ZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGY4MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJhOTc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUgCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2Jvb2suY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDg4ODAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3ZTNiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZW52amF2YWRvY3RvYy54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UvLFwKLSAgICAgICAgICAgICAgIHRvcGljc0Vudl9SZWZlcmVuY2UueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sLFwKLSAgICAgICAgICAgICAgIGJvb2suY3NzLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS5jc3MKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2J1aWxkRW52SmF2YWRvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZEVudkphdmFkb2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzFjMmE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2J1aWxkRW52SmF2YWRvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHByb2plY3QKLSAgICBuYW1lPSJqYXZhZG9jIgotICAgIGRlZmF1bHQ9Im1haW4iCi0gICAgYmFzZWRpcj0iLiI+Ci0JCi0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9ImJ1aWxkRGlyZWN0b3J5IgotICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIgLz4KLQotICAgIDwhLS0gPSA9ID0gc3RhbmRhcmQgcHJvcGVydGllcyBwYXR0ZXJuID0gPSA9IC0tPgotICAgIDwhLS0gCi0gICAgICAgIEZpcnN0IGdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgICAgICAgTm90ZSB0byBiZSBjcm9zcy1wbGF0Zm9ybSwgImVudmlyb25tZW50IHZhcmlhYmxlcyIgYXJlIG9ubHkgYXBwcm9wcmlhdGUgZm9yIAotICAgICAgICBzb21lIHZhcmlhYmxlcywgZS5nLiBvbmVzIHdlIHNldCwgc2luY2UgcHJvcGVydGllcyBhcmUgY2FzZSBzZW5zaXRpdmUsIGV2ZW4gaWYgCi0gICAgICAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb24geW91ciBvcGVyYXRpbmcgc3lzdGVtIGFyZSBub3QsIGUuZy4gaXQgd2lsbCAKLSAgICAgICAgYmUgJHtlbnYuUGF0aH0gbm90ICR7ZW52LlBBVEh9IG9uIFdpbmRvd3MgLS0+Ci0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0KLSAgICA8IS0tIAotICAgICAgICBMZXQgdXNlcnMgb3ZlcnJpZGUgc3RhbmRhcmQgcHJvcGVydGllcywgaWYgZGVzaXJlZC4KLSAgICAgICAgSWYgdGhpcyBkaXJlY3RvcnkvZmlsZXMgZG9lcyBub3QgZXhpc3QsIHRoZW4gaXQgd2lsbCBiZSBpZ25vcmVkLCAKLSAgICAgICAgYW5kIGRlZmF1bHRzIHVzZWQuCi0gICAgLS0+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIGZpbGU9IiR7ZW52LkxPQ0FMX0JVSUxEX1BST1BFUlRJRVNfRElSfS8ke2FudC5wcm9qZWN0Lm5hbWV9LnByb3BlcnRpZXMiIC8+Ci0KLQotCi0gICAgPHByb3BlcnR5IGZpbGU9ImVudmphdmFkb2MucHJvcGVydGllcyIgLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0ib3V0cHV0RGlyIgotICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfSIgLz4KLQotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0ibWFpbiIKLSAgICAgICAgZGVwZW5kcz0iamF2YWRvYywgcGFja2FnZXRvYyIKLSAgICAgICAgZGVzY3JpcHRpb249IkJ1aWxkcyBQbHVnaW4gSmF2YWRvYyIgLz4KLQotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0iamF2YWRvYyIKLSAgICAgICAgZGVwZW5kcz0iZ2V0U2tpcEphdmFEb2NQYXJhbSIKLSAgICAgICAgdW5sZXNzPSJkb3NraXBKYXZhRG9jIj4KLSAgICAJPGVjaG8gbWVzc2FnZT0iYmFzZWRpcjogJHtiYXNlZGlyfSIgLz4KLSAgICAJPGVjaG8gbWVzc2FnZT0ib3V0cHV0ZGlyOiAke291dHB1dERpcn0iIC8+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9ImNsYXNzcGF0aDogJHtKMlNFLTEuNX0iIC8+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkRGlyZWN0b3J5OiAke2J1aWxkRGlyZWN0b3J5fSIgLz4KLQotICAgICAgICA8amF2YWRvYwotICAgICAgICAgICAgYWNjZXNzPSJwdWJsaWMiCi0gICAgICAgICAgICBhdXRob3I9ImZhbHNlIgotICAgICAgICAgICAgZGVzdGRpcj0iJHtvdXRwdXREaXJ9L3JlZmVyZW5jZS9lbnZhcGkiCi0gICAgICAgICAgICBkb2N0aXRsZT0iJHthcGkudGl0bGV9IgotICAgICAgICAgICAgbm9kZXByZWNhdGVkPSJmYWxzZSIKLSAgICAgICAgICAgIG5vZGVwcmVjYXRlZGxpc3Q9ImZhbHNlIgotICAgICAgICAgICAgbm9pbmRleD0iZmFsc2UiCi0gICAgICAgICAgICBub25hdmJhcj0iZmFsc2UiCi0gICAgICAgICAgICBub3RyZWU9ImZhbHNlIgotICAgICAgICAgICAgRW5jb2Rpbmc9IklTTy04ODU5LTEiCi0gICAgICAgICAgICBwYWNrYWdlbmFtZXM9IiR7YXBpLnBhY2thZ2VzfSIKLSAgICAgICAgICAgIHNvdXJjZXBhdGg9IiR7cGx1Z2luLnNvdXJjZWZvbGRlcnN9IgotICAgICAgICAgICAgc3BsaXRpbmRleD0idHJ1ZSIKLSAgICAgICAgICAgIHVzZT0idHJ1ZSIKLSAgICAgICAgICAgIHZlcnNpb249InRydWUiCi0gICAgICAgICAgICBicmVha2l0ZXJhdG9yPSJ5ZXMiCi0gICAgICAgICAgICB2ZXJib3NlPSJmYWxzZSIKLSAgICAgICAgCWNsYXNzcGF0aD0iIgotICAgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgCQotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMiPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIAotCi0gICAgICAgIDwvamF2YWRvYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnZXRvYyI+Ci0gICAgICAgIDxsb2FkZmlsZQotICAgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIgotICAgICAgICAgICAgcHJvcGVydHk9Ind0cC5wYWNrYWdlcyIKLSAgICAgICAgICAgIHNyY0ZpbGU9IiR7b3V0cHV0RGlyfS9yZWZlcmVuY2UvZW52YXBpL3BhY2thZ2UtbGlzdCI+Ci0gICAgICAgICAgICA8ZmlsdGVyY2hhaW4+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcnJlYWRlcgotICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuUHJlZml4TGluZXMiPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByZWZpeCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSImbHQ7L3BhY2thZ2UmZ3Q7Jmx0O3BhY2thZ2UmZ3Q7IiAvPgotICAgICAgICAgICAgICAgIDwvZmlsdGVycmVhZGVyPgotICAgICAgICAgICAgICAgIDxzdHJpcGxpbmVicmVha3MgLz4KLSAgICAgICAgICAgIDwvZmlsdGVyY2hhaW4+Ci0gICAgICAgIDwvbG9hZGZpbGU+Ci0KLSAgICAgICAgPCEtLSBDcmVhdGUgcGFja2FnZXMueG1sIGZpbGUgLS0+Ci0gICAgICAgIDxlY2hvIGZpbGU9ImVudnBhY2thZ2VzLnhtbCI+Ci0gICAgICAgICAgICAmbHQ7cGFja2FnZXMmZ3Q7Jmx0O3BhY2thZ2UmZ3Q7JHt3dHAucGFja2FnZXN9Jmx0Oy9wYWNrYWdlJmd0OyZsdDsvcGFja2FnZXMmZ3Q7Ci0gICAgICAgIDwvZWNobz4KLQotICAgICAgICA8eHNsdAotICAgICAgICAgICAgYmFzZWRpcj0iJHtiYXNlZGlyfSIKLSAgICAgICAgICAgIGluPSJlbnZwYWNrYWdlcy54bWwiCi0gICAgICAgICAgICBvdXQ9ImVudmphdmFkb2N0b2MueG1sIgotICAgICAgICAgICAgc3R5bGU9ImVudmphdmFkb2NUb2MueHNsIj4KLSAgICAgICAgICAgIDxvdXRwdXRwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0ieG1sIiAvPgotICAgICAgICAgICAgPG91dHB1dHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iaW5kZW50IgotICAgICAgICAgICAgICAgIHZhbHVlPSJ5ZXMiIC8+Ci0gICAgICAgIDwveHNsdD4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImdldFNraXBKYXZhRG9jUGFyYW0iCi0gICAgICAgIGlmPSJza2lwSmF2YURvYyI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InNraXBKYXZhRG9jOiAke3NraXBKYXZhRG9jfSIgLz4KLSAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZG9za2lwSmF2YURvYyI+Ci0gICAgICAgICAgICA8ZXF1YWxzCi0gICAgICAgICAgICAgICAgYXJnMT0iJHtza2lwSmF2YURvY30iCi0gICAgICAgICAgICAgICAgYXJnMj0idHJ1ZSIKLSAgICAgICAgICAgICAgICB0cmltPSJ0cnVlIgotICAgICAgICAgICAgICAgIGNhc2VzZW5zaXRpdmU9ImZhbHNlIiAvPgotICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZEV4dERvY3MucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2J1aWxkRXh0RG9jcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM5MTU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2J1aWxkRXh0RG9jcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBJbmZvcm1hdGlvbiBmb3IgZXh0ZW5zaW9uIHBvaW50IG92ZXJ2aWV3IGRvY3VtZW50Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE92ZXJ2aWV3IGRvY3VtZW50IHRpdGxlCi10aXRsZSA9IFVSSSByZXNvbHZlciBFeHRlbnNpb24gUG9pbnRzCi1oZWFkZXIgPSBVUkkgcmVzb2x2ZXIgRXh0ZW5zaW9uIFBvaW50cyAKLSMgSW50cm9kdWN0aW9uIHBhcmFncmFwaAotb3ZlcnZpZXcgPSBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludHMgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIFVSSSByZXNvbHZlci4gCi0KLSMgQSBsaXN0IG9mIHRoZSBleHRlbnNpb24gcG9pbnRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZQotIyBleHRlbnNpb24gcG9pbnQgZG9jdW1lbnRhdGlvbi4KLWxpc3RlZC1leHQtcG9pbnRzPW9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZEV4dERvY3MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvYnVpbGRFeHREb2NzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3MmY1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZEV4dERvY3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIEV4dGVuc2lvbiBQb2ludCBEb2N1bWVudGF0aW9uIiBkZWZhdWx0PSJjcmVhdGVFeHREb2NzIiBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBmaWxlPSJidWlsZEV4dERvY3MucHJvcGVydGllcyIvPgotCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFwaW91dHB1dERpciIgdmFsdWU9IiR7b3V0cHV0RGlyfSR7ZmlsZS5zZXBhcmF0b3J9cmVmZXJlbmNlJHtmaWxlLnNlcGFyYXRvcn1leHQiLz4KLQotCTx0YXJnZXQgbmFtZT0iY3JlYXRlRXh0RG9jcyIgZGVwZW5kcz0iYnVpbGRFeHREb2NzLCBjcmVhdGVEb2NMaXN0aW5ncyIvPgotCQotCTx0YXJnZXQgbmFtZT0iYnVpbGRFeHREb2NzIiBkZXBlbmRzPSJidWlsZEpTRkV4dERvY3MiLz4KLQkJCi0gCTx0YXJnZXQgbmFtZT0iYnVpbGRKU0ZFeHREb2NzIj4KLSAJCQotIAkJPCEtLSBjbGVhbnVwIG9sZCAtLT4KLSAJCTxkZWxldGU+Ci0gCSAJCTxmaWxlc2V0IGRpcj0iJHthcGlvdXRwdXREaXJ9IiBjYXNlc2Vuc2l0aXZlPSJ5ZXMiIGlkPSJleHQtZG9jcy1saXN0LWVudCI+Ci0gCSAJCQk8aW5jbHVkZSBuYW1lPSIqLmh0bWwiLz4KLSAJCQk8L2ZpbGVzZXQ+Ci0gCQk8L2RlbGV0ZT4KLSAJCQotIAkJPCEtLSBnZW5lcmF0ZSBuZXcgaHRtbCBmcm9tIGV4dC1wdCBzY2hlbWFzIC0tPgotIAkJPHBkZS5jb252ZXJ0U2NoZW1hVG9IVE1MIG1hbmlmZXN0PSIuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi54bWwiIGRlc3RpbmF0aW9uPSIke2FwaW91dHB1dERpcn0iIC8+Ci0gCQkKLSAJCTwhLS0gR2V0IHRoZSBsaXN0IG9mIGV4dGVuc2lvbiBkb2MgZmlsZXMuIC0tPgotIAkJPGZpbGVzZXQgZGlyPSIke2FwaW91dHB1dERpcn0iIGNhc2VzZW5zaXRpdmU9InllcyIgaWQ9ImV4dC1kb2NzLWxpc3QtZW50IiA+Ci0gCQkJPGluY2x1ZGUgbmFtZT0iKi5odG1sIi8+Ci0JCTwvZmlsZXNldD4KLSAJCQotIAkJPCEtLSBDb252ZXJ0IHRoZSBsaXN0IHRvIGFuIFhNTCByZXByZXNlbnRhdGlvbi4gLS0+Ci0gCQk8cGF0aGNvbnZlcnQgcHJvcGVydHk9ImV4dC1kb2MtZW50IiByZWZpZD0iZXh0LWRvY3MtbGlzdC1lbnQiIHBhdGhzZXA9IiZsdDsvZmlsZSZndDsvbi9uJmx0O2ZpbGUmZ3Q7IiA+Ci0gCQkJPG1hcCBmcm9tPSIke2FwaW91dHB1dERpcn0ke2ZpbGUuc2VwYXJhdG9yfSIgdG89IiIvPgotIAkJPC9wYXRoY29udmVydD4KLSAJCTxlY2hvIGZpbGU9ImV4dGRvY3MueG1sIj4mbHQ7ZmlsZXMgY29tcG9uZW50PSJ3ZWJzZXJ2aWNlIiZndDsmbHQ7ZmlsZSZndDske2V4dC1kb2MtZW50fSZsdDsvZmlsZSZndDsmbHQ7L2ZpbGVzJmd0OzwvZWNobz4KLSAJCSAJCQkJCQkKLSAJPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjcmVhdGVEb2NMaXN0aW5ncyI+Ci0JCTxkZWxldGUgZmlsZT0iJHthcGlvdXRwdXREaXJ9JHtmaWxlLnNlcGFyYXRvcn1pbmRleC5odG1sIi8+Ci0JCTwhLS0gQ3JlYXRlIHRoZSBvdmVydmlldyBkb2N1bWVudC4gLS0+Ci0JCTx4c2x0IGJhc2VkaXI9IiR7YmFzZWRpcn0iIGluPSJleHREb2NMaXN0aW5ncy54bWwiIG91dD0iJHthcGlvdXRwdXREaXJ9JHtmaWxlLnNlcGFyYXRvcn1pbmRleC5odG1sIiBzdHlsZT0iZXh0RG9jT3ZlcnZpZXcueHNsIj4KLQkgIAkJPHBhcmFtIG5hbWU9InRpdGxlIiBleHByZXNzaW9uPSIke3RpdGxlfSIvPgotCSAgCQk8cGFyYW0gbmFtZT0iaGVhZGVyIiBleHByZXNzaW9uPSIke2hlYWRlcn0iLz4KLQkgIAkJPHBhcmFtIG5hbWU9Im92ZXJ2aWV3IiBleHByZXNzaW9uPSIke292ZXJ2aWV3fSIvPgotCQkJPHBhcmFtIG5hbWU9Imxpc3RlZC1leHQtcG9pbnRzIiBleHByZXNzaW9uPSIke2xpc3RlZC1leHQtcG9pbnRzfSIvPgotCQk8L3hzbHQ+Ci0JCQkKLQkJPCEtLSBDcmVhdGUgdGhlIGV4dGVudGlvbiBwb2ludCB0b2MuIC0tPgotCQk8eHNsdCBiYXNlZGlyPSIke2Jhc2VkaXJ9IiBpbj0iZXh0RG9jTGlzdGluZ3MueG1sIiBvdXQ9InRvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIiBzdHlsZT0iZXh0RG9jVG9jLnhzbCI+Ci0JCQk8cGFyYW0gbmFtZT0ibGlzdGVkLWV4dC1wb2ludHMiIGV4cHJlc3Npb249IiR7bGlzdGVkLWV4dC1wb2ludHN9Ii8+Ci0JCQk8b3V0cHV0cHJvcGVydHkgbmFtZT0ibWV0aG9kIiB2YWx1ZT0ieG1sIi8+Ci0JCQk8b3V0cHV0cHJvcGVydHkgbmFtZT0iaW5kZW50IiB2YWx1ZT0ieWVzIi8+Ci0JCTwveHNsdD4KLQkJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2MucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzYWIzZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZqYXZhZG9jLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotcGx1Z2luLnNvdXJjZWZvbGRlcnM9Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmM7Ci0KLWFwaS5wYWNrYWdlcz1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LFwKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLAotCi0KLWFwaS50aXRsZT1XZWIgVG9vbHMgUGxhdGZvcm06IEVudmlyb25tZW50IGZyYW1ld29yayBBUEkgZG9jdW1lbnRhdGlvbgotCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZqYXZhZG9jVG9jLnhzbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2NUb2MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWIxOTZjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2NUb2MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4YWxhbiI+Ci0gICAgCi0gICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2VzIj4KLSAgICAgPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotJmx0Oz9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPyZndDsKLQkgPC94c2w6dGV4dD4KLQkgPHRvYyBsYWJlbD0iSmF2YWRvYyBQYWNrYWdlcyBSZWZlcmVuY2UiPgotCSA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFja2FnZSI+Ci0JIDx4c2w6c29ydCBzZWxlY3Q9InRleHQoKSIvPgotCSAJPHhzbDppZiB0ZXN0PSJ0ZXh0KCkgIT0gJyciPgotCSAJCTx0b3BpYyBsYWJlbD0ie3RleHQoKX0iIGhyZWY9InJlZmVyZW5jZS9lbnZhcGkve3RyYW5zbGF0ZSh0ZXh0KCksJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIi8+Ci0JIAk8L3hzbDppZj4KLQkgPC94c2w6Zm9yLWVhY2g+Ci0JCi0JIDwvdG9jPiAKLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZqYXZhZG9jdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2N0b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTUzMTY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2N0b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCSA8dG9jIGxhYmVsPSJKYXZhZG9jIFBhY2thZ2VzIFJlZmVyZW5jZSI+Ci08dG9waWMgaHJlZj0icmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIvPgotPHRvcGljIGhyZWY9InJlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZwYWNrYWdlcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZwYWNrYWdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTQ3M2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZW52cGFja2FnZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLSAgICAgICAgICAgIDxwYWNrYWdlcz48cGFja2FnZT48L3BhY2thZ2U+PHBhY2thZ2U+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvcGFja2FnZT48cGFja2FnZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvcGFja2FnZT48L3BhY2thZ2VzPgotICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NMaXN0aW5ncy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NMaXN0aW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNzA4ZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZXh0RG9jTGlzdGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudHM+Ci0JPGNvbXBvbmVudCBuYW1lPSJVUkkgUmVzb2x2ZXIgQVBJIiBpZD0idXJpcmVzb2x2ZXIiIGZpbGU9ImV4dGRvY3MueG1sIi8+Ci08L2NvbXBvbmVudHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NPdmVydmlldy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NPdmVydmlldy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YWIyYzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZXh0RG9jT3ZlcnZpZXcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJoZWFkZXIiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im92ZXJ2aWV3Ii8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJsaXN0ZWQtZXh0LXBvaW50cyIvPgotICAgIAotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbXBvbmVudHMiPgotICAgIAkKLSAgICAJPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotICAgIAkmbHQ7IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRSQU5TSVRJT05BTC8vRU4iJmd0OwotCQk8L3hzbDp0ZXh0PgotCQk8aHRtbD4KLQkJPGhlYWQ+Ci0JCTx4c2w6dGV4dCBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIj4KLQkJJmx0O21ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iICZndDsKLQotICAgCQkmbHQ7bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiZndDsKLSAgIAkJPC94c2w6dGV4dD4KLSAgIAkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotICAgCQk8eHNsOnRleHQgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyI+Ci0JCSZsdDtMSU5LIFJFTD0iU1RZTEVTSEVFVCIgSFJFRj0iLi4vLi4vYm9vay5jc3MiIENIQVJTRVQ9IklTTy04ODU5LTEiIFRZUEU9InRleHQvY3NzIiZndDsKLQkJPC94c2w6dGV4dD4KLQkJPC9oZWFkPgotCQk8Ym9keSBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzgwMDA4MCI+Ci0KLQkJPGNlbnRlcj4KLQkJPGgxPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyIi8+PC9oMT4KLQkJPC9jZW50ZXI+Ci0KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdmVydmlldyIvPgotICAgIAk8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29tcG9uZW50Ij4KLSAgICAJCTx4c2w6c29ydCBzZWxlY3Q9IkBpZCIvPgotICAgIAkJPGgzPjxhIG5hbWU9IntAaWR9Ij48L2E+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMz4KLSAgICAJCTx1bD4KLSAgICAJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jdW1lbnQoQGZpbGUpL2ZpbGVzL2ZpbGUiPgotICAgIAkJCQk8eHNsOnNvcnQgc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICAJCQkJPCEtLSA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRsaXN0ZWQtZXh0LXBvaW50cywgdHJhbnNsYXRlKHN1YnN0cmluZyh0ZXh0KCksIDAsIHN0cmluZy1sZW5ndGgodGV4dCgpKSAtIDQpLCdfJywnLicpKSI+IC0tPiAKLSAgCQkJCQkJPGxpPgotICAJCQkJCQkJPGEgaHJlZj0ie3RleHQoKX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoc3Vic3RyaW5nKHRleHQoKSwgMCwgc3RyaW5nLWxlbmd0aCh0ZXh0KCkpIC0gNCksJ18nLCcuJykiLz48L2E+IAotICAJCQkJCQk8L2xpPgotICAJCQkJCTwhLS0gPC94c2w6aWY+IC0tPgotICAgIAkJCTwveHNsOmZvci1lYWNoPgotICAgIAkJPC91bD4KLSAgICAJPC94c2w6Zm9yLWVhY2g+Ci0gICAgCTwvYm9keT4KLQkJPC9odG1sPgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2V4dERvY1RvYy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NUb2MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmIyNzQxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2V4dERvY1RvYy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4YWxhbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhhbGFuIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imxpc3RlZC1leHQtcG9pbnRzIi8+Ci0gICAgCi0gICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbXBvbmVudHMiPgotICAgICAJPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotJmx0Oz9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPyZndDsKLQkgCTwveHNsOnRleHQ+Ci0JIAk8dG9jIGxhYmVsPSJFeHRlbnNpb24gUG9pbnRzIFJlZmVyZW5jZSI+Ci0JIAkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImRvY3VtZW50KGNvbXBvbmVudC9AZmlsZSkvZmlsZXMvZmlsZSI+Ci0JIAkJCTx4c2w6c29ydCBzZWxlY3Q9InRleHQoKSIvPgotCSAJCQk8IS0tIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJGxpc3RlZC1leHQtcG9pbnRzLCB0cmFuc2xhdGUoc3Vic3RyaW5nKHRleHQoKSwgMCwgc3RyaW5nLWxlbmd0aCh0ZXh0KCkpIC0gNCksJ18nLCcuJykpIj4gLS0+Ci0JIAkJCQk8dG9waWMgbGFiZWw9Int0cmFuc2xhdGUoc3Vic3RyaW5nKHRleHQoKSwgMCwgc3RyaW5nLWxlbmd0aCh0ZXh0KCkpIC0gNCksJ18nLCcuJyl9IiBocmVmPSJyZWZlcmVuY2UvZXh0L3t0ZXh0KCl9Ij4KLQkgCQkJCTwvdG9waWM+Ci0JIAkJCTwhLS0gPC94c2w6aWY+IC0tPgotCSAJCTwveHNsOmZvci1lYWNoPgotCSAJPC90b2M+IAotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2V4dGRvY3MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZXh0ZG9jcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTk1NjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZXh0ZG9jcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08ZmlsZXMgY29tcG9uZW50PSJ3ZWJzZXJ2aWNlIj48ZmlsZT5vcmdfZWNsaXBzZV93c3RfY29tbW9uX3VyaXJlc29sdmVyX3Jlc29sdmVyRXh0ZW5zaW9ucy5odG1sPC9maWxlPjwvZmlsZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkNzE4My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9RW52aXJvbm1lbnQgQVBJIERvY3VtZW50YXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2Mzg0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0JCi08IS0tCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAotIERlZmluZSBTdWJzZWN0aW9uIFRhYmxlIG9mIENvbnRlbnRzCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0tLT4gCi0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9InRvcGljc0Vudl9SZWZlcmVuY2UueG1sIi8+Ci0JCTx0b2MgZmlsZT0iZW52amF2YWRvY3RvYy54bWwiLz4KLQkJPHRvYyBmaWxlPSJ0b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbCIvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2FsbGNsYXNzZXMtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM2YjMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLTxCPkFsbCBDbGFzc2VzPC9CPjwvRk9OVD4KLTxCUj4KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5DaG9pY2U8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+RW52aXJvbm1lbnRTZXJ2aWNlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklFbnZpcm9ubWVudDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklMb2c8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVN0YXR1c0hhbmRsZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklVUkk8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVVJJRmFjdG9yeTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVVSSUZpbHRlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVVSSVNjaGVtZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklVUklWaXNpdG9yPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5TaW1wbGVVUklGYWN0b3J5PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+U3RhdHVzRXhjZXB0aW9uPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5VUklFeGNlcHRpb248L0E+Ci08QlI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljMTNlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLTxCPkFsbCBDbGFzc2VzPC9CPjwvRk9OVD4KLTxCUj4KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRFeGNlcHRpb248L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRTZXJ2aWNlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48ST5JRW52aXJvbm1lbnQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEk+SUxvZzwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEk+SVN0YXR1c0hhbmRsZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48ST5JVVJJPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxJPklVUklGYWN0b3J5PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEk+SVVSSUZpbHRlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxJPklVUklTY2hlbWU8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEk+SVVSSVZpc2l0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+U2ltcGxlVVJJRmFjdG9yeTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5TdGF0dXNFeGNlcHRpb248L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+Ci08QlI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2NvbnN0YW50LXZhbHVlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9jb25zdGFudC12YWx1ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3ZTM0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2NvbnN0YW50LXZhbHVlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUNvbnN0YW50IEZpZWxkIFZhbHVlcwotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkNvbnN0YW50IEZpZWxkIFZhbHVlcyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9jb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJjb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgxPgotQ29uc3RhbnQgRmllbGQgVmFsdWVzPC9IMT4KLTwvQ0VOVEVSPgotPEhSIFNJWkU9IjQiIE5PU0hBREU+Ci08Qj5Db250ZW50czwvQj48VUw+Ci08TEk+PEEgSFJFRj0iI29yZy5lY2xpcHNlIj5vcmcuZWNsaXBzZS4qPC9BPgotPC9VTD4KLQotPEEgTkFNRT0ib3JnLmVjbGlwc2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Rk9OVCBTSVpFPSIrMiI+Ci1vcmcuZWNsaXBzZS4qPC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5FUlJPUiI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI0VSUk9SIj5FUlJPUjwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjQ8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5JTkZPIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjSU5GTyI+SU5GTzwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjE8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5PSyI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI09LIj5PSzwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjA8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5XQVJOSU5HIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjV0FSTklORyI+V0FSTklORzwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjI8L0NPREU+PC9URD4KLTwvVFI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP2NvbnN0YW50LXZhbHVlcy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImNvbnN0YW50LXZhbHVlcy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9kZXByZWNhdGVkLWxpc3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvZGVwcmVjYXRlZC1saXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjQ3MzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9kZXByZWNhdGVkLWxpc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1EZXByZWNhdGVkIExpc3QKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJEZXByZWNhdGVkIExpc3QiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLTxCPkRlcHJlY2F0ZWQgQVBJPC9CPjwvSDI+Ci08L0NFTlRFUj4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotPEI+Q29udGVudHM8L0I+PFVMPgotPC9VTD4KLQotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9kZXByZWNhdGVkLWxpc3QuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaGVscC1kb2MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaGVscC1kb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0M2E1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2hlbHAtZG9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotQVBJIEhlbHAKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJBUEkgSGVscCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/aGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJoZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDE+Ci1Ib3cgVGhpcyBBUEkgRG9jdW1lbnQgSXMgT3JnYW5pemVkPC9IMT4KLTwvQ0VOVEVSPgotVGhpcyBBUEkgKEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSkgZG9jdW1lbnQgaGFzIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGl0ZW1zIGluIHRoZSBuYXZpZ2F0aW9uIGJhciwgZGVzY3JpYmVkIGFzIGZvbGxvd3MuPEgzPgotT3ZlcnZpZXc8L0gzPgotPEJMT0NLUVVPVEU+Ci0KLTxQPgotVGhlIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+T3ZlcnZpZXc8L0E+IHBhZ2UgaXMgdGhlIGZyb250IHBhZ2Ugb2YgdGhpcyBBUEkgZG9jdW1lbnQgYW5kIHByb3ZpZGVzIGEgbGlzdCBvZiBhbGwgcGFja2FnZXMgd2l0aCBhIHN1bW1hcnkgZm9yIGVhY2guICBUaGlzIHBhZ2UgY2FuIGFsc28gY29udGFpbiBhbiBvdmVyYWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXQgb2YgcGFja2FnZXMuPC9CTE9DS1FVT1RFPgotPEgzPgotUGFja2FnZTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIHBhY2thZ2UgaGFzIGEgcGFnZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBpdHMgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcywgd2l0aCBhIHN1bW1hcnkgZm9yIGVhY2guIFRoaXMgcGFnZSBjYW4gY29udGFpbiBmb3VyIGNhdGVnb3JpZXM6PFVMPgotPExJPkludGVyZmFjZXMgKGl0YWxpYyk8TEk+Q2xhc3NlczxMST5FbnVtczxMST5FeGNlcHRpb25zPExJPkVycm9yczxMST5Bbm5vdGF0aW9uIFR5cGVzPC9VTD4KLTwvQkxPQ0tRVU9URT4KLTxIMz4KLUNsYXNzL0ludGVyZmFjZTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIGNsYXNzLCBpbnRlcmZhY2UsIG5lc3RlZCBjbGFzcyBhbmQgbmVzdGVkIGludGVyZmFjZSBoYXMgaXRzIG93biBzZXBhcmF0ZSBwYWdlLiBFYWNoIG9mIHRoZXNlIHBhZ2VzIGhhcyB0aHJlZSBzZWN0aW9ucyBjb25zaXN0aW5nIG9mIGEgY2xhc3MvaW50ZXJmYWNlIGRlc2NyaXB0aW9uLCBzdW1tYXJ5IHRhYmxlcywgYW5kIGRldGFpbGVkIG1lbWJlciBkZXNjcmlwdGlvbnM6PFVMPgotPExJPkNsYXNzIGluaGVyaXRhbmNlIGRpYWdyYW08TEk+RGlyZWN0IFN1YmNsYXNzZXM8TEk+QWxsIEtub3duIFN1YmludGVyZmFjZXM8TEk+QWxsIEtub3duIEltcGxlbWVudGluZyBDbGFzc2VzPExJPkNsYXNzL2ludGVyZmFjZSBkZWNsYXJhdGlvbjxMST5DbGFzcy9pbnRlcmZhY2UgZGVzY3JpcHRpb24KLTxQPgotPExJPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PExJPkZpZWxkIFN1bW1hcnk8TEk+Q29uc3RydWN0b3IgU3VtbWFyeTxMST5NZXRob2QgU3VtbWFyeQotPFA+Ci08TEk+RmllbGQgRGV0YWlsPExJPkNvbnN0cnVjdG9yIERldGFpbDxMST5NZXRob2QgRGV0YWlsPC9VTD4KLUVhY2ggc3VtbWFyeSBlbnRyeSBjb250YWlucyB0aGUgZmlyc3Qgc2VudGVuY2UgZnJvbSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gZm9yIHRoYXQgaXRlbS4gVGhlIHN1bW1hcnkgZW50cmllcyBhcmUgYWxwaGFiZXRpY2FsLCB3aGlsZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb25zIGFyZSBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLiBUaGlzIHByZXNlcnZlcyB0aGUgbG9naWNhbCBncm91cGluZ3MgZXN0YWJsaXNoZWQgYnkgdGhlIHByb2dyYW1tZXIuPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotPEgzPgotQW5ub3RhdGlvbiBUeXBlPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggYW5ub3RhdGlvbiB0eXBlIGhhcyBpdHMgb3duIHNlcGFyYXRlIHBhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjxVTD4KLTxMST5Bbm5vdGF0aW9uIFR5cGUgZGVjbGFyYXRpb248TEk+QW5ub3RhdGlvbiBUeXBlIGRlc2NyaXB0aW9uPExJPlJlcXVpcmVkIEVsZW1lbnQgU3VtbWFyeTxMST5PcHRpb25hbCBFbGVtZW50IFN1bW1hcnk8TEk+RWxlbWVudCBEZXRhaWw8L1VMPgotPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotPEgzPgotRW51bTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIGVudW0gaGFzIGl0cyBvd24gc2VwYXJhdGUgcGFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PFVMPgotPExJPkVudW0gZGVjbGFyYXRpb248TEk+RW51bSBkZXNjcmlwdGlvbjxMST5FbnVtIENvbnN0YW50IFN1bW1hcnk8TEk+RW51bSBDb25zdGFudCBEZXRhaWw8L1VMPgotPC9CTE9DS1FVT1RFPgotPEgzPgotVXNlPC9IMz4KLTxCTE9DS1FVT1RFPgotRWFjaCBkb2N1bWVudGVkIHBhY2thZ2UsIGNsYXNzIGFuZCBpbnRlcmZhY2UgaGFzIGl0cyBvd24gVXNlIHBhZ2UuICBUaGlzIHBhZ2UgZGVzY3JpYmVzIHdoYXQgcGFja2FnZXMsIGNsYXNzZXMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycyBhbmQgZmllbGRzIHVzZSBhbnkgcGFydCBvZiB0aGUgZ2l2ZW4gY2xhc3Mgb3IgcGFja2FnZS4gR2l2ZW4gYSBjbGFzcyBvciBpbnRlcmZhY2UgQSwgaXRzIFVzZSBwYWdlIGluY2x1ZGVzIHN1YmNsYXNzZXMgb2YgQSwgZmllbGRzIGRlY2xhcmVkIGFzIEEsIG1ldGhvZHMgdGhhdCByZXR1cm4gQSwgYW5kIG1ldGhvZHMgYW5kIGNvbnN0cnVjdG9ycyB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSBBLiAgWW91IGNhbiBhY2Nlc3MgdGhpcyBwYWdlIGJ5IGZpcnN0IGdvaW5nIHRvIHRoZSBwYWNrYWdlLCBjbGFzcyBvciBpbnRlcmZhY2UsIHRoZW4gY2xpY2tpbmcgb24gdGhlICJVc2UiIGxpbmsgaW4gdGhlIG5hdmlnYXRpb24gYmFyLjwvQkxPQ0tRVU9URT4KLTxIMz4KLVRyZWUgKENsYXNzIEhpZXJhcmNoeSk8L0gzPgotPEJMT0NLUVVPVEU+Ci1UaGVyZSBpcyBhIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+Q2xhc3MgSGllcmFyY2h5PC9BPiBwYWdlIGZvciBhbGwgcGFja2FnZXMsIHBsdXMgYSBoaWVyYXJjaHkgZm9yIGVhY2ggcGFja2FnZS4gRWFjaCBoaWVyYXJjaHkgcGFnZSBjb250YWlucyBhIGxpc3Qgb2YgY2xhc3NlcyBhbmQgYSBsaXN0IG9mIGludGVyZmFjZXMuIFRoZSBjbGFzc2VzIGFyZSBvcmdhbml6ZWQgYnkgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIHN0YXJ0aW5nIHdpdGggPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4uIFRoZSBpbnRlcmZhY2VzIGRvIG5vdCBpbmhlcml0IGZyb20gPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4uPFVMPgotPExJPldoZW4gdmlld2luZyB0aGUgT3ZlcnZpZXcgcGFnZSwgY2xpY2tpbmcgb24gIlRyZWUiIGRpc3BsYXlzIHRoZSBoaWVyYXJjaHkgZm9yIGFsbCBwYWNrYWdlcy48TEk+V2hlbiB2aWV3aW5nIGEgcGFydGljdWxhciBwYWNrYWdlLCBjbGFzcyBvciBpbnRlcmZhY2UgcGFnZSwgY2xpY2tpbmcgIlRyZWUiIGRpc3BsYXlzIHRoZSBoaWVyYXJjaHkgZm9yIG9ubHkgdGhhdCBwYWNrYWdlLjwvVUw+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1EZXByZWNhdGVkIEFQSTwvSDM+Ci08QkxPQ0tRVU9URT4KLVRoZSA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+RGVwcmVjYXRlZCBBUEk8L0E+IHBhZ2UgbGlzdHMgYWxsIG9mIHRoZSBBUEkgdGhhdCBoYXZlIGJlZW4gZGVwcmVjYXRlZC4gQSBkZXByZWNhdGVkIEFQSSBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSwgZ2VuZXJhbGx5IGR1ZSB0byBpbXByb3ZlbWVudHMsIGFuZCBhIHJlcGxhY2VtZW50IEFQSSBpcyB1c3VhbGx5IGdpdmVuLiBEZXByZWNhdGVkIEFQSXMgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlIGltcGxlbWVudGF0aW9ucy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1JbmRleDwvSDM+Ci08QkxPQ0tRVU9URT4KLVRoZSA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPkluZGV4PC9BPiBjb250YWlucyBhbiBhbHBoYWJldGljIGxpc3Qgb2YgYWxsIGNsYXNzZXMsIGludGVyZmFjZXMsIGNvbnN0cnVjdG9ycywgbWV0aG9kcywgYW5kIGZpZWxkcy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1QcmV2L05leHQ8L0gzPgotVGhlc2UgbGlua3MgdGFrZSB5b3UgdG8gdGhlIG5leHQgb3IgcHJldmlvdXMgY2xhc3MsIGludGVyZmFjZSwgcGFja2FnZSwgb3IgcmVsYXRlZCBwYWdlLjxIMz4KLUZyYW1lcy9ObyBGcmFtZXM8L0gzPgotVGhlc2UgbGlua3Mgc2hvdyBhbmQgaGlkZSB0aGUgSFRNTCBmcmFtZXMuICBBbGwgcGFnZXMgYXJlIGF2YWlsYWJsZSB3aXRoIG9yIHdpdGhvdXQgZnJhbWVzLgotPFA+Ci08SDM+Ci1TZXJpYWxpemVkIEZvcm08L0gzPgotRWFjaCBzZXJpYWxpemFibGUgb3IgZXh0ZXJuYWxpemFibGUgY2xhc3MgaGFzIGEgZGVzY3JpcHRpb24gb2YgaXRzIHNlcmlhbGl6YXRpb24gZmllbGRzIGFuZCBtZXRob2RzLiBUaGlzIGluZm9ybWF0aW9uIGlzIG9mIGludGVyZXN0IHRvIHJlLWltcGxlbWVudG9ycywgbm90IHRvIGRldmVsb3BlcnMgdXNpbmcgdGhlIEFQSS4gV2hpbGUgdGhlcmUgaXMgbm8gbGluayBpbiB0aGUgbmF2aWdhdGlvbiBiYXIsIHlvdSBjYW4gZ2V0IHRvIHRoaXMgaW5mb3JtYXRpb24gYnkgZ29pbmcgdG8gYW55IHNlcmlhbGl6ZWQgY2xhc3MgYW5kIGNsaWNraW5nICJTZXJpYWxpemVkIEZvcm0iIGluIHRoZSAiU2VlIGFsc28iIHNlY3Rpb24gb2YgdGhlIGNsYXNzIGRlc2NyaXB0aW9uLgotPFA+Ci08SDM+Ci1Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0gzPgotVGhlIDxhIGhyZWY9ImNvbnN0YW50LXZhbHVlcy5odG1sIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L2E+IHBhZ2UgbGlzdHMgdGhlIHN0YXRpYyBmaW5hbCBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlcy4KLTxQPgotPEZPTlQgU0laRT0iLTEiPgotPEVNPgotVGhpcyBoZWxwIGZpbGUgYXBwbGllcyB0byBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGRvY2xldC48L0VNPgotPC9GT05UPgotPEJSPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/aGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJoZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2MjBlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1BLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQS1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIExFVFRFUiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfQV8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkE8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwjYWNjZXB0cyhvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PEI+YWNjZXB0cyhJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZpbHRlcjwvQT4KLTxERD5GaWx0ZXJzIHRoZSBnaXZlbiBJVVJJLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhcHBlbmQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPmFwcGVuZChJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXNGaWxlKCkiPjxCPmFzRmlsZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhc1N0cmluZygpIj48Qj5hc1N0cmluZygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhc1VSTCgpIj48Qj5hc1VSTCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBMRVRURVImbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjFjOGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0xMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVItSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJSLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEwLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfUl8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlI8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjcmVnaXN0ZXJTY2hlbWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZSkiPjxCPnJlZ2lzdGVyU2NoZW1lKFN0cmluZywgSVVSSVNjaGVtZSk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5TaW1wbGVVUklGYWN0b3J5PC9BPgotPEREPlRoaXMgbWV0aG9kIHJlZ2lzdGVycyBhIHNjaGVtZSBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNyZW5hbWUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPnJlbmFtZShJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD5SZW5hbWVzIG9yIG1vdmVzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSQotIHRvIHRoZSBuZXcgSVVSSS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+PEI+cmVwb3J0KElTdGF0dXMsIENob2ljZVtdKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPgotPEREPlJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+cmVwb3J0KElTdGF0dXMpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+Ci08REQ+UmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIHdpdGggaW1wbGllZCBvcHRpb25zIHRvIGVpdGhlcgotIGNvbnRpbnVlIG9yIGFib3J0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlW10pIj48Qj5yZXBvcnQoSVN0YXR1cywgQ2hvaWNlW10pPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPk51bGxTdGF0dXNIYW5kbGVyPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48Qj5yZXBvcnQoSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+cmVwb3J0RXJyb3IoSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT4KLTxERD5SZXBvcnQgdGhlIGdpdmVuIEVycm9yIFN0YXR1cy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48Qj5yZXBvcnRFcnJvcihJU3RhdHVzKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5OdWxsU3RhdHVzSGFuZGxlcjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPjxCPnJlcG9ydEluZm8oSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT4KLTxERD5SZXBvcnQgdGhlIGdpdmVuIEluZm8gU3RhdHVzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+cmVwb3J0SW5mbyhJU3RhdHVzKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5OdWxsU3RhdHVzSGFuZGxlcjwvQT4KLTxERD4mbmJzcDsKLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEwLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTEuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOTNmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTExLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotUy1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlMtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTExLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfU18iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlM8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI3NldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcpIj48Qj5zZXREZXNjcmlwdGlvbihTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Ci08REQ+U2V0cyB0aGUgZGVzY3JpcHRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKSI+PEI+c2V0TGFiZWwoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPgotPEREPlNldHMgdGhlIGxhYmVsLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjc2V0U2hvcnRjdXQoY2hhcikiPjxCPnNldFNob3J0Y3V0KGNoYXIpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Ci08REQ+U2V0cyB0aGUgc2hvcnRjdXQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPlNpbXBsZVVSSUZhY3Rvcnk8L0I+PC9BPiAtIENsYXNzIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48REQ+VGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElVUklGYWN0b3J5IGludGVyZmFjZS48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI1NpbXBsZVVSSUZhY3RvcnkoKSI+PEI+U2ltcGxlVVJJRmFjdG9yeSgpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+U2ltcGxlVVJJRmFjdG9yeTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+U3RhdHVzRXhjZXB0aW9uPC9CPjwvQT4gLSBFeGNlcHRpb24gaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48REQ+VGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgYnkgU3RhdHVzSGFuZGxlcnMgdG8gdGVsbCB0aGVpcgotIGNhbGxlcnMgdGhhdCBwcm9jZXNzaW5nIHNob3VsZCBzdG9wLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sI1N0YXR1c0V4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPjxCPlN0YXR1c0V4Y2VwdGlvbihJU3RhdHVzKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBTdGF0dXMuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2UpIj48Qj5TdGF0dXNFeGNlcHRpb24oQ2hvaWNlKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBDaG9pY2UuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlKSI+PEI+U3RhdHVzRXhjZXB0aW9uKElTdGF0dXMsIENob2ljZSk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5TdGF0dXNFeGNlcHRpb248L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gYW5kIHN0YXR1cyBvYmplY3QuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0xMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0xMi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI5MmU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1ULUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVC1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMy5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9UXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+VDwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN0b1N0cmluZygpIj48Qj50b1N0cmluZygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCN0b1N0cmluZygpIj48Qj50b1N0cmluZygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN0b3VjaEZvbGRlcigpIj48Qj50b3VjaEZvbGRlcigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgZm9sZGVyIHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gdGhlIElVUkkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3RvdWNoTGVhZigpIj48Qj50b3VjaExlYWYoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD5DcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotIHRoZSBJVVJJLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiMDdjNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVS1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlUtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfVV8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlU8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5VUklFeGNlcHRpb248L0I+PC9BPiAtIEV4Y2VwdGlvbiBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PEREPlRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgSVVSSSBjbGFzc2VzLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCNVUklFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48Qj5VUklFeGNlcHRpb24oSVN0YXR1cyk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyBVUklFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI1VSSUV4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPlVSSUV4Y2VwdGlvbihJU3RhdHVzLCBJVVJJKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgSVVSSSwKLSBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2YTlhZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTE0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVi1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlYtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfVl8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlY8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPnZhbGlkYXRlKElVUkkpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcikiPjxCPnZpc2l0KElVUklWaXNpdG9yKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD5WaXNpdHMgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGRlY2VuZGFudHMgaW4gcHJlLW9yZGVyIGZhc2hpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyKSI+PEI+dmlzaXQoSVVSSVZpc2l0b3IsIElVUklGaWx0ZXIpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPkFzIGZvciB2aXNpdChJVVJJVmlzaXRvciksIGV4Y2VwdCBvbmx5IHJlc291cmNlIFVSSXMgdGhhdCBhcmUKLSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwjdmlzaXQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPnZpc2l0KElVUkkpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+Ci08REQ+VmlzaXRzIHRoZSBnaXZlbiBJVVJJLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhMjAyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTE1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVy1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlctSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVCBMRVRURVI8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWFpbiI+PC9BPgotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX1dfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5XPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjV0FSTklORyI+PEI+V0FSTklORzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5UaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIHdhcm5pbmcuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIExFVFRFUjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE1Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMGZjM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotQy1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkMtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9DXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+QzwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5DaG9pY2U8L0I+PC9BPiAtIENsYXNzIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PEREPlRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgSVN0YXR1c0hhbmRsZXIgaW50ZXJmYWNlLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI0Nob2ljZSgpIj48Qj5DaG9pY2UoKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPgotPEREPkNvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNDaG9pY2UoY2hhciwgamF2YS5sYW5nLlN0cmluZykiPjxCPkNob2ljZShjaGFyLCBTdHJpbmcpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Ci08REQ+Q29uc3RydWN0b3IgZm9yIENob2ljZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI0Nob2ljZShjaGFyLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Q2hvaWNlKGNoYXIsIFN0cmluZywgU3RyaW5nKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPgotPEREPkNvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRhZjM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUUtSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJFLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNC5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfRV8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkU8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQj48L0E+IC0gRXhjZXB0aW9uIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PEREPlRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgY29uZGl0aW9ucyByYWlzZWQgYnkgdGhlIElFbnZpcm9ubWVudC48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI0Vudmlyb25tZW50RXhjZXB0aW9uKCkiPjxCPkVudmlyb25tZW50RXhjZXB0aW9uKCk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI0Vudmlyb25tZW50RXhjZXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+RW52aXJvbm1lbnRFeGNlcHRpb24oSVN0YXR1cyk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPkVudmlyb25tZW50U2VydmljZTwvQj48L0E+IC0gQ2xhc3MgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48REQ+VGhpcyBjbGFzcyBjcmVhdGVzIGEgY29uc29sZSBlbnZpcm9ubWVudC48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNFbnZpcm9ubWVudFNlcnZpY2UoKSI+PEI+RW52aXJvbm1lbnRTZXJ2aWNlKCk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50U2VydmljZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZXJhc2UoKSI+PEI+ZXJhc2UoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD5FcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI0VSUk9SIj48Qj5FUlJPUjwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5UaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIGFuIGVycm9yLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0zLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC00Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiOWZmZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1HLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRy1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWFpbiI+PC9BPgotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0dfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5HPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNnZXRDaG9pY2UoKSI+PEI+Z2V0Q2hvaWNlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5TdGF0dXNFeGNlcHRpb248L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNnZXREZXNjcmlwdGlvbigpIj48Qj5nZXREZXNjcmlwdGlvbigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Ci08REQ+R2V0cyB0aGUgZGVzY3JpcHRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNnZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCkiPjxCPmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50U2VydmljZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI2dldEVjbGlwc2VMb2coKSI+PEI+Z2V0RWNsaXBzZUxvZygpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRTZXJ2aWNlPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwjZ2V0RWNsaXBzZVNjaGVtZSgpIj48Qj5nZXRFY2xpcHNlU2NoZW1lKCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudFNlcnZpY2U8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNnZXRGaWxlU2NoZW1lKCkiPjxCPmdldEZpbGVTY2hlbWUoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50U2VydmljZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZ2V0SW5wdXRTdHJlYW0oKSI+PEI+Z2V0SW5wdXRTdHJlYW0oKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI2dldExhYmVsKCkiPjxCPmdldExhYmVsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4KLTxERD5HZXRzIHRoZSBsYWJlbC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sI2dldExvZygpIj48Qj5nZXRMb2coKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JRW52aXJvbm1lbnQ8L0E+Ci08REQ+UmV0dXJucyBhIGxvZ2dpbmcgZmFjaWxpdHkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2dldE91dHB1dFN0cmVhbSgpIj48Qj5nZXRPdXRwdXRTdHJlYW0oKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI2dldFNob3J0Y3V0KCkiPjxCPmdldFNob3J0Y3V0KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4KLTxERD5HZXRzIHRoZSBzaG9ydGN1dC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwjZ2V0U3RhdHVzKCkiPjxCPmdldFN0YXR1cygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBleGNlcHRpb24gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT4KLTxERD5SZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI2dldFN0YXR1cygpIj48Qj5nZXRTdGF0dXMoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gZXhjZXB0aW9uIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sI2dldFN0YXR1c0hhbmRsZXIoKSI+PEI+Z2V0U3RhdHVzSGFuZGxlcigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklFbnZpcm9ubWVudDwvQT4KLTxERD5SZXR1cm5zIGEgc3RhdHVzIGhhbmRsZXIuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwjZ2V0VVJJKCkiPjxCPmdldFVSSSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBleGNlcHRpb24gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwjZ2V0VVJJRmFjdG9yeSgpIj48Qj5nZXRVUklGYWN0b3J5KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUVudmlyb25tZW50PC9BPgotPEREPlJldHVybnMgYSBJVVJJIGZhY3RvcnkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2dldFVSSVNjaGVtZSgpIj48Qj5nZXRVUklTY2hlbWUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNS5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtNS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC01Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMThjMzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC01Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotSS1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkktSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC02Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC01Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9JXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+STwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUVudmlyb25tZW50PC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48REQ+QW4gSUVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgZ2V0dGluZyBhIAotIAotIEEgbG9nIGZvciB3cml0aW5nIG1lc3NhZ2VzIHRvIGEgbG9nZ2luZyBmYWNpbGl0eSwKLSBBIHByb2dyZXNzIG1vbml0b3IgZm9yIHJlY2VpdmluZyBwcm9ncmVzcyBpbmZvcm1hdGlvbiwKLSBBIHN0YXR1cyBoYW5kbGVyIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3Npbmcgc3RhdHVzIHJlcG9ydHMsCi0gQSBmYWN0b3J5IGZvciB0aGUgaGFuZGxpbmcgb2YgVVJJcyAocmVzb3VyY2VzKS48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUxvZzwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PEREPklMb2cgb2JqZWN0cyBwcm92aWRlIGEgbWVhbnMgZm9yIGxvZ2dpbmcgaW5mb3JtYXRpb24gZm9yIEZGREMgZXRjLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNJTkZPIj48Qj5JTkZPPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPlRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgaW5mb3JtYXRpb25hbC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNBdmFpbGFibGVBc0ZpbGUoKSI+PEI+aXNBdmFpbGFibGVBc0ZpbGUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNBdmFpbGFibGVBc1VSTCgpIj48Qj5pc0F2YWlsYWJsZUFzVVJMKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjaXNFbmFibGVkKCkiPjxCPmlzRW5hYmxlZCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPlJldHVybnMgdHJ1ZSBpZiBsb2dnaW5nIGlzIGVuYWJsZWQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjaXNFbmFibGVkKGphdmEubGFuZy5TdHJpbmcpIj48Qj5pc0VuYWJsZWQoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5SZXR1cm5zIHRydWUgaWYgdGhpcyBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzSGllcmFyY2hpY2FsKCkiPjxCPmlzSGllcmFyY2hpY2FsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI2lzSGllcmFyY2hpY2FsKCkiPjxCPmlzSGllcmFyY2hpY2FsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzTGVhZigpIj48Qj5pc0xlYWYoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNQcmVzZW50KCkiPjxCPmlzUHJlc2VudCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNpc1JlYWRhYmxlKCkiPjxCPmlzUmVhZGFibGUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNSZWxhdGl2ZSgpIj48Qj5pc1JlbGF0aXZlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPklTdGF0dXNIYW5kbGVyPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48REQ+UHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gcHJvY2VzaW5nLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjaXNWYWxpZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PEI+aXNWYWxpZChJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNXcml0YWJsZSgpIj48Qj5pc1dyaXRhYmxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjxERD5BIElVUkkgcmVwcmVzZW50cyBhIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZlci48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSUZhY3Rvcnk8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PEREPlRoaXMgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgSVVSSSBhbmQgSVVSSVNjaGVtZSBvYmplY3RzLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklGaWx0ZXI8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PEREPlRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBvciBsaXN0IFVSSXMuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSVNjaGVtZTwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48REQ+QSBJVVJJU2NoZW1lIHJlcHJlc2VudHMgYSBzaW5nbGUgc2NoZW1lIGZvciBzb21lIGEgZmFtaWx5IG9mCi0gVW5pdmVyYWwgUmVzb3VyY2UgSWRlbnRpZmllcnMuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklWaXNpdG9yPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjxERD5UaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgVVJJcy48L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC01Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE3N2Q0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUwtSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJMLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfTF8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkw8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjbGlzdCgpIj48Qj5saXN0KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+UmV0dXJucyBhIGxpc3Qgb2YgVVJJcyBmb3IgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLSBoaWVyYXJjaGljYWwsIG5vbi1sZWFmIElVUkkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3Qob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPjxCPmxpc3QoSVVSSUZpbHRlcik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+QXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpIj48Qj5sb2coaW50LCBpbnQsIE9iamVjdCwgU3RyaW5nLCBUaHJvd2FibGUpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPkxvZ3MgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkiPjxCPmxvZyhpbnQsIFN0cmluZywgaW50LCBPYmplY3QsIFN0cmluZywgVGhyb3dhYmxlKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5Mb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+bG9nKGludCwgaW50LCBPYmplY3QsIFN0cmluZywgSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+Ci08REQ+TG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPjxCPmxvZyhpbnQsIFN0cmluZywgaW50LCBPYmplY3QsIFN0cmluZywgSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+Ci08REQ+TG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+PEI+bG9nKGludCwgaW50LCBPYmplY3QsIFN0cmluZywgT2JqZWN0KTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5Mb2dzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+PEI+bG9nKGludCwgU3RyaW5nLCBpbnQsIE9iamVjdCwgU3RyaW5nLCBPYmplY3QpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPkxvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtNy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC03Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTM2ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC03Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotTi1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik4tSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC03Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9OXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+TjwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpIj48Qj5uZXdVUkkoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj48Qj5uZXdVUkkoVVJMKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpIj48Qj5uZXdVUkkoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPjxCPm5ld1VSSShVUkwpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCNuZXdVUkkob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPm5ld1VSSShJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpIj48Qj5uZXdVUkkoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj48Qj5uZXdVUkkoVVJMKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUklTY2hlbWUoamF2YS5sYW5nLlN0cmluZykiPjxCPm5ld1VSSVNjaGVtZShTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+Ci08REQ+Q3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5uZXdVUklTY2hlbWUoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+TnVsbFN0YXR1c0hhbmRsZXI8L0I+PC9BPiAtIENsYXNzIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PEREPlRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNOdWxsU3RhdHVzSGFuZGxlcigpIj48Qj5OdWxsU3RhdHVzSGFuZGxlcigpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPk51bGxTdGF0dXNIYW5kbGVyPC9BPgotPEREPiZuYnNwOwotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC03Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC04Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwZDcyYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1PLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iTy1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC03Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTguaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWFpbiI+PC9BPgotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX09fIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5PPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjT0siPjxCPk9LPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPlRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgT2suCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+IC0gcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PEREPiZuYnNwOzxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9BPiAtIHBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8REQ+Jm5ic3A7PC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC05Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC04Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC05Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4ODM4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1QLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iUC1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC05Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9QXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+UDwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNwYXJlbnQoKSI+PEI+cGFyZW50KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC05Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM4NjJiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2Mgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOC0tPgotPFRJVExFPgotR2VuZXJhdGVkIERvY3VtZW50YXRpb24gKFVudGl0bGVkKQotPC9USVRMRT4KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB0YXJnZXRQYWdlID0gIiIgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoOwotICAgIGlmICh0YXJnZXRQYWdlICE9ICIiICYmIHRhcmdldFBhZ2UgIT0gInVuZGVmaW5lZCIpCi0gICAgICAgdGFyZ2V0UGFnZSA9IHRhcmdldFBhZ2Uuc3Vic3RyaW5nKDEpOwotICAgIGZ1bmN0aW9uIGxvYWRGcmFtZXMoKSB7Ci0gICAgICAgIGlmICh0YXJnZXRQYWdlICE9ICIiICYmIHRhcmdldFBhZ2UgIT0gInVuZGVmaW5lZCIpCi0gICAgICAgICAgICAgdG9wLmNsYXNzRnJhbWUubG9jYXRpb24gPSB0b3AudGFyZ2V0UGFnZTsKLSAgICB9Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci08L0hFQUQ+Ci08RlJBTUVTRVQgY29scz0iMjAlLDgwJSIgdGl0bGU9IiIgb25Mb2FkPSJ0b3AubG9hZEZyYW1lcygpIj4KLTxGUkFNRVNFVCByb3dzPSIzMCUsNzAlIiB0aXRsZT0iIiBvbkxvYWQ9InRvcC5sb2FkRnJhbWVzKCkiPgotPEZSQU1FIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIgdGl0bGU9IkFsbCBQYWNrYWdlcyI+Ci08RlJBTUUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9InBhY2thZ2VGcmFtZSIgdGl0bGU9IkFsbCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIChleGNlcHQgbm9uLXN0YXRpYyBuZXN0ZWQgdHlwZXMpIj4KLTwvRlJBTUVTRVQ+Ci08RlJBTUUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiIHRpdGxlPSJQYWNrYWdlLCBjbGFzcyBhbmQgaW50ZXJmYWNlIGRlc2NyaXB0aW9ucyIgc2Nyb2xsaW5nPSJ5ZXMiPgotPE5PRlJBTUVTPgotPEgyPgotRnJhbWUgQWxlcnQ8L0gyPgotCi08UD4KLVRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgotPEJSPgotTGluayB0bzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Tm9uLWZyYW1lIHZlcnNpb24uPC9BPgotPC9OT0ZSQU1FUz4KLTwvRlJBTUVTRVQ+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDNiN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUNob2ljZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlIGNsYXNzIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJDaG9pY2UiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9DaG9pY2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkNob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvRk9OVD4KLTxCUj4KLUNsYXNzIENob2ljZTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5DaG9pY2U8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS4KLSBJdCBhbGxvd3MgY29kZSB0aGF0IGlzIHJlcG9ydGluZyBzdGF0dXMgdG8gc3BlY2lmeSBjaG9pY2VzIHRvIHRoZSB1c2VyCi0gd2hpY2ggdGhpcyByZXBvcnRpbmcgY29kZSBjYW4gcmVhY3QgdG8uCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2luY2U6PC9CPjwvRFQ+Ci0gIDxERD4xLjA8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNDaG9pY2UoKSI+Q2hvaWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29uc3RydWN0b3IgZm9yIENob2ljZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjQ2hvaWNlKGNoYXIsIGphdmEubGFuZy5TdHJpbmcpIj5DaG9pY2U8L0E+PC9CPihjaGFyJm5ic3A7c2hvcnRjdXQsCi0gICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2xhYmVsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29uc3RydWN0b3IgZm9yIENob2ljZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjQ2hvaWNlKGNoYXIsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj5DaG9pY2U8L0E+PC9CPihjaGFyJm5ic3A7c2hvcnRjdXQsCi0gICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2xhYmVsLAotICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZXNjcmlwdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NvbnN0cnVjdG9yIGZvciBDaG9pY2UuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjZ2V0RGVzY3JpcHRpb24oKSI+Z2V0RGVzY3JpcHRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtHZXRzIHRoZSBkZXNjcmlwdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI2dldExhYmVsKCkiPmdldExhYmVsPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7R2V0cyB0aGUgbGFiZWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2NoYXI8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNnZXRTaG9ydGN1dCgpIj5nZXRTaG9ydGN1dDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0dldHMgdGhlIHNob3J0Y3V0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykiPnNldERlc2NyaXB0aW9uPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2Rlc2NyaXB0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgZGVzY3JpcHRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TGFiZWw8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGFiZWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSBsYWJlbC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI3NldFNob3J0Y3V0KGNoYXIpIj5zZXRTaG9ydGN1dDwvQT48L0I+KGNoYXImbmJzcDtzaG9ydGN1dCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHNob3J0Y3V0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iQ2hvaWNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLUNob2ljZTwvSDM+Ci08UFJFPgotcHVibGljIDxCPkNob2ljZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkNvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi08UD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IkNob2ljZShjaGFyLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotQ2hvaWNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+Q2hvaWNlPC9CPihjaGFyJm5ic3A7c2hvcnRjdXQsCi0gICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCk8L1BSRT4KLTxETD4KLTxERD5Db25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnNob3J0Y3V0PC9DT0RFPiAtIHRoZSBzaW5nbGUgbGV0dGVyIHNob3J0Y3V0IGZvciB0aGlzIGNob2ljZS48REQ+PENPREU+bGFiZWw8L0NPREU+IC0gdGhlIGxhYmVsIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBjaG9pY2UuPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IkNob2ljZShjaGFyLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotQ2hvaWNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+Q2hvaWNlPC9CPihjaGFyJm5ic3A7c2hvcnRjdXQsCi0gICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCwKLSAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Rlc2NyaXB0aW9uKTwvUFJFPgotPERMPgotPEREPkNvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi08UD4KLTxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2hvcnRjdXQ8L0NPREU+IC0gdGhlIHNpbmdsZSBsZXR0ZXIgc2hvcnRjdXQgZm9yIHRoaXMgY2hvaWNlLjxERD48Q09ERT5sYWJlbDwvQ09ERT4gLSB0aGUgbGFiZWwgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciB0aGlzIGNob2ljZS48REQ+PENPREU+ZGVzY3JpcHRpb248L0NPREU+IC0gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNob2ljZS48L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRMYWJlbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRMYWJlbDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TGFiZWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5HZXRzIHRoZSBsYWJlbC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIGEgU3RyaW5nPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TGFiZWw8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldExhYmVsPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGFiZWwpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgbGFiZWwuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmxhYmVsPC9DT0RFPiAtIFRoZSBsYWJlbCB0byBzZXQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERlc2NyaXB0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERlc2NyaXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXREZXNjcmlwdGlvbjwvQj4oKTwvUFJFPgotPERMPgotPEREPkdldHMgdGhlIGRlc2NyaXB0aW9uLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgYSBTdHJpbmc8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXREZXNjcmlwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0RGVzY3JpcHRpb248L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZXNjcmlwdGlvbik8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBkZXNjcmlwdGlvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZGVzY3JpcHRpb248L0NPREU+IC0gVGhlIGRlc2NyaXB0aW9uIHRvIHNldDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U2hvcnRjdXQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2hvcnRjdXQ8L0gzPgotPFBSRT4KLXB1YmxpYyBjaGFyIDxCPmdldFNob3J0Y3V0PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+R2V0cyB0aGUgc2hvcnRjdXQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyBhIGNoYXI8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNob3J0Y3V0KGNoYXIpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRTaG9ydGN1dDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0U2hvcnRjdXQ8L0I+KGNoYXImbmJzcDtzaG9ydGN1dCk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBzaG9ydGN1dC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2hvcnRjdXQ8L0NPREU+IC0gVGhlIHNob3J0Y3V0IHRvIHNldDwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9DaG9pY2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkNob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGRkZmQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NSBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUVudmlyb25tZW50RXhjZXB0aW9uCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbiBjbGFzcyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRW52aXJvbm1lbnRFeGNlcHRpb24iOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBFbnZpcm9ubWVudEV4Y2VwdGlvbjwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+amF2YS5sYW5nLlRocm93YWJsZQotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5FeGNlcHRpb24KLSAgICAgICAgICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlPC9ERD4KLTwvREw+Ci08REw+Ci08RFQ+PEI+RGlyZWN0IEtub3duIFN1YmNsYXNzZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uPC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgY29uZGl0aW9ucyByYWlzZWQgYnkgdGhlIElFbnZpcm9ubWVudC4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50RXhjZXB0aW9uIj5TZXJpYWxpemVkIEZvcm08L0E+PC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI0Vudmlyb25tZW50RXhjZXB0aW9uKCkiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyBFbnZpcm9ubWVudEV4Y2VwdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCNFbnZpcm9ubWVudEV4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IEVudmlyb25tZW50RXhjZXB0aW9uLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI2dldFN0YXR1cygpIj5nZXRTdGF0dXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLlRocm93YWJsZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLlRocm93YWJsZTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmZpbGxJblN0YWNrVHJhY2UsIGdldENhdXNlLCBnZXRMb2NhbGl6ZWRNZXNzYWdlLCBnZXRNZXNzYWdlLCBnZXRTdGFja1RyYWNlLCBpbml0Q2F1c2UsIHByaW50U3RhY2tUcmFjZSwgcHJpbnRTdGFja1RyYWNlLCBwcmludFN0YWNrVHJhY2UsIHNldFN0YWNrVHJhY2UsIHRvU3RyaW5nPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJFbnZpcm9ubWVudEV4Y2VwdGlvbigpIj48IS0tIC0tPjwvQT48SDM+Ci1FbnZpcm9ubWVudEV4Y2VwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIDxCPkVudmlyb25tZW50RXhjZXB0aW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyBFbnZpcm9ubWVudEV4Y2VwdGlvbi4KLTxQPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iRW52aXJvbm1lbnRFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1FbnZpcm9ubWVudEV4Y2VwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIDxCPkVudmlyb25tZW50RXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IEVudmlyb25tZW50RXhjZXB0aW9uLgotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnN0YXR1czwvQ09ERT4gLSB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRTdGF0dXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U3RhdHVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgPEI+Z2V0U3RhdHVzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgU3RhdHVzIG9iamVjdC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkVudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzYTBiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU1IEVEVCAyMDA4IC0tPgotPFRJVExFPgotRW52aXJvbm1lbnRTZXJ2aWNlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2UgY2xhc3MiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkVudmlyb25tZW50U2VydmljZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0Vudmlyb25tZW50U2VydmljZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkVudmlyb25tZW50U2VydmljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvRk9OVD4KLTxCUj4KLUNsYXNzIEVudmlyb25tZW50U2VydmljZTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5FbnZpcm9ubWVudFNlcnZpY2U8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIGNyZWF0ZXMgYSBjb25zb2xlIGVudmlyb25tZW50LiAgSXQgYWxzbyBjb250YWlucyBzdGF0aWMKLSBjb252aWVuY2VzIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuIElMb2cgb2JqZWN0IGFzIHdlbGwgYXMgYW4gRWNsaXBzZSBhbmQKLSBGaWxlIFNjaGVtZS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI0Vudmlyb25tZW50U2VydmljZSgpIj5FbnZpcm9ubWVudFNlcnZpY2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUVudmlyb25tZW50PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI2dldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKSI+Z2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI2dldEVjbGlwc2VMb2coKSI+Z2V0RWNsaXBzZUxvZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwjZ2V0RWNsaXBzZVNjaGVtZSgpIj5nZXRFY2xpcHNlU2NoZW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNnZXRGaWxlU2NoZW1lKCkiPmdldEZpbGVTY2hlbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkVudmlyb25tZW50U2VydmljZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1FbnZpcm9ubWVudFNlcnZpY2U8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5FbnZpcm9ubWVudFNlcnZpY2U8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUVudmlyb25tZW50PC9BPiA8Qj5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgYW4gRWNsaXBzZSBjb25zb2xlIGVudmlyb25tZW50LjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0RWNsaXBzZUxvZygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRFY2xpcHNlTG9nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+IDxCPmdldEVjbGlwc2VMb2c8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJucyBhbiBFY2xpcHNlIGxvZ2dlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEVjbGlwc2VTY2hlbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RWNsaXBzZVNjaGVtZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+IDxCPmdldEVjbGlwc2VTY2hlbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJucyBhbiBFY2xpcHNlIHNjaGVtZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEZpbGVTY2hlbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RmlsZVNjaGVtZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+IDxCPmdldEZpbGVTY2hlbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJucyBhIEZpbGUgc2NoZW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJFbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjI0MjZlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTUgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1JRW52aXJvbm1lbnQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCBpbnRlcmZhY2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklFbnZpcm9ubWVudCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lFbnZpcm9ubWVudC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElFbnZpcm9ubWVudDwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklFbnZpcm9ubWVudDwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotQW4gSUVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgZ2V0dGluZyBhIAotIDxvbD4KLSA8bGk+QSBsb2cgZm9yIHdyaXRpbmcgbWVzc2FnZXMgdG8gYSBsb2dnaW5nIGZhY2lsaXR5LDwvbGk+Ci0gPGxpPkEgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgcmVjZWl2aW5nIHByb2dyZXNzIGluZm9ybWF0aW9uLDwvbGk+Ci0gPGxpPkEgc3RhdHVzIGhhbmRsZXIgZm9yIHJlY2VpdmluZyBhbmQgcHJvY2Vzc2luZyBzdGF0dXMgcmVwb3J0cyw8L2xpPgotIDxsaT5BIGZhY3RvcnkgZm9yIHRoZSBoYW5kbGluZyBvZiBVUklzIChyZXNvdXJjZXMpLjwvbGk+Ci0gPC9vbD4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCNnZXRMb2coKSI+Z2V0TG9nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIGxvZ2dpbmcgZmFjaWxpdHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCNnZXRTdGF0dXNIYW5kbGVyKCkiPmdldFN0YXR1c0hhbmRsZXI8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgc3RhdHVzIGhhbmRsZXIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sI2dldFVSSUZhY3RvcnkoKSI+Z2V0VVJJRmFjdG9yeTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBJVVJJIGZhY3RvcnkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRMb2coKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TG9nPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPiA8Qj5nZXRMb2c8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5yZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFN0YXR1c0hhbmRsZXIoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U3RhdHVzSGFuZGxlcjwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPiA8Qj5nZXRTdGF0dXNIYW5kbGVyPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIHN0YXR1cyBoYW5kbGVyLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgYSBzdGF0dXMgaGFuZGxlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFVSSUZhY3RvcnkoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VVJJRmFjdG9yeTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+IDxCPmdldFVSSUZhY3Rvcnk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgSVVSSSBmYWN0b3J5LgotIEhpbnQ6IEltcGxlbWVudGVycyBzaG91bGQgaW5zdXJlIHRoYXQgdGhlIEZhY3RvcnkgdGhleSByZXR1cm4KLSBoYXMgYSByZWZlcmVuY2UgdG8gdGhpcyBJRW52aXJvbm1lbnQgc28gdGhhdCBJVVJJIG9iamVjdHMgY2FuCi0gcmVwb3J0IHByb2dyZXNzIGFuZCBhbm5vdW5jZSBzdGF0dXMuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJucyBhIFVSSSBmYWN0b3J5LjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JRW52aXJvbm1lbnQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklFbnZpcm9ubWVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxMDhjZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NSBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUlMb2cKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cgaW50ZXJmYWNlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJTG9nIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSUxvZy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUxvZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJTG9nPC9IMj4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SUxvZzwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotSUxvZyBvYmplY3RzIHByb3ZpZGUgYSBtZWFucyBmb3IgbG9nZ2luZyBpbmZvcm1hdGlvbiBmb3IgRkZEQyBldGMuCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2luY2U6PC9CPjwvRFQ+Ci0gIDxERD4xLjA8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI0VSUk9SIj5FUlJPUjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIGFuIGVycm9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjSU5GTyI+SU5GTzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIGluZm9ybWF0aW9uYWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNPSyI+T0s8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBPay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI1dBUk5JTkciPldBUk5JTkc8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyB3YXJuaW5nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNpc0VuYWJsZWQoKSI+aXNFbmFibGVkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0cnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNpc0VuYWJsZWQoamF2YS5sYW5nLlN0cmluZykiPmlzRW5hYmxlZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtvcHRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRydWUgaWYgdGhpcyBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPmxvZzwvQT48L0I+KGludCZuYnNwO3NldmVyaXR5LAotICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO2NhbGxlciwKLSAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWV0aG9kLAotICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+bG9nPC9BPjwvQj4oaW50Jm5ic3A7c2V2ZXJpdHksCi0gICAgaW50Jm5ic3A7bWVzc2FnZU51bSwKLSAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXRob2QsCi0gICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0xvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpIj5sb2c8L0E+PC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICBpbnQmbmJzcDttZXNzYWdlTnVtLAotICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtjYWxsZXIsCi0gICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICBqYXZhLmxhbmcuVGhyb3dhYmxlJm5ic3A7dGhyb3dhYmxlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPmxvZzwvQT48L0I+KGludCZuYnNwO3NldmVyaXR5LAotICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtvcHRpb24sCi0gICAgaW50Jm5ic3A7bWVzc2FnZU51bSwKLSAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXRob2QsCi0gICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtMb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj5sb2c8L0E+PC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7b3B0aW9uLAotICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO2NhbGxlciwKLSAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWV0aG9kLAotICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtMb2dzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKSI+bG9nPC9BPjwvQj4oaW50Jm5ic3A7c2V2ZXJpdHksCi0gICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO29wdGlvbiwKLSAgICBpbnQmbmJzcDttZXNzYWdlTnVtLAotICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtjYWxsZXIsCi0gICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICBqYXZhLmxhbmcuVGhyb3dhYmxlJm5ic3A7dGhyb3dhYmxlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iT0siPjwhLS0gLS0+PC9BPjxIMz4KLU9LPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPk9LPC9CPjwvUFJFPgotPERMPgotPEREPlRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgT2suCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5PSyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJTkZPIj48IS0tIC0tPjwvQT48SDM+Ci1JTkZPPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklORk88L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBpbmZvcm1hdGlvbmFsLgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cuSU5GTyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJXQVJOSU5HIj48IS0tIC0tPjwvQT48SDM+Ci1XQVJOSU5HPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPldBUk5JTkc8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyB3YXJuaW5nLgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cuV0FSTklORyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJFUlJPUiI+PCEtLSAtLT48L0E+PEgzPgotRVJST1I8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+RVJST1I8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBhbiBlcnJvci4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nLkVSUk9SIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iaXNFbmFibGVkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzRW5hYmxlZDwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc0VuYWJsZWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRydWUgaWYgbG9nZ2luZyBpcyBlbmFibGVkLgotIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGF0dGVtcHRpbmcKLSBhIGNhbGwgdG8gb25lIG9mIHRoZSA8Y29kZT5sb2c8L2NvZGU+IG1ldGhvZHMsIGFzIHRoZXkgd2lsbAotIHF1aWV0bHkgZG8gbm90aGluZyBpZiBsb2dnaW5nIGlzIGRpc2FibGVkLiBUaGlzIG1ldGhvZCBjYW4gYmUKLSB1c2VmdWwsIGhvd2V2ZXIsIGFueXdoZXJlIHRoZSBjb3N0IG9mIGJ1aWxkaW5nIHVwIHRoZSBwYXJhbWV0ZXJzCi0gdG8gYSBsb2cgbWV0aG9kIG1pZ2h0IGJlIGhpZ2ggYW5kIGJlc3QgYXZvaWRlZCBleGNlcHQgd2hlbiBsb2dnaW5nCi0gaXMgZW5hYmxlZC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5UcnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZCwgYW5kIGZhbHNlIG90aGVyd2lzZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzRW5hYmxlZChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotaXNFbmFibGVkPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzRW5hYmxlZDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO29wdGlvbik8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRydWUgaWYgdGhpcyBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm9wdGlvbjwvQ09ERT4gLSB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlYnVnIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWxvZzwvSDM+Ci08UFJFPgotdm9pZCA8Qj5sb2c8L0I+KGludCZuYnNwO3NldmVyaXR5LAotICAgICAgICAgaW50Jm5ic3A7bWVzc2FnZU51bSwKLSAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtjYWxsZXIsCi0gICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWV0aG9kLAotICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZSZuYnNwO3Rocm93YWJsZSk8L1BSRT4KLTxETD4KLTxERD5Mb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2V2ZXJpdHk8L0NPREU+IC0gVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LjxERD48Q09ERT5tZXNzYWdlTnVtPC9DT0RFPiAtIFRoZSBtZXNzYWdlIG51bWJlci48REQ+PENPREU+Y2FsbGVyPC9DT0RFPiAtIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuPEREPjxDT0RFPm1ldGhvZDwvQ09ERT4gLSBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLjxERD48Q09ERT50aHJvd2FibGU8L0NPREU+IC0gVGhlIFRocm93YWJsZSB0byBsb2cuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpIj48IS0tIC0tPjwvQT48SDM+Ci1sb2c8L0gzPgotPFBSRT4KLXZvaWQgPEI+bG9nPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtvcHRpb24sCi0gICAgICAgICBpbnQmbmJzcDttZXNzYWdlTnVtLAotICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO2NhbGxlciwKLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXRob2QsCi0gICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlJm5ic3A7dGhyb3dhYmxlKTwvUFJFPgotPERMPgotPEREPkxvZ3MgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXZlcml0eTwvQ09ERT4gLSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuPEREPjxDT0RFPm9wdGlvbjwvQ09ERT4gLSB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuPEREPjxDT0RFPm1lc3NhZ2VOdW08L0NPREU+IC0gVGhlIG1lc3NhZ2UgbnVtYmVyLjxERD48Q09ERT5jYWxsZXI8L0NPREU+IC0gVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuPEREPjxDT0RFPnRocm93YWJsZTwvQ09ERT4gLSBUaGUgVGhyb3dhYmxlIHRvIGxvZy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1sb2c8L0gzPgotPFBSRT4KLXZvaWQgPEI+bG9nPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvUFJFPgotPERMPgotPEREPkxvZ3MgYSA8Y29kZT5TdGF0dXM8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXZlcml0eTwvQ09ERT4gLSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuPEREPjxDT0RFPm1lc3NhZ2VOdW08L0NPREU+IC0gVGhlIG1lc3NhZ2UgbnVtYmVyLjxERD48Q09ERT5jYWxsZXI8L0NPREU+IC0gVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuPEREPjxDT0RFPnN0YXR1czwvQ09ERT4gLSBUaGUgU3RhdHVzIHRvIGxvZy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1sb2c8L0gzPgotPFBSRT4KLXZvaWQgPEI+bG9nPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtvcHRpb24sCi0gICAgICAgICBpbnQmbmJzcDttZXNzYWdlTnVtLAotICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO2NhbGxlciwKLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXRob2QsCi0gICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD5Mb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2V2ZXJpdHk8L0NPREU+IC0gVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LjxERD48Q09ERT5vcHRpb248L0NPREU+IC0gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLjxERD48Q09ERT5tZXNzYWdlTnVtPC9DT0RFPiAtIFRoZSBtZXNzYWdlIG51bWJlci48REQ+PENPREU+Y2FsbGVyPC9DT0RFPiAtIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuPEREPjxDT0RFPm1ldGhvZDwvQ09ERT4gLSBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gVGhlIFN0YXR1cyB0byBsb2cuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1sb2c8L0gzPgotPFBSRT4KLXZvaWQgPEI+bG9nPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9QUkU+Ci08REw+Ci08REQ+TG9ncyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXZlcml0eTwvQ09ERT4gLSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuPEREPjxDT0RFPm1lc3NhZ2VOdW08L0NPREU+IC0gVGhlIG1lc3NhZ2UgbnVtYmVyLjxERD48Q09ERT5jYWxsZXI8L0NPREU+IC0gVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuPEREPjxDT0RFPm9iamVjdDwvQ09ERT4gLSBUaGUgT2JqZWN0IHRvIGxvZy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWxvZzwvSDM+Ci08UFJFPgotdm9pZCA8Qj5sb2c8L0I+KGludCZuYnNwO3NldmVyaXR5LAotICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO29wdGlvbiwKLSAgICAgICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9QUkU+Ci08REw+Ci08REQ+TG9ncyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXZlcml0eTwvQ09ERT4gLSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuPEREPjxDT0RFPm9wdGlvbjwvQ09ERT4gLSB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuPEREPjxDT0RFPm1lc3NhZ2VOdW08L0NPREU+IC0gVGhlIG1lc3NhZ2UgbnVtYmVyLjxERD48Q09ERT5jYWxsZXI8L0NPREU+IC0gVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuPEREPjxDT0RFPm9iamVjdDwvQ09ERT4gLSBUaGUgT2JqZWN0IHRvIGxvZy48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSUxvZy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUxvZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGM1NWRlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NSBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUlTdGF0dXNIYW5kbGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklTdGF0dXNIYW5kbGVyIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVN0YXR1c0hhbmRsZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJU3RhdHVzSGFuZGxlcjwvSDI+Ci08REw+Ci08RFQ+PEI+QWxsIEtub3duIEltcGxlbWVudGluZyBDbGFzc2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPk51bGxTdGF0dXNIYW5kbGVyPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JU3RhdHVzSGFuZGxlcjwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotUHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gcHJvY2VzaW5nLgotPFA+Ci0KLTxQPgotPERMPgotPERUPjxCPlNpbmNlOjwvQj48L0RUPgotICA8REQ+MS4wPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5yZXBvcnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSBjb250aW51ZSBvciBhYm9ydC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2VbXSkiPnJlcG9ydDwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzLAotICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+W10mbmJzcDtjaG9pY2VzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIGFuZCBzZXQgb2YgcG9zc2libGUgcmVzcG9uc2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRFcnJvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydEVycm9yPC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXBvcnQgdGhlIGdpdmVuIEVycm9yIFN0YXR1cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydEluZm88L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydCB0aGUgZ2l2ZW4gSW5mbyBTdGF0dXMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlW10pIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBvcnQ8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+IDxCPnJlcG9ydDwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMsCi0gICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+W10mbmJzcDtjaG9pY2VzKTwvUFJFPgotPERMPgotPEREPlJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBzdGF0dXMgdG8gcmVwb3J0LjxERD48Q09ERT5jaG9pY2VzPC9DT0RFPiAtIHRoZSBjaG9pY2VzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgdGhlIGNob2ljZSBtYWRlIGJ5IHRoZSB1c2VyL2hhbmRsZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBvcnQ8L0gzPgotPFBSRT4KLXZvaWQgPEI+cmVwb3J0PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cykKLSAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPlJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSBjb250aW51ZSBvciBhYm9ydC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBzdGF0dXMgdG8gcmVwb3J0LgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0NPREU+IC0gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaGFuZGxlciBkZWNpZGVzIHRoZSBjYWxsZXIKLSBzaG91bGQgc3RvcCBwcm9jZXNzaW5nLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBvcnRFcnJvcjwvSDM+Ci08UFJFPgotdm9pZCA8Qj5yZXBvcnRFcnJvcjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9QUkU+Ci08REw+Ci08REQ+UmVwb3J0IHRoZSBnaXZlbiBFcnJvciBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gdGhlIGVycm9yIHN0YXR1cyB0byByZXBvcnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotcmVwb3J0SW5mbzwvSDM+Ci08UFJFPgotdm9pZCA8Qj5yZXBvcnRJbmZvPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD5SZXBvcnQgdGhlIGdpdmVuIEluZm8gU3RhdHVzLiAgTm8gdXNlciBmZWVkYmFjayBpcyBwcm92aWRlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBpbmZvIHN0YXR1cyB0byByZXBvcnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lTdGF0dXNIYW5kbGVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmMDA1OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTUgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1OdWxsU3RhdHVzSGFuZGxlcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXIgY2xhc3MiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik51bGxTdGF0dXNIYW5kbGVyIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik51bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9GT05UPgotPEJSPgotQ2xhc3MgTnVsbFN0YXR1c0hhbmRsZXI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXI8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+TnVsbFN0YXR1c0hhbmRsZXI8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDxEVD5pbXBsZW1lbnRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjTnVsbFN0YXR1c0hhbmRsZXIoKSI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydDwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIHdpdGggaW1wbGllZCBvcHRpb25zIHRvIGVpdGhlcgotIGNvbnRpbnVlIG9yIGFib3J0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+cmVwb3J0PC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMsCi0gICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT5bXSZuYnNwO2Nob2ljZXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXBvcnRzIHRoZSBnaXZlbiBTdGF0dXMgYW5kIHNldCBvZiBwb3NzaWJsZSByZXNwb25zZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+cmVwb3J0RXJyb3I8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydCB0aGUgZ2l2ZW4gRXJyb3IgU3RhdHVzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+cmVwb3J0SW5mbzwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVwb3J0IHRoZSBnaXZlbiBJbmZvIFN0YXR1cy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik51bGxTdGF0dXNIYW5kbGVyKCkiPjwhLS0gLS0+PC9BPjxIMz4KLU51bGxTdGF0dXNIYW5kbGVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+TnVsbFN0YXR1c0hhbmRsZXI8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0icmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+PCEtLSAtLT48L0E+PEgzPgotcmVwb3J0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4gPEI+cmVwb3J0PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+W10mbmJzcDtjaG9pY2VzKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2VbXSkiPklTdGF0dXNIYW5kbGVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5SZXBvcnRzIHRoZSBnaXZlbiBTdGF0dXMgYW5kIHNldCBvZiBwb3NzaWJsZSByZXNwb25zZXMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2VbXSkiPnJlcG9ydDwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBzdGF0dXMgdG8gcmVwb3J0LjxERD48Q09ERT5jaG9pY2VzPC9DT0RFPiAtIHRoZSBjaG9pY2VzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgdGhlIGNob2ljZSBtYWRlIGJ5IHRoZSB1c2VyL2hhbmRsZXIuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PENPREU+b3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotcmVwb3J0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5yZXBvcnQ8L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5TdGF0dXNFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+SVN0YXR1c0hhbmRsZXI8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSBjb250aW51ZSBvciBhYm9ydC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+cmVwb3J0PC9BPjwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gdGhlIHN0YXR1cyB0byByZXBvcnQuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBoYW5kbGVyIGRlY2lkZXMgdGhlIGNhbGxlcgotIHNob3VsZCBzdG9wIHByb2Nlc3NpbmcuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PENPREU+b3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBvcnRFcnJvcjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+cmVwb3J0RXJyb3I8L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+SVN0YXR1c0hhbmRsZXI8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlJlcG9ydCB0aGUgZ2l2ZW4gRXJyb3IgU3RhdHVzLiAgTm8gdXNlciBmZWVkYmFjayBpcyBwcm92aWRlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5yZXBvcnRFcnJvcjwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBlcnJvciBzdGF0dXMgdG8gcmVwb3J0LjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRFcnJvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPjxDT0RFPklTdGF0dXNIYW5kbGVyLnJlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotcmVwb3J0SW5mbzwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+cmVwb3J0SW5mbzwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPklTdGF0dXNIYW5kbGVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5SZXBvcnQgdGhlIGdpdmVuIEluZm8gU3RhdHVzLiAgTm8gdXNlciBmZWVkYmFjayBpcyBwcm92aWRlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydEluZm88L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnN0YXR1czwvQ09ERT4gLSB0aGUgaW5mbyBzdGF0dXMgdG8gcmVwb3J0LjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PENPREU+SVN0YXR1c0hhbmRsZXIucmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9OdWxsU3RhdHVzSGFuZGxlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg5MWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTYgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1TdGF0dXNFeGNlcHRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbiBjbGFzcyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iU3RhdHVzRXhjZXB0aW9uIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU3RhdHVzRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJTdGF0dXNFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBTdGF0dXNFeGNlcHRpb248L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5UaHJvd2FibGUKLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRFeGNlcHRpb248L0E+Ci0gICAgICAgICAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlPC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+U3RhdHVzRXhjZXB0aW9uPC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCBieSBTdGF0dXNIYW5kbGVycyB0byB0ZWxsIHRoZWlyCi0gY2FsbGVycyB0aGF0IHByb2Nlc3Npbmcgc2hvdWxkIHN0b3AuCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2luY2U6PC9CPjwvRFQ+Ci0gIDxERD4xLjA8L0REPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb24iPlNlcmlhbGl6ZWQgRm9ybTwvQT48L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sI1N0YXR1c0V4Y2VwdGlvbihvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZSkiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Jm5ic3A7Y2hvaWNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5TdGF0dXNFeGNlcHRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwjU3RhdHVzRXhjZXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZSkiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzLAotICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Jm5ic3A7Y2hvaWNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gYW5kIHN0YXR1cyBvYmplY3QuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sI2dldENob2ljZSgpIj5nZXRDaG9pY2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRFeGNlcHRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRFeGNlcHRpb248L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI2dldFN0YXR1cygpIj5nZXRTdGF0dXM8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLlRocm93YWJsZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLlRocm93YWJsZTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmZpbGxJblN0YWNrVHJhY2UsIGdldENhdXNlLCBnZXRMb2NhbGl6ZWRNZXNzYWdlLCBnZXRNZXNzYWdlLCBnZXRTdGFja1RyYWNlLCBpbml0Q2F1c2UsIHByaW50U3RhY2tUcmFjZSwgcHJpbnRTdGFja1RyYWNlLCBwcmludFN0YWNrVHJhY2UsIHNldFN0YWNrVHJhY2UsIHRvU3RyaW5nPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1TdGF0dXNFeGNlcHRpb248L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5TdGF0dXNFeGNlcHRpb248L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gdGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlN0YXR1c0V4Y2VwdGlvbihvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZSkiPjwhLS0gLS0+PC9BPjxIMz4KLVN0YXR1c0V4Y2VwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIDxCPlN0YXR1c0V4Y2VwdGlvbjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4mbmJzcDtjaG9pY2UpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlLgotIFRoZSBDaG9pY2UgbWF5IGJlIG51bGwuCi08UD4KLTxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+Y2hvaWNlPC9DT0RFPiAtIHRoZSBjaG9pY2UgZm9yIHRoaXMgZXhjZXB0aW9uLjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlKSI+PCEtLSAtLT48L0E+PEgzPgotU3RhdHVzRXhjZXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+U3RhdHVzRXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4mbmJzcDtjaG9pY2UpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gYW5kIHN0YXR1cyBvYmplY3QuIFRoZSBDaG9pY2UgbWF5IGJlIG51bGwuCi08UD4KLTxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLjxERD48Q09ERT5jaG9pY2U8L0NPREU+IC0gdGhlIGNob2ljZSBmb3IgdGhpcyBleGNlcHRpb24uPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0Q2hvaWNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENob2ljZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+IDxCPmdldENob2ljZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRoZSBDaG9pY2Ugb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU3RhdHVzRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJTdGF0dXNFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9DaG9pY2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvQ2hvaWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTdmYjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9DaG9pY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZUNob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkNob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlN0YXR1c0V4Y2VwdGlvbi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNnZXRDaG9pY2UoKSI+Z2V0Q2hvaWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk51bGxTdGF0dXNIYW5kbGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+cmVwb3J0PC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMsCi0gICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT5bXSZuYnNwO2Nob2ljZXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVN0YXR1c0hhbmRsZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlW10pIj5yZXBvcnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPltdJm5ic3A7Y2hvaWNlcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk51bGxTdGF0dXNIYW5kbGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+cmVwb3J0PC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMsCi0gICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT5bXSZuYnNwO2Nob2ljZXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVN0YXR1c0hhbmRsZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlW10pIj5yZXBvcnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPltdJm5ic3A7Y2hvaWNlcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNvbnN0cnVjdG9ycyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwjU3RhdHVzRXhjZXB0aW9uKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlKSI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4mbmJzcDtjaG9pY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBDaG9pY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sI1N0YXR1c0V4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2UpIj5TdGF0dXNFeGNlcHRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPiZuYnNwO2Nob2ljZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIENob2ljZQotIGFuZCBzdGF0dXMgb2JqZWN0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlQ2hvaWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQ2hvaWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2U5ZmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbgotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbiI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJFbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRFeGNlcHRpb248L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5TdWJjbGFzc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCBieSBTdGF0dXNIYW5kbGVycyB0byB0ZWxsIHRoZWlyCi0gY2FsbGVycyB0aGF0IHByb2Nlc3Npbmcgc2hvdWxkIHN0b3AuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZUVudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Vudmlyb25tZW50U2VydmljZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJiNDY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZQotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2UiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1xjbGFzcy11c2VFbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJFbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lFbnZpcm9ubWVudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9JRW52aXJvbm1lbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzYzYzNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lFbnZpcm9ubWVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50PC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklFbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JRW52aXJvbm1lbnQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklFbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUVudmlyb25tZW50PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5FbnZpcm9ubWVudFNlcnZpY2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwjZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpIj5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lMb2cuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSUxvZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNlYTNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSUxvZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZwotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSUxvZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklMb2cuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkVudmlyb25tZW50U2VydmljZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNnZXRFY2xpcHNlTG9nKCkiPmdldEVjbGlwc2VMb2c8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SUVudmlyb25tZW50LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sI2dldExvZygpIj5nZXRMb2c8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSUxvZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklMb2cuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSVN0YXR1c0hhbmRsZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSVN0YXR1c0hhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmZWZlMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lTdGF0dXNIYW5kbGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcgotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1xjbGFzcy11c2VJU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCBpbXBsZW1lbnQgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JRW52aXJvbm1lbnQuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwjZ2V0U3RhdHVzSGFuZGxlcigpIj5nZXRTdGF0dXNIYW5kbGVyPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIHN0YXR1cyBoYW5kbGVyLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9OdWxsU3RhdHVzSGFuZGxlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9OdWxsU3RhdHVzSGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmRkNTgwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXIKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXIiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZU51bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Lk51bGxTdGF0dXNIYW5kbGVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXIKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJOdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9TdGF0dXNFeGNlcHRpb24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvU3RhdHVzRXhjZXB0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ODIyMDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9TdGF0dXNFeGNlcHRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbiI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZVN0YXR1c0V4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlN0YXR1c0V4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCB0aHJvdyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5OdWxsU3RhdHVzSGFuZGxlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydDwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVN0YXR1c0hhbmRsZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5yZXBvcnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSBjb250aW51ZSBvciBhYm9ydC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZVN0YXR1c0V4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlN0YXR1c0V4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLWZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTFlMDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IHBhY2thZ2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lVGl0bGVGb250Ij4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0ZPTlQ+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUludGVyZmFjZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJJRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklFbnZpcm9ubWVudDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JTG9nPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JU3RhdHVzSGFuZGxlcjwvST48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUNsYXNzZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJDaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+Q2hvaWNlPC9BPgotPEJSPgotPEEgSFJFRj0iRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkVudmlyb25tZW50U2VydmljZTwvQT4KLTxCUj4KLTxBIEhSRUY9Ik51bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk51bGxTdGF0dXNIYW5kbGVyPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1FeGNlcHRpb25zPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+RW52aXJvbm1lbnRFeGNlcHRpb248L0E+Ci08QlI+Ci08QSBIUkVGPSJTdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg5YmZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCBwYWNrYWdlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBQQUNLQUdFJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+TkVYVCBQQUNLQUdFPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLTwvSDI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+SW50ZXJmYWNlIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JRW52aXJvbm1lbnQ8L0E+PC9CPjwvVEQ+Ci08VEQ+QW4gSUVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgZ2V0dGluZyBhIAotIAotIEEgbG9nIGZvciB3cml0aW5nIG1lc3NhZ2VzIHRvIGEgbG9nZ2luZyBmYWNpbGl0eSwKLSBBIHByb2dyZXNzIG1vbml0b3IgZm9yIHJlY2VpdmluZyBwcm9ncmVzcyBpbmZvcm1hdGlvbiwKLSBBIHN0YXR1cyBoYW5kbGVyIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3Npbmcgc3RhdHVzIHJlcG9ydHMsCi0gQSBmYWN0b3J5IGZvciB0aGUgaGFuZGxpbmcgb2YgVVJJcyAocmVzb3VyY2VzKS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+PC9CPjwvVEQ+Ci08VEQ+SUxvZyBvYmplY3RzIHByb3ZpZGUgYSBtZWFucyBmb3IgbG9nZ2luZyBpbmZvcm1hdGlvbiBmb3IgRkZEQyBldGMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+PC9CPjwvVEQ+Ci08VEQ+UHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gcHJvY2VzaW5nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5DbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSBJU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRTZXJ2aWNlPC9BPjwvQj48L1REPgotPFREPlRoaXMgY2xhc3MgY3JlYXRlcyBhIGNvbnNvbGUgZW52aXJvbm1lbnQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5OdWxsU3RhdHVzSGFuZGxlcjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVN0YXR1c0hhbmRsZXIgaW50ZXJmYWNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FeGNlcHRpb24gU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgZm9yIGNvbmRpdGlvbnMgcmFpc2VkIGJ5IHRoZSBJRW52aXJvbm1lbnQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvQj48L1REPgotPFREPlRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIGJ5IFN0YXR1c0hhbmRsZXJzIHRvIHRlbGwgdGhlaXIKLSBjYWxsZXJzIHRoYXQgcHJvY2Vzc2luZyBzaG91bGQgc3RvcC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci08REw+Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgUEFDS0FHRSZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPk5FWFQgUEFDS0FHRTwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS10cmVlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS10cmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODZmYmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdHJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQgQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCBDbGFzcyBIaWVyYXJjaHkiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS10cmVlLmh0bWwiPjxCPk5FWFQ8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci1IaWVyYXJjaHkgRm9yIFBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudAotPC9IMj4KLTwvQ0VOVEVSPgotPERMPgotPERUPjxCPlBhY2thZ2UgSGllcmFyY2hpZXM6PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy10cmVlLmh0bWwiPkFsbCBQYWNrYWdlczwvQT48L0RMPgotPEhSPgotPEgyPgotQ2xhc3MgSGllcmFyY2h5Ci08L0gyPgotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLk9iamVjdDxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPkNob2ljZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+RW52aXJvbm1lbnRTZXJ2aWNlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk51bGxTdGF0dXNIYW5kbGVyPC9CPjwvQT4gKGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+KQotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLlRocm93YWJsZSAoaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSkKLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5FeGNlcHRpb248VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPkVudmlyb25tZW50RXhjZXB0aW9uPC9CPjwvQT48VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5TdGF0dXNFeGNlcHRpb248L0I+PC9BPjwvVUw+Ci08L1VMPgotPC9VTD4KLTwvVUw+Ci08L1VMPgotPEgyPgotSW50ZXJmYWNlIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5JRW52aXJvbm1lbnQ8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUxvZzwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SVN0YXR1c0hhbmRsZXI8L0I+PC9BPjwvVUw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtdHJlZS5odG1sIj48Qj5ORVhUPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXVzZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdXNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmEyM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIFBhY2thZ2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Nob2ljZS5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPkNob2ljZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+RW52aXJvbm1lbnRFeGNlcHRpb248L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIGZvciBjb25kaXRpb25zIHJhaXNlZCBieSB0aGUgSUVudmlyb25tZW50LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSUVudmlyb25tZW50Lmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUVudmlyb25tZW50PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FuIElFbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgbWVhbnMgZm9yIGdldHRpbmcgYSAKLSAKLSBBIGxvZyBmb3Igd3JpdGluZyBtZXNzYWdlcyB0byBhIGxvZ2dpbmcgZmFjaWxpdHksCi0gQSBwcm9ncmVzcyBtb25pdG9yIGZvciByZWNlaXZpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24sCi0gQSBzdGF0dXMgaGFuZGxlciBmb3IgcmVjZWl2aW5nIGFuZCBwcm9jZXNzaW5nIHN0YXR1cyByZXBvcnRzLAotIEEgZmFjdG9yeSBmb3IgdGhlIGhhbmRsaW5nIG9mIFVSSXMgKHJlc291cmNlcykuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9JTG9nLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUxvZzwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJTG9nIG9iamVjdHMgcHJvdmlkZSBhIG1lYW5zIGZvciBsb2dnaW5nIGluZm9ybWF0aW9uIGZvciBGRkRDIGV0Yy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lTdGF0dXNIYW5kbGVyLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SVN0YXR1c0hhbmRsZXI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gcHJvY2VzaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvU3RhdHVzRXhjZXB0aW9uLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+U3RhdHVzRXhjZXB0aW9uPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIGJ5IFN0YXR1c0hhbmRsZXJzIHRvIHRlbGwgdGhlaXIKLSBjYWxsZXJzIHRoYXQgcHJvY2Vzc2luZyBzaG91bGQgc3RvcC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiMTJmOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTYgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1JVVJJCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSBpbnRlcmZhY2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklVUkkiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIENMQVNTJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUkkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElVUkk8L0gyPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JVVJJPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1BIElVUkkgcmVwcmVzZW50cyBhIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZlci4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXBwZW5kKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5hcHBlbmQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7cmVsYXRpdmVVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5pby5GaWxlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhc0ZpbGUoKSI+YXNGaWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2FzU3RyaW5nKCkiPmFzU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubmV0LlVSTDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXNVUkwoKSI+YXNVUkw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZXJhc2UoKSI+ZXJhc2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtFcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmlvLklucHV0U3RyZWFtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNnZXRJbnB1dFN0cmVhbSgpIj5nZXRJbnB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmlvLk91dHB1dFN0cmVhbTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZ2V0T3V0cHV0U3RyZWFtKCkiPmdldE91dHB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNnZXRVUklTY2hlbWUoKSI+Z2V0VVJJU2NoZW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzQXZhaWxhYmxlQXNGaWxlKCkiPmlzQXZhaWxhYmxlQXNGaWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzQXZhaWxhYmxlQXNVUkwoKSI+aXNBdmFpbGFibGVBc1VSTDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNpc0hpZXJhcmNoaWNhbCgpIj5pc0hpZXJhcmNoaWNhbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNpc0xlYWYoKSI+aXNMZWFmPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzUHJlc2VudCgpIj5pc1ByZXNlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNSZWFkYWJsZSgpIj5pc1JlYWRhYmxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzUmVsYXRpdmUoKSI+aXNSZWxhdGl2ZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNpc1dyaXRhYmxlKCkiPmlzV3JpdGFibGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNsaXN0KCkiPmxpc3Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiBVUklzIGZvciB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotIGhpZXJhcmNoaWNhbCwgbm9uLWxlYWYgSVVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNsaXN0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIpIj5saXN0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FzIGZvciBsaXN0KCksIGV4Y2VwdCBvbmx5IFVSSXMgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuCi0gZmlsdGVyIGFyZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3BhcmVudCgpIj5wYXJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjcmVuYW1lKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5yZW5hbWU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7bmV3VVJJKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVuYW1lcyBvciBtb3ZlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkKLSB0byB0aGUgbmV3IElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3RvU3RyaW5nKCkiPnRvU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3RvdWNoRm9sZGVyKCkiPnRvdWNoRm9sZGVyPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyBmb2xkZXIgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIGlkZW50aWZpZWQgYnkKLSB0aGUgSVVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjdG91Y2hMZWFmKCkiPnRvdWNoTGVhZjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcsIGVtcHR5IHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gdGhlIElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmlzaXRzIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBkZWNlbmRhbnRzIGluIHByZS1vcmRlciBmYXNoaW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvciwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPnZpc2l0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+Jm5ic3A7dXJpVmlzaXRvciwKLSAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZpbHRlcjwvQT4mbmJzcDt1cmlGaWx0ZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBcyBmb3IgdmlzaXQoSVVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlciBhcmUgdmlzaXRlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InRvU3RyaW5nKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXRvU3RyaW5nPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgSVVSSS4KLSBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRVUklTY2hlbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VVJJU2NoZW1lPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+IDxCPmdldFVSSVNjaGVtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRoZSBJVVJJU2NoZW1lIGZvciB0aGUgc2NoZW1lIG9mIHRoaXMgSVVSSS4KLSBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1ByZXNlbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNQcmVzZW50PC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzUHJlc2VudDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0xlYWYoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNMZWFmPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzTGVhZjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMKLSBhbmQgaXMgYSBsZWFmLiBSZXR1cm5zIHRydWUgYWx3YXlzIGZvciBub24taGllcmFyY2hpY2FsIHNjaGVtZXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1JlYWRhYmxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzUmVhZGFibGU8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+aXNSZWFkYWJsZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMKLSBhbmQgaXMgcmVhZGFibGUuIEEgcmVhZGFibGUgbGVhZiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBhbgotIGlucHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSByZWFkYWJsZSBmb2xkZXIKLSByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGZvbGRlciwgaWYgYW55LAotIGNhbiBiZSBkZXRlcm1pbmVkIHZpYSB0aGUgbGlzdCgpIG9yIHZpc2l0KCkgbWV0aG9kcy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzV3JpdGFibGUoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNXcml0YWJsZTwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc1dyaXRhYmxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJIGV4aXN0cwotIGFuZCBpcyB3cml0YWJsZS4gQSB3cml0YWJsZSBsZWFmIHJlc291cmNlIGluZGljYXRlcyB0aGF0IGFuCi0gb3V0cHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSB3cml0YWJsZSBmb2xkZXIKLSByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBuZXcgcmVzb3VyY2VzIGNhbiBiZSBjcmVhdGVkIGluIHRoZSBmb2xkZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0hpZXJhcmNoaWNhbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0hpZXJhcmNoaWNhbDwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc0hpZXJhcmNoaWNhbDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWZmIHRoaXMgSVVSSSBiZWxvbmdzIHRvIGEgaGllcmFyY2hpY2FsIHNjaGVtZS4KLSBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gdGhpcy5pc0hpZXJhcmNoaWNhbCgpID09IHRoaXMuZ2V0VVJJU2NoZW1lKCkuaXNIaWVyYXJjaGljYWwoKS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzUmVsYXRpdmUoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNSZWxhdGl2ZTwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc1JlbGF0aXZlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdHJ1ZSBpZmYgdGhpcyBJVVJJIGlzIGEgcmVsYXRpdmUgSVVSSS4KLSBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJwYXJlbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotcGFyZW50PC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPnBhcmVudDwvQj4oKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyB0aGUgSVVSSSBvZiB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhpcyBJVVJJLgotIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgdGhlcmUgaXMgbm8gcGFyZW50IFVSSS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFwcGVuZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PCEtLSAtLT48L0E+PEgzPgotYXBwZW5kPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPmFwcGVuZDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3JlbGF0aXZlVVJJKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlbGF0aXZlVVJJPC9DT0RFPiAtIGEgcmVsYXRpdmUgVVJJLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIGEgbmV3LCBub3JtYWxpemVkIElVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4KLSByZWxhdGl2ZSBJVVJJIHRvIHRoaXMgSVVSSS4gQm90aCBVUklzIG11c3QgYmUgaGllcmFyY2hpY2FsLgotIFRoZSByZXN1bHRpbmcgSVVSSSB3aWxsIGFsd2F5cyBiZSBoaWVyYXJjaGljYWwuIFRoZSBnaXZlbgotIElVUkkgbXVzdCBiZSByZWxhdGl2ZS4gVGhpcyBJVVJJIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4KLSB0aGUgcmVzdWx0aW5nIElVUkkgd2lsbCBiZSBlcXVpdmFsZW50bHkgcmVsYXRpdmUgb3IgYWJzb2x1dGUuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIHJlbGF0aXZlVVJJIGlzIG5vdCByZWxhdGl2ZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElucHV0U3RyZWFtKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElucHV0U3RyZWFtPC9IMz4KLTxQUkU+Ci1qYXZhLmlvLklucHV0U3RyZWFtIDxCPmdldElucHV0U3RyZWFtPC9CPigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPkdldHMgYW4gSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcgZnJvbSB0aGUgcmVzb3VyY2UKLSBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIElVUkkuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGEgc3RyZWFtIGZvciB0aGlzIFVSSSBjYW4gbm90IGJlIGNyZWF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRPdXRwdXRTdHJlYW0oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0T3V0cHV0U3RyZWFtPC9IMz4KLTxQUkU+Ci1qYXZhLmlvLk91dHB1dFN0cmVhbSA8Qj5nZXRPdXRwdXRTdHJlYW08L0I+KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5HZXRzIGFuIE91dHB1dFN0cmVhbSBmb3Igd3JpdGluZyB0byB0aGUgcmVzb3VyY2UKLSBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIElVUkkuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGEgc3RyZWFtIGZvciB0aGlzIFVSSSBjYW4gbm90IGJlIGNyZWF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ0b3VjaExlYWYoKSI+PCEtLSAtLT48L0E+PEgzPgotdG91Y2hMZWFmPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnRvdWNoTGVhZjwvQj4oKQotICAgICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotIHRoZSBJVVJJLiBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IHRydWUuIElmIGEgbGVhZgotIHJlc291cmNlIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEKLSBub24tbGVhZiByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyB1bmRlciB0aGlzIElVUkksIGNyZWF0aW9uCi0gd2lsbCBmYWlsIGFuZCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIHRvdWNoaW5nIHRoaXMgbGVhZiByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InRvdWNoRm9sZGVyKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXRvdWNoRm9sZGVyPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnRvdWNoRm9sZGVyPC9CPigpCi0gICAgICAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyBmb2xkZXIgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIGlkZW50aWZpZWQgYnkKLSB0aGUgSVVSSS4gVGhlIHNjaGVtZSBvZiB0aGUgSVVSSSBtdXN0IGJlIGhpZXJhcmNoaWNhbC4KLSBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IGZhbHNlLiBJZiBhIGZvbGRlciByZXNvdXJjZQotIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEgbGVhZiByZXNvdXJjZQotIGFscmVhZHkgZXhpc3RzIHVuZGVyIHRoaXMgSVVSSSwgY3JlYXRpb24gd2lsbCBmYWlsIGFuZCBhbgotIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpZiBhbiBlcnJvciBvY2N1cnMgdG91Y2hpbmcgdGhpcyBmb2xkZXIgcmVzb3VyY2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJlcmFzZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1lcmFzZTwvSDM+Ci08UFJFPgotdm9pZCA8Qj5lcmFzZTwvQj4oKQotICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkVyYXNlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIGVyYXNpbmcgdGhpcyByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbmFtZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PCEtLSAtLT48L0E+PEgzPgotcmVuYW1lPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnJlbmFtZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO25ld1VSSSkKLSAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+UmVuYW1lcyBvciBtb3ZlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkKLSB0byB0aGUgbmV3IElVUkkuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5ld1VSSTwvQ09ERT4gLSB0aGUgbmV3IFVSSSBuYW1lIGZvciB0aGlzIFVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIHJlbmFtaW5nIHRoaXMgcmVzb3VyY2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZpc2l0PC9IMz4KLTxQUkU+Ci12b2lkIDxCPnZpc2l0PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yKQotICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPlZpc2l0cyB0aGlzIHJlc291cmNlIGFuZCBpdHMgZGVjZW5kYW50cyBpbiBwcmUtb3JkZXIgZmFzaGlvbi4KLSBGb3IgZWFjaCByZXNvdXJjZSwgd2hldGhlciBhIGZvbGRlciBvciBhIGxlYWYsIHRoZSBnaXZlbgotIElVUklWaXNpdG9yJ3MgdmlzaXQoKSBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIElVUkkgb2YgdGhlCi0gcmVzb3VyY2UuIElmIElVUklWaXNpdG9yLnZpc2l0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHZpc2l0aW5nCi0gYWxnb3JpdGhtIHdpbGwgInBydW5lIiB0aGUgZGVjZW5kYW50cyBvZiB0aGUgcmVzb3VyY2UgYW5kCi0gY2Fycnkgb24gdmlzaXRpbmcgdGhlIHJlc3Qgb2YgdGhlIHRyZWUuIElmIElVUklWaXNpdG9yLnZpc2l0KCkKLSByZXR1cm5zIHRydWUsIHRoZSB2aXNpdGluZyBhbGdvcml0aG0gd2lsbCBjb250aW51ZSBpdHMgd2FsawotIGRvd24gdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaVZpc2l0b3I8L0NPREU+IC0gdGhlIHZpc2l0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCByZXNvdXJjZSB2aXNpdGVkLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpZiBhbiBlcnJvciBvY2N1cnMgdmlzaXRpbmcgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmlzaXQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3IsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIpIj48IS0tIC0tPjwvQT48SDM+Ci12aXNpdDwvSDM+Ci08UFJFPgotdm9pZCA8Qj52aXNpdDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+Jm5ic3A7dXJpVmlzaXRvciwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcikKLSAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD5BcyBmb3IgdmlzaXQoSVVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlciBhcmUgdmlzaXRlZC4gSWYgYSBmb2xkZXIgcmVzb3VyY2UKLSBmYWlscyB0byBiZSBhY2NlcHRlZCBieSB0aGUgZmlsdGVyLCB0aGlzIHdpbGwgbm90IHByZXZlbnQgdGhlCi0gdmlzaXRpbmcgYWxnb3JpdGhtIGZyb20gd2Fsa2luZyB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cy4KLSBJdCByZW1haW5zIHRoZSBqb2Igb2YgdGhlIHZpc2l0b3IgdG8gY2hvb3NlIHdoZXRoZXIgb3Igbm90IHRvCi0gcHJ1bmUgYSBicmFuY2ggYnkgcmV0dXJuaW5nIGZhbHNlIG9yIHRydWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaVZpc2l0b3I8L0NPREU+IC0gdGhlIHZpc2l0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCByZXNvdXJjZSB2aXNpdGVkLjxERD48Q09ERT51cmlGaWx0ZXI8L0NPREU+IC0gdGhlIHJlc291cmNlIGZpbHRlci4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIHZpc2l0aW5nIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbi48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Imxpc3QoKSI+PCEtLSAtLT48L0E+PEgzPgotbGlzdDwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPltdIDxCPmxpc3Q8L0I+KCkKLSAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIGxpc3Qgb2YgVVJJcyBmb3IgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLSBoaWVyYXJjaGljYWwsIG5vbi1sZWFmIElVUkkuIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCwKLSB0aG91Z2ggaXQgbWF5IHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5LgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgdGhlIGNoaWxkcmVuIGZvciB0aGlzIFVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIGxvY2F0aW5nIHRoZSBjaGlsZHJlbiBmb3IgdGhpcyBVUkkuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsaXN0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIpIj48IS0tIC0tPjwvQT48SDM+Ci1saXN0PC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W10gPEI+bGlzdDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcikKLSAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+QXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLAotIHRob3VnaCBpdCBtYXkgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaUZpbHRlcjwvQ09ERT4gLSB0aGUgY2hpbGQgZmlsdGVyLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5yZXR1cm5zIHRoZSBmaWx0ZXJlZCBjaGlsZHJlbiBmb3IgdGhpcyBVUkkuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGFuIGVycm9yIG9jY3VycyBsb2NhdGluZyB0aGUgY2hpbGRyZW4gZm9yIHRoaXMgVVJJLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNBdmFpbGFibGVBc1VSTCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0F2YWlsYWJsZUFzVVJMPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzQXZhaWxhYmxlQXNVUkw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyB0cnVlIGlmIHRoZSBhc1VSTCgpIG1ldGhvZCBpcyBmYWlyIGdhbWUsCi0gaW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgSVVSSSBjYW4gYmUgY29udmVydGVkIGludG8gYSBVUkwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhc1VSTCgpIj48IS0tIC0tPjwvQT48SDM+Ci1hc1VSTDwvSDM+Ci08UFJFPgotamF2YS5uZXQuVVJMIDxCPmFzVVJMPC9CPigpCi0gICAgICAgICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyBhIFVSTCBvYmplY3QgZm9yIHRoZSByZXNvdXJjZSB1bmRlciB0aGlzIElVUkkuCi0gVGhlcmUgYXJlIG1hbnkgVVJJcyBhbmQgVVJJU2NoZW1lcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QKLSB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIHJlcHJlc2VudGFibGUgYXMgVVJMcy4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIHJldHVybmluZyB0aGlzIFVSTC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzQXZhaWxhYmxlQXNGaWxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQXZhaWxhYmxlQXNGaWxlPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzQXZhaWxhYmxlQXNGaWxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdHJ1ZSBpZiB0aGUgYXNGaWxlKCkgbWV0aG9kIGlzIGZhaXIgZ2FtZSwKLSBpbiBvdGhlciB3b3JkcywgaWYgdGhpcyBJVVJJIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIEZpbGUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhc0ZpbGUoKSI+PCEtLSAtLT48L0E+PEgzPgotYXNGaWxlPC9IMz4KLTxQUkU+Ci1qYXZhLmlvLkZpbGUgPEI+YXNGaWxlPC9CPigpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgYSBGaWxlIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgSVVSSS4KLSBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gaW4gY2FzZXMgd2hlcmUgVVJJcyBhcmUga25vd24gdG8gYmUgYmFja2VkIGJ5IHBoeXNpY2FsIGZpbGVzLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpZiBhbiBlcnJvciBvY2N1cnMgcmV0dXJuaW5nIHRoaXMgRmlsZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzU3RyaW5nKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFzU3RyaW5nPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmFzU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdGhlIElVUkkgYXMgYSBzdHJpbmcuCi0gRXF1aXZhbGVudCB0byB0b1N0cmluZygpLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIENMQVNTJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUkkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjc1ZTE5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTYgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1JVVJJRmFjdG9yeQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGYWN0b3J5IGludGVyZmFjZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVVSSUZhY3RvcnkiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJRmFjdG9yeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElVUklGYWN0b3J5PC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgS25vd24gSW1wbGVtZW50aW5nIENsYXNzZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklVUklGYWN0b3J5PC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IElVUkkgYW5kIElVUklTY2hlbWUgb2JqZWN0cy4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUklTY2hlbWUoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSVNjaGVtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzY2hlbWVPclVSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLW5ld1VSSTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiA8Qj5uZXdVUkk8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpCi0gICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dXJpPC9DT0RFPiAtIHRoZSB1cmkgdG8gYmUgY3JlYXRlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG5ldyBVUkkuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIHRoZSB1cmkgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbGlkIFVSSS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Im5ld1VSSShqYXZhLm5ldC5VUkwpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUkk8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4gPEI+bmV3VVJJPC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpCi0gICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dXJsPC9DT0RFPiAtIHRoZSB1cmwgdG8gdXNlIHRvIGNyZWF0ZSB0aGlzIFVSSQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbmV3IFVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgdGhlIHVybCBwYXJhbWV0ZXIgaXMgbm90IGEgdmFsaWQgdXJsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUklTY2hlbWU8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT4gPEI+bmV3VVJJU2NoZW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c2NoZW1lT3JVUkkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuCi0gSWYgdGhlIHN0cmluZyBjb250YWlucyBubyBjb2xvbnMsIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGludGVycHJldHRlZAotIGFzIHRoZSBuYW1lIG9mIHRoZSBzY2hlbWUuIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYSBjb2xvbiwgdGhlbiB0aGUKLSBzdWJzdHJpbmcgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgZmlyc3QgY29sb24gaXMgaW50ZXJwcmV0dGVkIGFzIHRoZQotIG5hbWUgb2YgdGhlIHNjaGVtZSwgbWVhbmluZyB0aGUgY2FsbGVyIGNhbiBwYXNzIGluIGFueSBJVVJJIHN0cmluZyBpbgotIG9yZGVyIHRvIGdldCBhIElVUklTY2hlbWUgb2JqZWN0LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zY2hlbWVPclVSSTwvQ09ERT4gLSB0aGUgc2NoZW1lIG9yIFVSSSBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgc2NoZW1lLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbmV3IFNjaGVtZS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgc2NoZW1lT3JVcmkgcGFyYW1ldGVyIGRvZXMgbm90IGNvbnRhaW4KLSBhIHZhbGlkIHNjaGVtZSBvciBVUkkgbmFtZS48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVVSSUZhY3RvcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklGYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MzQ2YjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU2IEVEVCAyMDA4IC0tPgotPFRJVExFPgotSVVSSUZpbHRlcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIgaW50ZXJmYWNlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJVVJJRmlsdGVyIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVVSSUZpbHRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSUZpbHRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVVSSUZpbHRlcjwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklVUklGaWx0ZXI8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBvciBsaXN0IFVSSXMuCi0gUmVmZXIgdG8gPENPREU+SVVSSSNnZXRDaGlsZHJlbjwvQ09ERT4uCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2luY2U6PC9CPjwvRFQ+Ci0gIDxERD4xLjA8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sI2FjY2VwdHMob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPmFjY2VwdHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RmlsdGVycyB0aGUgZ2l2ZW4gSVVSSS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFjY2VwdHMob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjwhLS0gLS0+PC9BPjxIMz4KLWFjY2VwdHM8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+YWNjZXB0czwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkZpbHRlcnMgdGhlIGdpdmVuIElVUkkuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdG8gZmlsdGVyLjxERD48Q09ERT51cmk8L0NPREU+IC0gdGhlIHVyaSB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlRydWUgaWYgdGhlIHJlc291cmNlIG1hdGNoZXMgdGhlIGZpbHRlciwKLSBmYWxzZSBpZiBpdCBkb2VzIG5vdC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gSWYgdGhlIGZpbHRlciBmYWlscyB0byBhbmFseXplIHRoZSByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVVSSUZpbHRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSUZpbHRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVkNGYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NiBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUlVUklTY2hlbWUKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lIGludGVyZmFjZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVVSSVNjaGVtZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklTY2hlbWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElVUklTY2hlbWU8L0gyPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JVVJJU2NoZW1lPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1BIElVUklTY2hlbWUgcmVwcmVzZW50cyBhIHNpbmdsZSBzY2hlbWUgZm9yIHNvbWUgYSBmYW1pbHkgb2YKLSBVbml2ZXJhbCBSZXNvdXJjZSBJZGVudGlmaWVycy4gRXhhbXBsZXMgaW5jbHVkZSAiZmlsZSIsICJodHRwIgotIGFuZCAicGxhdGZvcm0iIChFY2xpcHNlKS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjaXNIaWVyYXJjaGljYWwoKSI+aXNIaWVyYXJjaGljYWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjaXNWYWxpZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+aXNWYWxpZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5uZXdVUkk8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCNuZXdVUkkoamF2YS5uZXQuVVJMKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5uZXQuVVJMJm5ic3A7dXJsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI3RvU3RyaW5nKCkiPnRvU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLW5ld1VSSTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiA8Qj5uZXdVUkk8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpCi0gICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dXJpPC9DT0RFPiAtIHRoZSBVUkkgdG8gYmUgY3JlYXRlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyBhIG5ldyBJVVJJLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpZiB0aGUgdXJpIHNwZWNpZmllZCBpcyBub3QgdmFsaWQgb3IKLSBjYW4gbm90IGJlIGNyZWF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJuZXdVUkkoamF2YS5uZXQuVVJMKSI+PCEtLSAtLT48L0E+PEgzPgotbmV3VVJJPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPm5ld1VSSTwvQj4oamF2YS5uZXQuVVJMJm5ic3A7dXJsKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVybDwvQ09ERT4gLSB0aGUgdXJsIHVzZWQgdG8gY3JlYXRlIHRoZSBVUkkuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgYSBuZXcgSVVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgdGhlIHVybCBzcGVjaWZpZWQgaXMgbm90IHZhbGlkIG9yCi0gY2FuIG5vdCBiZSBjcmVhdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibmV3VVJJKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUkk8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4gPEI+bmV3VVJJPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaTwvQ09ERT4gLSB0aGUgVVJJIHRvIGJlIGNyZWF0ZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgYSBuZXcgSVVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgdGhlIHVyaSBzcGVjaWZpZWQgaXMgbm90IHZhbGlkIG9yCi0gY2FuIG5vdCBiZSBjcmVhdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+dG9TdHJpbmc8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+dG9TdHJpbmc8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEubGFuZy5PYmplY3Q8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdGhlIHByb3BlciBuYW1lIG9mIHRoZSBzY2hlbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0hpZXJhcmNoaWNhbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0hpZXJhcmNoaWNhbDwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc0hpZXJhcmNoaWNhbDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBzY2hlbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1ZhbGlkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj48IS0tIC0tPjwvQT48SDM+Ci1pc1ZhbGlkPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzVmFsaWQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT51cmk8L0NPREU+IC0gdGhlIHVyaSB0byBjaGVjayBmb3IgdmFsaWRpdHkuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gSVVSSSBzYXRpc2ZpZXMgdGhlCi0gZ3JhbW1hdGljYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBzY2hlbWUuIEFic29sdXRlIFVSSXMgbXVzdAotIGJlZ2luIHdpdGggIjxzY2hlbWU+OiIuIFJlbGF0aXZlIFVSSXMgbXVzdCBlaXRoZXIgbm90IGNvbnRhaW4KLSBhIGNvbG9uLCAiOiIsIG9yIGl0IG11c3QgYmVnaW4gd2l0aCAiLi8iLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyA8Qj52YWxpZGF0ZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaTwvQ09ERT4gLSB0aGUgdXJpIHRvIGNoZWNrIGZvciB2YWxpZGl0eS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyBhIFN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4KLSBJVVJJIGlzIHZhbGlkLiBUaGUgc2V2ZXJpdHkgYW5kIG1lc3NhZ2Ugb2YgdGhlIFN0YXR1cyBvYmplY3QKLSB3aWxsIGRlc2NyaWJlIHRoaXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklTY2hlbWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUzZTA3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTYgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1JVVJJVmlzaXRvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yIGludGVyZmFjZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVVSSVZpc2l0b3IiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJVmlzaXRvci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVVSSVZpc2l0b3I8L0gyPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JVVJJVmlzaXRvcjwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHZpc2l0IFVSSXMuCi0gUmVmZXIgdG8gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yKSI+PENPREU+SVVSSS52aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcik8L0NPREU+PC9BPi4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj52aXNpdDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWaXNpdHMgdGhlIGdpdmVuIElVUkkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PCEtLSAtLT48L0E+PEgzPgotdmlzaXQ8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+dmlzaXQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpCi0gICAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+VmlzaXRzIHRoZSBnaXZlbiBJVVJJLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT51cmk8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIHZpc2l0LgotPERUPjxCPlJldHVybnM6PC9CPjxERD5UcnVlIGlmIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRhbnRzIHNob3VsZCBiZSB2aXNpdGVkLAotIG9yIGZhbHNlIGlmIHRoZXkgc2hvdWxkIG5vdCBiZSB2aXNpdGVkLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBJZiB0aGUgdmlzaXQgbWV0aG9kIGZhaWxzLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJVmlzaXRvci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOThjYTk3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NiBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVNpbXBsZVVSSUZhY3RvcnkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5IGNsYXNzIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJTaW1wbGVVUklGYWN0b3J5IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU2ltcGxlVVJJRmFjdG9yeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlNpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9GT05UPgotPEJSPgotQ2xhc3MgU2ltcGxlVVJJRmFjdG9yeTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuU2ltcGxlVVJJRmFjdG9yeTwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGNsYXNzIDxCPlNpbXBsZVVSSUZhY3Rvcnk8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDxEVD5pbXBsZW1lbnRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVVSSUZhY3RvcnkgaW50ZXJmYWNlLgotPFA+Ci0KLTxQPgotPERMPgotPERUPjxCPlNpbmNlOjwvQj48L0RUPgotICA8REQ+MS4wPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCNTaW1wbGVVUklGYWN0b3J5KCkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPm5ld1VSSTwvQT48L0I+KGphdmEubmV0LlVSTCZuYnNwO3VybCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj5uZXdVUklTY2hlbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c2NoZW1lT3JVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUklTY2hlbWUgZm9yIHRoZSBnaXZlbiBzY2hlbWUgc3RyaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCNyZWdpc3RlclNjaGVtZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lKSI+cmVnaXN0ZXJTY2hlbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvdG9jb2wsCi0gICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+Jm5ic3A7c2NoZW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2QgcmVnaXN0ZXJzIGEgc2NoZW1lIGZvciBhIHBhcnRpY3VsYXIgcHJvdG9jb2wuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJTaW1wbGVVUklGYWN0b3J5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLVNpbXBsZVVSSUZhY3Rvcnk8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5TaW1wbGVVUklGYWN0b3J5PC9CPigpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Im5ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotbmV3VVJJPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiA8Qj5uZXdVUkk8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpCi0gICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPklVUklGYWN0b3J5PC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5DcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT51cmk8L0NPREU+IC0gdGhlIHVyaSB0byBiZSBjcmVhdGVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5DcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGlzIFVSSS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Im5ld1VSSShqYXZhLm5ldC5VUkwpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUkk8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPm5ld1VSSTwvQj4oamF2YS5uZXQuVVJMJm5ic3A7dXJsKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPklVUklGYWN0b3J5PC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5DcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5uZXQuVVJMKSI+bmV3VVJJPC9BPjwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVybDwvQ09ERT4gLSB0aGUgdXJsIHRvIHVzZSB0byBjcmVhdGUgdGhpcyB1cmkuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoaXMgVVJJLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUklTY2hlbWU8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+IDxCPm5ld1VSSVNjaGVtZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3NjaGVtZU9yVVJJKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj5JVVJJRmFjdG9yeTwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+Q3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbG9ucywgdGhlIGVudGlyZSBzdHJpbmcgaXMgaW50ZXJwcmV0dGVkCi0gYXMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtZS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhIGNvbG9uLCB0aGVuIHRoZQotIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gbmFtZSBvZiB0aGUgc2NoZW1lLCBtZWFuaW5nIHRoZSBjYWxsZXIgY2FuIHBhc3MgaW4gYW55IElVUkkgc3RyaW5nIGluCi0gb3JkZXIgdG8gZ2V0IGEgSVVSSVNjaGVtZSBvYmplY3QuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUklTY2hlbWUoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSVNjaGVtZTwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zY2hlbWVPclVSSTwvQ09ERT4gLSB0aGUgc2NoZW1lIG5hbWUgb3IgVVJJIGZyb20gd2hpY2ggdGhpcyBzY2hlbWUgaXMgCi0gdG8gYmUgY3JlYXRlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+Q3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbG9ucywgdGhlIGVudGlyZSBzdHJpbmcgaXMgaW50ZXJwcmV0dGVkCi0gYXMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtZS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhIGNvbG9uLCB0aGVuIHRoZQotIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gbmFtZSBvZiB0aGUgc2NoZW1lLCBtZWFuaW5nIHRoZSBjYWxsZXIgY2FuIHBhc3MgaW4gYW55IElVUkkgc3RyaW5nIGluCi0gb3JkZXIgdG8gZ2V0IGEgSVVSSVNjaGVtZSBvYmplY3QuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGlzIFVSSSBzY2hlbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZWdpc3RlclNjaGVtZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lKSI+PCEtLSAtLT48L0E+PEgzPgotcmVnaXN0ZXJTY2hlbWU8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlZ2lzdGVyU2NoZW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+Jm5ic3A7c2NoZW1lKTwvUFJFPgotPERMPgotPEREPlRoaXMgbWV0aG9kIHJlZ2lzdGVycyBhIHNjaGVtZSBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm90b2NvbDwvQ09ERT4gLSB0aGUgcHJvdG9jb2wuPEREPjxDT0RFPnNjaGVtZTwvQ09ERT4gLSB0aGUgc2NoZW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3ZDYyZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NiBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVSSUV4Y2VwdGlvbgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbiBjbGFzcyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVVJJRXhjZXB0aW9uIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVVJJRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlVSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBVUklFeGNlcHRpb248L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5UaHJvd2FibGUKLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlPC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+VVJJRXhjZXB0aW9uPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb248L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9zdCBleGNlcHRpb25zIHRocm93biBieSBJVVJJIGNsYXNzZXMuCi0gRXZlcnkgVVJJRXhjZXB0aW9uIGNhcnJpZXMgYSBJVVJJIGFuZCBhIFN0YXR1cywgZWFjaCBvZiB3aGljaCBtYXkKLSBiZSBudWxsLiBUaGUgZ2V0TWVzc2FnZSgpIG1ldGhvZCBhcyBpbmhlcml0ZWQgZnJvbSBFeGNlcHRpb24gd2lsbAotIHJldHVybiB0aGUgbWVzc2FnZSBmcm9tIHRoZSBVUklFeGNlcHRpbidzIFN0YXR1cyBvYmplY3QsIGlmIGFueS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb24iPlNlcmlhbGl6ZWQgRm9ybTwvQT48L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCNVUklFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5VUklFeGNlcHRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgVVJJRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI1VSSUV4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPlVSSUV4Y2VwdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzLAotICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgSVVSSSwKLSBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwjZ2V0U3RhdHVzKCkiPmdldFN0YXR1czwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI2dldFVSSSgpIj5nZXRVUkk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5UaHJvd2FibGUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5UaHJvd2FibGU8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5maWxsSW5TdGFja1RyYWNlLCBnZXRDYXVzZSwgZ2V0TG9jYWxpemVkTWVzc2FnZSwgZ2V0TWVzc2FnZSwgZ2V0U3RhY2tUcmFjZSwgaW5pdENhdXNlLCBwcmludFN0YWNrVHJhY2UsIHByaW50U3RhY2tUcmFjZSwgcHJpbnRTdGFja1RyYWNlLCBzZXRTdGFja1RyYWNlLCB0b1N0cmluZzwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iVVJJRXhjZXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotVVJJRXhjZXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+VVJJRXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBTdGF0dXMuCi0gVGhlIHN0YXR1cyBtYXkgYmUgbnVsbC4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gdGhlIHN0YXVzIGZvciB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iVVJJRXhjZXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PCEtLSAtLT48L0E+PEgzPgotVVJJRXhjZXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+VVJJRXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgSVVSSSwKLSBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLgotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnN0YXR1czwvQ09ERT4gLSB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi48REQ+PENPREU+dXJpPC9DT0RFPiAtIHRoZSB1cmkgdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24uPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0U3RhdHVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFN0YXR1czwvSDM+Ci08UFJFPgotcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIDxCPmdldFN0YXR1czwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5yZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFVSSSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRVUkk8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPmdldFVSSTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5yZXR1cm5zIHRoZSBJVVJJIGluc2lkZSB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVVJJRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlVSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9JVVJJLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9JVVJJLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NWMxOGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VJVVJJLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhcHBlbmQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPmFwcGVuZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDtyZWxhdGl2ZVVSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlVSSUV4Y2VwdGlvbi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwjZ2V0VVJJKCkiPmdldFVSSTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3QoKSI+bGlzdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBsaXN0IG9mIFVSSXMgZm9yIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gaGllcmFyY2hpY2FsLCBub24tbGVhZiBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3Qob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPmxpc3Q8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGaWx0ZXI8L0E+Jm5ic3A7dXJpRmlsdGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJU2NoZW1lLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5uZXdVUkk8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklTY2hlbWUuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJU2NoZW1lLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPm5ld1VSSTwvQT48L0I+KGphdmEubmV0LlVSTCZuYnNwO3VybCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3BhcmVudCgpIj5wYXJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklGaWx0ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCNhY2NlcHRzKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5hY2NlcHRzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0ZpbHRlcnMgdGhlIGdpdmVuIElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2FwcGVuZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+YXBwZW5kPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3JlbGF0aXZlVVJJKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSVNjaGVtZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI2lzVmFsaWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPmlzVmFsaWQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSVNjaGVtZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI25ld1VSSShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+bmV3VVJJPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNyZW5hbWUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPnJlbmFtZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDtuZXdVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW5hbWVzIG9yIG1vdmVzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSQotIHRvIHRoZSBuZXcgSVVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSVNjaGVtZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj52YWxpZGF0ZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJVmlzaXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCN2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmlzaXRzIHRoZSBnaXZlbiBJVVJJLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+Q29uc3RydWN0b3JzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI1VSSUV4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPlVSSUV4Y2VwdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzLAotICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgSVVSSSwKLSBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VJVVJJLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSUZhY3RvcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklGYWN0b3J5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZmM2MmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSUZhY3RvcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeQotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGYWN0b3J5IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklFbnZpcm9ubWVudC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCNnZXRVUklGYWN0b3J5KCkiPmdldFVSSUZhY3Rvcnk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgSVVSSSBmYWN0b3J5LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gdGhhdCBpbXBsZW1lbnQgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+U2ltcGxlVVJJRmFjdG9yeTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVVSSUZhY3RvcnkgaW50ZXJmYWNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSUZpbHRlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSUZpbHRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTAyNzU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklGaWx0ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlciI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSUZpbHRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklGaWx0ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGaWx0ZXI8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNsaXN0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIpIj5saXN0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FzIGZvciBsaXN0KCksIGV4Y2VwdCBvbmx5IFVSSXMgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuCi0gZmlsdGVyIGFyZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yLAotICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FzIGZvciB2aXNpdChJVVJJVmlzaXRvciksIGV4Y2VwdCBvbmx5IHJlc291cmNlIFVSSXMgdGhhdCBhcmUKLSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VJVVJJRmlsdGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSUZpbHRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSVNjaGVtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSVNjaGVtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FmMjUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSVNjaGVtZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklTY2hlbWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5FbnZpcm9ubWVudFNlcnZpY2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwjZ2V0RWNsaXBzZVNjaGVtZSgpIj5nZXRFY2xpcHNlU2NoZW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RW52aXJvbm1lbnRTZXJ2aWNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI2dldEZpbGVTY2hlbWUoKSI+Z2V0RmlsZVNjaGVtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2dldFVSSVNjaGVtZSgpIj5nZXRVUklTY2hlbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TaW1wbGVVUklGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj5uZXdVUklTY2hlbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c2NoZW1lT3JVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUklTY2hlbWUoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSVNjaGVtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzY2hlbWVPclVSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TaW1wbGVVUklGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjcmVnaXN0ZXJTY2hlbWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZSkiPnJlZ2lzdGVyU2NoZW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3Byb3RvY29sLAotICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPiZuYnNwO3NjaGVtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHJlZ2lzdGVycyBhIHNjaGVtZSBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VJVVJJU2NoZW1lLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSVNjaGVtZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSVZpc2l0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklWaXNpdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ODJjNDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSVZpc2l0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcgotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSVZpc2l0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklWaXNpdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklWaXNpdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjdmlzaXQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3IpIj52aXNpdDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklWaXNpdG9yPC9BPiZuYnNwO3VyaVZpc2l0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWaXNpdHMgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGRlY2VuZGFudHMgaW4gcHJlLW9yZGVyIGZhc2hpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yLAotICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FzIGZvciB2aXNpdChJVVJJVmlzaXRvciksIGV4Y2VwdCBvbmx5IHJlc291cmNlIFVSSXMgdGhhdCBhcmUKLSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSVZpc2l0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvU2ltcGxlVVJJRmFjdG9yeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvU2ltcGxlVVJJRmFjdG9yeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjYwNGFhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL1NpbXBsZVVSSUZhY3RvcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3RvcnkKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3RvcnkiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlNpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5PC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3RvcnkKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VTaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvVVJJRXhjZXB0aW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9VUklFeGNlcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNmEzNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9VUklFeGNlcHRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbgotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlVVJJRXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVVJJRXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPiB0aGF0IHRocm93IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSUZpbHRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sI2FjY2VwdHMob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPmFjY2VwdHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RmlsdGVycyB0aGUgZ2l2ZW4gSVVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXBwZW5kKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5hcHBlbmQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7cmVsYXRpdmVVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5pby5GaWxlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhc0ZpbGUoKSI+YXNGaWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubmV0LlVSTDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXNVUkwoKSI+YXNVUkw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZXJhc2UoKSI+ZXJhc2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtFcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmlvLklucHV0U3RyZWFtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNnZXRJbnB1dFN0cmVhbSgpIj5nZXRJbnB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmlvLk91dHB1dFN0cmVhbTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZ2V0T3V0cHV0U3RyZWFtKCkiPmdldE91dHB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3QoKSI+bGlzdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBsaXN0IG9mIFVSSXMgZm9yIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gaGllcmFyY2hpY2FsLCBub24tbGVhZiBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3Qob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPmxpc3Q8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGaWx0ZXI8L0E+Jm5ic3A7dXJpRmlsdGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJU2NoZW1lLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5uZXdVUkk8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklTY2hlbWUuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJU2NoZW1lLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPm5ld1VSSTwvQT48L0I+KGphdmEubmV0LlVSTCZuYnNwO3VybCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSVNjaGVtZShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJU2NoZW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3NjaGVtZU9yVVJJKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSUZhY3RvcnkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj5uZXdVUklTY2hlbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c2NoZW1lT3JVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUklTY2hlbWUgZm9yIHRoZSBnaXZlbiBzY2hlbWUgc3RyaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNwYXJlbnQoKSI+cGFyZW50PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3JlbmFtZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+cmVuYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO25ld1VSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbmFtZXMgb3IgbW92ZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJCi0gdG8gdGhlIG5ldyBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN0b3VjaEZvbGRlcigpIj50b3VjaEZvbGRlcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgZm9sZGVyIHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gdGhlIElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3RvdWNoTGVhZigpIj50b3VjaExlYWY8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotIHRoZSBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklWaXNpdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj52aXNpdDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWaXNpdHMgdGhlIGdpdmVuIElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmlzaXRzIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBkZWNlbmRhbnRzIGluIHByZS1vcmRlciBmYXNoaW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvciwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPnZpc2l0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+Jm5ic3A7dXJpVmlzaXRvciwKLSAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZpbHRlcjwvQT4mbmJzcDt1cmlGaWx0ZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBcyBmb3IgdmlzaXQoSVVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlciBhcmUgdmlzaXRlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvXGNsYXNzLXVzZVVSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlVSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2YjdkNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkgcGFja2FnZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PC9GT05UPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1JbnRlcmZhY2VzPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklVUkk8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVVJJRmFjdG9yeTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVVSSUZpbHRlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVVSSVNjaGVtZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklVUklWaXNpdG9yPC9JPjwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotQ2xhc3NlczwvRk9OVD4mbmJzcDsKLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KLTxCUj4KLTxBIEhSRUY9IlNpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUV4Y2VwdGlvbnM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJVUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlVSSUV4Y2VwdGlvbjwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQwZTg0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSBwYWNrYWdlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPlBSRVYgUEFDS0FHRTwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIFBBQ0tBR0U8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPEgyPgotUGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaQotPC9IMj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5JbnRlcmZhY2UgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9CPjwvVEQ+Ci08VEQ+QSBJVVJJIHJlcHJlc2VudHMgYSBVbml2ZXJhbCBSZXNvdXJjZSBJZGVudGlmZXIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT48L0I+PC9URD4KLTxURD5UaGlzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IElVUkkgYW5kIElVUklTY2hlbWUgb2JqZWN0cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZpbHRlcjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgb3IgbGlzdCBVUklzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQj48L1REPgotPFREPkEgSVVSSVNjaGVtZSByZXByZXNlbnRzIGEgc2luZ2xlIHNjaGVtZSBmb3Igc29tZSBhIGZhbWlseSBvZgotIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZpZXJzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHZpc2l0IFVSSXMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNsYXNzIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElVUklGYWN0b3J5IGludGVyZmFjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RXhjZXB0aW9uIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQj48L1REPgotPFREPlRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgSVVSSSBjbGFzc2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLTxETD4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgUEFDS0FHRTwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS10cmVlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtdHJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWZlZDExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS10cmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkgQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkgQ2xhc3MgSGllcmFyY2h5IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotSGllcmFyY2h5IEZvciBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpCi08L0gyPgotPC9DRU5URVI+Ci08REw+Ci08RFQ+PEI+UGFja2FnZSBIaWVyYXJjaGllczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+QWxsIFBhY2thZ2VzPC9BPjwvREw+Ci08SFI+Ci08SDI+Ci1DbGFzcyBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuT2JqZWN0PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPlNpbXBsZVVSSUZhY3Rvcnk8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT4pCi08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuVGhyb3dhYmxlIChpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlKQotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLkV4Y2VwdGlvbjxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPlVSSUV4Y2VwdGlvbjwvQj48L0E+PC9VTD4KLTwvVUw+Ci08L1VMPgotPC9VTD4KLTxIMj4KLUludGVyZmFjZSBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUkk8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklGYWN0b3J5PC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklGaWx0ZXI8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSVNjaGVtZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSVZpc2l0b3I8L0I+PC9BPjwvVUw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS11c2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS11c2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzMDJiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtdXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIFBhY2thZ2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9JVVJJRmFjdG9yeS5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPklVUklGYWN0b3J5PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgSVVSSSBhbmQgSVVSSVNjaGVtZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5JVVJJU2NoZW1lPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgSVVSSVNjaGVtZSByZXByZXNlbnRzIGEgc2luZ2xlIHNjaGVtZSBmb3Igc29tZSBhIGZhbWlseSBvZgotIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZpZXJzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPiB1c2VkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSS5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgSVVSSSByZXByZXNlbnRzIGEgVW5pdmVyYWwgUmVzb3VyY2UgSWRlbnRpZmVyLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklGYWN0b3J5Lmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklGYWN0b3J5PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgSVVSSSBhbmQgSVVSSVNjaGVtZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklGaWx0ZXIuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSUZpbHRlcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgb3IgbGlzdCBVUklzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSVNjaGVtZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIElVUklTY2hlbWUgcmVwcmVzZW50cyBhIHNpbmdsZSBzY2hlbWUgZm9yIHNvbWUgYSBmYW1pbHkgb2YKLSBVbml2ZXJhbCBSZXNvdXJjZSBJZGVudGlmaWVycy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9JVVJJVmlzaXRvci5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJVmlzaXRvcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgVVJJcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9VUklFeGNlcHRpb24uaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+VVJJRXhjZXB0aW9uPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgSVVSSSBjbGFzc2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vdmVydmlldy1mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vdmVydmlldy1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDVmZTFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLU92ZXJ2aWV3Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0iT3ZlcnZpZXcsIFdlYiBUb29scyBQbGF0Zm9ybTogRW52aXJvbm1lbnQgZnJhbWV3b3JrIEFQSSBkb2N1bWVudGF0aW9uIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxUSCBBTElHTj0ibGVmdCIgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEI+PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiB0YXJnZXQ9InBhY2thZ2VGcmFtZSI+QWxsIENsYXNzZXM8L0E+PC9GT05UPgotPFA+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotUGFja2FnZXM8L0ZPTlQ+Ci08QlI+Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD4KLTxCUj4KLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+Ci08QlI+Ci08L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotJm5ic3A7Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDhjZGVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLU92ZXJ2aWV3Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0iT3ZlcnZpZXcsIFdlYiBUb29scyBQbGF0Zm9ybTogRW52aXJvbm1lbnQgZnJhbWV3b3JrIEFQSSBkb2N1bWVudGF0aW9uIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJPdmVydmlldyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMT4KLVdlYiBUb29scyBQbGF0Zm9ybTogRW52aXJvbm1lbnQgZnJhbWV3b3JrIEFQSSBkb2N1bWVudGF0aW9uCi08L0gxPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+UGFja2FnZXM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjIwJSI+PEI+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIyMCUiPjxCPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotJm5ic3A7PEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL292ZXJ2aWV3LXRyZWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctdHJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFiZTgxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctdHJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUNsYXNzIEhpZXJhcmNoeQotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkNsYXNzIEhpZXJhcmNoeSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLUhpZXJhcmNoeSBGb3IgQWxsIFBhY2thZ2VzPC9IMj4KLTwvQ0VOVEVSPgotPERMPgotPERUPjxCPlBhY2thZ2UgSGllcmFyY2hpZXM6PC9CPjxERD48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdHJlZS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPiwgPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS10cmVlLmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjwvREw+Ci08SFI+Ci08SDI+Ci1DbGFzcyBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuT2JqZWN0PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+Q2hvaWNlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5FbnZpcm9ubWVudFNlcnZpY2U8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+TnVsbFN0YXR1c0hhbmRsZXI8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT4pCi08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+U2ltcGxlVVJJRmFjdG9yeTwvQj48L0E+IChpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPikKLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5UaHJvd2FibGUgKGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUpCi08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuRXhjZXB0aW9uPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQj48L0E+PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+U3RhdHVzRXhjZXB0aW9uPC9CPjwvQT48L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+VVJJRXhjZXB0aW9uPC9CPjwvQT48L1VMPgotPC9VTD4KLTwvVUw+Ci08L1VMPgotPEgyPgotSW50ZXJmYWNlIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5JRW52aXJvbm1lbnQ8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUxvZzwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SVN0YXR1c0hhbmRsZXI8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSUZhY3Rvcnk8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSUZpbHRlcjwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJU2NoZW1lPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJVmlzaXRvcjwvQj48L0E+PC9VTD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9vdmVydmlldy10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9wYWNrYWdlLWxpc3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3BhY2thZ2UtbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YzhlOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3BhY2thZ2UtbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudA0KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9yZXNvdXJjZXMvaW5oZXJpdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3Jlc291cmNlcy9pbmhlcml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNDg2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3Jlc291cmNlcy9pbmhlcml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3NlcmlhbGl6ZWQtZm9ybS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTliOGQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotU2VyaWFsaXplZCBGb3JtCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iU2VyaWFsaXplZCBGb3JtIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP3NlcmlhbGl6ZWQtZm9ybS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InNlcmlhbGl6ZWQtZm9ybS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDE+Ci1TZXJpYWxpemVkIEZvcm08L0gxPgotPC9DRU5URVI+Ci08SFIgU0laRT0iNCIgTk9TSEFERT4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJjZW50ZXIiPjxGT05UIFNJWkU9IisyIj4KLTxCPlBhY2thZ2U8L0I+IDxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50RXhjZXB0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q2xhc3MgPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT4gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotPEI+c2VyaWFsVmVyc2lvblVJRDombmJzcDs8L0I+Mzk3ODk4MzI3NTg5OTQwMjAzNkwKLQotPFA+Ci08QSBOQU1FPSJzZXJpYWxpemVkRm9ybSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPlNlcmlhbGl6ZWQgRmllbGRzPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxIMz4KLXN0YXR1czwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgPEI+c3RhdHVzPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNsYXNzIDxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjwvQT4gZXh0ZW5kcyA8QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT4gaW1wbGVtZW50cyBTZXJpYWxpemFibGU8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08Qj5zZXJpYWxWZXJzaW9uVUlEOiZuYnNwOzwvQj4zNjE4MTQxMTYwMzIyMTE5OTkyTAotCi08UD4KLTxBIE5BTUU9InNlcmlhbGl6ZWRGb3JtIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+U2VyaWFsaXplZCBGaWVsZHM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEgzPgotY2hvaWNlPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPiA8Qj5jaG9pY2U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIENob2ljZSB0aGF0IGxlYWQgdG8gdGhlIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24sCi0gaWYgYW55IChpZS4gbWF5IGJlIG51bGwpLgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImNlbnRlciI+PEZPTlQgU0laRT0iKzIiPgotPEI+UGFja2FnZTwvQj4gPEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5DbGFzcyA8QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb248L0E+IGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxCPnNlcmlhbFZlcnNpb25VSUQ6Jm5ic3A7PC9CPjMyNTgxMzAyNzE0MjQ3NTYwMThMCi0KLTxQPgotPEEgTkFNRT0ic2VyaWFsaXplZEZvcm0iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5TZXJpYWxpemVkIEZpZWxkczwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08SDM+Ci1zdGF0dXM8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIDxCPnN0YXR1czwvQj48L1BSRT4KLTxETD4KLTxERD5BIFN0YXR1cyBvYmplY3QgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBleGNlcHRpb24sCi0gaWYgYXBwbGljYWJsZS4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci08SDM+Ci11cmk8L0gzPgotPFBSRT4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4gPEI+dXJpPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBJVVJJIGZvciB3aGljaCB0aGUgZXhjZXB0aW9uIG9jY3VyZWQsCi0gaWYgYXBwbGljYWJsZS4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci0KLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9zZXJpYWxpemVkLWZvcm0uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJzZXJpYWxpemVkLWZvcm0uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvc3R5bGVzaGVldC5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3N0eWxlc2hlZXQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGMzNzM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvc3R5bGVzaGVldC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBKYXZhZG9jIHN0eWxlIHNoZWV0ICovDQotDQotLyogRGVmaW5lIGNvbG9ycywgZm9udHMgYW5kIG90aGVyIHN0eWxlIGF0dHJpYnV0ZXMgaGVyZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMgKi8NCi0NCi0vKiBQYWdlIGJhY2tncm91bmQgY29sb3IgKi8NCi1ib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRiB9DQotDQotLyogSGVhZGluZ3MgKi8NCi1oMSB7IGZvbnQtc2l6ZTogMTQ1JSB9DQotDQotLyogVGFibGUgY29sb3JzICovDQotLlRhYmxlSGVhZGluZ0NvbG9yICAgICB7IGJhY2tncm91bmQ6ICNDQ0NDRkYgfSAvKiBEYXJrIG1hdXZlICovDQotLlRhYmxlU3ViSGVhZGluZ0NvbG9yICB7IGJhY2tncm91bmQ6ICNFRUVFRkYgfSAvKiBMaWdodCBtYXV2ZSAqLw0KLS5UYWJsZVJvd0NvbG9yICAgICAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGIH0gLyogV2hpdGUgKi8NCi0NCi0vKiBGb250IHVzZWQgaW4gbGVmdC1oYW5kIGZyYW1lIGxpc3RzICovDQotLkZyYW1lVGl0bGVGb250ICAgeyBmb250LXNpemU6IDEwMCU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIH0NCi0uRnJhbWVIZWFkaW5nRm9udCB7IGZvbnQtc2l6ZTogIDkwJTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgfQ0KLS5GcmFtZUl0ZW1Gb250ICAgIHsgZm9udC1zaXplOiAgOTAlOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiB9DQotDQotLyogTmF2aWdhdGlvbiBiYXIgZm9udHMgYW5kIGNvbG9ycyAqLw0KLS5OYXZCYXJDZWxsMSAgICB7IGJhY2tncm91bmQtY29sb3I6I0VFRUVGRjt9IC8qIExpZ2h0IG1hdXZlICovDQotLk5hdkJhckNlbGwxUmV2IHsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDhCO30gLyogRGFyayBCbHVlICovDQotLk5hdkJhckZvbnQxICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiMwMDAwMDA7fQ0KLS5OYXZCYXJGb250MVJldiB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjojRkZGRkZGO30NCi0NCi0uTmF2QmFyQ2VsbDIgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGO30NCi0uTmF2QmFyQ2VsbDMgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGO30NCi0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZXh0L2luZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZXh0L2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNGU1ZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2V4dC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLSAgICAJPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUUkFOU0lUSU9OQUwvL0VOIj4KLQkJPGh0bWwgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0Ij4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotCQk8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotCi0gICAJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgCQk8dGl0bGU+VVJJIHJlc29sdmVyIEV4dGVuc2lvbiBQb2ludHM8L3RpdGxlPgotCQk8TElOSyBSRUw9IlNUWUxFU0hFRVQiIEhSRUY9Ii4uLy4uL2Jvb2suY3NzIiBDSEFSU0VUPSJJU08tODg1OS0xIiBUWVBFPSJ0ZXh0L2NzcyI+Ci0JCTwvaGVhZD4KLTxib2R5IGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODAwMDgwIj4KLTxjZW50ZXI+Ci08aDE+VVJJIHJlc29sdmVyIEV4dGVuc2lvbiBQb2ludHMgPC9oMT4KLTwvY2VudGVyPlRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50cyBjYW4gYmUgdXNlZCB0byBleHRlbmQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgVVJJIHJlc29sdmVyLiA8aDM+Ci08YSBuYW1lPSJ1cmlyZXNvbHZlciI+PC9hPlVSSSBSZXNvbHZlciBBUEk8L2gzPgotPHVsPgotPGxpPgotPGEgaHJlZj0ib3JnX2VjbGlwc2Vfd3N0X2NvbW1vbl91cmlyZXNvbHZlcl9yZXNvbHZlckV4dGVuc2lvbnMuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnM8L2E+Ci08L2xpPgotPC91bD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9leHQvb3JnX2VjbGlwc2Vfd3N0X2NvbW1vbl91cmlyZXNvbHZlcl9yZXNvbHZlckV4dGVuc2lvbnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9leHQvb3JnX2VjbGlwc2Vfd3N0X2NvbW1vbl91cmlyZXNvbHZlcl9yZXNvbHZlckV4dGVuc2lvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5NTFiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZXh0L29yZ19lY2xpcHNlX3dzdF9jb21tb25fdXJpcmVzb2x2ZXJfcmVzb2x2ZXJFeHRlbnNpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5VUkkgUmVzb2x2ZXIgRXh0ZW5zaW9ucyBQb2ludDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+VVJJIFJlc29sdmVyIEV4dGVuc2lvbnMgUG9pbnQ8L0gxPgotPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9uczxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PjxiPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuPC9iPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj5UaGUgVVJJIFJlc29sdmVyIEV4dGVuc2lvbnMgcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gcmVnaXN0ZXIgY3VzdG9tIFVSSSByZXNvbHZlcnMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJlc29sdXRpb24gb2YgcmVzb3VyY2VzIGJ5IHRvb2xzIHN1Y2ggYXMgZWRpdG9ycywgZ2VuZXJhdG9ycywgdmFsaWRhdG9ycywgYW5kIHdpemFyZHMuPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS5yZXNvbHZlckV4dGVuc2lvbiI+cmVzb2x2ZXJFeHRlbnNpb248L2E+KykmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnBvaW50PC9iPiAtIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQ8L2xpPgotPGxpPjxiPmlkPC9iPiAtIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnJlc29sdmVyRXh0ZW5zaW9uIj5yZXNvbHZlckV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLnByb2plY3ROYXR1cmUiPnByb2plY3ROYXR1cmU8L2E+KikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcmVzb2x2ZXJFeHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5zdGFnZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2xhc3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wcmlvcml0eSZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnN0YWdlPC9iPiAtIFRoZSBzdGFnZSBpbiB3aGljaCB0byBydW4gdGhpcyBleHRlbnNpb24gcmVzb2x2ZXI6IHByZW5vcm1hbGl6YXRpb24sIHBvc3Rub3JtYWxpemF0aW9uLCBvciBwaHlzaWNhbC4gRGVmYXVsdHMgdG8gcG9zdG5vcm1hbGl6YXRpb24uPGJyPgotcHJlbm9ybWFsaXphdGlvbjogIHJ1biBiZWZvcmUgbm9ybWFsaXphdGlvbiBvZiB0aGUgaW5wdXQ8YnI+Ci1wb3N0bm9ybWFsaXphdGlvbjogcnVuIGFmdGVyIG5vcm1hbGl6YXRpb24gb2YgdGhlIGlucHV0PGJyPgotcGh5c2ljYWw6ICAgICAgICAgIHJ1biBhZnRlciBhbGwgcHJlIGFuZCBwb3N0bm9ybWFsaXphdGlvbiByZXNvbHZlcnM8L2xpPgotPGxpPjxiPmNsYXNzPC9iPiAtIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjwvY29kZT4uPC9saT4KLTxsaT48Yj5wcmlvcml0eTwvYj4gLSBUaGUgcHJpb3JpdHkgb2YgdGhpcyByZXNvbHZlcjogaGlnaCwgbWVkaXVtLCBvciBsb3cuIERlZmF1bHRzIHRvIG1lZGl1bS4gVGhlIHByaW9yaXR5IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGVuIHRoaXMgcmVzb2x2ZXIgc2hvdWxkIHJ1biB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgcmVzb2x2ZXJzIGRlZmluZWQgZm9yIHRoZSBzYW1lIHN0YWdlLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucHJvamVjdE5hdHVyZSI+cHJvamVjdE5hdHVyZTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcHJvamVjdE5hdHVyZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnZhbHVlJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1JZiBhIHByb2plY3QgbmF0dXJlIGlzIHNwZWNpZmllZCB0aGUgVVJJIHJlc29sdmVyIHdpbGwgb25seSBiZSB1c2VkIGZvciBwcm9qZWN0cyB0aGF0IGNvbnRhaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBuYXR1cmVzLiBJZiBubyBwcm9qZWN0IG5hdHVyZXMgYXJlIHNwZWNpZmllZCB0aGUgVVJJIHJlc29sdmVyIHdpbGwgYmUgdXNlZCBmb3IgYWxsIHByb2plY3RzLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnZhbHVlPC9iPiAtIEEgcHJvamVjdCBuYXR1cmUgSUQgZm9yIHdoaWNoIHRoZSBVUkkgcmVzb2x2ZXIgc2hvdWxkIGJlIHVzZWQuPC9saT4KLTwvdWw+Ci08YnI+PGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RXhhbXBsZXM6IDwvaDY+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIFVSSSByZXNvbHZlciBjb250cmlidXRpb246Ci08cHJlIGNsYXNzPSJFeGFtcGxlIj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICAgJmx0O3Jlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7cGh5c2ljYWwmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIHByaW9yaXR5PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtsb3cmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIGNsYXNzPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLlNhbXBsZVJlc29sdmVyJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICAgJmx0Oy9yZXNvbHZlckV4dGVuc2lvbiZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotPC9zcGFuPjwvcHJlPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TdXBwbGllZCBJbXBsZW1lbnRhdGlvbjogPC9oNj48Y29kZT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlc29sdmVyCi08L2NvZGU+Ci1wcm92aWRlcyBhbiBVUkkgcmVzb2x2ZXIgdGhhdCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGEgcHJvamVjdCB3aXRoIG11bHRpcGxlIGNvbXBvbmVudHMKLTxjb2RlPgotb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24KLTwvY29kZT4KLXByb3ZpZGVzIGFuIFVSSSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHJlZmVyZW5jZXMgaW4gYSBjYWNoZQotPGNvZGU+Ci1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24KLTwvY29kZT4KLXByb3ZpZGVzIGFuIFVSSSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgY2F0YWxvZwotPHA+PC9wPgotCi08YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLjxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9zY2hlbWEuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2Mvc2NoZW1hLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYmYyNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9zY2hlbWEuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotSDYuQ2FwdGlvbkZpZ0NvbHVtbiNoZWFkZXIgew0KLQlmb250LXNpemU6MTZweDsgDQotCWRpc3BsYXk6aW5saW5lDQotfQ0KLQ0KLVAuTm90ZSNjb3B5cmlnaHQgew0KLQlmb250LXNpemU6IHNtYWxsZXI7IA0KLQlmb250LXN0eWxlOiBub3JtYWw7DQotCWNvbG9yOiAjMzM2Njk5OyANCi0JZGlzcGxheTppbmxpbmU7DQotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjZHRkIHsNCi0JY29sb3I6ICM4MDAwMDA7IA0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI2R0ZEF0dGxpc3Qgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDIwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjdGFnIHsNCi0JY29sb3I6ICMwMDAwODA7IA0KLQlkaXNwbGF5OmlubGluZTsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI2NzdHJpbmcgew0KLQljb2xvcjogIzAwODAwMDsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0OwkNCi19DQotDQotLkNvbmZpZ01hcmt1cCNlbGVtZW50RGVzYyB7DQotCWNvbG9yOiBibGFjazsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMTAuMDAwMDAwcHQ7DQotfQ0KLQ0KLS5Db25maWdNYXJrdXAjYXR0bGlzdERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDMyLjAwMDAwMHB0Ow0KLX0NCi0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy90b3BpY3NFbnZfUmVmZXJlbmNlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3RvcGljc0Vudl9SZWZlcmVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ2YWMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3RvcGljc0Vudl9SZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBEZWZpbmUgdG9waWNzIGZvciB0aGUgcmVmZXJlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dG9jIGxhYmVsPSJFbnZpcm9ubWVudCByZWZlcmVuY2UiIGxpbmtfdG89Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9yZWZlcmVuY2VfdG9jLnhtbCNqYXZhZG9jX2NvbW1vbiI+Ci0JPHRvcGljIGxhYmVsPSJFbnZpcm9ubWVudCBmcmFtZXdvcmsgQVBJIFJlZmVyZW5jZSIgaHJlZj0icmVmZXJlbmNlL2VudmFwaS9pbmRleC5odG1sIj4KLQkKLQkJPCEtLSBUaGUgZW52amF2YWRvY3RvYy54bWwgdG9jIGlzIGdlbmVyYXRlZCBieSB0aGUgYnVpbGQuIC0tPgotCQk8bGluayB0b2M9ImVudmphdmFkb2N0b2MueG1sIiAvPgotCTwvdG9waWM+CQotCQotCTx0b3BpYyBsYWJlbD0iVVJJIFJlc29sdmVyIEFQSSBSZWZlcmVuY2UiIGhyZWY9InJlZmVyZW5jZS9leHQvaW5kZXguaHRtbCI+Ci0JCi0JCTwhLS0gVGhlIHRvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIHRvYyBpcyBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkLiAtLT4KLQkJPGxpbmsgdG9jPSJ0b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbCIgLz4KLQk8L3RvcGljPgkKLQkKLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3RvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvdG9waWNzX0V4dFBvaW50X1JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMWVhMWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvdG9waWNzX0V4dFBvaW50X1JlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0JIAk8dG9jIGxhYmVsPSJFeHRlbnNpb24gUG9pbnRzIFJlZmVyZW5jZSI+Ci08dG9waWMgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zIiBocmVmPSJyZWZlcmVuY2UvZXh0L29yZ19lY2xpcHNlX3dzdF9jb21tb25fdXJpcmVzb2x2ZXJfcmVzb2x2ZXJFeHRlbnNpb25zLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2Ly5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZThmMDZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3Y8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZGFkYWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjEwMS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmhlbHAudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvUkVBRE1FLlRYVCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9SRUFETUUuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTgyYzQ3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9SRUFETUUuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0JCQkJCQlHZW5lcmF0aW5nIEphdmFEb2MgYW5kIEV4dGVuc2lvbiBQb2ludCBEb2N1bWVudGF0aW9uIGZvciAJCQkJCS0tCi0tLQkJCQkJCW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YgcGx1Zy1pbgkJCQkJCS0tCi0tLQkJCQkJCQkJMjAwOC8wNS8yMAkoR1JLKQkJCQkJCQkJLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSW50cm86Ci0JVGhpcyB0b29sIGFuZCByZWFkbWUgd2FzIGV4dHJhY3RlZCBmcm9tIGFuIGV4YW1wbGUgZG9uZSBieSB0aGUgSlNGIHRlYW0uIEl0IHdhcwotCXRoZW4gYWRvcHRlZCB0byBnZW5lcmF0ZSB0aGUgSmF2YURvY3MgYW5kIEV4dC1QdCBmb3IgdmFsaWRhdGlvbi4KLQkKLQkKLUphdmFEb2MgR2VuZXJhdGlvbiBUYXNrCi0JSW50cm86Ci0JCVRoZSBqYXZhZG9jQnVpbGQueG1sIGZpbGUgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHJlZmVyZW5jZSBqYXZhZG9jcy4gSXQgaGFyZCBjb2RlcyB0aGUgcGFja2FnZQotCQluYW1lcyBpbnRvIHRoZSBBbnQgc2NyaXB0LCBzbyBpZiBBUEkgcGFja2FnZXMgYXJlIGFkZGVkIG9yIHJlbW92ZWQgdGhpcyB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZC4gICAKLQkJCQotCVNldHVwOgotCQktIGVuc3VyZSB0aGF0IHRoZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiBwbHVnLWluIGlzIHByZXNlbnQgaW4gdGhlIHdvcmtzcGFjZQotCQkKLQlHZW5lcmF0ZToKLQkJMSkgc2VsZWN0IGphdmFkb2NCdWlsZC54bWwgZmlsZSBpbiBwcm9qZWN0IGV4cGxvcmVyCi0JCTIpIFJ1biBhcyAiQW50IEJ1aWxkLi4uIiAtLT4gSlJFIFRhYiwgZW5zdXJlIHRoYXQgIlJ1biBpbiBzYW1lIEpSRSBhcyBXb3Jrc3BhY2UiIGlzIHNlbGVjdGVkCi0JCQotCVNhbml0eSBUZXN0OgotCQkxKSBEaXJlY3RseSBzZWxlY3QgdGhlIEFQSSBwYWNrYWdlcyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24gcGx1Zy1pbi4KLQkJMikgVXNlIHRoZSBFeHBvcnQtPkphdmFkb2MgY29tbWFuZCB0byBnZW5lcmF0ZSBqYXZhZG9jIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LgotCQkzKSBFeGFtaW5lIHRoZSBDb25zb2xlIGZvciB3YXJuaW5ncyBhbmQgZXJyb3JzLiBGaXggYXMgbmVjZXNzYXJ5LgotCQotRXh0ZW5zaW9uLXBvaW50IFJlZmVyZW5jZXMgVGFzawotCUludHJvOgotCQlUaGUgbGlzdGVkLWV4dC1wb2ludHMgcHJvcGVydHkgaW4gYnVpbGRFeHREb2NzLnByb3BlcnRpZXMgZmlsZSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotCQl0aGUgSFRNTCBkb2N1bWVudGF0aW9uIGZyb20gdGhlIHNjaGVtYXMuICAgVGhpcyBsaXN0IG11c3QgYmUgdmVyaWZpZWQgZm9yIGFjY3VyYWN5IAotCQlhbmQgaXMgbm90IGdlbmVyYXRlZCBsaWtlIHRoZSBKYXZhZG9jIEFQSSBwYWNrYWdlcyBhcmUuCi0JCQkJCi0JR2VuZXJhdGU6Ci0JCTEpIHNlbGVjdCBidWlsZEV4dERvY3MueG1sIGZpbGUgaW4gcHJvamVjdCBleHBsb3JlcgotCQkyKSBSdW4gYXMgIkFudCBCdWlsZC4uLiIgLS0+IEpSRSBUYWIsIGVuc3VyZSB0aGF0ICJSdW4gaW4gc2FtZSBKUkUgYXMgV29ya3NwYWNlIiBpcyAKLQkJc2VsZWN0ZWQKLQotQ2hlY2tpbmctaW46Ci0JQ2hlY2sgaW46Ci0JLSBhbnkgY2hhbmdlcyBtYWRlIGluIHRoaXMgcHJvamVjdAotCi0JCQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2Jvb2suY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQ4ODgwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUBpbXBvcnQgIi4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMmU3NTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS8sXAotICAgICAgICAgICAgICAgdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYnVpbGRFeHREb2NzLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYnVpbGRFeHREb2NzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzQ1NWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2J1aWxkRXh0RG9jcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSW5mb3JtYXRpb24gZm9yIGV4dGVuc2lvbiBwb2ludCBvdmVydmlldyBkb2N1bWVudAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPdmVydmlldyBkb2N1bWVudCB0aXRsZQotCi10aXRsZSA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIEV4dGVuc2lvbiBQb2ludHMKLWhlYWRlciA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIEV4dGVuc2lvbiBQb2ludHMgCi0jIEludHJvZHVjdGlvbiBwYXJhZ3JhcGgKLW92ZXJ2aWV3ID0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnRzIGNhbiBiZSB1c2VkIHRvIGFkZCBuZXcgdmFsaWRhdG9yczogCi0jIEEgbGlzdCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUKLSMgZXh0ZW5zaW9uIHBvaW50IGRvY3VtZW50YXRpb24uCi0KLWxpc3RlZC1leHQtcG9pbnRzPW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyLFwKLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckdyb3VwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2J1aWxkRXh0RG9jcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYnVpbGRFeHREb2NzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5YjU3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYnVpbGRFeHREb2NzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBFeHRlbnNpb24gUG9pbnQgRG9jdW1lbnRhdGlvbiIgZGVmYXVsdD0iY3JlYXRlRXh0RG9jcyIgYmFzZWRpcj0iLiI+Ci0KLQk8cHJvcGVydHkgZmlsZT0iYnVpbGRFeHREb2NzLnByb3BlcnRpZXMiLz4KLQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cyIvPgotCTxwcm9wZXJ0eSBuYW1lPSJ2Zk91dHB1dERpciIgdmFsdWU9IiR7b3V0cHV0RGlyfSR7ZmlsZS5zZXBhcmF0b3J9dmYke2ZpbGUuc2VwYXJhdG9yfSIvPgotCi0JPCEtLSA8dGFza2RlZiBuYW1lPSJwZGUuY29udmVydFNjaGVtYVRvSFRNTCIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS5hbnQuQ29udmVydFNjaGVtYVRvSFRNTCIvPiAtLT4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNyZWF0ZUV4dERvY3MiIGRlcGVuZHM9ImJ1aWxkRXh0RG9jcywgY3JlYXRlRG9jTGlzdGluZ3MiLz4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkRXh0RG9jcyIgZGVwZW5kcz0iYnVpbGRWRkV4dERvY3MiLz4KLQkJCi0gCTx0YXJnZXQgbmFtZT0iYnVpbGRWRkV4dERvY3MiPgotIAkJPG1rZGlyIGRpcj0iJHt2Zk91dHB1dERpcn0iLz4KLSAJCTwhLS0gY2xlYW51cCBvbGQgLS0+Ci0gCQk8ZGVsZXRlPgotIAkgCQk8ZmlsZXNldCBkaXI9IiR7dmZPdXRwdXREaXJ9IiBjYXNlc2Vuc2l0aXZlPSJ5ZXMiIGlkPSJleHQtZG9jcy1saXN0LWVudCI+Ci0gCSAJCQk8aW5jbHVkZSBuYW1lPSIqLmh0bWwiLz4KLSAJCQk8L2ZpbGVzZXQ+Ci0gCQk8L2RlbGV0ZT4KLSAJCQotIAkJPCEtLSBnZW5lcmF0ZSBuZXcgaHRtbCBmcm9tIGV4dC1wdCBzY2hlbWFzIC0tPgotIAkJPHBkZS5jb252ZXJ0U2NoZW1hVG9IVE1MIG1hbmlmZXN0PSIuLi9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wbHVnaW4ueG1sIiBkZXN0aW5hdGlvbj0iJHt2Zk91dHB1dERpcn0iIC8+Ci0gCQkKLSAJCTwhLS0gR2V0IHRoZSBsaXN0IG9mIGV4dGVuc2lvbiBkb2MgZmlsZXMuIC0tPgotIAkJPGZpbGVzZXQgZGlyPSIke3ZmT3V0cHV0RGlyfSIgY2FzZXNlbnNpdGl2ZT0ieWVzIiBpZD0iZXh0LWRvY3MtbGlzdC1lbnQiPgotIAkJCTxpbmNsdWRlIG5hbWU9IiouaHRtbCIvPgotCQk8L2ZpbGVzZXQ+Ci0gCQkKLSAJCTwhLS0gQ29udmVydCB0aGUgbGlzdCB0byBhbiBYTUwgcmVwcmVzZW50YXRpb24uIC0tPgotIAkJPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJleHQtZG9jLWVudCIgcmVmaWQ9ImV4dC1kb2NzLWxpc3QtZW50IiBwYXRoc2VwPSImbHQ7L2ZpbGUmZ3Q7L24vbiZsdDtmaWxlJmd0OyI+Ci0gCQkJPG1hcCBmcm9tPSIke3ZmT3V0cHV0RGlyfSIgdG89IiIvPgotIAkJPC9wYXRoY29udmVydD4KLSAJCSAJCQkJCQkKLSAJPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjcmVhdGVEb2NMaXN0aW5ncyI+Ci0JCTxkZWxldGUgZmlsZT0iJHtvdXRwdXREaXJ9JHtmaWxlLnNlcGFyYXRvcn1pbmRleC5odG1sIi8+Ci0JCTwhLS0gQ3JlYXRlIHRoZSBvdmVydmlldyBkb2N1bWVudC4gLS0+Ci0JCTx4c2x0IGJhc2VkaXI9IiR7YmFzZWRpcn0iIGluPSJleHREb2NMaXN0aW5ncy54bWwiIG91dD0iJHtvdXRwdXREaXJ9JHtmaWxlLnNlcGFyYXRvcn1pbmRleC5odG1sIiBzdHlsZT0iZXh0RG9jT3ZlcnZpZXcueHNsIj4KLQkgIAkJPHBhcmFtIG5hbWU9InRpdGxlIiBleHByZXNzaW9uPSIke3RpdGxlfSIvPgotCSAgCQk8cGFyYW0gbmFtZT0iaGVhZGVyIiBleHByZXNzaW9uPSIke2hlYWRlcn0iLz4KLQkgIAkJPHBhcmFtIG5hbWU9Im92ZXJ2aWV3IiBleHByZXNzaW9uPSIke292ZXJ2aWV3fSIvPgotCQkJPHBhcmFtIG5hbWU9Imxpc3RlZC1leHQtcG9pbnRzIiBleHByZXNzaW9uPSIke2xpc3RlZC1leHQtcG9pbnRzfSIvPgotCQk8L3hzbHQ+Ci0JCQkKLQkJPCEtLSBDcmVhdGUgdGhlIGV4dGVudGlvbiBwb2ludCB0b2MuIC0tPgotCQk8eHNsdCBiYXNlZGlyPSIke2Jhc2VkaXJ9IiBpbj0iZXh0RG9jTGlzdGluZ3MueG1sIiBvdXQ9InRvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIiBzdHlsZT0iZXh0RG9jVG9jLnhzbCI+Ci0JCQk8cGFyYW0gbmFtZT0ibGlzdGVkLWV4dC1wb2ludHMiIGV4cHJlc3Npb249IiR7bGlzdGVkLWV4dC1wb2ludHN9Ii8+Ci0JCQk8b3V0cHV0cHJvcGVydHkgbmFtZT0ibWV0aG9kIiB2YWx1ZT0ieG1sIi8+Ci0JCQk8b3V0cHV0cHJvcGVydHkgbmFtZT0iaW5kZW50IiB2YWx1ZT0ieWVzIi8+Ci0JCTwveHNsdD4KLQkJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9leHREb2NMaXN0aW5ncy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvZXh0RG9jTGlzdGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY1ZWM4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9leHREb2NMaXN0aW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50cz4KLQk8Y29tcG9uZW50IG5hbWU9IlZhbGlkYXRpb24gRnJhbWV3b3JrIiBpZD0idmYiIGZpbGU9InZmZXh0ZG9jcy54bWwiLz4KLTwvY29tcG9uZW50cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9leHREb2NPdmVydmlldy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvZXh0RG9jT3ZlcnZpZXcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQxOTg3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9leHREb2NPdmVydmlldy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4YWxhbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImhlYWRlciIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ib3ZlcnZpZXciLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imxpc3RlZC1leHQtcG9pbnRzIi8+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tcG9uZW50cyI+Ci0gICAgCQotICAgIAk8eHNsOnRleHQgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyI+Ci0gICAgCSZsdDshRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVFJBTlNJVElPTkFMLy9FTiImZ3Q7Ci0JCTwveHNsOnRleHQ+Ci0JCTxodG1sPgotCQk8aGVhZD4KLQkJPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotCQkmbHQ7bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgT3JhY2xlIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgJmd0OwotCi0gICAJCSZsdDttZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiJmd0OwotICAgCQk8L3hzbDp0ZXh0PgotICAgCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci0gICAJCTx4c2w6dGV4dCBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIj4KLQkJJmx0O0xJTksgUkVMPSJTVFlMRVNIRUVUIiBIUkVGPSIuLi8uLi9ib29rLmNzcyIgQ0hBUlNFVD0iSVNPLTg4NTktMSIgVFlQRT0idGV4dC9jc3MiJmd0OwotCQk8L3hzbDp0ZXh0PgotCQk8L2hlYWQ+Ci0JCTxib2R5IGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODAwMDgwIj4KLQotCQk8Y2VudGVyPgotCQk8aDE+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXIiLz48L2gxPgotCQk8L2NlbnRlcj4KLQotCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG92ZXJ2aWV3Ii8+Ci0gICAgCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjb21wb25lbnQiPgotICAgIAkJPHhzbDpzb3J0IHNlbGVjdD0iQGlkIi8+Ci0gICAgCQk8aDM+PGEgbmFtZT0ie0BpZH0iPjwvYT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2gzPgotICAgIAkJPHVsPgotICAgIAkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJkb2N1bWVudChAZmlsZSkvZmlsZXMvZmlsZSI+Ci0gICAgCQkJCTx4c2w6c29ydCBzZWxlY3Q9InRleHQoKSIvPgotICAgIAkJCQk8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRsaXN0ZWQtZXh0LXBvaW50cywgdHJhbnNsYXRlKHN1YnN0cmluZyh0ZXh0KCksIDAsIHN0cmluZy1sZW5ndGgodGV4dCgpKSAtIDQpLCdfJywnLicpKSI+Ci0gIAkJCQkJCTxsaT4KLSAgCQkJCQkJCTxhIGhyZWY9InsuLi9AY29tcG9uZW50fS97dGV4dCgpfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZShzdWJzdHJpbmcodGV4dCgpLCAwLCBzdHJpbmctbGVuZ3RoKHRleHQoKSkgLSA0KSwnXycsJy4nKSIvPjwvYT4gCi0gIAkJCQkJCTwvbGk+Ci0gIAkJCQkJPC94c2w6aWY+Ci0gICAgCQkJPC94c2w6Zm9yLWVhY2g+Ci0gICAgCQk8L3VsPgotICAgIAk8L3hzbDpmb3ItZWFjaD4KLSAgICAJPC9ib2R5PgotCQk8L2h0bWw+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2V4dERvY1RvYy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvZXh0RG9jVG9jLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNTRiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvZXh0RG9jVG9jLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGFsYW4iPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ibGlzdGVkLWV4dC1wb2ludHMiLz4KLSAgICAKLSAgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tcG9uZW50cyI+Ci0gICAgIAk8eHNsOnRleHQgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyI+Ci0mbHQ7P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/Jmd0OwotCSAJPC94c2w6dGV4dD4KLQkgCTx0b2MgbGFiZWw9IkV4dGVuc2lvbiBQb2ludHMgUmVmZXJlbmNlIj4KLQkgCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jdW1lbnQoY29tcG9uZW50L0BmaWxlKS9maWxlcy9maWxlIj4KLQkgCQkJPHhzbDpzb3J0IHNlbGVjdD0idGV4dCgpIi8+Ci0JIAkJCTx4c2w6aWYgdGVzdD0iY29udGFpbnMoJGxpc3RlZC1leHQtcG9pbnRzLCB0cmFuc2xhdGUoc3Vic3RyaW5nKHRleHQoKSwgMCwgc3RyaW5nLWxlbmd0aCh0ZXh0KCkpIC0gNCksJ18nLCcuJykpIj4KLQkgCQkJCTx0b3BpYyBsYWJlbD0ie3RyYW5zbGF0ZShzdWJzdHJpbmcodGV4dCgpLCAwLCBzdHJpbmctbGVuZ3RoKHRleHQoKSkgLSA0KSwnXycsJy4nKX0iIGhyZWY9InJlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3suLi9AY29tcG9uZW50fS97dGV4dCgpfSI+Ci0JIAkJCQk8L3RvcGljPgotCSAJCQk8L3hzbDppZj4KLQkgCQk8L3hzbDpmb3ItZWFjaD4KLQkgCTwvdG9jPiAKLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvamF2YWRvYy5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2phdmFkb2MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YjhiYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvamF2YWRvYy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotYXBpLnRpdGxlPVdlYiBUb29scyBQbGF0Zm9ybTogVmFsaWRhdGlvbiBGcmFtZXdvcmsKLXNvdXJjZXBhdGg9Li4vb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyOy4uL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUKLWFwaS5wYWNrYWdlcz1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbixvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9qYXZhZG9jQnVpbGQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2phdmFkb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NmM1MTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2phdmFkb2NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLQk8cHJvcGVydHkgZmlsZT0iamF2YWRvYy5wcm9wZXJ0aWVzIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UuaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4iLz4KLQkKLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLCBqYXZhZG9jIiBkZXNjcmlwdGlvbj0iQnVpbGRzIFBsdWdpbiBKYXZhZG9jIiAvPgotCQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke291dHB1dERpcn0vcmVmZXJlbmNlL2FwaS8iID4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImphdmFkb2MiPgotCQk8ZWNobyBtZXNzYWdlPSI9PT09PT09PT0gJHtlY2xpcHNlLmhvbWV9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfS9yZWZlcmVuY2UvYXBpIiAvPgotCi0JCTxqYXZhZG9jIAotICAgICAgICAJYWNjZXNzPSJwdWJsaWMiIAotICAgIAkJYWRkaXRpb25hbHBhcmFtPSItYnJlYWtpdGVyYXRvciIKLQkJCWF1dGhvcj0iZmFsc2UiIAotCQkJY2xhc3NwYXRoPSIke2NsYXNzcGF0aH0iIAotCQkJZGVzdGRpcj0iJHtvdXRwdXREaXJ9L3JlZmVyZW5jZS9hcGkiIAotCQkJZG9jdGl0bGU9IiR7YXBpLnRpdGxlfSIgCi0JCQlub2RlcHJlY2F0ZWQ9ImZhbHNlIiAKLQkJCW5vZGVwcmVjYXRlZGxpc3Q9ImZhbHNlIiAKLQkJCW5vaW5kZXg9InRydWUiIAotCQkJbm9uYXZiYXI9ImZhbHNlIiAKLQkJCW5vdHJlZT0idHJ1ZSIgCi0gICAgICAgIAlvdmVydmlldz0iJHtiYXNlZGlyfS9vdmVydmlldy5odG1sIgotCQkJcGFja2FnZW5hbWVzPSIke2FwaS5wYWNrYWdlc30iIAotCQkJc291cmNlcGF0aD0iJHtzb3VyY2VwYXRofSIgCi0JCQl1c2U9InRydWUiIAotCQkJdmVyc2lvbj0idHJ1ZSIKLQkJCWJyZWFraXRlcmF0b3I9InllcyIKLSAgICAgICAgCXZlcmJvc2U9ImZhbHNlIgotICAgICAgICAJZmFpbG9uZXJyb3I9ImZhbHNlIj4KLQkJCTx0YWcgbmFtZT0iaWdub3JlIiAgICAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0iZ2VuZXJhdGVkIiAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0ibW9kZWwiICAgICAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0ibW9kaWZpYWJsZSIgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0iZXh0ZW5kcyIgICAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0iaW1wbGVtZW50cyIgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0ib3JkZXJlZCIgICAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPC9qYXZhZG9jPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L292ZXJ2aWV3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3Yvb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxZWY3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3Yvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VmFsaWRhdGlvbiBGcmFtZXdvcmsgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLjwvcD4KLTxoMj5BcHByb2FjaDwvaDI+Ci08cD5JbiBXVFAgMy4wIGEgbmV3IHZhbGlkYXRpb24gZnJhbWV3b3JrIGhhcyBiZWVuIGFkZGVkLiBUaGlzIHdhcyBkZXZlbG9wZWQgYXQgCi10aGUgcmVxdWVzdCBvZiB2YWxpZGF0b3Igb3duZXJzIGFuZCBlbmQgdXNlcnMuIFRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhpcyAKLW5ldyBmcmFtZXdvcmssIHRoYXQgYXBwcm9hY2ggdGhhdCBoYXMgYmVlbiB0YWtlbiBpcyB0byBzdXBwb3J0IGJvdGggdGhlIG9sZCBhbmQgCi10aGUgbmV3IGZyYW1ld29ya3MgZm9yIGEgd2hpbGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgb2xkIHZhbGlkYXRvcnMgd29yayBleGFjdGx5IAotbGlrZSB0aGV5IHVzZWQgdG8uIFRoZXkgY2FuIHN0aWxsIHBsdWcgaW50byB0aGUgb2xkIGZyYW1ld29yayBhbmQgd2lsbCBjb250aW51ZSAKLXRvIGJlIHJ1biBieSB0aGUgb2xkIGZyYW1ld29yay4gVGhpcyBhbGxvd3MgdmFsaWRhdG9yIG93bmVycyB0byBtaWdyYXRlIGF0IHRoZWlyIAotb3duIHBhY2UuPC9wPgotPHA+Rm9yIHZhbGlkYXRvciBvd25lcnMgdGhhdCB3aXNoIHRvIGV4cGxvaXQgdGhlIG5ldyBmcmFtZXdvcmssIGl0IGhhcyBiZWVuIAotZGVzaWduZWQgbiBzdWNoIGEgd2F5IHRvIG1pbmltaXplIHRoZSB0cmFuc2l0aW9uIGZyb20gdGhlIG9sZCBmcmFtZXdvcmsgdG8gdGhlIAotbmV3IGZyYW1ld29yay4gVGhlcmUgaXMgYSBuZXcgZXh0ZW5zaW9uIHBvaW50IHRoYXQgbmVlZHMgdG8gYmUgc3BlY2lmaWVkLCBhbmQgYSAKLW5ldyBhYnN0cmFjdCBjbGFzcyB0aGF0IG5lZWRzIHRvIGJlIGV4dGVuZGVkLjwvcD4KLTxoMz5CZW5lZml0czwvaDM+Ci08cD5XaGF0IGJlbmVmaXRzIGRvZXMgdGhlIG5ldyBmcmFtZXdvcmsgaGF2ZSB0byBvZmZlcj8gT3IgYXNrZWQgYW5vdGhlciB3YXksIGFzIAotYSB2YWxpZGF0b3Igb3duZXIsIHdoeSB3b3VsZCBJIHdhbnQgdG8gc3dpdGNoPzwvcD4KLTxoND5QZXJmb3JtYW5jZTwvaDQ+Ci08aDU+VHVuaW5nPC9oNT4KLTxwPlRoZSBtYWluIHJlYXNvbiBmb3IgY3JlYXRpbmcgYSBuZXcgZnJhbWV3b3JrIHdhcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLiBBcyAKLW1vcmUgYW5kIG1vcmUgdmFsaWRhdG9ycyBhcmUgYWRkZWQsIHZhbGlkYXRpb24gaXMgY29uc3VtaW5nIGEgYmlnZ2VyIHNsaWNlIG9mIAotdGhlIHJlc291cmNlcyB0aGF0IGl0IHRha2VzIHRvIHBlcmZvcm0gYSBidWlsZC48L3A+Ci08cD5UaGUgYmVzdCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpcyBlbGltaW5hdGluZyB1bm5lY2Vzc2FyeSB3b3JrLiBXZSAKLWVsaW1pbmF0ZSB3b3JrLCBieSBwcm92aWRpbmcgc2lnbmlmaWNhbnRseSBtb3JlIHR1bmluZyBvcHRpb25zLiBWYWxpZGF0aW9uIAotb3duZXJzIGNhbiB0dW5lIHdoaWNoIHJlc291cmNlcyB0aGV5IGFyZSBjYWxsZWQgb24uIFRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSB1c2UgCi1vZiBmaWx0ZXIgcnVsZXMuIFRoZXNlIGZpbHRlciBydWxlcyBhcmUgZ3JvdXBlZCBpbnRvIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIAotZ3JvdXBzLiBJZiB5b3UgaGF2ZSBtdWx0aXBsZSBpbmNsdXNpb24gZ3JvdXBzIHRoZXkgYXJlICZxdW90O2FuZGVkJnF1b3Q7IHRvZ2V0aGVyLCBtZWFuaW5nIAotdGhhdCBlYWNoIG9mIHRoZSBpbmNsdXNpb24gZ3JvdXBzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VjY2Vzc2Z1bCBmaWx0ZXIgcnVsZS4gCi1FeGNsdXNpb24gZ3JvdXBzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hhdCBkb2Vzbid0IGdldCB2YWxpZGF0ZWQuIEV4Y2x1c2lvbiAKLWdyb3VwcyBoYXZlIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBpbmNsdXNpb24gZ3JvdXBzLiBJZiBhbiBleGNsdXNpb24gZ3JvdXAgCi1leGNsdWRlcyBhIHJlc291cmNlIHRoYW4gaXQgaXMgZXhjbHVkZWQgbm8gbWF0dGVyIHdoYXQgdGhlIGluY2x1c2lvbiBncm91cHMgbWF5IAotc2F5LjwvcD4KLTxwPlRoZXkgYXJlIHNldmVyYWwgZGlmZmVyZW50IHR5cGVzIG9mIGZpbHRlciBydWxlczo8L3A+Ci08dWw+Ci0JPGxpPjxzdHJvbmc+RmlsZSBleHRlbnNpb248L3N0cm9uZz4gLSBSdWxlcyBiYXNlZCBvbiB0aGUgZmlsZSBleHRlbnNpb24uIEZvciAKLQlleGFtcGxlLCBpbmNsdWRlIGFsbCB0aGUgZmlsZXMgd2l0aCBleHRlbnNpb24gKi54bWwuPC9saT4KLQk8bGk+PHN0cm9uZz5Gb2xkZXIgb3IgRmlsZSBuYW1lPC9zdHJvbmc+IC0gUnVsZXMgYmFzZWQgb24gdGhlIGZvbGRlciBvciBmaWxlIAotCW5hbWUuIEZvciBleGFtcGxlIGV4Y2x1ZGUgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIGJ1aWxkIGZvbGRlci4gRmlsZSBuYW1lcyAKLQljYW4gYmUgZnVsbHkgcXVhbGlmaWVkLCBwcm9qZWN0IHJlbGF0aXZlIG5hbWVzLCBlLmcuIDxzdHJvbmc+V2ViQ29udGVudC9XRUItSU5GL3dlYi54bWw8L3N0cm9uZz4sIAotCW9yIHNpbXBsZSBuYW1lcywgPHN0cm9uZz53ZWIueG1sPC9zdHJvbmc+LjwvbGk+Ci0JPGxpPjxzdHJvbmc+UHJvamVjdCBuYXR1cmU8L3N0cm9uZz4gLSBQcm9qZWN0cyB3aXRoIGNlcnRhaW4gbmF0dXJlcyBjYW4gYmUgCi0JZWl0aGVyIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLjwvbGk+Ci0JPGxpPjxzdHJvbmc+RmFjZXQ8L3N0cm9uZz4gLSBQcm9qZWN0cyB3aXRoIGNlcnRhaW4gZmFjZXRzIGNhbiBiZSBlaXRoZXIgCi0JaW5jbHVkZWQgb3IgZXhjbHVkZWQuPC9saT4KLQk8bGk+PHN0cm9uZz5Db250ZW50IFR5cGUgPC9zdHJvbmc+LSBSZXNvdXJjZXMgb2YgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSAKLQljYW4gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQuPC9saT4KLTwvdWw+Ci08cD5UaGUgZmlsdGVyIHJ1bGVzIGFuZCBncm91cHMgZm9ybSB0aGUgYnVpbGRpbmcgYmxvY2tzIG9mIHdoYXQgZ2V0cyB2YWxpZGF0ZWQuCi08L3A+Ci08cD5JbiB0ZXJtcyBvZiB0dW5pbmcgaG93ZXZlciwgdGhlIGVuZCB1c2VyIGhhcyB0aGUgZmluYWwgc2F5LiBUaGUgdmFsaWRhdG9yIAotb3duZXJzIHNwZWNpZnkgdGhlIGRlZmF1bHQgZmlsdGVyIHJ1bGVzIGFuZCBncm91cHMgZm9yIHRoZWlyIHZhbGlkYXRvciwgYnV0IHRoZSAKLWVuZCB1c2VyIHRocm91Z2ggdGhlIHVzZSBvZiBwcmVmZXJlbmNlcyBjYW4gb3ZlcnJpZGUgdGhlc2Ugc2V0dGluZ3MuIDwvcD4KLTxoNT5DYWNoaW5nPC9oNT4KLTxwPkFub3RoZXIgd2F5IHRoYXQgcGVyZm9ybWFuY2UgaXMgaW1wcm92ZWQgaXMgdGhyb3VnaCBtb3JlIGVmZmVjdGl2ZSBjYWNoaW5nLiAKLVdpdGggdGhlIHByZXZpb3VzIGZyYW1ld29yayB3ZSB3ZXJlIG5vdGljaW5nIHRoYXQgZGlmZmVyZW50IHZhbGlkYXRvcnMgd291bGQgYmUgCi1vcGVuaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBzYW1lIGZpbGUsIGJ1dCB0aGF0IHRoaXMgd291bGQgaGFwcGVuIGZhciBlbm91Z2ggCi1hcGFydCwgdGhhdCBjYWNoZXMgd2VyZW4ndCBlZmZlY3RpdmUuIEV2ZW4gaWYgZmlsZXMgd2VyZSBiZWluZyBjYWNoZWQsIHRoZSAKLXNlY29uZCAob3IgdGhpcmQsIG9yIGZvcnRoLCAuLi4pIG9wZW4gd291bGQgaGFwcGVuIGZhciBlbm91Z2ggYSBtZWFucyB0aGF0IHdheSAKLXRoYXQgdGhlIGZpbGUgd291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gZXZpY3RlZCBmcm9tIHRoZSBjYWNoZS4gSW4gdGhlIG5ldyAKLWZyYW1ld29yaywgdGhlIHByb2Nlc3Npbmcgb3JkZXIgaXMgbW9yZSB0aWdodGx5IGNvbnRyb2xsZWQuIFRoZSBmcmFtZXdvcmsgY2FsbHMgCi10aGUgdmFsaWRhdG9yIGFuZCB0ZWxscyBpdCB3aGF0IHRvIHZhbGlkYXRlLiBUaGlzIHdheSBmaWxlcyBhcmUgcHJvY2Vzc2VkIGluIAotb3JkZXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNoYW5jZSBvZiB0aGVtIGJlaW5nIGEgY2FjaGUgaXMgbXVjaCBoaWdoZXIuIEV2ZXJ5IAotdmFsaWRhdG9yIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiBmaWxlIEEgcHJvY2Vzc2VzIGl0LCBhbmQgdGhlbiB3ZSBtb3ZlIG9uIGFuZCAKLWV2ZXJ5IHZhbGlkYXRvciB0aGF0IGlzIGludGVyZXN0ZWQgaW4gZmlsZSBCIHByb2Nlc3NlcyBpdCwgZXRjLjwvcD4KLTxwPkFsc28gYmVjYXVzZSBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBrZXB0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbGlkYXRpb24gCi1vcGVyYXRpb24sIHZhbGlkYXRvcnMgY2FuIGNhY2hlIGV4cGVuc2l2ZSBvcGVyYXRpb25zLCBsaWtlIG1vZGVsIGNyZWF0aW9uLCB0aGF0IAotbWlnaHQgYmUgbmVlZGVkIGFzIHBhcnQgb2YgdmFsaWRhdGluZyBzZXZlcmFsIGZpbGVzLiA8L3A+Ci08aDU+Sm9iIENvbnRyb2w8L2g1PgotPHA+V2l0aCB0aGUgZWFybGllciBmcmFtZXdvcmssIHRoZXJlIHdlcmUgdG9vIG1hbnkgam9icy90aHJlYWRzIHJ1bm5pbmcgCi1jb25jdXJyZW50bHkuIFRoaXMgaXMgbm93IG1vcmUgdGlnaHRseSBjb250cm9sbGVkLjwvcD4KLTxoND5EZXBlbmRlbmN5IFN1cHBvcnQ8L2g0PgotPHA+QW5vdGhlciBuZXcgZmVhdHVyZSBpcyBkZXBlbmRlbmN5IHN1cHBvcnQuIEEgdmFsaWRhdG9yIGNhbiBub3cgYXNzZXJ0IHRoYXQgYSAKLXJlc291cmNlIGlzIGRlcGVuZGFudCBvbiBzb21lIG90aGVyIHJlc291cmNlcy4gRm9yIGV4YW1wbGUgdGhhdCBhIFhNTCBmaWxlIGlzIAotZGVwZW5kYW50IG9uIGEgWFNEIGZpbGUuIE5vdyBpZiB0aGUgWFNEIGZpbGUgY2hhbmdlcyB0aGUgWE1MIGNhbiBiZSByZXZhbGlkYXRlZC4gCi1BcyB0aGUgdXNlciBjb21lcyB0byB0cnVzdCB0aGlzIGRlcGVuZGVuY3kgc3VwcG9ydCwgdGhleSB3b250IHBlcmZvcm0gYXMgbWFueSAKLWNsZWFuIGJ1aWxkcy48L3A+Ci08aDQ+UHJpbWFyeSBGcmFtZXdvcms8L2g0PgotPHA+VGhpcyBpcyB0aGUgcHJpbWFyeSB2YWxpZGF0aW9uIGZyYW1ld29yay4gQXQgc29tZSBwb2ludCwgdGhlIGVhcmxpZXIgCi1mcmFtZXdvcmsgd2lsbCBiZSBkZXByZWNhdGVkIGFuZCB0aGVuIHJlbW92ZWQuIEFsbCB0aGUgbmV3IGludmVzdG1lbnQgd2lsbCAKLWhhcHBlbiBpbiB0aGlzIGZyYW1ld29yay4gPC9wPgotPHA+VGhlIGZyYW1ld29yayBjb2xsYXRlcmFsIHdpbGwgY29udGludWUgdG8gYmUgZW5oYW5jZWQgKGp1bml0IHRlc3RjYXNlcywgCi1kb2N1bWVudGF0aW9uLCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMsIC4uLik8L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTNmMDVlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1CdW5kbGUtTmFtZS4wID0gVmFsaWRhdGlvbiBGcmFtZXdvcmsgLSBEZXZlbG9wZXIgR3VpZGUKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzVhNWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9InRvYy54bWwiPgotICAgICAgPC90b2M+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDRkNDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotPEI+QWxsIENsYXNzZXM8L0I+PC9GT05UPgotPEJSPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+RnJpZW5kPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklEZXBlbmRlbmN5SW5kZXg8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SU1lc3NhZ2U8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SU1ldGFNb2RlbENvbnRleHQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JTXV0YWJsZVZhbGlkYXRvcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVBlcmZvcm1hbmNlTW9uaXRvcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVJlcG9ydGVyPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdGlvbkNvbnRleHQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdG9yPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVZhbGlkYXRvckdyb3VwTGlzdGVuZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdG9ySm9iPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlJlcG9ydGVySGVscGVyPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uUmVzdWx0PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRpb25SZXN1bHRzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uU3RhdGU8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRvcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0b3IuTGV2ZWw8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRvci5WMTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRvci5WMS5WMUNvcHk8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRvci5WMjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRvck1lc3NhZ2U8L0E+Ci08QlI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWFhNzA0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotPEI+QWxsIENsYXNzZXM8L0I+PC9GT05UPgotPEJSPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkRlcGVuZGVudFJlc291cmNlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+RnJpZW5kPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48ST5JRGVwZW5kZW5jeUluZGV4PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48ST5JTWVzc2FnZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEk+SU1ldGFNb2RlbENvbnRleHQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEk+SU11dGFibGVWYWxpZGF0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48ST5JUGVyZm9ybWFuY2VNb25pdG9yPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxJPklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48ST5JUmVwb3J0ZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48ST5JVmFsaWRhdGlvbkNvbnRleHQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEk+SVZhbGlkYXRvcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48ST5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48ST5JVmFsaWRhdG9ySm9iPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5NZXNzYWdlTGltaXRFeGNlcHRpb248L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5SZXBvcnRlckhlbHBlcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxLlYxQ29weTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPgotPEJSPgotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvY29uc3RhbnQtdmFsdWVzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9jb25zdGFudC12YWx1ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ODJjZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9jb25zdGFudC12YWx1ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Db25zdGFudCBGaWVsZCBWYWx1ZXMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJDb25zdGFudCBGaWVsZCBWYWx1ZXMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ic2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9jb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJjb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgxPgotQ29uc3RhbnQgRmllbGQgVmFsdWVzPC9IMT4KLTwvQ0VOVEVSPgotPEhSIFNJWkU9IjQiIE5PU0hBREU+Ci08Qj5Db250ZW50czwvQj48VUw+Ci08TEk+PEEgSFJFRj0iI29yZy5lY2xpcHNlIj5vcmcuZWNsaXBzZS4qPC9BPgotPC9VTD4KLQotPEEgTkFNRT0ib3JnLmVjbGlwc2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Rk9OVCBTSVpFPSIrMiI+Ci1vcmcuZWNsaXBzZS4qPC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZS5WYWxpZGF0aW9uSWQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI1ZhbGlkYXRpb25JZCI+VmFsaWRhdGlvbklkPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+IlZhbGlkYXRpb25JZCI8L0NPREU+PC9URD4KLTwvVFI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5BTExfTUVTU0FHRVMiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjQUxMX01FU1NBR0VTIj5BTExfTUVTU0FHRVM8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT43PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI0VSUk9SX0FORF9XQVJOSU5HIj5FUlJPUl9BTkRfV0FSTklORzwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjM8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuSElHSF9TRVZFUklUWSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNISUdIX1NFVkVSSVRZIj5ISUdIX1NFVkVSSVRZPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+MTwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5MSU5FTk9fVU5TRVQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjTElORU5PX1VOU0VUIj5MSU5FTk9fVU5TRVQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLkxPV19TRVZFUklUWSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNMT1dfU0VWRVJJVFkiPkxPV19TRVZFUklUWTwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjQ8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI05PUk1BTF9TRVZFUklUWSI+Tk9STUFMX1NFVkVSSVRZPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+MjwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5PRkZTRVRfVU5TRVQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjT0ZGU0VUX1VOU0VUIj5PRkZTRVRfVU5TRVQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4tMTwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5UYXJnZXRSZXNvdXJjZSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjVGFyZ2V0UmVzb3VyY2UiPlRhcmdldFJlc291cmNlPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+IlRhcmdldFJlc291cmNlIjwvQ09ERT48L1REPgotPC9UUj4KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJzZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP2NvbnN0YW50LXZhbHVlcy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImNvbnN0YW50LXZhbHVlcy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvZGVwcmVjYXRlZC1saXN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9kZXByZWNhdGVkLWxpc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1N2FmNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9kZXByZWNhdGVkLWxpc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1EZXByZWNhdGVkIExpc3QKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJEZXByZWNhdGVkIExpc3QiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ic2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPkRlcHJlY2F0ZWQgQVBJPC9CPjwvSDI+Ci08L0NFTlRFUj4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotPEI+Q29udGVudHM8L0I+PFVMPgotPExJPjxBIEhSRUY9IiNleGNlcHRpb24iPkRlcHJlY2F0ZWQgRXhjZXB0aW9uczwvQT4KLTxMST48QSBIUkVGPSIjZmllbGQiPkRlcHJlY2F0ZWQgRmllbGRzPC9BPgotPExJPjxBIEhSRUY9IiNtZXRob2QiPkRlcHJlY2F0ZWQgTWV0aG9kczwvQT4KLTwvVUw+Ci0KLTxBIE5BTUU9ImV4Y2VwdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkRlcHJlY2F0ZWQgRXhjZXB0aW9uczwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb248L0E+Ci08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8ST5UaGlzIGNsYXNzIGlzIG5vdCBsb25nZXIgdXNlZCBieSB0aGUgZnJhbWV3b3JrLiBUaGUgZnJhbWV3b3JrIGlzCi0gIG5vdCBnb2luZyB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGRpc3BsYXllZCBieSBhIHZhbGlkYXRvci48L0k+Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9ImZpZWxkIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RGVwcmVjYXRlZCBGaWVsZHM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwjVHJpZ2dlclJlc291cmNlIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUuVHJpZ2dlclJlc291cmNlPC9BPgotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PEk+VGhpcyBhcHByb2FjaCBpcyBub3QgdGhyZWFkIHNhZmUsIHRoZSBsb25nZXIgZm9ybSBvZiB0aGUgQWJzdHJhY3RWYWxpZGF0b3IgdmFsaWRhdGUgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuPC9JPiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJtZXRob2QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5EZXByZWNhdGVkIE1ldGhvZHM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFZhbGlkYXRvcihqYXZhLmxhbmcuU3RyaW5nKSI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yay5nZXRWYWxpZGF0b3IoU3RyaW5nKTwvQT4KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxJPlVzZSBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KSB3aXRoIGEgbnVsbCBwcm9qZWN0IGluc3RlYWQuPC9JPiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ic2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9oZWxwLWRvYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaGVscC1kb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0MzZlNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9oZWxwLWRvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLUFQSSBIZWxwCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQVBJIEhlbHAiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ic2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SGVscDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP2hlbHAtZG9jLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgxPgotSG93IFRoaXMgQVBJIERvY3VtZW50IElzIE9yZ2FuaXplZDwvSDE+Ci08L0NFTlRFUj4KLVRoaXMgQVBJIChBcHBsaWNhdGlvbiBQcm9ncmFtbWluZyBJbnRlcmZhY2UpIGRvY3VtZW50IGhhcyBwYWdlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpdGVtcyBpbiB0aGUgbmF2aWdhdGlvbiBiYXIsIGRlc2NyaWJlZCBhcyBmb2xsb3dzLjxIMz4KLU92ZXJ2aWV3PC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLVRoZSA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPk92ZXJ2aWV3PC9BPiBwYWdlIGlzIHRoZSBmcm9udCBwYWdlIG9mIHRoaXMgQVBJIGRvY3VtZW50IGFuZCBwcm92aWRlcyBhIGxpc3Qgb2YgYWxsIHBhY2thZ2VzIHdpdGggYSBzdW1tYXJ5IGZvciBlYWNoLiAgVGhpcyBwYWdlIGNhbiBhbHNvIGNvbnRhaW4gYW4gb3ZlcmFsbCBkZXNjcmlwdGlvbiBvZiB0aGUgc2V0IG9mIHBhY2thZ2VzLjwvQkxPQ0tRVU9URT4KLTxIMz4KLVBhY2thZ2U8L0gzPgotPEJMT0NLUVVPVEU+Ci0KLTxQPgotRWFjaCBwYWNrYWdlIGhhcyBhIHBhZ2UgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgaXRzIGNsYXNzZXMgYW5kIGludGVyZmFjZXMsIHdpdGggYSBzdW1tYXJ5IGZvciBlYWNoLiBUaGlzIHBhZ2UgY2FuIGNvbnRhaW4gZm91ciBjYXRlZ29yaWVzOjxVTD4KLTxMST5JbnRlcmZhY2VzIChpdGFsaWMpPExJPkNsYXNzZXM8TEk+RW51bXM8TEk+RXhjZXB0aW9uczxMST5FcnJvcnM8TEk+QW5ub3RhdGlvbiBUeXBlczwvVUw+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1DbGFzcy9JbnRlcmZhY2U8L0gzPgotPEJMT0NLUVVPVEU+Ci0KLTxQPgotRWFjaCBjbGFzcywgaW50ZXJmYWNlLCBuZXN0ZWQgY2xhc3MgYW5kIG5lc3RlZCBpbnRlcmZhY2UgaGFzIGl0cyBvd24gc2VwYXJhdGUgcGFnZS4gRWFjaCBvZiB0aGVzZSBwYWdlcyBoYXMgdGhyZWUgc2VjdGlvbnMgY29uc2lzdGluZyBvZiBhIGNsYXNzL2ludGVyZmFjZSBkZXNjcmlwdGlvbiwgc3VtbWFyeSB0YWJsZXMsIGFuZCBkZXRhaWxlZCBtZW1iZXIgZGVzY3JpcHRpb25zOjxVTD4KLTxMST5DbGFzcyBpbmhlcml0YW5jZSBkaWFncmFtPExJPkRpcmVjdCBTdWJjbGFzc2VzPExJPkFsbCBLbm93biBTdWJpbnRlcmZhY2VzPExJPkFsbCBLbm93biBJbXBsZW1lbnRpbmcgQ2xhc3NlczxMST5DbGFzcy9pbnRlcmZhY2UgZGVjbGFyYXRpb248TEk+Q2xhc3MvaW50ZXJmYWNlIGRlc2NyaXB0aW9uCi08UD4KLTxMST5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTxMST5GaWVsZCBTdW1tYXJ5PExJPkNvbnN0cnVjdG9yIFN1bW1hcnk8TEk+TWV0aG9kIFN1bW1hcnkKLTxQPgotPExJPkZpZWxkIERldGFpbDxMST5Db25zdHJ1Y3RvciBEZXRhaWw8TEk+TWV0aG9kIERldGFpbDwvVUw+Ci1FYWNoIHN1bW1hcnkgZW50cnkgY29udGFpbnMgdGhlIGZpcnN0IHNlbnRlbmNlIGZyb20gdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGZvciB0aGF0IGl0ZW0uIFRoZSBzdW1tYXJ5IGVudHJpZXMgYXJlIGFscGhhYmV0aWNhbCwgd2hpbGUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9ucyBhcmUgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgY29kZS4gVGhpcyBwcmVzZXJ2ZXMgdGhlIGxvZ2ljYWwgZ3JvdXBpbmdzIGVzdGFibGlzaGVkIGJ5IHRoZSBwcm9ncmFtbWVyLjwvQkxPQ0tRVU9URT4KLTwvQkxPQ0tRVU9URT4KLTxIMz4KLUFubm90YXRpb24gVHlwZTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIGFubm90YXRpb24gdHlwZSBoYXMgaXRzIG93biBzZXBhcmF0ZSBwYWdlIHdpdGggdGhlIGZvbGxvd2luZyBzZWN0aW9uczo8VUw+Ci08TEk+QW5ub3RhdGlvbiBUeXBlIGRlY2xhcmF0aW9uPExJPkFubm90YXRpb24gVHlwZSBkZXNjcmlwdGlvbjxMST5SZXF1aXJlZCBFbGVtZW50IFN1bW1hcnk8TEk+T3B0aW9uYWwgRWxlbWVudCBTdW1tYXJ5PExJPkVsZW1lbnQgRGV0YWlsPC9VTD4KLTwvQkxPQ0tRVU9URT4KLTwvQkxPQ0tRVU9URT4KLTxIMz4KLUVudW08L0gzPgotPEJMT0NLUVVPVEU+Ci0KLTxQPgotRWFjaCBlbnVtIGhhcyBpdHMgb3duIHNlcGFyYXRlIHBhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjxVTD4KLTxMST5FbnVtIGRlY2xhcmF0aW9uPExJPkVudW0gZGVzY3JpcHRpb248TEk+RW51bSBDb25zdGFudCBTdW1tYXJ5PExJPkVudW0gQ29uc3RhbnQgRGV0YWlsPC9VTD4KLTwvQkxPQ0tRVU9URT4KLTxIMz4KLVVzZTwvSDM+Ci08QkxPQ0tRVU9URT4KLUVhY2ggZG9jdW1lbnRlZCBwYWNrYWdlLCBjbGFzcyBhbmQgaW50ZXJmYWNlIGhhcyBpdHMgb3duIFVzZSBwYWdlLiAgVGhpcyBwYWdlIGRlc2NyaWJlcyB3aGF0IHBhY2thZ2VzLCBjbGFzc2VzLCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMgYW5kIGZpZWxkcyB1c2UgYW55IHBhcnQgb2YgdGhlIGdpdmVuIGNsYXNzIG9yIHBhY2thZ2UuIEdpdmVuIGEgY2xhc3Mgb3IgaW50ZXJmYWNlIEEsIGl0cyBVc2UgcGFnZSBpbmNsdWRlcyBzdWJjbGFzc2VzIG9mIEEsIGZpZWxkcyBkZWNsYXJlZCBhcyBBLCBtZXRob2RzIHRoYXQgcmV0dXJuIEEsIGFuZCBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMgd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgQS4gIFlvdSBjYW4gYWNjZXNzIHRoaXMgcGFnZSBieSBmaXJzdCBnb2luZyB0byB0aGUgcGFja2FnZSwgY2xhc3Mgb3IgaW50ZXJmYWNlLCB0aGVuIGNsaWNraW5nIG9uIHRoZSAiVXNlIiBsaW5rIGluIHRoZSBuYXZpZ2F0aW9uIGJhci48L0JMT0NLUVVPVEU+Ci08SDM+Ci1EZXByZWNhdGVkIEFQSTwvSDM+Ci08QkxPQ0tRVU9URT4KLVRoZSA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+RGVwcmVjYXRlZCBBUEk8L0E+IHBhZ2UgbGlzdHMgYWxsIG9mIHRoZSBBUEkgdGhhdCBoYXZlIGJlZW4gZGVwcmVjYXRlZC4gQSBkZXByZWNhdGVkIEFQSSBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSwgZ2VuZXJhbGx5IGR1ZSB0byBpbXByb3ZlbWVudHMsIGFuZCBhIHJlcGxhY2VtZW50IEFQSSBpcyB1c3VhbGx5IGdpdmVuLiBEZXByZWNhdGVkIEFQSXMgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlIGltcGxlbWVudGF0aW9ucy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1QcmV2L05leHQ8L0gzPgotVGhlc2UgbGlua3MgdGFrZSB5b3UgdG8gdGhlIG5leHQgb3IgcHJldmlvdXMgY2xhc3MsIGludGVyZmFjZSwgcGFja2FnZSwgb3IgcmVsYXRlZCBwYWdlLjxIMz4KLUZyYW1lcy9ObyBGcmFtZXM8L0gzPgotVGhlc2UgbGlua3Mgc2hvdyBhbmQgaGlkZSB0aGUgSFRNTCBmcmFtZXMuICBBbGwgcGFnZXMgYXJlIGF2YWlsYWJsZSB3aXRoIG9yIHdpdGhvdXQgZnJhbWVzLgotPFA+Ci08SDM+Ci1TZXJpYWxpemVkIEZvcm08L0gzPgotRWFjaCBzZXJpYWxpemFibGUgb3IgZXh0ZXJuYWxpemFibGUgY2xhc3MgaGFzIGEgZGVzY3JpcHRpb24gb2YgaXRzIHNlcmlhbGl6YXRpb24gZmllbGRzIGFuZCBtZXRob2RzLiBUaGlzIGluZm9ybWF0aW9uIGlzIG9mIGludGVyZXN0IHRvIHJlLWltcGxlbWVudG9ycywgbm90IHRvIGRldmVsb3BlcnMgdXNpbmcgdGhlIEFQSS4gV2hpbGUgdGhlcmUgaXMgbm8gbGluayBpbiB0aGUgbmF2aWdhdGlvbiBiYXIsIHlvdSBjYW4gZ2V0IHRvIHRoaXMgaW5mb3JtYXRpb24gYnkgZ29pbmcgdG8gYW55IHNlcmlhbGl6ZWQgY2xhc3MgYW5kIGNsaWNraW5nICJTZXJpYWxpemVkIEZvcm0iIGluIHRoZSAiU2VlIGFsc28iIHNlY3Rpb24gb2YgdGhlIGNsYXNzIGRlc2NyaXB0aW9uLgotPFA+Ci08SDM+Ci1Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0gzPgotVGhlIDxhIGhyZWY9ImNvbnN0YW50LXZhbHVlcy5odG1sIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L2E+IHBhZ2UgbGlzdHMgdGhlIHN0YXRpYyBmaW5hbCBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlcy4KLTxQPgotPEZPTlQgU0laRT0iLTEiPgotPEVNPgotVGhpcyBoZWxwIGZpbGUgYXBwbGllcyB0byBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGRvY2xldC48L0VNPgotPC9GT05UPgotPEJSPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InNlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkhlbHA8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9oZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzN2UzOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5LS0+Ci08VElUTEU+Ci1HZW5lcmF0ZWQgRG9jdW1lbnRhdGlvbiAoVW50aXRsZWQpCi08L1RJVExFPgotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHRhcmdldFBhZ2UgPSAiIiArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7Ci0gICAgaWYgKHRhcmdldFBhZ2UgIT0gIiIgJiYgdGFyZ2V0UGFnZSAhPSAidW5kZWZpbmVkIikKLSAgICAgICAgdGFyZ2V0UGFnZSA9IHRhcmdldFBhZ2Uuc3Vic3RyaW5nKDEpOwotICAgIGlmICh0YXJnZXRQYWdlLmluZGV4T2YoIjoiKSAhPSAtMSkKLSAgICAgICAgdGFyZ2V0UGFnZSA9ICJ1bmRlZmluZWQiOwotICAgIGZ1bmN0aW9uIGxvYWRGcmFtZXMoKSB7Ci0gICAgICAgIGlmICh0YXJnZXRQYWdlICE9ICIiICYmIHRhcmdldFBhZ2UgIT0gInVuZGVmaW5lZCIpCi0gICAgICAgICAgICAgdG9wLmNsYXNzRnJhbWUubG9jYXRpb24gPSB0b3AudGFyZ2V0UGFnZTsKLSAgICB9Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci08L0hFQUQ+Ci08RlJBTUVTRVQgY29scz0iMjAlLDgwJSIgdGl0bGU9IiIgb25Mb2FkPSJ0b3AubG9hZEZyYW1lcygpIj4KLTxGUkFNRVNFVCByb3dzPSIzMCUsNzAlIiB0aXRsZT0iIiBvbkxvYWQ9InRvcC5sb2FkRnJhbWVzKCkiPgotPEZSQU1FIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIgdGl0bGU9IkFsbCBQYWNrYWdlcyI+Ci08RlJBTUUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9InBhY2thZ2VGcmFtZSIgdGl0bGU9IkFsbCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIChleGNlcHQgbm9uLXN0YXRpYyBuZXN0ZWQgdHlwZXMpIj4KLTwvRlJBTUVTRVQ+Ci08RlJBTUUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiIHRpdGxlPSJQYWNrYWdlLCBjbGFzcyBhbmQgaW50ZXJmYWNlIGRlc2NyaXB0aW9ucyIgc2Nyb2xsaW5nPSJ5ZXMiPgotPE5PRlJBTUVTPgotPEgyPgotRnJhbWUgQWxlcnQ8L0gyPgotCi08UD4KLVRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgotPEJSPgotTGluayB0bzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Tm9uLWZyYW1lIHZlcnNpb24uPC9BPgotPC9OT0ZSQU1FUz4KLTwvRlJBTUVTRVQ+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNzYzZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMiBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLUFic3RyYWN0VmFsaWRhdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQWJzdHJhY3RWYWxpZGF0b3IiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotQ2xhc3MgQWJzdHJhY3RWYWxpZGF0b3I8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgYWJzdHJhY3QgY2xhc3MgPEI+QWJzdHJhY3RWYWxpZGF0b3I8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGUgY2xhc3MgdGhhdCBhbGwgVmFsaWRhdG9ycyB0aGF0IHdpc2ggdG8gdXNlIHZlcnNpb24gdHdvIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBtdXN0IHN1YmNsYXNzLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI0Fic3RyYWN0VmFsaWRhdG9yKCkiPkFic3RyYWN0VmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjY2xlYW4oSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPmNsZWFuPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIGNhbGwgYmFjayBtZXRob2QgdGhhdCBsZXRzIHRoZSB2YWxpZGF0b3Iga25vdyB0aGF0IHRoZSBwcm9qZWN0IGlzIGJlaW5nCi0gY2xlYW5lZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI2dldFBhcmVudCgpIj5nZXRQYXJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRvciB0aGF0IHlvdSBiZWxvbmcgdG8uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2hvdWxkIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBmaXJzdCBjbGVhciB0aGUgbWFya2VycyB0aGF0IHRoaXMKLSB2YWxpZGF0b3IgaGFzIHBsYWNlZCBvbiB0aGlzIHJlc291cmNlPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJBYnN0cmFjdFZhbGlkYXRvcigpIj48IS0tIC0tPjwvQT48SDM+Ci1BYnN0cmFjdFZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxCPkFic3RyYWN0VmFsaWRhdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPiA8Qj52YWxpZGF0ZTwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+VmFsaWRhdGUgdGhlIHJlc291cmNlLiBUaGUgdmFsaWRhdG9yIGlzIGNhbGxlZCBmcm9tIGEgV29ya3NwYWNlSm9iLCBzbwotIHRoZSB2YWxpZGF0b3IgaXRzZWxmIGRvZXMgbm90IG5lZWQgdG8gZXN0YWJsaXNoIGl0J3Mgb3duIElXb3Jrc3BhY2VSdW5uYWJsZS4KLSA8cD4KLSBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgdGhlbiB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgb3RoZXIgdmFsaWRhdGUgbWV0aG9kLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC48REQ+PENPREU+a2luZDwvQ09ERT4gLSBUaGUgd2F5IHRoZSByZXNvdXJjZSBjaGFuZ2VkLiBJdCB1c2VzIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUga2luZAotICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpbiBJUmVzb3VyY2VEZWx0YS48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gQSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZQotICAgICAgICAgICAgICAgIGludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS4KLSAgICAgICAgICAgICAgICBBdCB0aGUgZW5kIG9mIHRoZSB2YWxpZGF0aW9uIHBoYXNlLCB0aGlzIG9iamVjdCB3aWxsIGJlIGNsZWFyZWQsCi0gICAgICAgICAgICAgICAgdGhlcmVieSBhbGxvd2luZyBhbnkgb2YgdGhpcyBzdGF0ZSBpbmZvcm1hdGlvbiB0byBiZSBnYXJiYWdlZAotICAgICAgICAgICAgICAgIGNvbGxlY3RlZC48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBBIG1vbml0b3IgdGhhdCB5b3UgY2FuIHVzZSB0byByZXBvcnQgeW91ciBwcm9ncmVzcy4gVG8gYmUgYSB3ZWxsCi0gICAgICAgICAgICAgICAgYmVoYXZlZCB2YWxpZGF0b3IgeW91IG5lZWQgdG8gY2hlY2sgdGhlIGlzQ2FuY2VsbGVkKCkgbWV0aG9kIGF0Ci0gICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgdGltZXMuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSByZXN1bHQgb2YgdGhlIHZhbGlkYXRpb24uIFRoaXMgbWF5IGJlLCBidXQgdXN1YWxseSBpc24ndCwgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4gPEI+dmFsaWRhdGU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPlZhbGlkYXRlIHRoZSByZXNvdXJjZS4gVGhlIHZhbGlkYXRvciBpcyBjYWxsZWQgZnJvbSBhIFdvcmtzcGFjZUpvYiwgc28KLSB0aGUgdmFsaWRhdG9yIGl0c2VsZiBkb2VzIG5vdCBuZWVkIHRvIGVzdGFibGlzaCBpdCdzIG93bgotIElXb3Jrc3BhY2VSdW5uYWJsZS4KLSA8cD4KLSBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgdGhlbiB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgb3RoZXIKLSB2YWxpZGF0ZSBtZXRob2QuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5ldmVudDwvQ09ERT4gLSBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZCBhbmQgd2h5Ci0gICAgICAgICAgICBpdCBzaG91bGQgYmUgdmFsaWRhdGVkLjxERD48Q09ERT5zdGF0ZTwvQ09ERT4gLSBBIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lCi0gICAgICAgICAgICBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24KLSAgICAgICAgICAgIHBoYXNlLiBBdCB0aGUgZW5kIG9mIHRoZSB2YWxpZGF0aW9uIHBoYXNlLCB0aGlzIG9iamVjdCB3aWxsIGJlCi0gICAgICAgICAgICBjbGVhcmVkLCB0aGVyZWJ5IGFsbG93aW5nIGFueSBvZiB0aGlzIHN0YXRlIGluZm9ybWF0aW9uIHRvIGJlCi0gICAgICAgICAgICBnYXJiYWdlZCBjb2xsZWN0ZWQuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gQSBtb25pdG9yIHRoYXQgeW91IGNhbiB1c2UgdG8gcmVwb3J0IHlvdXIgcHJvZ3Jlc3MuIFRvIGJlIGEKLSAgICAgICAgICAgIHdlbGwgYmVoYXZlZCB2YWxpZGF0b3IgeW91IG5lZWQgdG8gY2hlY2sgdGhlIGlzQ2FuY2VsbGVkKCkKLSAgICAgICAgICAgIG1ldGhvZCBhdCBhcHByb3ByaWF0ZSB0aW1lcy4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHJlc3VsdCBvZiB0aGUgdmFsaWRhdGlvbi4gTnVsbCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQuIElmCi0gICAgICAgICBudWxsIGlzIHJldHVybmVkIHRoZW4gdGhlIG90aGVyIHZhbGlkYXRlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcwotICAgICAgICAgd2VsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1jbGVhbjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+Y2xlYW48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPkEgY2FsbCBiYWNrIG1ldGhvZCB0aGF0IGxldHMgdGhlIHZhbGlkYXRvciBrbm93IHRoYXQgdGhlIHByb2plY3QgaXMgYmVpbmcKLSBjbGVhbmVkLiBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgdmFsaWRhdG9yIGEgY2hhbmNlIHRvIGRvIGFueSBzcGVjaWFsCi0gY2xlYW51cC4gVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KLSA8cD4KLSBJZiB0aGUgZW50aXJlIHdvcmtzcGFjZSBpcyBiZWluZyBjbGVhbmVkLCB0aGVuIHRoZSBmaXJzdCBjYWxsIHdpbGwgaGF2ZSBhCi0gbnVsbCBwcm9qZWN0LCBhbmQgdGhlbiB0aGVyZSB3aWxsIGJlIHN1YnNlcXVlbnQgY2FsbHMgZm9yIGVhY2ggb3BlbgotIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS48L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gVGhlIHByb2plY3QgYmVpbmcgY2xlYW5lZC4gVGhpcyBtYXkgYmUgbnVsbCwgd2hpY2ggaXMgYW4gaW5kaWNhdGlvbgotICAgICAgICAgICAgICAgIHRoYXQgdGhlIHdvcmtzcGFjZSBpcyBiZWluZyBjbGVhbmVkLjxERD48Q09ERT5zdGF0ZTwvQ09ERT4gLSBBIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lCi0gICAgICAgICAgICAgICAgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0byB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIFRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgY2xlYW4KLSAgICAgICAgICAgICAgICB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGlvblN0YXJ0aW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj52YWxpZGF0aW9uU3RhcnRpbmc8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+VGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS4gSXQgYWxsb3dzCi0gdmFsaWRhdG9ycyB0byBwZXJmb3JtIGFueSBpbml0aWFsaXphdGlvbiB0aGF0IHRoZXkgbWlnaHQgbmVlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4gRm9yIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgaW4gdGhlCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbiBwaGFzZSwgdGhpcyB3aWxsIGJlIG51bGwuIEEgbnVsbCBwcm9qZWN0IGlzIHRoZSBzaWduYWwKLSAgICAgICAgICAgICAgICB0aGF0IGEgdG9wIGxldmVsIHZhbGlkYXRpb24gaXMgc3RhcnRpbmcuIFN1YnNlcXVlbnRseSwgdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICB3aWxsIGJlIHNldCwgYXMgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBwcm9qZWN0cyBhcmUgdmFsaWRhdGVkLjxERD48Q09ERT5zdGF0ZTwvQ09ERT4gLSBBIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lCi0gICAgICAgICAgICAgICAgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0byB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIFRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgICAgICB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRpb25GaW5pc2hpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnZhbGlkYXRpb25GaW5pc2hpbmc8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD5UaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuIEl0IGFsbG93cwotIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkgY2xlYW51cCB0aGF0IHRoZXkgbWlnaHQgbmVlZCB0byBkby4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IHdhcyB2YWxpZGF0ZWQuIFRoZSB2ZXJ5IGxhc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgIHNldHMgdGhpcyB0byBudWxsIHNvIHRoYXQgdGhlIHZhbGlkYXRvciBrbm93cyB0aGF0IGFsbCB0aGUKLSAgICAgICAgICAgICAgICBwcm9qZWN0cyBoYXZlIG5vdyBiZWVuIHZhbGlkYXRlZC48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gQSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZQotICAgICAgICAgICAgICAgIGludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBUaGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFudXAKLSAgICAgICAgICAgICAgICB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRDbGVhck1hcmtlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNob3VsZENsZWFyTWFya2VyczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvUFJFPgotPERMPgotPEREPlNob3VsZCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZmlyc3QgY2xlYXIgdGhlIG1hcmtlcnMgdGhhdCB0aGlzCi0gdmFsaWRhdG9yIGhhcyBwbGFjZWQgb24gdGhpcyByZXNvdXJjZT8gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkKLSB2YWxpZGF0b3IgaW1wbGVtZW50b3JzIHRvIHByb3ZpZGUgYSB2YWxpZGF0b3Igc3BlY2lmaWMgYmVoYXZpb3IuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmV2ZW50PC9DT0RFPiAtIFRoZSB2YWxpZGF0aW9uIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSB2YWxpZGF0aW9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzaG91bGQgZmlyc3QgY2xlYXIgYWxsIHRoZQotICAgICAgICAgbWFya2VycyB0aGF0IHRoaXMgdmFsaWRhdG9yIHByb2R1Y2VkLiBUaGlzIGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICBiZWhhdmlvci4gUmV0dXJuIGZhbHNlIHRvIGxlYXZlIHRoZSBtYXJrZXJzIHVuY2hhbmdlZC4gSXQgdGhlbgotICAgICAgICAgYmVjb21lcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHZhbGlkYXRvciB0byBtYW5hZ2UgaXQncyBvd24KLSAgICAgICAgIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UsIGZvciB0aGlzIHZhbGlkYXRpb24gZXZlbnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQYXJlbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UGFyZW50PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPiA8Qj5nZXRQYXJlbnQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHZhbGlkYXRvciB0aGF0IHlvdSBiZWxvbmcgdG8uIFRoZSB2YWxpZGF0b3IgY29udHJvbHMgdGhlCi0gZmlsdGVycyBhbmQgdmFyaW91cyBvdGhlciBzZXR0aW5ncy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJBYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyNWE0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMiBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLURlcGVuZGVudFJlc291cmNlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRGVwZW5kZW50UmVzb3VyY2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0RlcGVuZGVudFJlc291cmNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBEZXBlbmRlbnRSZXNvdXJjZTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uRGVwZW5kZW50UmVzb3VyY2U8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5EZXBlbmRlbnRSZXNvdXJjZTwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLUEgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlbnQgb24gYW5vdGhlciByZXNvdXJjZS4KLSA8cD4KLSBUaGlzIGlzIHJldHVybmVkIGJ5IHRoZSBJRGVwZW5kZW5jeUluZGV4LgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Q09ERT5JRGVwZW5kZW5jeUluZGV4PC9DT0RFPjwvQT48L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sI0RlcGVuZGVudFJlc291cmNlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+RGVwZW5kZW50UmVzb3VyY2U8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lSZXNvdXJjZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sI2dldFJlc291cmNlKCkiPmdldFJlc291cmNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVkIG9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwjZ2V0VmFsaWRhdG9yKCkiPmdldFZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgdmFsaWRhdG9yIHRoYXQgYXNzZXJ0ZWQgdGhlIGRlcGVuZGVuY3kuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJEZXBlbmRlbnRSZXNvdXJjZShJUmVzb3VyY2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLURlcGVuZGVudFJlc291cmNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+RGVwZW5kZW50UmVzb3VyY2U8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldFJlc291cmNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFJlc291cmNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVJlc291cmNlIDxCPmdldFJlc291cmNlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVkIG9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiA8Qj5nZXRWYWxpZGF0b3I8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHZhbGlkYXRvciB0aGF0IGFzc2VydGVkIHRoZSBkZXBlbmRlbmN5LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlNjM2MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzIgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1GcmllbmQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJGcmllbmQiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0ZyaWVuZC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRnJpZW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIEZyaWVuZDwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uRnJpZW5kPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+RnJpZW5kPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBjbGFzcyBpcyBvbmx5IHRvIGJlIGNhbGxlZCBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgYW5kIGl0J3MgdGVzdCBjYXNlcy4KLSBUaGlzIGNsYXNzIGlzIE5PVCBwYXJ0IG9mIHRoZSBBUEkuCi0gPHA+Ci0gVGhpcyBjbGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gc29tZSBpbnRlcm5hbCBtZXRob2RzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjRnJpZW5kKCkiPkZyaWVuZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCNpc0xvYWRlZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5pc0xvYWRlZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtIYXMgdGhlIHZhbGlkYXRvcidzIGltcGxlbWVudGF0aW9uIGJlZW4gbG9hZGVkIHlldD88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCNzZXRNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IsIGphdmEudXRpbC5NYXApIj5zZXRNZXNzYWdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Jmd0OyZuYnNwO21hcCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sI3NldE1pZ3JhdGVkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciwgYm9vbGVhbikiPnNldE1pZ3JhdGVkPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgIGJvb2xlYW4mbmJzcDttaWdyYXRlZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sI3Nob3VsZFZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciwgSVJlc291cmNlLCBib29sZWFuLCBib29sZWFuLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50VHlwZVdyYXBwZXIpIj5zaG91bGRWYWxpZGF0ZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICBJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc0J1aWxkLAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudFR5cGVXcmFwcGVyJm5ic3A7Y29udGVudFR5cGVXcmFwcGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjc2hvdWxkVmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBJUmVzb3VyY2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlcikiPnNob3VsZFZhbGlkYXRlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgIElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSZuYnNwO3ZhbFR5cGUsCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50VHlwZVdyYXBwZXImbmJzcDtjb250ZW50VHlwZVdyYXBwZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkZyaWVuZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1GcmllbmQ8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5GcmllbmQ8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0ic2V0TWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBqYXZhLnV0aWwuTWFwKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TWVzc2FnZXM8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgdm9pZCA8Qj5zZXRNZXNzYWdlczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Jmd0OyZuYnNwO21hcCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzTG9hZGVkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLWlzTG9hZGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gPEI+aXNMb2FkZWQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9QUkU+Ci08REw+Ci08REQ+SGFzIHRoZSB2YWxpZGF0b3IncyBpbXBsZW1lbnRhdGlvbiBiZWVuIGxvYWRlZCB5ZXQ/IFRoaXMgaXMgdXNlZCBieSBzb21lIHRlc3QgY2FzZXMgdG8gZW5zdXJlIHRoYXQgCi0gcGx1Zy1pbnMgYXJlIG5vdCBsb2FkZWQgdG9vIGVhcmx5LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzaG91bGRWYWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IsIElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudFR5cGVXcmFwcGVyKSI+PCEtLSAtLT48L0E+PEgzPgotc2hvdWxkVmFsaWRhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiA8Qj5zaG91bGRWYWxpZGF0ZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudFR5cGVXcmFwcGVyJm5ic3A7Y29udGVudFR5cGVXcmFwcGVyKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2hvdWxkVmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBJUmVzb3VyY2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlcikiPjwhLS0gLS0+PC9BPjxIMz4KLXNob3VsZFZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gPEI+c2hvdWxkVmFsaWRhdGU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSZuYnNwO3ZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudFR5cGVXcmFwcGVyJm5ic3A7Y29udGVudFR5cGVXcmFwcGVyKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0TWlncmF0ZWQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TWlncmF0ZWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgdm9pZCA8Qj5zZXRNaWdyYXRlZDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7bWlncmF0ZWQpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9GcmllbmQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkZyaWVuZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNzhhZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMiBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLUlEZXBlbmRlbmN5SW5kZXgKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJRGVwZW5kZW5jeUluZGV4IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJRGVwZW5kZW5jeUluZGV4PC9IMj4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SURlcGVuZGVuY3lJbmRleDwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBzZXJ2aWNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVzb3VyY2VzIHRoYXQgYSBwYXJ0aWN1bGFyIHJlc291cmNlIGRlcGVuZHMgb24uCi0gPHA+Ci0gVGhpcyBpcyBhbiBvcHRpb25hbCBzZXJ2aWNlLCB2YWxpZGF0b3JzIGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzIEludGVyZmFjZSBhbmQgY2FuIHNpbXBseSBzdXBwbHkKLSB0aGVpciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIFZhbGlkYXRpb25SZXN1bHQgcmV0dXJuIHJlc3VsdC4KLSA8L3A+Ci0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PENPREU+VmFsaWRhdGlvblJlc3VsdDwvQ09ERT48L0E+PC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sI2FkZChqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UsIElSZXNvdXJjZSkiPmFkZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICBJUmVzb3VyY2UmbmJzcDtkZXBlbmRlbnQsCi0gICAgSVJlc291cmNlJm5ic3A7ZGVwZW5kc09uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QXNzZXJ0IHRoYXQgb25lIHJlc291cmNlIGRlcGVuZHMgb24gYW5vdGhlciByZXNvdXJjZSBhcyBwYXJ0IG9mIGl0J3MgdmFsaWRpdHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sI2NsZWFyKElQcm9qZWN0KSI+Y2xlYXI8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW1vdmUgYWxsIHRoZSBkZXBlbmRlbmN5IGFzc2VydGlvbnMgZm9yIHRoaXMgcHJvamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCNnZXQoSVJlc291cmNlKSI+Z2V0PC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBkZXBlbmQgb24gdGhpcyByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVJlc291cmNlW108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UpIj5nZXQ8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBkZXBlbmQgb24gdGhpcyByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwjaXNEZXBlbmRlZE9uKElSZXNvdXJjZSkiPmlzRGVwZW5kZWRPbjwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRydWUgaWYgb3RoZXIgcmVzb3VyY2VzIGRlcGVuZCBvbiB0aGlzIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCNzZXQoamF2YS5sYW5nLlN0cmluZywgSVJlc291cmNlLCBJUmVzb3VyY2VbXSkiPnNldDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICBJUmVzb3VyY2UmbmJzcDtkZXBlbmRlbnQsCi0gICAgSVJlc291cmNlW10mbmJzcDtkZXBlbmRzT24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXBsYWNlIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIGRlcGVuZGVudCBkZXBlbmRzIG9uLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iYWRkKGphdmEubGFuZy5TdHJpbmcsIElSZXNvdXJjZSwgSVJlc291cmNlKSI+PCEtLSAtLT48L0E+PEgzPgotYWRkPC9IMz4KLTxQUkU+Ci12b2lkIDxCPmFkZDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkLAotICAgICAgICAgSVJlc291cmNlJm5ic3A7ZGVwZW5kZW50LAotICAgICAgICAgSVJlc291cmNlJm5ic3A7ZGVwZW5kc09uKTwvUFJFPgotPERMPgotPEREPkFzc2VydCB0aGF0IG9uZSByZXNvdXJjZSBkZXBlbmRzIG9uIGFub3RoZXIgcmVzb3VyY2UgYXMgcGFydCBvZiBpdCdzIHZhbGlkaXR5LgotIDxwPgotIEZvciBleGFtcGxlLCBpZiBhbiBYTUwgZmlsZSBpcyBkZXBlbmRlbnQgb24gYW4gWFNEIGZpbGUgdG8gYmUgdmFsaWQsIHRoZQotIHJlc291cmNlIHRoYXQgaG9sZHMgdGhlIFhNTCBmaWxlIHdvdWxkIGJlIHRoZSBkZXBlbmRlbnQsIGFuZCB0aGUgcmVzb3VyY2UKLSB0aGF0IGhvbGRzIHRoZSBYU0Qgd291bGQgYmUgdGhlIGRlcGVuZHNPbi4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmlkPC9DT0RFPiAtIFRoZSB2YWxpZGF0b3IgaWQgdGhhdCBpcyBhc3NlcnRpbmcgdGhhdCB0aGUgZGVwZW5kZW5jeSBleGlzdHMuPEREPjxDT0RFPmRlcGVuZGVudDwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIG90aGVyIHJlc291cmNlLiBGb3IgZXhhbXBsZSBhIFhNTCBmaWxlLjxERD48Q09ERT5kZXBlbmRzT248L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgdGhpcyBiZWluZyBkZXBlbmRlZCBvbi4gRm9yIGV4YW1wbGUgYSBYU0QgZmlsZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNsZWFyKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotY2xlYXI8L0gzPgotPFBSRT4KLXZvaWQgPEI+Y2xlYXI8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5SZW1vdmUgYWxsIHRoZSBkZXBlbmRlbmN5IGFzc2VydGlvbnMgZm9yIHRoaXMgcHJvamVjdC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IHdpbGwgaGF2ZSBpdCdzIGRlcGVuZGVuY3kgYXNzZXJ0aW9ucyByZW1vdmVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0KElSZXNvdXJjZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldDwvSDM+Ci08UFJFPgotamF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT4mZ3Q7IDxCPmdldDwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UuIEZvciBleGFtcGxlLCBpZgotIHRoaXMgcmVzb3VyY2Ugd2FzIGEgWFNELCB0aGlzIGNvdWxkIGFuc3dlciBhbGwgdGhlIFhNTCBmaWxlcyB0aGF0Ci0gZGVwZW5kZWQgb24gaXQgZm9yIHRoZWlyIHZhbGlkaXR5LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBBIHJlc291cmNlIHRoYXQgb3RoZXIgcmVzb3VyY2VzIG1heSBkZXBlbmQgb24uCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBkZXBlbmRlbnQgcmVzb3VyY2VzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0KGphdmEubGFuZy5TdHJpbmcsIElSZXNvdXJjZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldDwvSDM+Ci08UFJFPgotSVJlc291cmNlW10gPEI+Z2V0PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UuIEZvciBleGFtcGxlLCBpZgotIHRoaXMgcmVzb3VyY2Ugd2FzIGEgWFNELCB0aGlzIGNvdWxkIGFuc3dlciBhbGwgdGhlIFhNTCBmaWxlcyB0aGF0Ci0gZGVwZW5kZWQgb24gaXQgZm9yIHRoZWlyIHZhbGlkaXR5LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5pZDwvQ09ERT4gLSBUaGUgdmFsaWRhdG9yIGlkIHRoYXQgYXNzZXJ0ZWQgdGhhdCB0aGUgZGVwZW5kZW5jeSBleGlzdHMuPEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIEEgcmVzb3VyY2UgdGhhdCBvdGhlciByZXNvdXJjZXMgbWF5IGRlcGVuZCBvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGRlcGVuZGVudCByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCBvciBhbiBlbXB0eSBhcnJheSwgaWYKLSAgICAgICAgdGhlcmUgYXJlIG5vIGRlcGVuZGVudCByZXNvdXJjZXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0RlcGVuZGVkT24oSVJlc291cmNlKSI+PCEtLSAtLT48L0E+PEgzPgotaXNEZXBlbmRlZE9uPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzRGVwZW5kZWRPbjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRydWUgaWYgb3RoZXIgcmVzb3VyY2VzIGRlcGVuZCBvbiB0aGlzIHJlc291cmNlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgYmVpbmcgdGVzdGVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIGFueSBvZiB0aGUgdmFsaWRhdG9ycyBhc3NlcnRlZCBhIGRlcGVuZGVuY3kgb24gdGhpcyByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldChqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UsIElSZXNvdXJjZVtdKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0PC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkLAotICAgICAgICAgSVJlc291cmNlJm5ic3A7ZGVwZW5kZW50LAotICAgICAgICAgSVJlc291cmNlW10mbmJzcDtkZXBlbmRzT24pPC9QUkU+Ci08REw+Ci08REQ+UmVwbGFjZSBhbGwgdGhlIHJlc291cmNlcyB0aGF0IHRoZSBkZXBlbmRlbnQgZGVwZW5kcyBvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+aWQ8L0NPREU+IC0gVGhlIHZhbGlkYXRvciBpZCB0aGF0IGlzIGFzc2VydGluZyB0aGF0IHRoZSBkZXBlbmRlbmN5IGV4aXN0cy48REQ+PENPREU+ZGVwZW5kZW50PC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgcmVzb3VyY2UuPEREPjxDT0RFPmRlcGVuZHNPbjwvQ09ERT4gLSBBbGwgdGhlIHJlc291cmNlcyB0aGF0IGFyZSBkZXBlbmRlZCBvbi4gVGhpcyBjYW4gYmUgbnVsbCBvciBhIHplcm8KLSAgICAgICAgICAgICAgICBsZW5ndGggYXJyYXkuIE51bGwgb3IgYSB6ZXJvIGxlbmd0aCBhcnJheSByZW1vdmVzIGFsbCB0aGUgZGVwZW5kZW5jaWVzLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSURlcGVuZGVuY3lJbmRleC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSURlcGVuZGVuY3lJbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliNDg5NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMiBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLUlNdXRhYmxlVmFsaWRhdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSU11dGFibGVWYWxpZGF0b3IiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJTXV0YWJsZVZhbGlkYXRvcjwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklNdXRhYmxlVmFsaWRhdG9yPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1BIHZhbGlkYXRvciB0aGF0IGhhcyBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRlZC4KLSA8cD4KLSBUaGUgZm9sbG93aW5nIHByb2NlZHVyZSBpcyB1c2VkIHRvIGNoYW5nZSBhIFZhbGlkYXRvcidzIHNldHRpbmdzLgotIDxvbD4KLSA8bGk+QW4gSU11dGFibGVWYWxpZGF0b3IgaXMgcmV0cmlldmVkLjwvbGk+Ci0gPGxpPlRoZSBJTXV0YWJsZVZhbGlkYXRvciBpcyBjaGFuZ2VkLjwvbGk+Ci0gPGxpPlRoZSBJTXV0YWJsZVZhbGlkYXRvciBpcyAiYWN0aXZhdGVkIi48L2xpPgotIDwvb2w+Ci0gPC9wPgotIDxwPlRoZSBtZXRob2RzIDxDT0RFPlZhbGlkYXRpb25GcmFtZXdvcmsjZ2V0UHJvamVjdFNldHRpbmdzKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KTwvQ09ERT4gYW5kIAotIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRXb3Jrc3BhY2VTZXR0aW5ncygpIj48Q09ERT5WYWxpZGF0aW9uRnJhbWV3b3JrLmdldFdvcmtzcGFjZVNldHRpbmdzKCk8L0NPREU+PC9BPiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBJTXV0YWJsZVZhbGlkYXRvcidzLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI2dldElkKCkiPmdldElkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSB2YWxpZGF0b3IncyBpZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgdmFsaWRhdG9yJ3MgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI2lzQnVpbGRWYWxpZGF0aW9uKCkiPmlzQnVpbGRWYWxpZGF0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGlmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI2lzTWFudWFsVmFsaWRhdGlvbigpIj5pc01hbnVhbFZhbGlkYXRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgaWYgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkIGZvciBtYW51YWwgYmFzZWQgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI3NldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuKSI+c2V0QnVpbGRWYWxpZGF0aW9uPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2J1aWxkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgZW5hYmxlZCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI3NldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPnNldE1hbnVhbFZhbGlkYXRpb248L0E+PC9CPihib29sZWFuJm5ic3A7bWFudWFsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgZW5hYmxlZCBmb3IgbWFudWFsIGJhc2VkIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRJZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJZDwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgdmFsaWRhdG9yJ3MgaWQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXROYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE5hbWU8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgdmFsaWRhdG9yJ3MgbmFtZS4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzQnVpbGRWYWxpZGF0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQnVpbGRWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzQnVpbGRWYWxpZGF0aW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGlmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNNYW51YWxWYWxpZGF0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzTWFudWFsVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc01hbnVhbFZhbGlkYXRpb248L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgaWYgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkIGZvciBtYW51YWwgYmFzZWQgdmFsaWRhdGlvbi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRCdWlsZFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0QnVpbGRWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7YnVpbGQpPC9QUkU+Ci08REw+Ci08REQ+U2V0IHdoZXRoZXIgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgZW5hYmxlZCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TWFudWFsVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRNYW51YWxWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7bWFudWFsKTwvUFJFPgotPERMPgotPEREPlNldCB3aGV0aGVyIHRoZSB2YWxpZGF0b3Igc2hvdWxkIGJlIGVuYWJsZWQgZm9yIG1hbnVhbCBiYXNlZCB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JTXV0YWJsZVZhbGlkYXRvci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0OTU4MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMiBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLUlQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUVudW0gSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5FbnVtJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4mZ3Q7Ci0gICAgICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNvbXBhcmFibGUmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPiZndDs8L0REPgotPC9ETD4KLTxETD4KLTxEVD48Qj5FbmNsb3NpbmcgaW50ZXJmYWNlOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIHN0YXRpYyBlbnVtIDxCPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5FbnVtJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4mZ3Q7PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoZSBsZXZlbCBvZiBpbmZvcm1hdGlvbiB0byBjb2xsZWN0LgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRU5VTSBDT05TVEFOVCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJlbnVtX2NvbnN0YW50X3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FbnVtIENvbnN0YW50IFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCNEZWZhdWx0Ij5EZWZhdWx0PC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCNOb25lIj5Ob25lPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPnZhbHVlT2Y8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCN2YWx1ZXMoKSI+dmFsdWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuRW51bSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLkVudW08L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5jb21wYXJlVG8sIGVxdWFscywgZ2V0RGVjbGFyaW5nQ2xhc3MsIGhhc2hDb2RlLCBuYW1lLCBvcmRpbmFsLCB0b1N0cmluZywgdmFsdWVPZjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5nZXRDbGFzcywgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRU5VTSBDT05TVEFOVCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImVudW1fY29uc3RhbnRfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iTm9uZSI+PCEtLSAtLT48L0E+PEgzPgotTm9uZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+IDxCPk5vbmU8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iRGVmYXVsdCI+PCEtLSAtLT48L0E+PEgzPgotRGVmYXVsdDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+IDxCPkRlZmF1bHQ8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2YWx1ZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsdWVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT5bXSA8Qj52YWx1ZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC4gIFRoaXMgbWV0aG9kIG1heSBiZSB1c2VkIHRvIGl0ZXJhdGUKLW92ZXIgdGhlIGNvbnN0YW50cyBhcyBmb2xsb3dzOgotPHByZT4KLWZvciAoSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwgYyA6IElQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLnZhbHVlcygpKQotJm5ic3A7ICAgU3lzdGVtLm91dC5wcmludGxuKGMpOwotPC9wcmU+Ci08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci12YWx1ZU9mPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4gPEI+dmFsdWVPZjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi1UaGUgc3RyaW5nIG11c3QgbWF0Y2ggPEk+ZXhhY3RseTwvST4gYW4gaWRlbnRpZmllciB1c2VkIHRvIGRlY2xhcmUgYW4KLWVudW0gY29uc3RhbnQgaW4gdGhpcyB0eXBlLiAgKEV4dHJhbmVvdXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSAKLW5vdCBwZXJtaXR0ZWQuKQotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5uYW1lPC9DT0RFPiAtIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50IHRvIGJlIHJldHVybmVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgZW51bSBjb25zdGFudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGlzIGVudW0gdHlwZSBoYXMgbm8gY29uc3RhbnQKLXdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi08REQ+PENPREU+amF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfc3VtbWFyeSI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9kZXRhaWwiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZGQ1NTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMiBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLUlQZXJmb3JtYW5jZU1vbml0b3IKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJUGVyZm9ybWFuY2VNb25pdG9yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVBlcmZvcm1hbmNlTW9uaXRvcjwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklQZXJmb3JtYW5jZU1vbml0b3I8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLUEgc2VydmljZSB0aGF0IGNvbGxlY3RzIHBlcmZvcm1hbmNlIGluZm9ybWF0aW9uIG9uIHZhbGlkYXRpb24gb3BlcmF0aW9ucy4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09IE5FU1RFRCBDTEFTUyBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBsZXZlbCBvZiBpbmZvcm1hdGlvbiB0byBjb2xsZWN0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwjYWRkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlBlcmZvcm1hbmNlQ291bnRlcnMpIj5hZGQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT4mbmJzcDtjb3VudGVycyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FkZCB0aGlzIHBlcmZvcm1hbmNlIGNvdW50ZXIgdG8gdGhlIG1vbml0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sI2dldENvbGxlY3Rpb25MZXZlbCgpIj5nZXRDb2xsZWN0aW9uTGV2ZWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGxldmVsIG9mIHBlcmZvcm1hbmNlIGV2ZW50cyB0aGF0IGFyZSBiZWluZyBjb2xsZWN0ZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNnZXRQZXJmb3JtYW5jZUNvdW50ZXJzKGJvb2xlYW4pIj5nZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2FzU3VtbWFyeSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHNvIGZhci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwjaXNDb2xsZWN0aW5nKCkiPmlzQ29sbGVjdGluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0cnVlIGlmIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGlzIGNvbGxlY3RpbmcgcGVyZm9ybWFuY2UgZXZlbnRzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNpc1N1bW1hcnlPbmx5KCkiPmlzU3VtbWFyeU9ubHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdHJ1ZSBpZiBvbmx5IHN1bW1hcnkgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNyZXNldFBlcmZvcm1hbmNlQ291bnRlcnMoKSI+cmVzZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RGVsZXRlIHRoZSBjb2xsZWN0ZWQgcGVyZm9ybWFuY2UgY291bnRlcnMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sI3NldENvbGxlY3Rpb25MZXZlbChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbCkiPnNldENvbGxlY3Rpb25MZXZlbDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4mbmJzcDtsZXZlbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB0aGUgcGVyZm9ybWFuY2UgZXZlbnQgY29sbGVjdGlvbiBsZXZlbC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzKSI+PCEtLSAtLT48L0E+PEgzPgotYWRkPC9IMz4KLTxQUkU+Ci12b2lkIDxCPmFkZDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+Jm5ic3A7Y291bnRlcnMpPC9QUkU+Ci08REw+Ci08REQ+QWRkIHRoaXMgcGVyZm9ybWFuY2UgY291bnRlciB0byB0aGUgbW9uaXRvci4gVGhlIG1vbml0b3Igd2lsbCBkZWNpZGUgd2hhdCB0byAKLSBkbyB3aXRoIHRoZSByZXN1bHRzLCBpdCBtYXkgbG9nIHRoZW0gdG8gYSBmaWxlLCBvciBpdCBtYXkgc2ltcGx5IGhvbGQgb24gdG8gdGhlbS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+Y291bnRlcnM8L0NPREU+IC0gPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0NvbGxlY3RpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNDb2xsZWN0aW5nPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzQ29sbGVjdGluZzwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0cnVlIGlmIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGlzIGNvbGxlY3RpbmcgcGVyZm9ybWFuY2UgZXZlbnRzLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1N1bW1hcnlPbmx5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzU3VtbWFyeU9ubHk8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+aXNTdW1tYXJ5T25seTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0cnVlIGlmIG9ubHkgc3VtbWFyeSBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldENvbGxlY3Rpb25MZXZlbChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldENvbGxlY3Rpb25MZXZlbDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRDb2xsZWN0aW9uTGV2ZWw8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4mbmJzcDtsZXZlbCk8L1BSRT4KLTxETD4KLTxERD5TZXQgdGhlIHBlcmZvcm1hbmNlIGV2ZW50IGNvbGxlY3Rpb24gbGV2ZWwuIFRoaXMgY29udHJvbHMgd2hpY2gKLSBwZXJmb3JtYW5jZSBldmVudHMgYXJlIGNvbGxlY3RlZCwgaW5jbHVkaW5nIG5vbmUgb2YgdGhlbS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bGV2ZWw8L0NPREU+IC0gVGhlIGxldmVsIHRvIGNvbGxlY3QuIFRoZSBkZWZhdWx0IGlzIHRvIG5vdCBjb2xsZWN0IGFueXRoaW5nLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q29sbGVjdGlvbkxldmVsKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENvbGxlY3Rpb25MZXZlbDwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPiA8Qj5nZXRDb2xsZWN0aW9uTGV2ZWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIGxldmVsIG9mIHBlcmZvcm1hbmNlIGV2ZW50cyB0aGF0IGFyZSBiZWluZyBjb2xsZWN0ZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQZXJmb3JtYW5jZUNvdW50ZXJzKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9IMz4KLTxQUkU+Ci1qYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT4mZ3Q7IDxCPmdldFBlcmZvcm1hbmNlQ291bnRlcnM8L0I+KGJvb2xlYW4mbmJzcDthc1N1bW1hcnkpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyB0aGF0IGhhdmUgYmVlbiBjb2xsZWN0ZWQgc28gZmFyLiBTb21lCi0gbW9uaXRvcnMgZG8gbm90IHNhdmUgY291bnRlcnMsIGFuZCB0aGV5IHdpbGwgYWx3YXlzIHJldHVybiBhbiBlbXB0eSBsaXN0LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc1N1bW1hcnk8L0NPREU+IC0gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgb25seSBhbnN3ZXIgYSBzdW1tYXJ5IG9mIHRoZSBjb3VudGVycy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlc2V0UGVyZm9ybWFuY2VDb3VudGVycygpIj48IS0tIC0tPjwvQT48SDM+Ci1yZXNldFBlcmZvcm1hbmNlQ291bnRlcnM8L0gzPgotPFBSRT4KLXZvaWQgPEI+cmVzZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+RGVsZXRlIHRoZSBjb2xsZWN0ZWQgcGVyZm9ybWFuY2UgY291bnRlcnMuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODcxZDQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMyIEVTVCAyMDA5IC0tPgotPFRJVExFPgotSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcjwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklWYWxpZGF0b3JHcm91cExpc3RlbmVyPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1WYWxpZGF0b3JzIG1heSB3aXNoIHRvIGpvaW4gdmFsaWRhdG9yIGdyb3VwcyBmb3IgcGVyZm9ybWFuY2Ugb3Igb3RoZXIKLSByZWFzb25zLiBUaGF0IHdheSBleHBlbnNpdmUgb3BlcmF0aW9ucyBsaWtlIGNyZWF0aW5nIGFuZCByZWxlYXNpbmcgbW9kZWxzIGNhbgotIGJlIGRvbmUgaW4gYSBjb21tb24gbG9jYXRpb24sIGFuZCBiZSBkb25lIG9ubHkgb25jZSBwZXIgcmVzb3VyY2UuIEdyb3VwIGxpc3RlbmVycwotIGFyZSBkZWNsYXJlZCB2aWEgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckdyb3VwPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gPHA+Ci0gQXMgdmFsaWRhdGlvbiBwcm9jZWVkcywgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBvbiBhIHJlc291cmNlIGJ5IHJlc291cmNlCi0gYmFzZXMsIGRldGVybWluZXMgaWYgYW55IHZhbGlkYXRvcnMgdGhhdCBhcmUgbWVtYmVycyBvZiBhIGdyb3VwIGFyZQotIGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlLiBJZiB0aGV5IGFyZSwgYmVmb3JlIHRoZSBmaXJzdCB2YWxpZGF0b3IgaW4gdGhlCi0gZ3JvdXAgaXMgY2FsbGVkLCB0aGUgPGNvZGU+dmFsaWRhdGlvblN0YXJ0aW5nPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLiBJZiB0aGlzIG1ldGhvZCB3YXMKLSBjYWxsZWQsIHRoZW4gdGhlIDxjb2RlPnZhbGlkYXRpb25GaW5pc2hpbmc8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbmNlIGFsbCB0aGUKLSB2YWxpZGF0b3JzIGhhdmUgcHJvY2Vzc2VkIHRoZSByZXNvdXJjZS4KLSA8L3A+Ci0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwjdmFsaWRhdGlvbkZpbmlzaGluZyhJUmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSkiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHRoZSB2YWxpZGF0aW9uU3RhcnRpbmcgbWV0aG9kIHdhcyBjYWxsZWQgb24gdGhlIHJlc291cmNlLCB0aGVuIHRoaXMKLSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgdmFsaWRhdG9yIGhhcyBwcm9jZXNzZWQgdGhlCi0gcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCN2YWxpZGF0aW9uU3RhcnRpbmcoSVJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUpIj52YWxpZGF0aW9uU3RhcnRpbmc8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IHZhbGlkYXRvciBpbiB0aGUgZ3JvdXAgdGhhdCBpcyBpbnRlcmVzdGVkCi0gaW4gdGhlIHJlc291cmNlIGlzIGNhbGxlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25TdGFydGluZyhJUmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRpb25TdGFydGluZzwvSDM+Ci08UFJFPgotdm9pZCA8Qj52YWxpZGF0aW9uU3RhcnRpbmc8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUpPC9QUkU+Ci08REw+Ci08REQ+VGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCB2YWxpZGF0b3IgaW4gdGhlIGdyb3VwIHRoYXQgaXMgaW50ZXJlc3RlZAotIGluIHRoZSByZXNvdXJjZSBpcyBjYWxsZWQuIElmIG5vIHZhbGlkYXRvcnMgaW4gdGhlIGdyb3VwIGFyZSBpbnRlcmVzdGVkCi0gaW4gdGhlIHJlc291cmNlLCB0aGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBBIHByb2dyZXNzIG1vbml0b3IgdGhhdCB0aGUgbWV0aG9kIHNob3VsZCB1c2UuPEREPjxDT0RFPnN0YXRlPC9DT0RFPiAtIFRoZSB2YWxpZGF0aW9uIHN0YXRlIGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24uPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0aW9uRmluaXNoaW5nKElSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGlvbkZpbmlzaGluZzwvSDM+Ci08UFJFPgotdm9pZCA8Qj52YWxpZGF0aW9uRmluaXNoaW5nPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUpPC9QUkU+Ci08REw+Ci08REQ+SWYgdGhlIHZhbGlkYXRpb25TdGFydGluZyBtZXRob2Qgd2FzIGNhbGxlZCBvbiB0aGUgcmVzb3VyY2UsIHRoZW4gdGhpcwotIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCB2YWxpZGF0b3IgaGFzIHByb2Nlc3NlZCB0aGUKLSByZXNvdXJjZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIEEgcHJvZ3Jlc3MgbW9uaXRvciB0aGF0IHRoZSBtZXRob2QgY2FuIHVzZS48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gVGhlIHZhbGlkYXRpb24gc3RhdGUgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmNkZjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMiBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLU1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfc3VtbWFyeSI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9kZXRhaWwiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1FbnVtIE1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5FbnVtJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+Jmd0OwotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNvbXBhcmFibGUmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4mZ3Q7PC9ERD4KLTwvREw+Ci08REw+Ci08RFQ+PEI+RW5jbG9zaW5nIGNsYXNzOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgc3RhdGljIGVudW0gPEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiZndDs8L0RMPgotPC9QUkU+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRU5VTSBDT05TVEFOVCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJlbnVtX2NvbnN0YW50X3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FbnVtIENvbnN0YW50IFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sI0Vycm9yIj5FcnJvcjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCNJZ25vcmUiPklnbm9yZTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCNXYXJuaW5nIj5XYXJuaW5nPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCNnZXRNYXJrZXJTZXZlcml0eSgpIj5nZXRNYXJrZXJTZXZlcml0eTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgYXNzb2NpYXRlZCBJTWFya2VyIHNldmVyaXR5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCN0b1N0cmluZygpIj50b1N0cmluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsdWVPZjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sI3ZhbHVlcygpIj52YWx1ZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5FbnVtIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuRW51bTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmNvbXBhcmVUbywgZXF1YWxzLCBnZXREZWNsYXJpbmdDbGFzcywgaGFzaENvZGUsIG5hbWUsIG9yZGluYWwsIHZhbHVlT2Y8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Z2V0Q2xhc3MsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJlbnVtX2NvbnN0YW50X2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkVudW0gQ29uc3RhbnQgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkVycm9yIj48IS0tIC0tPjwvQT48SDM+Ci1FcnJvcjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiA8Qj5FcnJvcjwvQj48L1BSRT4KLTxETD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJXYXJuaW5nIj48IS0tIC0tPjwvQT48SDM+Ci1XYXJuaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+IDxCPldhcm5pbmc8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSWdub3JlIj48IS0tIC0tPjwvQT48SDM+Ci1JZ25vcmU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4gPEI+SWdub3JlPC9CPjwvUFJFPgotPERMPgotPERMPgotPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0idmFsdWVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbHVlczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPltdIDxCPnZhbHVlczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLiAgVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgdG8gaXRlcmF0ZQotb3ZlciB0aGUgY29uc3RhbnRzIGFzIGZvbGxvd3M6Ci08cHJlPgotZm9yIChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5IGMgOiBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5LnZhbHVlcygpKQotJm5ic3A7ICAgU3lzdGVtLm91dC5wcmludGxuKGMpOwotPC9wcmU+Ci08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci12YWx1ZU9mPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+IDxCPnZhbHVlT2Y8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotVGhlIHN0cmluZyBtdXN0IG1hdGNoIDxJPmV4YWN0bHk8L0k+IGFuIGlkZW50aWZpZXIgdXNlZCB0byBkZWNsYXJlIGFuCi1lbnVtIGNvbnN0YW50IGluIHRoaXMgdHlwZS4gIChFeHRyYW5lb3VzIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUgCi1ub3QgcGVybWl0dGVkLikKLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bmFtZTwvQ09ERT4gLSB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudCB0byBiZSByZXR1cm5lZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGVudW0gY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPmphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L0NPREU+IC0gaWYgdGhpcyBlbnVtIHR5cGUgaGFzIG5vIGNvbnN0YW50Ci13aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotPEREPjxDT0RFPmphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiZndDs8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRNYXJrZXJTZXZlcml0eSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNYXJrZXJTZXZlcml0eTwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5nZXRNYXJrZXJTZXZlcml0eTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgYXNzb2NpYXRlZCBJTWFya2VyIHNldmVyaXR5LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfc3VtbWFyeSI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9kZXRhaWwiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYmVlMGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMiBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLU1lc3NhZ2VTZXZlcml0eVNldHRpbmcKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotQXNzb2NpYXRlIGEgbWVzc2FnZSBzZXZlcml0eSB3aXRoIGEgbWVzc2FnZSBjYXRlZ29yeS4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09IE5FU1RFRCBDTEFTUyBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI01lc3NhZ2VTZXZlcml0eVNldHRpbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSkiPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4mbmJzcDtkZWZhdWx0U2V2ZXJpdHkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIGxhYmVsIGFuZCBhIG1lc3NhZ2Ugc2V2ZXJpdHkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI2NvcHkoKSI+Y29weTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGNvcHkgb2YgdGhpcyBvYmplY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCNnZXRDdXJyZW50KCkiPmdldEN1cnJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGN1cnJlbnQgc2V2ZXJpdHkgZm9yIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwjZ2V0RGVmYXVsdCgpIj5nZXREZWZhdWx0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBkZWZhdWx0IHNldmVyaXR5IGFzIGRlZmluZWQgYnkgdGhlIHZhbGlkYXRvciBvd25lci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgaWQgdGhhdCB0aGUgdmFsaWRhdG9yIG93bmVyIGFzc2lnbmVkIHRvIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCNnZXRMYWJlbCgpIj5nZXRMYWJlbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI2hhc2hDb2RlKCkiPmhhc2hDb2RlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI3NldEN1cnJlbnQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSkiPnNldEN1cnJlbnQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiZuYnNwO3NldmVyaXR5KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBjdXJyZW50IG1lc3NhZ2Ugc2V2ZXJpdHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI3RvU3RyaW5nKCkiPnRvU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iTWVzc2FnZVNldmVyaXR5U2V0dGluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5KSI+PCEtLSAtLT48L0E+PEgzPgotTWVzc2FnZVNldmVyaXR5U2V0dGluZzwvSDM+Ci08UFJFPgotcHVibGljIDxCPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+Jm5ic3A7ZGVmYXVsdFNldmVyaXR5KTwvUFJFPgotPERMPgotPEREPkNyZWF0ZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgbGFiZWwgYW5kIGEgbWVzc2FnZSBzZXZlcml0eS4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5pZDwvQ09ERT4gLSBBbiBpZCB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIHNldHRpbmcuIFRoaXMgbXVzdCBiZQotICAgICAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IuPEREPjxDT0RFPmxhYmVsPC9DT0RFPiAtIEFuIGVuZCB1c2VyIHN0cmluZywgdGhhdCBjYW4gZGVzY3JpYmUgZWl0aGVyIGFuIGluZGl2aWR1YWwgbWVzc2FnZQotICAgICAgICAgICAgICAgIG9yIGEgbWVzc2FnZSBjYXRlZ29yeS48REQ+PENPREU+ZGVmYXVsdFNldmVyaXR5PC9DT0RFPiAtIFRoZSBkZWZhdWx0IHNldmVyaXR5IGZvciB0aGlzIGxhYmVsLiBJZiB0aGUgZW5kIHVzZXIgZG9lc24ndCBjaGFuZ2UKLSAgICAgICAgICAgICAgICBhbnl0aGluZyB0aGlzIGlzIHdoYXQgdGhlIHNldmVyaXR5IHdpbGwgYmUuPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iaGFzaENvZGUoKSI+PCEtLSAtLT48L0E+PEgzPgotaGFzaENvZGU8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+aGFzaENvZGU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+aGFzaENvZGU8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEubGFuZy5PYmplY3Q8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRMYWJlbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRMYWJlbDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TGFiZWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERlZmF1bHQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVmYXVsdDwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+IDxCPmdldERlZmF1bHQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIGRlZmF1bHQgc2V2ZXJpdHkgYXMgZGVmaW5lZCBieSB0aGUgdmFsaWRhdG9yIG93bmVyLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRDdXJyZW50KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEN1cnJlbnQ8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiA8Qj5nZXRDdXJyZW50PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBjdXJyZW50IHNldmVyaXR5IGZvciB0aGUgbWVzc2FnZS4gVGhlIGVuZCB1c2VyIG1heSBoYXZlIGNoYW5nZWQgdGhpcyB0aHJvdWdoIGEKLSBwcmVmZXJlbmNlIGRpYWxvZy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldElkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+VGhlIGlkIHRoYXQgdGhlIHZhbGlkYXRvciBvd25lciBhc3NpZ25lZCB0byB0aGUgbWVzc2FnZS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0Q3VycmVudChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0Q3VycmVudDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2V0Q3VycmVudDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4mbmJzcDtzZXZlcml0eSk8L1BSRT4KLTxETD4KLTxERD5TZXQgdGhlIGN1cnJlbnQgbWVzc2FnZSBzZXZlcml0eS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2V2ZXJpdHk8L0NPREU+IC0gCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHNldHRpbmcgY2hhbmdlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY29weSgpIj48IS0tIC0tPjwvQT48SDM+Ci1jb3B5PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+IDxCPmNvcHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmYzc0NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotTXV0YWJsZVByb2plY3RTZXR0aW5ncwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik11dGFibGVQcm9qZWN0U2V0dGluZ3MiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik11dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotQ2xhc3MgTXV0YWJsZVByb2plY3RTZXR0aW5nczwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVByb2plY3RTZXR0aW5nczwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGZpbmFsIGNsYXNzIDxCPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIGhvbGRzIHRoZSBvdmVyYWxsIHByb2plY3QgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLSA8cD4KLSBUaGUgZm9sbG93aW5nIHByb2NlZHVyZSBpcyB1c2VkIHRvIGNoYW5nZSBhIHByb2plY3QncyBWYWxpZGF0aW9uIHNldHRpbmdzLgotIDxvbD4KLSA8bGk+VGhlIE11dGFibGVQcm9qZWN0U2V0dGluZ3MgYXJlIHJldHJpZXZlZC48L2xpPgotIDxsaT5UaGUgTXV0YWJsZVByb2plY3RTZXR0aW5ncyBhcmUgY2hhbmdlZC48L2xpPgotIDxsaT5UaGUgTXV0YWJsZVByb2plY3RTZXR0aW5ncyBhcmUgImFwcGxpZWQiLjwvbGk+Ci0gPC9vbD4KLSA8L3A+Ci0gPHA+SW4gb3JkZXIgZm9yIGEgcHJvamVjdCdzIHZhbGlkYXRpb24gc2V0dGluZyB0byBiZSBlZmZlY3RpdmUsIGJvdGggCi0gPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sI2dldE92ZXJyaWRlKCkiPjxDT0RFPmdldE92ZXJyaWRlKCk8L0NPREU+PC9BPiBhbmQgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjZ2V0T3ZlcnJpZGUoKSI+PENPREU+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmdldE92ZXJyaWRlKCk8L0NPREU+PC9BPgotIG11c3QgYmUgdHJ1ZS4KLSA8L3A+Ci0gPHA+Ci0gVGhlc2Ugc2V0dGluZ3MgY2FuIGJlIHJldHJpZXZlZCB3aXRoIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRQcm9qZWN0U2V0dGluZ3MoSVByb2plY3QpIj48Q09ERT5WYWxpZGF0aW9uRnJhbWV3b3JrLmdldFByb2plY3RTZXR0aW5ncyhJUHJvamVjdCk8L0NPREU+PC9BPi4KLSA8L3A+Ci0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNNdXRhYmxlUHJvamVjdFNldHRpbmdzKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcltdKSI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W10mbmJzcDt2YWxpZGF0b3JzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNnZXRPdmVycmlkZSgpIj5nZXRPdmVycmlkZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NhbiB0aGlzIHByb2plY3Qgb3ZlcnJpZGUgdGhlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJUHJvamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwjZ2V0UHJvamVjdCgpIj5nZXRQcm9qZWN0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBwcm9qZWN0IHRoYXQgdGhlc2Ugc2V0dGluZ3MgYXJlIGZvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwjZ2V0U3VzcGVuZCgpIj5nZXRTdXNwZW5kPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SXMgdmFsaWRhdGlvbiBzdXNwZW5kZWQgZm9yIHRoaXMgcHJvamVjdD88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sI2dldFZhbGlkYXRvcnMoKSI+Z2V0VmFsaWRhdG9yczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNzZXRPdmVycmlkZShib29sZWFuKSI+c2V0T3ZlcnJpZGU8L0E+PC9CPihib29sZWFuJm5ic3A7b3ZlcnJpZGUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgY2FuIG92ZXJyaWRlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNzZXRTdXNwZW5kKGJvb2xlYW4pIj5zZXRTdXNwZW5kPC9BPjwvQj4oYm9vbGVhbiZuYnNwO3N1c3BlbmQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgaXMgc3VzcGVuZGluZyBpdCdzIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJNdXRhYmxlUHJvamVjdFNldHRpbmdzKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcltdKSI+PCEtLSAtLT48L0E+PEgzPgotTXV0YWJsZVByb2plY3RTZXR0aW5nczwvSDM+Ci08UFJFPgotcHVibGljIDxCPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklNdXRhYmxlVmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycyk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0VmFsaWRhdG9ycygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3JzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W10gPEI+Z2V0VmFsaWRhdG9yczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0T3ZlcnJpZGUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0T3ZlcnJpZGU8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmdldE92ZXJyaWRlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+Q2FuIHRoaXMgcHJvamVjdCBvdmVycmlkZSB0aGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3M/Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE92ZXJyaWRlKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRPdmVycmlkZTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0T3ZlcnJpZGU8L0I+KGJvb2xlYW4mbmJzcDtvdmVycmlkZSk8L1BSRT4KLTxETD4KLTxERD5DaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgY2FuIG92ZXJyaWRlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5vdmVycmlkZTwvQ09ERT4gLSBTZXQgdG8gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhbGxvd2VkIHRvIG92ZXJyaWRlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U3VzcGVuZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTdXNwZW5kPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5nZXRTdXNwZW5kPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SXMgdmFsaWRhdGlvbiBzdXNwZW5kZWQgZm9yIHRoaXMgcHJvamVjdD8KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0U3VzcGVuZChib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0U3VzcGVuZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0U3VzcGVuZDwvQj4oYm9vbGVhbiZuYnNwO3N1c3BlbmQpPC9QUkU+Ci08REw+Ci08REQ+Q2hhbmdlIHdoZXRoZXIgdGhpcyBwcm9qZWN0IGlzIHN1c3BlbmRpbmcgaXQncyB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdXNwZW5kPC9DT0RFPiAtIFNldCB0byB0cnVlLCB0byBzdXNwZW5kIHZhbGlkYXRpb24gZm9yIHRoaXMgcHJvamVjdC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFByb2plY3QoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UHJvamVjdDwvSDM+Ci08UFJFPgotcHVibGljIElQcm9qZWN0IDxCPmdldFByb2plY3Q8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHByb2plY3QgdGhhdCB0aGVzZSBzZXR0aW5ncyBhcmUgZm9yLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTEyYzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotQ2xhc3MgTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBmaW5hbCBjbGFzcyA8Qj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIGhvbGRzIHRoZSBvdmVyYWxsIHdvcmtzcGFjZSB2YWxpZGF0aW9uIHNldHRpbmdzLgotIDxwPgotIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIHVzZWQgdG8gY2hhbmdlIGEgcHJvamVjdCdzIFZhbGlkYXRpb24gc2V0dGluZ3MuCi0gPG9sPgotIDxsaT5UaGUgTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIGFyZSByZXRyaWV2ZWQuPC9saT4KLSA8bGk+VGhlIE11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyBhcmUgY2hhbmdlZC48L2xpPgotIDxsaT5UaGUgTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIGFyZSAiYXBwbGllZCIuPC9saT4KLSA8L29sPgotIDwvcD4KLSA8cD4KLSBUaGVzZSBzZXR0aW5ncyBjYW4gYmUgcmV0cmlldmVkIHdpdGggPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFdvcmtzcGFjZVNldHRpbmdzKCkiPjxDT0RFPlZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0V29ya3NwYWNlU2V0dGluZ3MoKTwvQ09ERT48L0E+LgotIDwvcD4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yW10sIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzVmFsdWVzKSI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W10mbmJzcDt2YWxpZGF0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzVmFsdWVzJm5ic3A7dmFsdWVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sI2dldEF1dG9TYXZlKCkiPmdldEF1dG9TYXZlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzVmFsdWVzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sI2dldEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzKCkiPmdldEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjZ2V0T3ZlcnJpZGUoKSI+Z2V0T3ZlcnJpZGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDYW4gdGhpcyBwcm9qZWN0IG92ZXJyaWRlIHRoZSB3b3Jrc3BhY2UgbGV2ZWwgdmFsaWRhdGlvbiBzZXR0aW5ncz88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNnZXRTdXNwZW5kKCkiPmdldFN1c3BlbmQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJcyB2YWxpZGF0aW9uIHN1c3BlbmRlZCBmb3IgdGhpcyBwcm9qZWN0PzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNnZXRWYWxpZGF0b3JzKCkiPmdldFZhbGlkYXRvcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNzZXRBdXRvU2F2ZShib29sZWFuKSI+c2V0QXV0b1NhdmU8L0E+PC9CPihib29sZWFuJm5ic3A7YXV0b1NhdmUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNzZXRPdmVycmlkZShib29sZWFuKSI+c2V0T3ZlcnJpZGU8L0E+PC9CPihib29sZWFuJm5ic3A7b3ZlcnJpZGUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgY2FuIG92ZXJyaWRlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sI3NldFN1c3BlbmQoYm9vbGVhbikiPnNldFN1c3BlbmQ8L0E+PC9CPihib29sZWFuJm5ic3A7c3VzcGVuZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NoYW5nZSB3aGV0aGVyIHRoaXMgcHJvamVjdCBpcyBzdXNwZW5kaW5nIGl0J3MgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcltdLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcykiPjwhLS0gLS0+PC9BPjxIMz4KLU11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvSDM+Ci08UFJFPgotcHVibGljIDxCPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W10mbmJzcDt2YWxpZGF0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcyZuYnNwO3ZhbHVlcyk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0VmFsaWRhdG9ycygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3JzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W10gPEI+Z2V0VmFsaWRhdG9yczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0R2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0R2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXM8L0gzPgotPFBSRT4KLXB1YmxpYyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcyA8Qj5nZXRHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QXV0b1NhdmUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QXV0b1NhdmU8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmdldEF1dG9TYXZlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRBdXRvU2F2ZShib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0QXV0b1NhdmU8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldEF1dG9TYXZlPC9CPihib29sZWFuJm5ic3A7YXV0b1NhdmUpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRPdmVycmlkZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRPdmVycmlkZTwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+Z2V0T3ZlcnJpZGU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5DYW4gdGhpcyBwcm9qZWN0IG92ZXJyaWRlIHRoZSB3b3Jrc3BhY2UgbGV2ZWwgdmFsaWRhdGlvbiBzZXR0aW5ncz8KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0T3ZlcnJpZGUoYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE92ZXJyaWRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRPdmVycmlkZTwvQj4oYm9vbGVhbiZuYnNwO292ZXJyaWRlKTwvUFJFPgotPERMPgotPEREPkNoYW5nZSB3aGV0aGVyIHRoaXMgcHJvamVjdCBjYW4gb3ZlcnJpZGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3MuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm92ZXJyaWRlPC9DT0RFPiAtIFNldCB0byB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIGFsbG93ZWQgdG8gb3ZlcnJpZGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3MuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTdXNwZW5kKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFN1c3BlbmQ8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmdldFN1c3BlbmQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5JcyB2YWxpZGF0aW9uIHN1c3BlbmRlZCBmb3IgdGhpcyBwcm9qZWN0PwotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTdXNwZW5kKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRTdXNwZW5kPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRTdXNwZW5kPC9CPihib29sZWFuJm5ic3A7c3VzcGVuZCk8L1BSRT4KLTxETD4KLTxERD5DaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgaXMgc3VzcGVuZGluZyBpdCdzIHZhbGlkYXRpb24uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnN1c3BlbmQ8L0NPREU+IC0gU2V0IHRvIHRydWUsIHRvIHN1c3BlbmQgdmFsaWRhdGlvbiBmb3IgdGhpcyBwcm9qZWN0LjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4ZmQ3NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotUGVyZm9ybWFuY2VDb3VudGVycwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlBlcmZvcm1hbmNlQ291bnRlcnMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBQZXJmb3JtYW5jZUNvdW50ZXJzPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+UGVyZm9ybWFuY2VDb3VudGVyczwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLVNvbWUgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gZm9yIGEgdmFsaWRhdGlvbiBpbnZvY2F0aW9uLiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUuCi0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCNQZXJmb3JtYW5jZUNvdW50ZXJzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgbG9uZywgbG9uZykiPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsaWRhdG9ySWQsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWxpZGF0b3JOYW1lLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDtudW1iZXJJbnZvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgbG9uZyZuYnNwO2VsYXBzZWRUaW1lLAotICAgICAgICAgICAgICAgICAgICBsb25nJm5ic3A7Y3B1VGltZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7bG9uZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwjZ2V0Q3B1VGltZSgpIj5nZXRDcHVUaW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBhbW91bnQgb2YgQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2xvbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI2dldEVsYXBzZWRUaW1lKCkiPmdldEVsYXBzZWRUaW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI2dldE51bWJlckludm9jYXRpb25zKCkiPmdldE51bWJlckludm9jYXRpb25zPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI2dldFJlc291cmNlTmFtZSgpIj5nZXRSZXNvdXJjZU5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwjZ2V0VmFsaWRhdG9ySWQoKSI+Z2V0VmFsaWRhdG9ySWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwjZ2V0VmFsaWRhdG9yTmFtZSgpIj5nZXRWYWxpZGF0b3JOYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2xvbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI2dldFdoZW4oKSI+Z2V0V2hlbjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB3aGVuIHdhcyB0aGUgZXZlbnQgbG9nZ2VkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCN0b1N0cmluZygpIj50b1N0cmluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCN0b1N0cmluZyhib29sZWFuKSI+dG9TdHJpbmc8L0E+PC9CPihib29sZWFuJm5ic3A7YXNTdW1tYXJ5KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IlBlcmZvcm1hbmNlQ291bnRlcnMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBsb25nLCBsb25nKSI+PCEtLSAtLT48L0E+PEgzPgotUGVyZm9ybWFuY2VDb3VudGVyczwvSDM+Ci08UFJFPgotcHVibGljIDxCPlBlcmZvcm1hbmNlQ291bnRlcnM8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWxpZGF0b3JJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWxpZGF0b3JOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3Jlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO251bWJlckludm9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyZuYnNwO2VsYXBzZWRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyZuYnNwO2NwdVRpbWUpPC9QUkU+Ci08REw+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcklkPC9DT0RFPiAtIDxERD48Q09ERT52YWxpZGF0b3JOYW1lPC9DT0RFPiAtIDxERD48Q09ERT5yZXNvdXJjZU5hbWU8L0NPREU+IC0gPEREPjxDT0RFPm51bWJlckludm9jYXRpb25zPC9DT0RFPiAtIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsaWRhdG9yIHdhcyBpbnZva2VkPEREPjxDT0RFPmVsYXBzZWRUaW1lPC9DT0RFPiAtIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHM8REQ+PENPREU+Y3B1VGltZTwvQ09ERT4gLSBDUFUgdGltZSBpbiBuYW5vc2Vjb25kczwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvcklkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRvcklkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRWYWxpZGF0b3JJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TnVtYmVySW52b2NhdGlvbnMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TnVtYmVySW52b2NhdGlvbnM8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0TnVtYmVySW52b2NhdGlvbnM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEVsYXBzZWRUaW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEVsYXBzZWRUaW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgbG9uZyA8Qj5nZXRFbGFwc2VkVGltZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q3B1VGltZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRDcHVUaW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgbG9uZyA8Qj5nZXRDcHVUaW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBhbW91bnQgb2YgQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMuIElmIHRoaXMgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLAotIGFuc3dlciAtMS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXRvU3RyaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj50b1N0cmluZzwvQj4oYm9vbGVhbiZuYnNwO2FzU3VtbWFyeSk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvck5hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yTmFtZTwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VmFsaWRhdG9yTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0V2hlbigpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRXaGVuPC9IMz4KLTxQUkU+Ci1wdWJsaWMgbG9uZyA8Qj5nZXRXaGVuPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHdoZW4gd2FzIHRoZSBldmVudCBsb2dnZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFJlc291cmNlTmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRSZXNvdXJjZU5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldFJlc291cmNlTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJQZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGM4ZGE3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotUmVwb3J0ZXJIZWxwZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJSZXBvcnRlckhlbHBlciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvUmVwb3J0ZXJIZWxwZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotQ2xhc3MgUmVwb3J0ZXJIZWxwZXI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlJlcG9ydGVySGVscGVyPC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+UmVwb3J0ZXJIZWxwZXI8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDxEVD5pbXBsZW1lbnRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGlzIGEgdGVtcG9yYXJ5IGNsYXNzIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gPHA+Ci0gVGhpcyBpcyBub3QgQVBJLgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI1JlcG9ydGVySGVscGVyKElQcm9ncmVzc01vbml0b3IpIj5SZXBvcnRlckhlbHBlcjwvQT48L0I+KElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjYWRkTWVzc2FnZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5hZGRNZXNzYWdlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4sCi0gICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gQWRkIGEgbG9jYWxlLWluZGVwZW5kZW50IHZhbGlkYXRpb24gbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI2Rpc3BsYXlTdWJ0YXNrKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmRpc3BsYXlTdWJ0YXNrPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1Nob3cgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSwgZm9ybWF0dGVkIGluIHRoZSBkZWZhdWx0Ci0gTG9jYWxlLCB0byB0aGUgdXNlciBpbW1lZGlhdGVseS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNnZXRNZXNzYWdlcygpIj5nZXRNZXNzYWdlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjaXNDYW5jZWxsZWQoKSI+aXNDYW5jZWxsZWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm4gdHJ1ZSBpZiB0aGUgdXNlciBjYW5jZWxlZCB2YWxpZGF0aW9uLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjbWFrZU1hcmtlcnMoKSI+bWFrZU1hcmtlcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcikiPnJlbW92ZUFsbE1lc3NhZ2VzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMgZW50ZXJlZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QpIj5yZW1vdmVBbGxNZXNzYWdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcywgZW50ZXJlZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IsCi0gcGVydGFpbmluZyB0byB0aGUgT2JqZWN0IHByb3ZpZGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjcmVtb3ZlTWVzc2FnZVN1YnNldChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpIj5yZW1vdmVNZXNzYWdlU3Vic2V0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmosCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtncm91cE5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkKLSBhc3NpZ24gZ3JvdXAgbmFtZXMgdG8gSU1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iUmVwb3J0ZXJIZWxwZXIoSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLVJlcG9ydGVySGVscGVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+UmVwb3J0ZXJIZWxwZXI8L0I+KElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWFkZE1lc3NhZ2U8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmFkZE1lc3NhZ2U8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjYWRkTWVzc2FnZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPjxwPgotIEFkZCBhIGxvY2FsZS1pbmRlcGVuZGVudCB2YWxpZGF0aW9uIG1lc3NhZ2UuIEl0IHdpbGwgYmUgZGlzcGxheWVkIGxhdGVyLCB3aXRoIGFsbCBvZiB0aGUKLSBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotIDwvcD4KLSA8cD4KLSBUaGUgSVZhbGlkYXRvciBwYXNzZWQgaW4gaXMgbmVlZGVkIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uICh3aGVuIGEgbWVzc2FnZSBuZWVkcyB0byBiZQotIHJlbW92ZWQsIG9uZSB2YWxpZGF0b3Igc2hvdWxkIG5vdCByZW1vdmUgbWVzc2FnZXMgZW50ZXJlZCBieSBhbm90aGVyIHZhbGlkYXRvci4pIFRoZQotIHZhbGlkYXRvciBpcyBhbHNvIHF1ZXJpZWQgZm9yIGluZm9ybWF0aW9uIGFib3V0IGl0cyByZXNvdXJjZSBidW5kbGUsIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgotIGxvY2FsaXphdGlvbiBvZiBtZXNzYWdlcyBpbiBhIGNsaWVudC1zZXJ2ZXIgZW52aXJvbm1lbnQuCi0gPC9wPgotIDxwPgotIEJvdGggcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI2FkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+YWRkTWVzc2FnZTwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5vcmlnaW48L0NPREU+IC0gVGhlIHZhbGlkYXRvciB3aGljaCBpcyB0aGUgc291cmNlIG9mIHRoZSBtZXNzYWdlLjxERD48Q09ERT5tZXNzYWdlPC9DT0RFPiAtIEEgbWVzc2FnZSB0byBiZSByZXBvcnRlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImRpc3BsYXlTdWJ0YXNrKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWRpc3BsYXlTdWJ0YXNrPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5kaXNwbGF5U3VidGFzazwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjZGlzcGxheVN1YnRhc2sob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5TaG93IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UsIGZvcm1hdHRlZCBpbiB0aGUgZGVmYXVsdAotIExvY2FsZSwgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuIFRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgd2hpY2ggc3VidGFzayBpcwotIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBtZXNzYWdlIGlzIG5vdCBzdG9yZWQuIFRoZSBzdWJ0YXNrIG1lc3NhZ2UKLSBpbiB0aGlzIGNvbnRleHQgaXMgdGhlIHN1YnRhc2sgaW4gYSBJUHJvZ3Jlc3NNb250aW9yCi0gPHA+Ci0gQm90aCBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjZGlzcGxheVN1YnRhc2sob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+ZGlzcGxheVN1YnRhc2s8L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsaWRhdG9yPC9DT0RFPiAtIFRoZSB2YWxpZGF0b3IgaXNzdWluZyB0aGUgc3VidGFzayBtZXNzYWdlLjxERD48Q09ERT5tZXNzYWdlPC9DT0RFPiAtIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE1lc3NhZ2VzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE1lc3NhZ2VzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZndDsgPEI+Z2V0TWVzc2FnZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNnZXRNZXNzYWdlcygpIj5nZXRNZXNzYWdlczwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXNzYWdlIGFjY2VzcyBpbnRlcmZhY2UgdG8gdGhpcyByZXBvcnRlciwgb3IgbnVsbCBpZiBtZXNzYWdlIGFjY2VzcyBpcyBub3QKLSBzdXBwb3J0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0NhbmNlbGxlZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0NhbmNlbGxlZDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aXNDYW5jZWxsZWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjaXNDYW5jZWxsZWQoKSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5SZXR1cm4gdHJ1ZSBpZiB0aGUgdXNlciBjYW5jZWxlZCB2YWxpZGF0aW9uLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUKLSBjYWxsZWQgYnkgSVZhbGlkYXRvcnMgcGVyaW9kaWNhbGx5LCBiZWNhdXNlIG5vIGV2ZW50IGlzIGZpcmVkIHRvIG5vdGlmeSBJVmFsaWRhdG9ycyB0aGF0IHRoZQotIHVzZXIgY2FuY2VsZWQgdmFsaWRhdGlvbi4gSWYgYSB2YWxpZGF0b3IgZG9lcyBub3QgY2hlY2sgdGhpcyBtZXRob2QsIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QKLSBpcyBpZ25vcmVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjaXNDYW5jZWxsZWQoKSI+aXNDYW5jZWxsZWQ8L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1yZW1vdmVBbGxNZXNzYWdlczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+cmVtb3ZlQWxsTWVzc2FnZXM8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IpIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlJlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcyBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvci4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQKLSBmb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gCi0gPHA+Ci0gVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yKSI+cmVtb3ZlQWxsTWVzc2FnZXM8L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+b3JpZ2luPC9DT0RFPiAtIE9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotcmVtb3ZlQWxsTWVzc2FnZXM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlbW92ZUFsbE1lc3NhZ2VzPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCkiPklSZXBvcnRlcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+UmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvciwKLSBwZXJ0YWluaW5nIHRvIHRoZSBPYmplY3QgcHJvdmlkZWQuIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGZvcgotIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIDxicj4KLSA8YnI+Ci0gSWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBudWxsLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByZW1vdmUgYWxsCi0gbWVzc2FnZXMgb3duZWQgYnkgdGhlIHZhbGlkYXRvci4gKGkuZS4sIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUKLSByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yKSBtZXRob2QuKSA8YnI+Ci0gPGJyPgotIDxwPgotIFRoZSBJVmFsaWRhdG9yIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCkiPnJlbW92ZUFsbE1lc3NhZ2VzPC9BPjwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm9yaWdpbjwvQ09ERT4gLSBPcmlnaW5hdG9yIHZhbGlkYXRvciBvZiB0aGUgbWVzc2FnZS48REQ+PENPREU+b2JqZWN0PC9DT0RFPiAtIE9iamVjdCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLiBPYmplY3QgaXMgdGhlIHRhcmdldCBvYmplY3QKLSAgICAgICAgICAgICAgICB0aGF0IHdhcyBzZXQgb24gdGhlIElNZXNzYWdlIHdoZW4gYWRkaW5nIHRoZSBtZXNzYWdlIGFzIHByb2JsZW0KLSAgICAgICAgICAgICAgICBtYXJrZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZW1vdmVNZXNzYWdlU3Vic2V0KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXJlbW92ZU1lc3NhZ2VTdWJzZXQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlbW92ZU1lc3NhZ2VTdWJzZXQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7b2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7Z3JvdXBOYW1lKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNyZW1vdmVNZXNzYWdlU3Vic2V0KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykiPklSZXBvcnRlcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+VG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5Ci0gYXNzaWduIGdyb3VwIG5hbWVzIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZCBieQotIHRoZSBuYW1lIG9mIGl0cyBncm91cC4gVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgb25seSB0aGUgSU1lc3NhZ2UncyB0aGF0Ci0gYXJlIGluIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZS4gCi0gPHA+Ci0gVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotIDxwPgotIElmIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgbnVsbCwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgcmVtb3ZlIGFsbAotIG1lc3NhZ2VzIG93bmVkIGJ5IHRoZSB2YWxpZGF0b3IuIChpLmUuLCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgdGhlCi0gcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikgbWV0aG9kLikKLSA8L3A+Ci0gPHA+Ci0gSWYgZ3JvdXBOYW1lIGlzIG51bGwsIHRoYXQncyB0aGUgc2FtZSBhcyBubyBncm91cCAoaS5lLiwgdGhlIHNhbWUKLSBiZWhhdmlvdXIgYXMgdGhlIDxjb2RlPnJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCk8L2NvZGU+Ci0gbWV0aG9kLikKLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNyZW1vdmVNZXNzYWdlU3Vic2V0KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykiPnJlbW92ZU1lc3NhZ2VTdWJzZXQ8L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsaWRhdG9yPC9DT0RFPiAtIE9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLjxERD48Q09ERT5vYmo8L0NPREU+IC0gT2JqZWN0IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuPEREPjxDT0RFPmdyb3VwTmFtZTwvQ09ERT4gLSBOYW1lIG9mIHRoZSBncm91cCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibWFrZU1hcmtlcnMoKSI+PCEtLSAtLT48L0E+PEgzPgotbWFrZU1hcmtlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPm1ha2VNYXJrZXJzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9SZXBvcnRlckhlbHBlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJSZXBvcnRlckhlbHBlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTg0ZjY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRpb25FdmVudAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRpb25FdmVudCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdGlvbkV2ZW50Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25FdmVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0aW9uRXZlbnQ8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudDwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGZpbmFsIGNsYXNzIDxCPlZhbGlkYXRpb25FdmVudDwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLUFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB3aGljaCBvYmplY3Qgc2hvdWxkIGJlIHZhbGlkYXRlZCBhbmQgd2hhdCB0cmlnZ2VyZWQgaXRzIHZhbGlkYXRpb24uCi0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sI1ZhbGlkYXRpb25FdmVudChJUmVzb3VyY2UsIGludCwgSVJlc291cmNlRGVsdGEpIj5WYWxpZGF0aW9uRXZlbnQ8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZURlbHRhJm5ic3A7ZGVwZW5kc09uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB3aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJUmVzb3VyY2VEZWx0YTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCNnZXREZXBlbmRzT24oKSI+Z2V0RGVwZW5kc09uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgdGhlIHJlc291cmNlIGlzIGJlaW5nIHZhbGlkYXRlZCBiZWNhdXNlIG9uZSBvZiBpdCdzIGRlcGVuZGVuY2llcyBoYXMgY2hhbmdlZCwgdGhhdCBjaGFuZ2UgaXMgZGVzY3JpYmVkIGhlcmUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCNnZXRLaW5kKCkiPmdldEtpbmQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgd2F5IHRoZSByZXNvdXJjZSBjaGFuZ2VkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJUmVzb3VyY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwjZ2V0UmVzb3VyY2UoKSI+Z2V0UmVzb3VyY2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgcmVzb3VyY2UgdG8gYmUgdmFsaWRhdGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iVmFsaWRhdGlvbkV2ZW50KElSZXNvdXJjZSwgaW50LCBJUmVzb3VyY2VEZWx0YSkiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRpb25FdmVudDwvSDM+Ci08UFJFPgotcHVibGljIDxCPlZhbGlkYXRpb25FdmVudDwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZURlbHRhJm5ic3A7ZGVwZW5kc09uKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZSBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgd2hhdCBzaG91bGQgYmUgdmFsaWRhdGVkLgotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0byBiZSB2YWxpZGF0ZWQuPEREPjxDT0RFPmtpbmQ8L0NPREU+IC0gVGhlIHdheSB0aGUgcmVzb3VyY2UgY2hhbmdlZC4gSXQgdXNlcyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlCi0gICAgICAgICAgICBraW5kIHBhcmFtZXRlciBpbiBJUmVzb3VyY2VEZWx0YS48REQ+PENPREU+ZGVwZW5kc09uPC9DT0RFPiAtIElmIHRoZSByZXNvdXJjZSBpcyBiZWluZyB2YWxpZGF0ZWQgYmVjYXVzZSBvbmUgb2YgaXQncwotICAgICAgICAgICAgZGVwZW5kZW5jaWVzIGhhcyBjaGFuZ2VkLCB0aGF0IGNoYW5nZSBpcyBkZXNjcmliZWQgaGVyZS4gVGhpcwotICAgICAgICAgICAgY2FuIGJlIG51bGwuPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0UmVzb3VyY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UmVzb3VyY2U8L0gzPgotPFBSRT4KLXB1YmxpYyBJUmVzb3VyY2UgPEI+Z2V0UmVzb3VyY2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5UaGUgcmVzb3VyY2UgdG8gYmUgdmFsaWRhdGVkLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRLaW5kKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEtpbmQ8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0S2luZDwvQj4oKTwvUFJFPgotPERMPgotPEREPlRoZSB3YXkgdGhlIHJlc291cmNlIGNoYW5nZWQuIEl0IHVzZXMgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSBraW5kCi0gcGFyYW1ldGVyIGluIElSZXNvdXJjZURlbHRhLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXREZXBlbmRzT24oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVwZW5kc09uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVJlc291cmNlRGVsdGEgPEI+Z2V0RGVwZW5kc09uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SWYgdGhlIHJlc291cmNlIGlzIGJlaW5nIHZhbGlkYXRlZCBiZWNhdXNlIG9uZSBvZiBpdCdzIGRlcGVuZGVuY2llcyBoYXMgY2hhbmdlZCwgdGhhdCBjaGFuZ2UgaXMgZGVzY3JpYmVkIGhlcmUuCi0gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCB3aGVuIHRoZSB0cmlnZ2VyIGlzIG5vdCBiZWNhdXNlIG9mIGEgZGVwZW5kZW5jeSBjaGFuZ2UuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25FdmVudC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzYTdhMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJWYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBjbGFzczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIHN0YXRpYyBjbGFzcyA8Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sI1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcihqYXZhLnV0aWwuU2V0KSI+VmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyPC9BPjwvQj4oamF2YS51dGlsLlNldCZsdDtJUmVzb3VyY2UmZ3Q7Jm5ic3A7c2V0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSBjbGFzcyB0aGF0IGtub3dzIGhvdyB0byBhZGQgcmVzb3VyY2VzIHRvIGEgc2V0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCN2aXNpdChJUmVzb3VyY2UpIj52aXNpdDwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJWYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIoamF2YS51dGlsLlNldCkiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvSDM+Ci08UFJFPgotcHVibGljIDxCPlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvQj4oamF2YS51dGlsLlNldCZsdDtJUmVzb3VyY2UmZ3Q7Jm5ic3A7c2V0KTwvUFJFPgotPERMPgotPEREPkEgY2xhc3MgdGhhdCBrbm93cyBob3cgdG8gYWRkIHJlc291cmNlcyB0byBhIHNldC4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXQ8L0NPREU+IC0gdGhlIHNldCB3aGVyZSB0aGUgcmVzb3VyY2VzIGFyZSBhZGRlZC48L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2aXNpdChJUmVzb3VyY2UpIj48IS0tIC0tPjwvQT48SDM+Ci12aXNpdDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+dmlzaXQ8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKQotICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+Q29yZUV4Y2VwdGlvbjwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMGI2MWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1WYWxpZGF0aW9uRnJhbWV3b3JrCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVmFsaWRhdGlvbkZyYW1ld29yayI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0aW9uRnJhbWV3b3JrPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgZmluYWwgY2xhc3MgPEI+VmFsaWRhdGlvbkZyYW1ld29yazwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoZSBjZW50cmFsIGNsYXNzIG9mIHRoZSBWYWxpZGF0aW9uIEZyYW1ld29yay4KLSA8cD4KLSBUaGlzIGlzIGEgc2luZ2xldG9uIGNsYXNzIHRoYXQgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgZ2V0RGVmYXVsdCgpIG1ldGhvZC4gCi0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibmVzdGVkX2NsYXNzX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2FkZFZhbGlkYXRpb25CdWlsZGVyKElQcm9qZWN0KSI+YWRkVmFsaWRhdGlvbkJ1aWxkZXI8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBZGQgdGhlIHZhbGlkYXRpb24gYnVpbGRlciB0byB0aGUgcHJvamVjdCwgc28gdGhhdCB0aGUgcHJvamVjdCBjYW4gc3VwcG9ydAotIGJ1aWxkIHRpbWUgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjYXBwbHlDaGFuZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVQcm9qZWN0U2V0dGluZ3MsIGJvb2xlYW4pIj5hcHBseUNoYW5nZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT4mbmJzcDtzZXR0aW5ncywKLSAgICAgICAgICAgICBib29sZWFuJm5ic3A7cGVyc2lzdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FwcGx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGJlZW4gdG8gdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2FwcGx5Q2hhbmdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MsIGJvb2xlYW4pIj5hcHBseUNoYW5nZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+Jm5ic3A7c2V0dGluZ3MsCi0gICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3BlcnNpc3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBcHBseSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBiZWVuIHRvIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNjbGVhck1lc3NhZ2VzKElSZXNvdXJjZSwgamF2YS5sYW5nLlN0cmluZykiPmNsZWFyTWVzc2FnZXM8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3ZhbGlkYXRvcklkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2xlYXIgYW55IHZhbGlkYXRpb24gbWFya2VycyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IHRoaXMgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNkaXNhYmxlVmFsaWRhdGlvbihJUmVzb3VyY2UpIj5kaXNhYmxlVmFsaWRhdGlvbjwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RGlzYWJsZSBhbGwgdmFsaWRhdGlvbiBmb3IgdGhlIGdpdmVuIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNlbmFibGVWYWxpZGF0aW9uKElSZXNvdXJjZSkiPmVuYWJsZVZhbGlkYXRpb248L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0VuYWJsZSB2YWxpZGF0aW9uIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0RGVmYXVsdCgpIj5nZXREZWZhdWx0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBzaW5nbGV0b24sIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JRGVwZW5kZW5jeUluZGV4PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0RGVwZW5kZW5jeUluZGV4KCkiPmdldERlcGVuZGVuY3lJbmRleDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgZGVwZW5kZW5jeSBpbmRleC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLlNldCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0RGlzYWJsZWRWYWxpZGF0b3JzRm9yKElSZXNvdXJjZSkiPmdldERpc2FibGVkVmFsaWRhdG9yc0ZvcjwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IHNob3VsZCBub3QgdmFsaWRhdGUgdGhlIHJlc291cmNlLCBlaXRoZXIKLSBiZWNhdXNlIHRoZWlyIGZpbHRlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgcmVzb3VyY2UsIG9yIHRoZSB2YWxpZGF0b3IgaGFzCi0gYmVlbiBkaXNhYmxlZCBmb3IgYm90aCBidWlsZCB2YWxpZGF0aW9uIGFuZCBtYW51YWwgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0UGVyZm9ybWFuY2VNb25pdG9yKCkiPmdldFBlcmZvcm1hbmNlTW9uaXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIHBlcmZvcm1hbmNlIG1vbml0b3IgZm9yIHRoZSB2YWxpZGF0b3JzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJRWNsaXBzZVByZWZlcmVuY2VzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRQcmVmZXJlbmNlU3RvcmUoKSI+Z2V0UHJlZmVyZW5jZVN0b3JlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgaG9sZHMgdGhlIHBlcnNpc3RlZCBnbG9iYWwgdmFsaWRhdGlvbiBzZXR0aW5ncy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRQcm9qZWN0U2V0dGluZ3MoSVByb2plY3QpIj5nZXRQcm9qZWN0U2V0dGluZ3M8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBvbiB0aGUKLSBwcm9qZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFJlcG9ydGVyKElQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yKSI+Z2V0UmVwb3J0ZXI8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZykiPmdldFZhbGlkYXRvcjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxCPkRlcHJlY2F0ZWQuPC9CPiZuYnNwOzxJPlVzZSBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KSB3aXRoIGEgbnVsbCBwcm9qZWN0IGluc3RlYWQuPC9JPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZywgSVByb2plY3QpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQgdGhhdCBpcyBpbiBlZmZlY3QgZm9yIHRoZSBnaXZlbgotIHByb2plY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0VmFsaWRhdG9ycygpIj5nZXRWYWxpZGF0b3JzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGNvcGllcyBvZiBhbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QoSVByb2plY3QpIj5nZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3Q8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0b3JzIGNhbiB1c2UgcHJvamVjdCBsZXZlbCBzZXR0aW5ncyAoUHJvamVjdCBuYXR1cmVzIGFuZCBmYWNldHMpIHRvCi0gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGFwcGxpY2FibGUgdG8gdGhlIHByb2plY3Qgb3Igbm90LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFZhbGlkYXRvcnNGb3IoSVJlc291cmNlKSI+Z2V0VmFsaWRhdG9yc0ZvcjwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhcHBsaWNhYmxlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0VmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj5nZXRWYWxpZGF0b3JzRm9yPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0V29ya3NwYWNlU2V0dGluZ3MoKSI+Z2V0V29ya3NwYWNlU2V0dGluZ3M8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBhdCB0aGUgd29ya3NwYWNlIGxldmVsLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNoYXNWYWxpZGF0b3JzKElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbikiPmhhc1ZhbGlkYXRvcnM8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0cnVlIGlmIHRoZSByZXNvdXJjZSBoYXMgYW55IGVuYWJsZWQgdmFsaWRhdG9ycy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjaXNMb2FkZWQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+aXNMb2FkZWQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3IgaGFzIGJlZW4gYWN0aXZhdGVkLCBpLmUuIGhhcyB0aGUKLSBidW5kbGUgdGhhdCBkZWZpbmVzIHRoZSB2YWxpZGF0b3IgYmVlbiBsb2FkZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2lzUHJvamVjdFN1c3BlbmRlZChJUHJvamVjdCkiPmlzUHJvamVjdFN1c3BlbmRlZDwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgYW55IGNvZGUgdGhhdCBpcyBwcmVwYXJpbmcgdG8gc3VzcGVuZCB2YWxpZGF0aW9uIG9uIGEKLSBwcm9qZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNpc1N1c3BlbmRlZCgpIj5pc1N1c3BlbmRlZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybiB0cnVlIGlmICJzdXNwZW5kIGFsbCIgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNpc1N1c3BlbmRlZChJUHJvamVjdCkiPmlzU3VzcGVuZGVkPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0cnVlIGlmIHZhbGlkYXRpb24gd2lsbCBub3QgcnVuIG9uIHRoZSBwcm9qZWN0IGJlY2F1c2UgaXQncyBiZWVuIHN1c3BlbmRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjam9pbihJUHJvZ3Jlc3NNb25pdG9yKSI+am9pbjwvQT48L0I+KElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7V2FpdHMgdW50aWwgYWxsIHZhbGlkYXRpb24gam9icyBhcmUgZmluaXNoZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI3NhdmVWYWxpZGF0b3JzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcltdKSI+c2F2ZVZhbGlkYXRvcnM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+W10mbmJzcDt2YWxpZGF0b3JzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2F2ZSB0aGUgdmFsaWRhdG9ycyBzZXR0aW5ncyBpbnRvIHRoZSBwZXJzaXN0ZW50IHN0b3JlLCB0aGVyZSBieSBtYWtpbmcgdGhlaXIgc2V0dGluZ3MgdGhlIGFjdGl2ZSBzZXR0aW5ncy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjc3VzcGVuZEFsbFZhbGlkYXRpb24oYm9vbGVhbikiPnN1c3BlbmRBbGxWYWxpZGF0aW9uPC9BPjwvQj4oYm9vbGVhbiZuYnNwO3N1c3BlbmQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTdXNwZW5kcywgb3IgdW5kb2VzIHRoZSBzdXNwZW5zaW9uIG9mLCB2YWxpZGF0aW9uIG9uIGFsbCBwcm9qZWN0cyBpbiB0aGUKLSB3b3JrYmVuY2guPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI3N1c3BlbmRWYWxpZGF0aW9uKElQcm9qZWN0LCBib29sZWFuKSI+c3VzcGVuZFZhbGlkYXRpb248L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7c3VzcGVuZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1N1c3BlbmRzLCBvciB1bmRvZXMgdGhlIHN1c3BlbnNpb24gb2YsIHZhbGlkYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0czwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI3ZhbGlkYXRlKElGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJRmlsZSZuYnNwO2ZpbGUsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIGEgc3BlY2lmaWMgZmlsZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0czwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI3ZhbGlkYXRlKElQcm9qZWN0W10sIGJvb2xlYW4sIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KElQcm9qZWN0W10mbmJzcDtwcm9qZWN0cywKLSAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgIGJvb2xlYW4mbmJzcDtpc0J1aWxkLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZSB0aGUgcHJvamVjdHMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldERlZmF1bHQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVmYXVsdDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkZyYW1ld29yazwvQT4gPEI+Z2V0RGVmYXVsdDwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgc2luZ2xldG9uLCBkZWZhdWx0IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFkZFZhbGlkYXRpb25CdWlsZGVyKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotYWRkVmFsaWRhdGlvbkJ1aWxkZXI8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmFkZFZhbGlkYXRpb25CdWlsZGVyPC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+QWRkIHRoZSB2YWxpZGF0aW9uIGJ1aWxkZXIgdG8gdGhlIHByb2plY3QsIHNvIHRoYXQgdGhlIHByb2plY3QgY2FuIHN1cHBvcnQKLSBidWlsZCB0aW1lIHZhbGlkYXRpb24uIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIG1ldGhvZCwgaWYgdGhlIGJ1aWxkZXIgd2FzCi0gcHJldmlvdXNseSBhZGRlZCB0byB0aGUgcHJvamVjdC4gSXQgd2lsbCBub3QgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gVGhlIHByb2plY3QgdGhhdCB0aGUgYnVpbGRlciBpcyBhZGRlZCB0by48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNsZWFyTWVzc2FnZXMoSVJlc291cmNlLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotY2xlYXJNZXNzYWdlczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+Y2xlYXJNZXNzYWdlczwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWxpZGF0b3JJZCkKLSAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPkNsZWFyIGFueSB2YWxpZGF0aW9uIG1hcmtlcnMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSB0aGlzIHZhbGlkYXRvci4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgbWF5IGhhdmUgaXQncyBtYXJrZXJzIGNsZWFyZWQuPEREPjxDT0RFPnZhbGlkYXRvcklkPC9DT0RFPiAtIFRoZSBpZCBvZiB2YWxpZGF0b3IgdGhhdCBjcmVhdGVkIHRoZSBtYXJrZXIuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5Db3JlRXhjZXB0aW9uPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZGlzYWJsZVZhbGlkYXRpb24oSVJlc291cmNlKSI+PCEtLSAtLT48L0E+PEgzPgotZGlzYWJsZVZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmRpc2FibGVWYWxpZGF0aW9uPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L1BSRT4KLTxETD4KLTxERD5EaXNhYmxlIGFsbCB2YWxpZGF0aW9uIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuIFRoaXMgbWV0aG9kIGluc3RydWN0cwotIHRoZSBmcmFtZXdvcmsgdG8gbm90IHJ1biBhbnkgdmFsaWRhdG9ycyBvbiB0aGUgZ2l2ZW4gcmVzb3VyY2Ugb3IgYW55IG9mCi0gaXQncyBjaGlsZHJlbi4gVGhpcyBzZXR0aW5nIGlzIHBlcnNpc3RlbnQuIEN1cnJlbnRseSB0aGlzIG9ubHkgd29ya3Mgd2l0aCB2ZXJzaW9uIDIKLSB2YWxpZGF0b3JzLgotIDxwPgotIFVzZSB0aGUgZW5hYmxlVmFsaWRhdGlvbiBtZXRob2QgdG8gcmVzdG9yZSB2YWxpZGF0aW9uLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgaXMgaGF2aW5nIHZhbGlkYXRpb24gZGlzYWJsZWQuIEl0IG11c3QgYmUgYW4gSUZvbGRlciBvciBhbiBJRmlsZS48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZW5hYmxlVmFsaWRhdGlvbihJUmVzb3VyY2UpIj48Q09ERT5lbmFibGVWYWxpZGF0aW9uKElSZXNvdXJjZSk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZW5hYmxlVmFsaWRhdGlvbihJUmVzb3VyY2UpIj48IS0tIC0tPjwvQT48SDM+Ci1lbmFibGVWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5lbmFibGVWYWxpZGF0aW9uPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L1BSRT4KLTxETD4KLTxERD5FbmFibGUgdmFsaWRhdGlvbiBmb3IgdGhlIGdpdmVuIHJlc291cmNlLiBJZiB0aGUgcmVzb3VyY2Ugd2FzIG5vdAotIHByZXZpb3VzbHkgZGlzYWJsZWQgdGhpcyBtZXRob2QgY2FsbCBoYXMgbm8gZWZmZWN0LiBDdXJyZW50bHkgdGhpcyBvbmx5Ci0gd29ya3Mgd2l0aCB2ZXJzaW9uIDIgdmFsaWRhdG9ycy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgaXMgaGF2aW5nIHZhbGlkYXRpb24gcmUtZW5hYmxlZC48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZGlzYWJsZVZhbGlkYXRpb24oSVJlc291cmNlKSI+PENPREU+ZGlzYWJsZVZhbGlkYXRpb24oSVJlc291cmNlKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXREZXBlbmRlbmN5SW5kZXgoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVwZW5kZW5jeUluZGV4PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JRGVwZW5kZW5jeUluZGV4PC9BPiA8Qj5nZXREZXBlbmRlbmN5SW5kZXg8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIGRlcGVuZGVuY3kgaW5kZXguIFZhbGlkYXRvcnMgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGljaCByZXNvdXJjZXMgZGVwZW5kIG9uIHdoaWNoCi0gb3RoZXIgcmVzb3VyY2VzLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQZXJmb3JtYW5jZU1vbml0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UGVyZm9ybWFuY2VNb25pdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yPC9BPiA8Qj5nZXRQZXJmb3JtYW5jZU1vbml0b3I8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYSBwZXJmb3JtYW5jZSBtb25pdG9yIGZvciB0aGUgdmFsaWRhdG9ycy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UHJlZmVyZW5jZVN0b3JlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFByZWZlcmVuY2VTdG9yZTwvSDM+Ci08UFJFPgotcHVibGljIElFY2xpcHNlUHJlZmVyZW5jZXMgPEI+Z2V0UHJlZmVyZW5jZVN0b3JlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgaG9sZHMgdGhlIHBlcnNpc3RlZCBnbG9iYWwgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UmVwb3J0ZXIoSVByb2plY3QsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRSZXBvcnRlcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiA8Qj5nZXRSZXBvcnRlcjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvcnNGb3IoSVJlc291cmNlLCBib29sZWFuLCBib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yc0ZvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXSA8Qj5nZXRWYWxpZGF0b3JzRm9yPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc0J1aWxkKTwvUFJFPgotPERMPgotPEREPkFuc3dlciBhbGwgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXBwbGljYWJsZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlLiBBIHZhbGlkYXRvciBpcwotIHN0aWxsIHJldHVybmVkIGV2ZW4gaWYgaXQgaGFzIGJlZW4gdHVybmVkIG9mZiBieSB0aGUgdXNlci4KLSA8cD4KLSBUaGUgY2FsbGVyIG1heSBzdGlsbCBuZWVkIHRvIHRlc3QgaWYgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiB0dXJuZWQgb2ZmIGJ5Ci0gdGhlIHVzZXIsIGJ5IHVzaW5nIHRoZSBpc0J1aWxkVmFsaWRhdGlvbigpIGFuZCBpc01hbnVhbFZhbGlkYXRpb24oKQotIG1ldGhvZHMuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHZhbGlkYXRvcnMgYXJlIGFwcGxpY2FibGUuPEREPjxDT0RFPmlzTWFudWFsPC9DT0RFPiAtIElmIHRydWUgdGhlbiB0aGUgdmFsaWRhdG9yIG11c3QgYmUgdHVybmVkIG9uIGZvciBtYW51YWwgdmFsaWRhdGlvbi4KLSAgICAgICAgICAgICAgICBJZiBmYWxzZSB0aGVuIHRoZSBpc01hbnVhbFZhbGlkYXRpb24gc2V0dGluZyBpc24ndCB1c2VkIHRvIGZpbHRlcgotICAgICAgICAgICAgICAgIG91dCB2YWxpZGF0b3JzLjxERD48Q09ERT5pc0J1aWxkPC9DT0RFPiAtIElmIHRydWUgdGhlbiB0aGUgdmFsaWRhdG9yIG11c3QgYmUgdHVybmVkIG9uIGZvciBidWlsZCBiYXNlZAotICAgICAgICAgICAgICAgIHZhbGlkYXRpb24uIElmIGZhbHNlIHRoZW4gdGhlIGlzQnVpbGRWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZAotICAgICAgICAgICAgICAgIHRvIGZpbHRlciBvdXQgdmFsaWRhdG9ycy48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0J1aWxkVmFsaWRhdGlvbigpIj48Q09ERT5WYWxpZGF0b3IuaXNCdWlsZFZhbGlkYXRpb24oKTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzTWFudWFsVmFsaWRhdGlvbigpIj48Q09ERT5WYWxpZGF0b3IuaXNNYW51YWxWYWxpZGF0aW9uKCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0RGlzYWJsZWRWYWxpZGF0b3JzRm9yKElSZXNvdXJjZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERpc2FibGVkVmFsaWRhdG9yc0ZvcjwvSDM+Ci08UFJFPgotcHVibGljIGphdmEudXRpbC5TZXQmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZndDsgPEI+Z2V0RGlzYWJsZWRWYWxpZGF0b3JzRm9yPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgc2hvdWxkIG5vdCB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UsIGVpdGhlcgotIGJlY2F1c2UgdGhlaXIgZmlsdGVycyBkb24ndCBzdXBwb3J0IHRoZSByZXNvdXJjZSwgb3IgdGhlIHZhbGlkYXRvciBoYXMKLSBiZWVuIGRpc2FibGVkIGZvciBib3RoIGJ1aWxkIHZhbGlkYXRpb24gYW5kIG1hbnVhbCB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdGhpcyBpcyBiZWluZyB0ZXN0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4gPEI+Z2V0VmFsaWRhdG9yPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVwcmVjYXRlZC48L0I+Jm5ic3A7PEk+VXNlIGdldFZhbGlkYXRvcihTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpIHdpdGggYSBudWxsIHByb2plY3QgaW5zdGVhZC48L0k+Ci08UD4KLTxERD5BbnN3ZXIgdGhlIGdsb2JhbCB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmlkPC9DT0RFPiAtIAotPERUPjxCPlJldHVybnM6PC9CPjxERD5udWxsIGlmIHRoZSB2YWxpZGF0b3IgaXMgbm90IGZvdW5kPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZywgSVByb2plY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3I8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IDxCPmdldFZhbGlkYXRvcjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGlkIHRoYXQgaXMgaW4gZWZmZWN0IGZvciB0aGUgZ2l2ZW4KLSBwcm9qZWN0LgotIDxwPgotIEluZGl2aWR1YWwgcHJvamVjdHMgbWF5IG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlCi0gc2V0dGluZ3MuIElmIHRoaXMgaXMgYWxsb3dlZCBhbmQgaWYgdGhlIHByb2plY3QgaGFzIGl0J3Mgb3duIHNldHRpbmdzLAotIHRoZW4gdGhvc2UgdmFsaWRhdG9ycyBhcmUgcmV0dXJuZWQgdmlhIHRoaXMgbWV0aG9kLgotIDwvcD4KLSA8cD4KLSBUaGUgZm9sbG93aW5nIGFwcHJvYWNoIGlzIHVzZWQuIEZvciB2ZXJzaW9uIDEgdmFsaWRhdG9ycywgdGhlIHZhbGlkYXRvcgotIGlzIG9ubHkgcmV0dXJuZWQgaWYgaXQgaXMgZGVmaW5lZCB0byBvcGVyYXRlIG9uIHRoaXMgcHJvamVjdCB0eXBlLiBUaGlzCi0gaXMgdGhlIHdheSB0aGF0IHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBmcmFtZXdvcmsgZGlkIGl0LiBGb3IgdmVyc2lvbgotIDIgdmFsaWRhdG9ycywgdGhleSBhcmUgYWxsIHJldHVybmVkLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+aWQ8L0NPREU+IC0gVmFsaWRhdG9yIGlkLjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIFRoaXMgY2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2UgYWxsIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMgYXJlCi0gICAgICAgICAgICAgICAgY2hlY2tlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+bnVsbCBpZiB0aGUgdmFsaWRhdG9yIGlzIG5vdCBmb3VuZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VmFsaWRhdG9ycygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3JzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdIDxCPmdldFZhbGlkYXRvcnM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgY29waWVzIG9mIGFsbCB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPkFuc3dlciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdG9ycy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFByb2plY3RTZXR0aW5ncyhJUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFByb2plY3RTZXR0aW5nczwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPiA8Qj5nZXRQcm9qZWN0U2V0dGluZ3M8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBvbiB0aGUKLSBwcm9qZWN0LiBUbyAiYWN0aXZhdGUiIGFueSBjaGFuZ2VzIHRvIHRoZXNlIHNldHRpbmdzLCB0aGUKLSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjYXBwbHlDaGFuZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVQcm9qZWN0U2V0dGluZ3MsIGJvb2xlYW4pIj48Q09ERT5hcHBseUNoYW5nZXMoTXV0YWJsZVByb2plY3RTZXR0aW5ncywgYm9vbGVhbik8L0NPREU+PC9BPiBtZXRob2QgbmVlZHMgdG8gYmUKLSBjYWxsZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gVGhlIHByb2plY3Qgd2hvJ3Mgc2V0dGluZ3MgeW91IHdpc2ggdG8gZXhhbWluZSBvciBjaGFuZ2UuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlZhbGlkYXRpb24gc2V0dGluZ3MgdGhhdCBhcHBseSB0byB0aGUgZ2l2ZW4gcHJvamVjdC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFdvcmtzcGFjZVNldHRpbmdzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFdvcmtzcGFjZVNldHRpbmdzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPiA8Qj5nZXRXb3Jrc3BhY2VTZXR0aW5nczwvQj4oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYXQgdGhlIHdvcmtzcGFjZSBsZXZlbC4KLSBUbyAiYWN0aXZhdGUiIGFueSBjaGFuZ2VzIHRvIHRoZXNlIHNldHRpbmdzLCB0aGUKLSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjYXBwbHlDaGFuZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncywgYm9vbGVhbikiPjxDT0RFPmFwcGx5Q2hhbmdlcyhNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MsIGJvb2xlYW4pPC9DT0RFPjwvQT4gbWV0aG9kIG5lZWRzIHRvIGJlCi0gY2FsbGVkLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlZhbGlkYXRpb24gc2V0dGluZ3MgdGhhdCBhcHBseSB0byB0aGUgZW50aXJlIHdvcmtzcGFjZS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPmphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L0NPREU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhcHBseUNoYW5nZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVByb2plY3RTZXR0aW5ncywgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLWFwcGx5Q2hhbmdlczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+YXBwbHlDaGFuZ2VzPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT4mbmJzcDtzZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7cGVyc2lzdCk8L1BSRT4KLTxETD4KLTxERD5BcHBseSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBiZWVuIHRvIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXR0aW5nczwvQ09ERT4gLSBUaGUgcHJvamVjdCBzZXR0aW5ncy48REQ+PENPREU+cGVyc2lzdDwvQ09ERT4gLSBJZiB0cnVlIHRoZW4gdGhlIGNoYW5nZXMgYXJlIHBlcnNpc3RlZCB0byB0aGUgcHJvcGVydHkgZmlsZXMuCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgY2hhbmdlcyBhcmUgYXBwbGllZCB0byB0aGUgdmFsaWRhdG9ycywgYnV0IGFyZQotICAgICAgICAgICAgbm90IHBlcnNpc3RlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFwcGx5Q2hhbmdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MsIGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1hcHBseUNoYW5nZXM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmFwcGx5Q2hhbmdlczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPiZuYnNwO3NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtwZXJzaXN0KTwvUFJFPgotPERMPgotPEREPkFwcGx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGJlZW4gdG8gdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnNldHRpbmdzPC9DT0RFPiAtIFRoZSB3b3Jrc3BhY2Ugc2V0dGluZ3MuPEREPjxDT0RFPnBlcnNpc3Q8L0NPREU+IC0gSWYgdHJ1ZSB0aGVuIHRoZSBjaGFuZ2VzIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIHByb3BlcnR5IGZpbGVzLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIGNoYW5nZXMgYXJlIGFwcGxpZWQgdG8gdGhlIHZhbGlkYXRvcnMsIGJ1dCBhcmUKLSAgICAgICAgICAgIG5vdCBwZXJzaXN0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QoSVByb2plY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3Q8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+W10gPEI+Z2V0VmFsaWRhdG9yc0NvbmZpZ3VyZWRGb3JQcm9qZWN0PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RVbmF2YWlsYWJsZUVycm9yPC9QUkU+Ci08REw+Ci08REQ+VmFsaWRhdG9ycyBjYW4gdXNlIHByb2plY3QgbGV2ZWwgc2V0dGluZ3MgKFByb2plY3QgbmF0dXJlcyBhbmQgZmFjZXRzKSB0bwotIGRldGVybWluZSBpZiB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBwcm9qZWN0IG9yIG5vdC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5UaGUgY29waWVzIG9mIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIHRoaXMgcHJvamVjdCBiYXNlZAotICAgICAgICAgb24gdGhlIHByb2plY3QgbGV2ZWwgc2V0dGluZ3MuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0VW5hdmFpbGFibGVFcnJvcjwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvcnNGb3IoSVJlc291cmNlKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yc0ZvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXSA8Qj5nZXRWYWxpZGF0b3JzRm9yPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gdGhlIHJlc291cmNlIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWNhYmxlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaGFzVmFsaWRhdG9ycyhJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1oYXNWYWxpZGF0b3JzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5oYXNWYWxpZGF0b3JzPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaGFzIGFueSBlbmFibGVkIHZhbGlkYXRvcnMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIEEgZmlsZSwgZm9sZGVyIG9yIHByb2plY3QuPEREPjxDT0RFPmlzTWFudWFsPC9DT0RFPiAtIElmIHRydWUgdGhlbiB0aGUgdmFsaWRhdG9yIG11c3QgYmUgdHVybmVkIG9uIGZvciBtYW51YWwgdmFsaWRhdGlvbi4KLSAgICAgICAgICAgICAgICBJZiBmYWxzZSB0aGVuIHRoZSBpc01hbnVhbFZhbGlkYXRpb24gc2V0dGluZyBpc24ndCB1c2VkIHRvIGZpbHRlcgotICAgICAgICAgICAgICAgIG91dCB2YWxpZGF0b3JzLjxERD48Q09ERT5pc0J1aWxkPC9DT0RFPiAtIElmIHRydWUgdGhlbiB0aGUgdmFsaWRhdG9yIG11c3QgYmUgdHVybmVkIG9uIGZvciBidWlsZCBiYXNlZAotICAgICAgICAgICAgICAgIHZhbGlkYXRpb24uIElmIGZhbHNlIHRoZW4gdGhlIGlzQnVpbGRWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZAotICAgICAgICAgICAgICAgIHRvIGZpbHRlciBvdXQgdmFsaWRhdG9ycy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzTG9hZGVkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLWlzTG9hZGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5pc0xvYWRlZDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvcik8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiBhY3RpdmF0ZWQsIGkuZS4gaGFzIHRoZQotIGJ1bmRsZSB0aGF0IGRlZmluZXMgdGhlIHZhbGlkYXRvciBiZWVuIGxvYWRlZC4gV2UgZG8gbm90IHdhbnQgdG8gY2F1c2UKLSB1bm5lY2Vzc2FyeSBidW5kbGUgbG9hZGluZywgc28gdGhpcyBjaGVjayBjYW4gYmUgcGVyZm9ybWVkIGJ5IHRoaXJkIHBhcnR5Ci0gY2FsbGVycywgdG8gcHJldmVudCBtYWtpbmcgb3RoZXIgY2FsbHMgdGhhdCB3aWxsIGZvcmNlIHRoZSB2YWxpZGF0b3IgdG8KLSBiZSBsb2FkZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcjwvQ09ERT4gLSBUaGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgdGVzdGVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSB2YWxpZGF0b3IgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJqb2luKElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1qb2luPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5qb2luPC9CPihJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcikKLSAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPldhaXRzIHVudGlsIGFsbCB2YWxpZGF0aW9uIGpvYnMgYXJlIGZpbmlzaGVkLiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHRoZQotIGNhbGxpbmcgdGhyZWFkIHVudGlsIGFsbCBzdWNoIGpvYnMgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcsIG9yIHVudGlsIHRoaXMKLSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuIElmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGpvYnMgdGhhdCBhcmUKLSBjdXJyZW50bHkgd2FpdGluZywgcnVubmluZywgb3Igc2xlZXBpbmcsIHRoaXMgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gRmVlZGJhY2sgb24gaG93IHRoZSBqb2luIGlzIHByb2dyZXNzaW5nIGlzIHByb3ZpZGVkIHRvIHRoZSBwcm9ncmVzcwotIG1vbml0b3IuCi0gPHA+Ci0gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoaWxlIHRoZSBqb2IgbWFuYWdlciBpcyBzdXNwZW5kZWQsIG9ubHkgam9icwotIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIHdpbGwgYmUgam9pbmVkLiBPbmNlIHRoZXJlIGFyZSBubyBqb2JzIGluIHRoZQotIGZhbWlseSBpbiB0aGUgPENPREU+Sm9iI1JVTk5JTkc8L0NPREU+IHN0YXRlLCB0aGlzIG1ldGhvZCByZXR1cm5zLgotIDwvcD4KLSA8cD4KLSBOb3RlIHRoYXQgdGhlcmUgaXMgYSBkZWFkbG9jayByaXNrIHdoZW4gdXNpbmcgam9pbi4gSWYgdGhlIGNhbGxpbmcgdGhyZWFkCi0gb3ducyBhIGxvY2sgb3Igb2JqZWN0IG1vbml0b3IgdGhhdCB0aGUgam9pbmVkIHRocmVhZCBpcyB3YWl0aW5nIGZvciwKLSBkZWFkbG9jayB3aWxsIG9jY3VyLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyByZXN1bHQgaW4gc3RhcnZhdGlvbiBvZiB0aGUKLSBjdXJyZW50IHRocmVhZCBpZiBhbm90aGVyIHRocmVhZCBjb250aW51ZXMgdG8gYWRkIGpvYnMgb2YgdGhlIGdpdmVuCi0gZmFtaWx5LCBvciBpZiBhIGpvYiBpbiB0aGUgZ2l2ZW4gZmFtaWx5IHJlc2NoZWR1bGVzIGl0c2VsZiBpbiBhbiBpbmZpbml0ZQotIGxvb3AuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIFByb2dyZXNzIG1vbml0b3IgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBvbiBob3cgdGhlIHdhaXQgaXMKLSAgICAgICAgICAgICAgICBwcm9ncmVzc2luZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcwotICAgICAgICAgICAgICAgIHJlcXVpcmVkLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoaXMgdGhyZWFkIGlzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcKLTxERD48Q09ERT5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyBjYW5jZWxlZCB3aGlsZSB3YWl0aW5nPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCwgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXN1c3BlbmRWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zdXNwZW5kVmFsaWRhdGlvbjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3N1c3BlbmQpPC9QUkU+Ci08REw+Ci08REQ+U3VzcGVuZHMsIG9yIHVuZG9lcyB0aGUgc3VzcGVuc2lvbiBvZiwgdmFsaWRhdGlvbiBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotIElmIDxiPnN1c3BlbmQ8L2I+IGlzIHRydWUgdGhlbiB2YWxpZGF0aW9uIGlzIHN1c3BlbmRlZCBhbmQgaWYgaXQncyBmYWxzZQotIHRoZW4gdmFsaWRhdGlvbiBpcyBub3Qgc3VzcGVuZGVkIG9uIHRoZSBwcm9qZWN0LiBUaGUgdmFsdWUgb2YgdGhpcwotIHZhcmlhYmxlIGlzIG5vdCBwZXJzaXN0ZWQuCi0gPHA+Ci0gQmUgPGI+dmVyeSBjYXJlZnVsPC9iPiB3aGVuIHlvdSB1c2UgdGhpcyBtZXRob2QhIFR1cm4gdmFsaWRhdGlvbiBiYWNrIG9uIGluIGEKLSBmaW5hbGx5IGJsb2NrIGJlY2F1c2UgaWYgdGhlIGNvZGUgd2hpY2ggc3VzcGVuZGVkIHZhbGlkYXRpb24gY3Jhc2hlcywgdGhlCi0gdXNlciBoYXMgbm8gd2F5IHRvIHJlc2V0IHRoZSBzdXNwZW5zaW9uLiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gc2h1dCBkb3duCi0gYW5kIHJlc3RhcnQgdGhlIHdvcmtiZW5jaCB0byBnZXQgdmFsaWRhdGlvbiB0byB3b3JrIGFnYWluLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IGlzIHRvIGJlIHN1c3BlbmRlZCBvciB1bnN1c3BlbmRlZC48REQ+PENPREU+c3VzcGVuZDwvQ09ERT4gLSBJZiB0cnVlLCB2YWxpZGF0aW9uIG9uIHRoZSBwcm9qZWN0IHdpbGwgYmUgc3VzcGVuZC4gSWYgZmFsc2UgaXQgd2lsbAotICAgICAgICAgICAgICAgIG5vdCBiZSBzdXNwZW5kZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzYXZlVmFsaWRhdG9ycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JbXSkiPjwhLS0gLS0+PC9BPjxIMz4KLXNhdmVWYWxpZGF0b3JzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zYXZlVmFsaWRhdG9yczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5TYXZlIHRoZSB2YWxpZGF0b3JzIHNldHRpbmdzIGludG8gdGhlIHBlcnNpc3RlbnQgc3RvcmUsIHRoZXJlIGJ5IG1ha2luZyB0aGVpciBzZXR0aW5ncyB0aGUgYWN0aXZlIHNldHRpbmdzLgotIDxwPgotIEEgY29tbW9uIHVzZSBvZiB0aGlzIG1ldGhvZCB3b3VsZCBiZSB0byBjaGFuZ2Ugd2hldGhlciBwYXJ0aWN1bGFyIHZhbGlkYXRvcnMgYXJlIGVuYWJsZWQgb3Igbm90LiBGb3IgZXhhbXBsZQotIGlmIHlvdSBvbmx5IHdhbnRlZCB0aGUgSlNQIHZhbGlkYXRvciBlbmFibGVkLCB5b3UgY291bGQgdXNlIGNvZGUgc2ltaWxhciB0byB0aGlzOgotIDxwcmU+Ci0gVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotIFZhbGlkYXRvcltdIHZhbHMgPSB2Zi5nZXRWYWxpZGF0b3JzKCk7Ci0gZm9yIChWYWxpZGF0b3IgdiA6IHZhbHMpewotICAgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0gICBpZiAodi5nZXRWYWxpZGF0b3JDbGFzc25hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEJhdGNoVmFsaWRhdG9yIikpZW5hYmxlZCA9IHRydWU7Ci0gICAgIHYuc2V0QnVpbGRWYWxpZGF0aW9uKGVuYWJsZWQpOwotICAgICB2LnNldE1hbnVhbFZhbGlkYXRpb24oZW5hYmxlZCk7Ci0gIH0KLSB2Zi5zYXZlVmFsaWRhdG9ycyh2YWxzKTsKLSA8L3ByZT4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcnM8L0NPREU+IC0gVGhlIHZhbGlkYXRvcnMgdGhhdCB5b3UgYXJlIHNhdmluZy4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPmphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L0NPREU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzdXNwZW5kQWxsVmFsaWRhdGlvbihib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc3VzcGVuZEFsbFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnN1c3BlbmRBbGxWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7c3VzcGVuZCk8L1BSRT4KLTxETD4KLTxERD5TdXNwZW5kcywgb3IgdW5kb2VzIHRoZSBzdXNwZW5zaW9uIG9mLCB2YWxpZGF0aW9uIG9uIGFsbCBwcm9qZWN0cyBpbiB0aGUKLSB3b3JrYmVuY2guIElmICJzdXNwZW5kIiBpcyB0cnVlIHRoZW4gdmFsaWRhdGlvbiBpcyBzdXNwZW5kZWQgYW5kIGlmIGl0J3MKLSAiZmFsc2UiIHRoZW4gdmFsaWRhdGlvbiBpcyBub3Qgc3VzcGVuZGVkLiBUaGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcwotIG5vdCBwZXJzaXN0ZWQuCi0gPHA+Ci0gQmUgPGI+dmVyeSBjYXJlZnVsPC9iPiB3aGVuIHlvdSB1c2UgdGhpcyBtZXRob2QhIFR1cm4gdmFsaWRhdGlvbiBiYWNrIG9uIGluIGEKLSBmaW5hbGx5IGJsb2NrIGJlY2F1c2UgaWYgdGhlIGNvZGUgd2hpY2ggc3VzcGVuZGVkIHZhbGlkYXRpb24gY3Jhc2hlcywgdGhlCi0gdXNlciBoYXMgbm8gd2F5IHRvIHJlc2V0IHRoZSBzdXNwZW5zaW9uLiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gc2h1dCBkb3duCi0gYW5kIHJlc3RhcnQgdGhlIHdvcmtiZW5jaCB0byBnZXQgdmFsaWRhdGlvbiB0byB3b3JrIGFnYWluLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNTdXNwZW5kZWQoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNTdXNwZW5kZWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmlzU3VzcGVuZGVkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJuIHRydWUgaWYgInN1c3BlbmQgYWxsIiBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzU3VzcGVuZGVkKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotaXNTdXNwZW5kZWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmlzU3VzcGVuZGVkPC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0cnVlIGlmIHZhbGlkYXRpb24gd2lsbCBub3QgcnVuIG9uIHRoZSBwcm9qZWN0IGJlY2F1c2UgaXQncyBiZWVuIHN1c3BlbmRlZC4gVGhpcwotIG1ldGhvZCBjaGVja3Mgb25seSB0aGUgc3VzcGVuc2lvbiBzdGF0dXM7IGlmIHZhbGlkYXRpb24gY2Fubm90IHJ1biBmb3Igc29tZSBvdGhlciByZWFzb24gKGZvcgotIGV4YW1wbGUsIHRoZXJlIGFyZSBubyBlbmFibGVkIHZhbGlkYXRvcnMpLCB5ZXQgdGhlIElQcm9qZWN0IGlzIG5vdCBzdXNwZW5kZWQsIHRoaXMgbWV0aG9kCi0gd2lsbCByZXR1cm4gdHJ1ZSBldmVuIHRob3VnaCB2YWxpZGF0aW9uIHdpbGwgbm90IHJ1bi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNQcm9qZWN0U3VzcGVuZGVkKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotaXNQcm9qZWN0U3VzcGVuZGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5pc1Byb2plY3RTdXNwZW5kZWQ8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5UaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBjb2RlIHRoYXQgaXMgcHJlcGFyaW5nIHRvIHN1c3BlbmQgdmFsaWRhdGlvbiBvbiBhCi0gcHJvamVjdC4gUmF0aGVyIHRoYW4gY2FsbGluZyBpc1N1c3BlbmRlZChJUHJvamVjdCksIHdoaWNoIHdpbGwgYWxzbyByZXR1cm4gdHJ1ZSBpZiBhbGwgdmFsaWRhdGlvbgotIGhhcyBiZWVuIHN1c3BlbmRlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIHRlc3RlZAotPERUPjxCPlJldHVybnM6PC9CPjxERD5ib29sZWFuIHRydWUgaWYgdGhlIHByb2plY3QgaGFzIGJlZW4gc3VzcGVuZGVkPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0ZShJUHJvamVjdFtdLCBib29sZWFuLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPiA8Qj52YWxpZGF0ZTwvQj4oSVByb2plY3RbXSZuYnNwO3Byb2plY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+VmFsaWRhdGUgdGhlIHByb2plY3RzLiBFeGFjdGx5IG9uZSBvZiBpc01hbnVhbCBvciBpc0J1aWxkIG5lZWRzIHRvIGJlIHRydWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3RzPC9DT0RFPiAtIFRoZSBwcm9qZWN0cyB0byBiZSB2YWxpZGF0ZWQuPEREPjxDT0RFPmlzTWFudWFsPC9DT0RFPiAtIElzIHRoaXMgYmVpbmcgZG9uZSBhcyBwYXJ0IG9mIGEgbWFudWFsIHZhbGlkYXRpb24/IGkuZS4gZGlkCi0gICAgICAgICAgICB0aGUgdXNlciBzZWxlY3QgdGhlIFZhbGlkYXRlIG1lbnUgaXRlbT88REQ+PENPREU+aXNCdWlsZDwvQ09ERT4gLSBJcyB0aGlzIGJlaW5nIGRvbmUgYXMgcGFydCBvZiBhIGJ1aWxkPzxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIAotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdmFsaWRhdGlvbiByZXN1bHQgd2hpY2ggaXMgdGhlIGNvbWJpbmVkIHJlc3VsdCBmb3IgYWxsIHRoZQotICAgICAgICAgcmVzb3VyY2VzIHRoYXQgd2VyZSB2YWxpZGF0ZWQuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5Db3JlRXhjZXB0aW9uPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUoSUZpbGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdHM8L0E+IDxCPnZhbGlkYXRlPC9CPihJRmlsZSZuYnNwO2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPlZhbGlkYXRlIGEgc3BlY2lmaWMgZmlsZSByZXNvdXJjZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZmlsZTwvQ09ERT4gLSBUaGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gUHJvZ3Jlc3MgbW9uaXRvci4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHJlc3VsdCBvZiB2YWxpZGF0aW5nIHRoZSBmaWxlLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+Q29yZUV4Y2VwdGlvbjwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDs8QSBIUkVGPSIjbmVzdGVkX2NsYXNzX3N1bW1hcnkiPk5FU1RFRDwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzJjMGViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1WYWxpZGF0aW9uUmVzdWx0Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVmFsaWRhdGlvblJlc3VsdCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdGlvblJlc3VsdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIFZhbGlkYXRpb25SZXN1bHQ8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBmaW5hbCBjbGFzcyA8Qj5WYWxpZGF0aW9uUmVzdWx0PC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhlIHJlc3VsdCBvZiBydW5uaW5nIGEgdmFsaWRhdGUgb3BlcmF0aW9uLiBWYWxpZGF0b3JzIGNyZWF0ZSBhbmQgcmV0dXJuIHRoaXMgb2JqZWN0cyBhcyBwYXJ0IG9mCi0gcGVyZm9ybWluZyB0aGVpciB2YWxpZGF0aW9uLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjVmFsaWRhdGlvblJlc3VsdCgpIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNhZGQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZSkiPmFkZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGlzIGFuIG9wdGlvbmFsIG1ldGhvZCwgdGhhdCBhIHZhbGlkYXRvciBjYW4gdXNlIHRvIHJldHVybiBlcnJvcgotIG1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJUmVzb3VyY2VbXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0RGVwZW5kc09uKCkiPmdldERlcGVuZHNPbjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIHZhbGlkYXRlZCByZXNvdXJjZSBkZXBlbmRzIG9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0TWVzc2FnZXMoKSI+Z2V0TWVzc2FnZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYW55IHZhbGlkYXRpb24gbWVzc2FnZXMgdGhhdCB3ZXJlIGFkZGVkIGJ5IHRoZSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXRNZXNzYWdlc0FzQ29weSgpIj5nZXRNZXNzYWdlc0FzQ29weTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGNvcHkgb2YgYW55IHZhbGlkYXRpb24gbWVzc2FnZXMgdGhhdCB3ZXJlIGFkZGVkIGJ5IHRoZSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0TnVtYmVyT2ZWYWxpZGF0ZWRSZXNvdXJjZXMoKSI+Z2V0TnVtYmVyT2ZWYWxpZGF0ZWRSZXNvdXJjZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRhdGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldFJlcG9ydGVyKElQcm9ncmVzc01vbml0b3IpIj5nZXRSZXBvcnRlcjwvQT48L0I+KElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFuIElSZXBvcnRlciBmb3IgaGFuZGluZyBlcnJvciBtZXNzYWdlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXRTZXZlcml0eUVycm9yKCkiPmdldFNldmVyaXR5RXJyb3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXRTZXZlcml0eUluZm8oKSI+Z2V0U2V2ZXJpdHlJbmZvPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXRTZXZlcml0eVdhcm5pbmcoKSI+Z2V0U2V2ZXJpdHlXYXJuaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVByb2plY3Q8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldFN1c3BlbmRWYWxpZGF0aW9uKCkiPmdldFN1c3BlbmRWYWxpZGF0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBwcm9qZWN0IHRoYXQgdGhlIHZhbGlkYXRvciB3b3VsZCBsaWtlIHRvIGhhdmUgc3VzcGVuZGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJUmVzb3VyY2VbXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0VmFsaWRhdGVkKCkiPmdldFZhbGlkYXRlZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb248L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldFZhbGlkYXRpb25FeGNlcHRpb24oKSI+Z2V0VmFsaWRhdGlvbkV4Y2VwdGlvbjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHRoZSB2YWxpZGF0aW9uIGVuZGVkIHdpdGggYW4gZXhjZXB0aW9uLCBhbnN3ZXIgaXQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjaW5jcmVtZW50RXJyb3IoaW50KSI+aW5jcmVtZW50RXJyb3I8L0E+PC9CPihpbnQmbmJzcDtlcnJvcnMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNpbmNyZW1lbnRJbmZvKGludCkiPmluY3JlbWVudEluZm88L0E+PC9CPihpbnQmbmJzcDtpbmZvKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SW5jcmVtZW50IHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNpbmNyZW1lbnRXYXJuaW5nKGludCkiPmluY3JlbWVudFdhcm5pbmc8L0E+PC9CPihpbnQmbmJzcDt3YXJuaW5ncyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0luY3JlbWVudCB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2lzQ2FuY2VsZWQoKSI+aXNDYW5jZWxlZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1dhcyB0aGUgb3BlcmF0aW9uIGNhbmNlbGVkIGJlZm9yZSBpdCBjb21wbGV0ZWQ/PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI21lcmdlUmVzdWx0cyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0KSI+bWVyZ2VSZXN1bHRzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+Jm5ic3A7cmVzdWx0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TWVyZ2UgdGhlIG1lc3NhZ2UgY291bnRzIGFuZCBtZXNzYWdlcyBmcm9tIGFuIGluZGl2aWR1YWwgdmFsaWRhdG9yIGludG8gdGhpcyByZXN1bHQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldENhbmNlbGVkKGJvb2xlYW4pIj5zZXRDYW5jZWxlZDwvQT48L0I+KGJvb2xlYW4mbmJzcDtjYW5jZWxlZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0luZGljYXRlIGlmIHRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNzZXREZXBlbmRzT24oSVJlc291cmNlW10pIj5zZXREZXBlbmRzT248L0E+PC9CPihJUmVzb3VyY2VbXSZuYnNwO2RlcGVuZHNPbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1VwZGF0ZSB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIHZhbGlkYXRlZCByZXNvdXJjZSBkZXBlbmRzIG9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNzZXRTZXZlcml0eUVycm9yKGludCkiPnNldFNldmVyaXR5RXJyb3I8L0E+PC9CPihpbnQmbmJzcDtzZXZlcml0eUVycm9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldFNldmVyaXR5SW5mbyhpbnQpIj5zZXRTZXZlcml0eUluZm88L0E+PC9CPihpbnQmbmJzcDtzZXZlcml0eUluZm8pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNzZXRTZXZlcml0eVdhcm5pbmcoaW50KSI+c2V0U2V2ZXJpdHlXYXJuaW5nPC9BPjwvQj4oaW50Jm5ic3A7c2V2ZXJpdHlXYXJuaW5nKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjc2V0U3VzcGVuZFZhbGlkYXRpb24oSVByb2plY3QpIj5zZXRTdXNwZW5kVmFsaWRhdGlvbjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBpbmZvcm0gdGhlIGZyYW1ld29yaywgdGhhdCB0aGlzIHZhbGlkYXRvciBkb2VzIG5vdCB3aXNoIHRvIGJlCi0gY2FsbGVkIGFnYWluIGZvciBhbnkgcmVzb3VyY2VzIGluIHRoaXMgcHJvamVjdCwgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNzZXRWYWxpZGF0ZWQoSVJlc291cmNlW10pIj5zZXRWYWxpZGF0ZWQ8L0E+PC9CPihJUmVzb3VyY2VbXSZuYnNwO3ZhbGlkYXRlZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0luZGljYXRlIHRoYXQgYWRkaXRpb25hbCByZXNvdXJjZXMgaGF2ZSBiZWVuIHZhbGlkYXRlZCBhcyBwYXJ0IG9mIHRoaXMKLSB2YWxpZGF0ZSBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldFZhbGlkYXRpb25FeGNlcHRpb24ob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uKSI+c2V0VmFsaWRhdGlvbkV4Y2VwdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbiZuYnNwO3ZhbGlkYXRpb25FeGNlcHRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJZiB0aGUgdmFsaWRhdGlvbiBmYWlsZWQgd2l0aCBhbiBleGNlcHRpb24sIGl0IGNhbiBiZSByZWNvcmRlZCBoZXJlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iVmFsaWRhdGlvblJlc3VsdCgpIj48IS0tIC0tPjwvQT48SDM+Ci1WYWxpZGF0aW9uUmVzdWx0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+VmFsaWRhdGlvblJlc3VsdDwvQj4oKTwvUFJFPgotPERMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJhZGQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWFkZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+YWRkPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPlRoaXMgaXMgYW4gb3B0aW9uYWwgbWV0aG9kLCB0aGF0IGEgdmFsaWRhdG9yIGNhbiB1c2UgdG8gcmV0dXJuIGVycm9yCi0gbWVzc2FnZXMuIFRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBjb252ZXJ0cyB0aGVzZSBpbnRvIElNYXJrZXJzLgotIDxwPgotIFRoZSBzY2VuYXJpbyB0aGF0IG1vdGl2YXRlZCB0aGlzIG1ldGhvZCwgaXMgd2hlbiBhIHZhbGlkYXRvciBpcyB1c2VkIGJvdGgKLSBmb3IgPGI+YXMgeW91IHR5cGU8L2I+IHZhbGlkYXRpb24gYW5kIDxiPmJ1aWxkPC9iPiB2YWxpZGF0aW9uLiBXaGVuCi0gY2FsbGVkIGluIGFzIHlvdSB0eXBlIG1vZGUsIHRoZSB2YWxpZGF0b3IgZG9lc24ndCB3YW50IHRvIGRpcmVjdGx5IGNyZWF0ZSBJTWFya2VycywKLSBiZWNhdXNlIHRoZSByZXNvdXJjZSBoYXNuJ3QgYmVlbiBzYXZlZCB5ZXQuIEl0IG5lZWRzIHRvIHJldHVybiBzb21ldGhpbmcKLSBvdGhlciB0aGFuIGFuIElNYXJrZXIuIEJ1dCB3aGVuIGNhbGxlZCBpbiBidWlsZCBtb2RlLCBpdCBkb2VzIHVsdGltYXRlbHkKLSB3YW50IElNYXJrZXJzLiBCeSByZXR1cm5pbmcgVmFsaWRhdG9yTWVzc2FnZXMsIGl0IG9ubHkgbmVlZHMgdG8gcmV0dXJuCi0gb25lIHR5cGUgb2YgbWVzc2FnZSwgYW5kIHRob3NlIG1lc3NhZ2VzIGNhbiBiZSBlaXRoZXIgYmUgZGlyZWN0bHkgdXNlZCBieQotIHRoZSBjYWxsZXIsIG9yIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIGludG8gSU1hcmtlcnMgYnkgdGhlIHZhbGlkYXRpb24KLSBmcmFtZXdvcmsuCi0gPC9wPgotIDxwPgotIFRvIG1ha2UgbWF0dGVycyBldmVuIG1vcmUgY29tcGxpY2F0ZWQgdGhlcmUgaXMgYSB0aGlyZCB3YXkgdG8gcmV0dXJuCi0gbWVzc2FnZXMuIFRvIG1ha2UgaXQgZWFzaWVyIGZvciBvbGQgdmFsaWRhdG9ycyB0byBwb3J0IHRvIHRoZSBuZXcKLSBmcmFtZXdvcmssIHRoZXkgY2FuIGNvbnRpbnVlIHRvIHVzZSBhbiBJUmVwb3J0ZXIuIElmIGEgdmFsaWRhdG9yIGNhbGxzCi0gdGhlIGdldFJlcG9ydGVyKCkgbWV0aG9kIHRoZW4gaXQgaXMgYXNzdW1lZCBieSB0aGUgZnJhbWV3b3JrIHRoYXQgdGhhdCBpcwotIHRoZSBhcHByb2FjaCB0aGF0IHRoZXkgaGF2ZSBjaG9zZW4uCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tZXNzYWdlPC9DT0RFPiAtIEEgdmFsaWRhdGlvbiBtZXNzYWdlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXRSZXBvcnRlcihJUHJvZ3Jlc3NNb25pdG9yKSI+PENPREU+Z2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvcik8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFJlcG9ydGVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+IDxCPmdldFJlcG9ydGVyPC9CPihJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYW4gSVJlcG9ydGVyIGZvciBoYW5kaW5nIGVycm9yIG1lc3NhZ2VzLgotIDxwPgotIFRoaXMgaXMgYSB0cmFuc2l0aW9uIG1ldGhvZCwgdG8gaGVscCBvbGQgdmFsaWRhdG9ycyBwb3J0IHRvIHRoZSBuZXcgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIElmIHRoaXMgbWV0aG9kCi0gaXMgY2FsbGVkIGl0IGlzIGFzc3VtZWQgYnkgdGhlIGZyYW1ld29yaywgdGhhdCB0aGlzIElSZXBvcnRlciB3aWxsIGJlIHVzZWQgYXMgdGhlIG9ubHkgd2F5IG9mIHBhc3NpbmcgbWVzc2FnZXMKLSBiYWNrIHRvIHRoZSBmcmFtZXdvcmsuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2FkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlKSI+PENPREU+YWRkKFZhbGlkYXRvck1lc3NhZ2UpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Im1lcmdlUmVzdWx0cyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0KSI+PCEtLSAtLT48L0E+PEgzPgotbWVyZ2VSZXN1bHRzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5tZXJnZVJlc3VsdHM8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPiZuYnNwO3Jlc3VsdCk8L1BSRT4KLTxETD4KLTxERD5NZXJnZSB0aGUgbWVzc2FnZSBjb3VudHMgYW5kIG1lc3NhZ2VzIGZyb20gYW4gaW5kaXZpZHVhbCB2YWxpZGF0b3IgaW50byB0aGlzIHJlc3VsdC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzdWx0PC9DT0RFPiAtIGl0IGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGl0IGlzIGlnbm9yZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXREZXBlbmRzT24oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVwZW5kc09uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVJlc291cmNlW10gPEI+Z2V0RGVwZW5kc09uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgdmFsaWRhdGVkIHJlc291cmNlIGRlcGVuZHMgb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE1lc3NhZ2VzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE1lc3NhZ2VzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+W10gPEI+Z2V0TWVzc2FnZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYW55IHZhbGlkYXRpb24gbWVzc2FnZXMgdGhhdCB3ZXJlIGFkZGVkIGJ5IHRoZSB2YWxpZGF0b3IuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gYXJyYXkgaXMgcmV0dXJuZWQgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRNZXNzYWdlc0FzQ29weSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNZXNzYWdlc0FzQ29weTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPltdIDxCPmdldE1lc3NhZ2VzQXNDb3B5PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGEgY29weSBvZiBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRvci4gVGhlIGFycmF5IGlzIGEgbmV3Ci0gYXJyYXksIGFuZCBlYWNoIG1lc3NhZ2UgaXMgYSBjb3B5LgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIGFycmF5IGlzIHJldHVybmVkIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIG1lc3NhZ2VzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0RGVwZW5kc09uKElSZXNvdXJjZVtdKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0RGVwZW5kc09uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXREZXBlbmRzT248L0I+KElSZXNvdXJjZVtdJm5ic3A7ZGVwZW5kc09uKTwvUFJFPgotPERMPgotPEREPlVwZGF0ZSB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIHZhbGlkYXRlZCByZXNvdXJjZSBkZXBlbmRzIG9uLiBUaGlzIGNhbiBiZQotIGxlZnQgbnVsbC4gRm9yIGV4YW1wbGUsIGEgWE1MIGZpbGUgbWF5IGRlcGVuZCBvbiBhIFhTRCBmaWxlIGluIG9yZGVyIHRvCi0ga25vdyBpZiBpdCBpcyB2YWxpZCBvciBub3QuIEl0IHdvdWxkIHBhc3MgYmFjayB0aGF0IFhTRCBmaWxlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5kZXBlbmRzT248L0NPREU+IC0gSWYgdGhpcyBpcyBudWxsIHRoZW4gdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgbm90IHVwZGF0ZWQuIFRvCi0gICAgICAgICAgICAgICAgcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLCBhbiBlbXB0eSBhcnJheSBuZWVkcyB0byBiZQotICAgICAgICAgICAgICAgIHN1cHBsaWVkLiBBIG5vbiBudWxsIHBhcmFtZXRlciwgPGI+cmVwbGFjZXM8L2I+IGFsbCB0aGUgZGVwZW5kZW5jeQotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciB0aGlzIHJlc291cmNlLCBmb3IgdGhpcyB2YWxpZGF0b3IuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0ZWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVJlc291cmNlW10gPEI+Z2V0VmFsaWRhdGVkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPkFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgd2VyZSB2YWxpZGF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZgotICAgICAgICB2YWxpZGF0aW5nIHRoZSBtYWluIHJlc291cmNlLCBvciBudWxsIGlmIG5vbmUgd2VyZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFZhbGlkYXRlZChJUmVzb3VyY2VbXSkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFZhbGlkYXRlZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0VmFsaWRhdGVkPC9CPihJUmVzb3VyY2VbXSZuYnNwO3ZhbGlkYXRlZCk8L1BSRT4KLTxETD4KLTxERD5JbmRpY2F0ZSB0aGF0IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYXMgcGFydCBvZiB0aGlzCi0gdmFsaWRhdGUgb3BlcmF0aW9uLiBTb21ldGltZXMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIGEgdmFsaWRhdGlvbiBvbgotIG9uZSByZXNvdXJjZSBpdCBpcyBuZWNlc3NhcnkgdG8gdmFsaWRhdGUgb3RoZXIgcmVzb3VyY2VzIGFzIHdlbGwuIFRoaXMKLSBtZXRob2QgaXMgdXNlZCB0byBsZXQgdGhlIGZyYW1ld29yayBrbm93IGFib3V0IHRoZXNlIGFkZGl0aW9uYWwgdmFsaWRhdGVkCi0gcmVzb3VyY2VzLCB0byBwb3NzaWJseSBzYXZlIHRoZW0gYmVpbmcgdmFsaWRhdGVkIHJlZHVuZGFudGx5LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWxpZGF0ZWQ8L0NPREU+IC0gQW55IGFkZGl0aW9uYWwgcmVzb3VyY2VzIHRoYXQgd2VyZSB2YWxpZGF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTZXZlcml0eUVycm9yKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNldmVyaXR5RXJyb3I8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0U2V2ZXJpdHlFcnJvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTZXZlcml0eUVycm9yKGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFNldmVyaXR5RXJyb3I8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldFNldmVyaXR5RXJyb3I8L0I+KGludCZuYnNwO3NldmVyaXR5RXJyb3IpPC9QUkU+Ci08REw+Ci08REQ+U2V0IHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0gPHA+Ci0gTWVzc2FnZXMgYWRkZWQgdGhyb3VnaCB0aGUgYWRkKFZhbGlkYXRpb25NZXNzYWdlKSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBoZXJlLCBhcyB0aGlzCi0gaW5mb3JtYXRpb24gd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIFZhbGlkYXRpb25NZXNzYWdlLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaW5jcmVtZW50RXJyb3IoaW50KSI+PCEtLSAtLT48L0E+PEgzPgotaW5jcmVtZW50RXJyb3I8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+aW5jcmVtZW50RXJyb3I8L0I+KGludCZuYnNwO2Vycm9ycyk8L1BSRT4KLTxETD4KLTxERD5JbmNyZW1lbnQgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLSA8cD4KLSBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBjdXJyZW50IG51bWJlciBvZiBlcnJvcnMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTZXZlcml0eVdhcm5pbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2V2ZXJpdHlXYXJuaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldFNldmVyaXR5V2FybmluZzwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNldmVyaXR5V2FybmluZyhpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRTZXZlcml0eVdhcm5pbmc8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldFNldmVyaXR5V2FybmluZzwvQj4oaW50Jm5ic3A7c2V2ZXJpdHlXYXJuaW5nKTwvUFJFPgotPERMPgotPEREPlNldCB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0gPHA+Ci0gTWVzc2FnZXMgYWRkZWQgdGhyb3VnaCB0aGUgYWRkKFZhbGlkYXRpb25NZXNzYWdlKSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBoZXJlLCBhcyB0aGlzCi0gaW5mb3JtYXRpb24gd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIFZhbGlkYXRpb25NZXNzYWdlLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaW5jcmVtZW50V2FybmluZyhpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1pbmNyZW1lbnRXYXJuaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmluY3JlbWVudFdhcm5pbmc8L0I+KGludCZuYnNwO3dhcm5pbmdzKTwvUFJFPgotPERMPgotPEREPkluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0gPHA+Ci0gTWVzc2FnZXMgYWRkZWQgdGhyb3VnaCB0aGUgYWRkKFZhbGlkYXRpb25NZXNzYWdlKSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBoZXJlLCBhcyB0aGlzCi0gaW5mb3JtYXRpb24gd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIFZhbGlkYXRpb25NZXNzYWdlLgotIDwvcD4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgY3VycmVudCBudW1iZXIgb2Ygd2FybmluZ3MuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTZXZlcml0eUluZm8oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2V2ZXJpdHlJbmZvPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldFNldmVyaXR5SW5mbzwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgbnVtYmVyIG9mIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNldmVyaXR5SW5mbyhpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRTZXZlcml0eUluZm88L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldFNldmVyaXR5SW5mbzwvQj4oaW50Jm5ic3A7c2V2ZXJpdHlJbmZvKTwvUFJFPgotPERMPgotPEREPlNldCB0aGUgbnVtYmVyIG9mIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0gPHA+Ci0gTWVzc2FnZXMgYWRkZWQgdGhyb3VnaCB0aGUgYWRkKFZhbGlkYXRpb25NZXNzYWdlKSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBoZXJlLCBhcyB0aGlzCi0gaW5mb3JtYXRpb24gd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIFZhbGlkYXRpb25NZXNzYWdlLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaW5jcmVtZW50SW5mbyhpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1pbmNyZW1lbnRJbmZvPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmluY3JlbWVudEluZm88L0I+KGludCZuYnNwO2luZm8pPC9QUkU+Ci08REw+Ci08REQ+SW5jcmVtZW50IHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLSA8cD4KLSBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBjdXJyZW50IG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0NhbmNlbGVkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQ2FuY2VsZWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmlzQ2FuY2VsZWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5XYXMgdGhlIG9wZXJhdGlvbiBjYW5jZWxlZCBiZWZvcmUgaXQgY29tcGxldGVkPyBGb3IgZXhhbXBsZSBpZiB0aGUgdmFsaWRhdGlvbiBpcyBiZWluZyBydW4gdGhyb3VnaCB0aGUKLSB1c2VyIGludGVyZmFjZSwgdGhlIGVuZCB1c2VyIGNhbiBjYW5jZWwgdGhlIG9wZXJhdGlvbiB0aHJvdWdoIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldENhbmNlbGVkKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRDYW5jZWxlZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0Q2FuY2VsZWQ8L0I+KGJvb2xlYW4mbmJzcDtjYW5jZWxlZCk8L1BSRT4KLTxETD4KLTxERD5JbmRpY2F0ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+Y2FuY2VsZWQ8L0NPREU+IC0gU2V0IHRvIHRydWUgaWYgaXQgd2FzIGNhbmNlbGVkIGFuZCBmYWxzZSBpZiBpdCB3YXMgbm90IGNhbmNlbGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TnVtYmVyT2ZWYWxpZGF0ZWRSZXNvdXJjZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TnVtYmVyT2ZWYWxpZGF0ZWRSZXNvdXJjZXM8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0TnVtYmVyT2ZWYWxpZGF0ZWRSZXNvdXJjZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRhdGVkLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0aW9uRXhjZXB0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRpb25FeGNlcHRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb24gPEI+Z2V0VmFsaWRhdGlvbkV4Y2VwdGlvbjwvQj4oKTwvUFJFPgotPERMPgotPEREPklmIHRoZSB2YWxpZGF0aW9uIGVuZGVkIHdpdGggYW4gZXhjZXB0aW9uLCBhbnN3ZXIgaXQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+bnVsbCBpZiB0aGUgdmFsaWRhdG9yIGRpZCBub3QgZmluaXNoIHdpdGggYW4gZXhjZXB0aW9uLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0VmFsaWRhdGlvbkV4Y2VwdGlvbihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb24pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRWYWxpZGF0aW9uRXhjZXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRWYWxpZGF0aW9uRXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb24mbmJzcDt2YWxpZGF0aW9uRXhjZXB0aW9uKTwvUFJFPgotPERMPgotPEREPklmIHRoZSB2YWxpZGF0aW9uIGZhaWxlZCB3aXRoIGFuIGV4Y2VwdGlvbiwgaXQgY2FuIGJlIHJlY29yZGVkIGhlcmUuCi0gPHA+Ci0gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgZm9yIG9sZCB2YWxpZGF0b3JzIHRvIGVhc2UgdGhlaXIgdHJhbnNpdGlvbiB0byB0aGUgbmV3IGZyYW1ld29yay4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRpb25FeGNlcHRpb248L0NPREU+IC0gPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTdXNwZW5kVmFsaWRhdGlvbigpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTdXNwZW5kVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIElQcm9qZWN0IDxCPmdldFN1c3BlbmRWYWxpZGF0aW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBwcm9qZWN0IHRoYXQgdGhlIHZhbGlkYXRvciB3b3VsZCBsaWtlIHRvIGhhdmUgc3VzcGVuZGVkLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBwcm9qZWN0IHRvIHN1c3BlbmQgb3IgbnVsbC4gVGhlIG5vcm1hbCByZXN1bHQgaXMgbnVsbCwgd2hpY2ggbWVhbnMgdGhhdAotIHRoZSB2YWxpZGF0b3Igd2lzaGVzIHRvIHJlY2VpdmUgbm9ybWFsIHZhbGlkYXRpb24gcmVxdWVzdHMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFN1c3BlbmRWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRTdXNwZW5kVmFsaWRhdGlvbjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvUFJFPgotPERMPgotPEREPkNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBpbmZvcm0gdGhlIGZyYW1ld29yaywgdGhhdCB0aGlzIHZhbGlkYXRvciBkb2VzIG5vdCB3aXNoIHRvIGJlCi0gY2FsbGVkIGFnYWluIGZvciBhbnkgcmVzb3VyY2VzIGluIHRoaXMgcHJvamVjdCwgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotIDxwPgotIFNvbWUgdmFsaWRhdG9ycyBtYXkgaGF2ZSBhIHJpY2ggc2V0IG9mIHRyaWdnZXJzLCBidXQgb25jZSB0aGV5IGhhdmUgYmVlbiBpbnZva2VkIG9uY2UsCi0gZG8gbm90IG5lZWQgdG8gYmUgaW52b2tlZCBhZ2FpbiBkdXJpbmcgdGhlIGNvdXJzZSBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IHRoaXMgdmFsaWRhdG9yIG5vIGxvbmdlciB3YW50cyB0byBiZSBub3RpZmllZCBvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3MTk3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRpb25SZXN1bHRzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVmFsaWRhdGlvblJlc3VsdHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIFZhbGlkYXRpb25SZXN1bHRzPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0czwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGZpbmFsIGNsYXNzIDxCPlZhbGlkYXRpb25SZXN1bHRzPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhlIGNvbWJpbmVkIHJlc3VsdHMgb2YgdmFsaWRhdGluZyBtdWx0aXBsZSByZXNvdXJjZXMuCi0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwjVmFsaWRhdGlvblJlc3VsdHMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdCkiPlZhbGlkYXRpb25SZXN1bHRzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+Jm5ic3A7cmVzdWx0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sI2dldE1lc3NhZ2VzKCkiPmdldE1lc3NhZ2VzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFueSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRoYXQgd2VyZSBhZGRlZCBieSB0aGUgdmFsaWRhdGlvbiBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sI2dldFNldmVyaXR5RXJyb3IoKSI+Z2V0U2V2ZXJpdHlFcnJvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCNnZXRTZXZlcml0eUluZm8oKSI+Z2V0U2V2ZXJpdHlJbmZvPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwjZ2V0U2V2ZXJpdHlXYXJuaW5nKCkiPmdldFNldmVyaXR5V2FybmluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJWYWxpZGF0aW9uUmVzdWx0cyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0KSI+PCEtLSAtLT48L0E+PEgzPgotVmFsaWRhdGlvblJlc3VsdHM8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5WYWxpZGF0aW9uUmVzdWx0czwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+Jm5ic3A7cmVzdWx0KTwvUFJFPgotPERMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRNZXNzYWdlcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNZXNzYWdlczwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPltdIDxCPmdldE1lc3NhZ2VzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGFueSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRoYXQgd2VyZSBhZGRlZCBieSB0aGUgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gYXJyYXkgaXMgcmV0dXJuZWQgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTZXZlcml0eUVycm9yKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNldmVyaXR5RXJyb3I8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0U2V2ZXJpdHlFcnJvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTZXZlcml0eUluZm8oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2V2ZXJpdHlJbmZvPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldFNldmVyaXR5SW5mbzwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgbnVtYmVyIG9mIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNldmVyaXR5V2FybmluZygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTZXZlcml0eVdhcm5pbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0U2V2ZXJpdHlXYXJuaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdGlvblJlc3VsdHMuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhNDAwNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1WYWxpZGF0aW9uU3RhdGUKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJWYWxpZGF0aW9uU3RhdGUiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25TdGF0ZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25TdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0aW9uU3RhdGU8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGZpbmFsIGNsYXNzIDxCPlZhbGlkYXRpb25TdGF0ZTwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLUtlZXAgdHJhY2sgb2YgYXJiaXRyYXJ5IHZhbGlkYXRpb24gZGF0YSwgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSB2YWxpZGF0aW9uLgotIDxwPgotIFRvIGVuYWJsZSBtb3JlIGVmZmljaWVudCBjYWNoaW5nLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIGFsbG93cyBpbmRpdmlkdWFsIHZhbGlkYXRvcnMgdG8gY2FjaGUKLSBhcmJpdHJhcnkgZGF0YSBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcHJvY2Vzcy4gVXNlIG9mIHRoaXMgb2JqZWN0IGlzIGNvbXBsZXRlbHkgb3B0aW9uYWwuCi0gPHA+Ci0gU2luY2Ugc29tZSB2YWxpZGF0b3JzIHdpc2ggdG8gc2hhcmUgZGF0YSB3aXRoIG90aGVyIHZhbGlkYXRvcnMsIGFueSB2YWxpZGF0b3IgY2FuIHNlZSB0aGUgc3RhdGUgZGF0YSBmb3IKLSBhbnkgb3RoZXIgdmFsaWRhdG9yLCBzaW5jZSB0aGUgaWQgaXMgc2ltcGx5IHRoZSB2YWxpZGF0b3IncyBleHRlbnNpb24gaWQuCi0gPHA+Ci0gVGhpcyBvYmplY3QgaXMgZnJlZWQgYXQgdGhlIGVuZCBvZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sI1RyaWdnZXJSZXNvdXJjZSI+VHJpZ2dlclJlc291cmNlPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxCPkRlcHJlY2F0ZWQuPC9CPiZuYnNwOzxJPlRoaXMgYXBwcm9hY2ggaXMgbm90IHRocmVhZCBzYWZlLCB0aGUgbG9uZ2VyIGZvcm0gb2YgdGhlIEFic3RyYWN0VmFsaWRhdG9yIHZhbGlkYXRlIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLjwvST48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwjVmFsaWRhdGlvblN0YXRlKCkiPlZhbGlkYXRpb25TdGF0ZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLk9iamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCNnZXQoamF2YS5sYW5nLlN0cmluZykiPmdldDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgc3RhdGUgZGF0YSBmb3IgdGhlIGdpdmVuIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCNwdXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPnB1dDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTYXZlIHNvbWUgc3RhdGUgaW5mb3JtYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJUcmlnZ2VyUmVzb3VyY2UiPjwhLS0gLS0+PC9BPjxIMz4KLVRyaWdnZXJSZXNvdXJjZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIDxCPlRyaWdnZXJSZXNvdXJjZTwvQj48L1BSRT4KLTxETD4KLTxERD48Qj5EZXByZWNhdGVkLjwvQj4mbmJzcDs8ST5UaGlzIGFwcHJvYWNoIGlzIG5vdCB0aHJlYWQgc2FmZSwgdGhlIGxvbmdlciBmb3JtIG9mIHRoZSBBYnN0cmFjdFZhbGlkYXRvciB2YWxpZGF0ZSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC48L0k+PEREPlRoaXMgaXMgYSBzcGVjaWFsIGlkLgotIDxwPgotIElmIGEgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlZCBvbiBieSBvdGhlcnMgaXMgY2hhbmdlZCwgdGhlbiB0aGUKLSBkZXBlbmRlbnQgcmVzb3VyY2VzIGFyZSB2YWxpZGF0ZWQuIFRoZSBkZXBlbmRlZCBvbiByZXNvdXJjZSwgd2hpY2ggaXMgdGhlCi0gcmVzb3VyY2UgdGhhdCBhY3R1YWxseSBjaGFuZ2VkLCBpcyBwbGFjZWQgaW50byB0aGUgVmFsaWRhdGlvblN0YXRlIHVzaW5nCi0gdGhpcyBpZC4KLSA8L3A+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxDT0RFPkFic3RyYWN0VmFsaWRhdG9yI3ZhbGlkYXRlKFZhbGlkYXRpb25FdmVudCwgVmFsaWRhdGlvblN0YXRlLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcik8L0NPREU+PC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IlZhbGlkYXRpb25TdGF0ZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1WYWxpZGF0aW9uU3RhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5WYWxpZGF0aW9uU3RhdGU8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0icHV0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1wdXQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnB1dDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkLAotICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5TYXZlIHNvbWUgc3RhdGUgaW5mb3JtYXRpb24uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmlkPC9DT0RFPiAtIEJ5IGNvbnZlbnRpb24gdGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhbGlkYXRvciBleHRlbnNpb24gaWQuCi0gICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLkhUTUxWYWxpZGF0b3I8REQ+PENPREU+dmFsdWU8L0NPREU+IC0gQW55IGFyYml0cmFyeSBkYXRhIHRoYXQgdGhlIHZhbGlkYXRvciBtaWdodCBmaW5kIHVzZWZ1bC4gVGhlCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZG9lc24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgb2JqZWN0IGV4Y2VwdAotICAgICAgICAgICAgICAgIHBhc3MgaXQgYWxvbmcgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXQoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5PYmplY3QgPEI+Z2V0PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBzdGF0ZSBkYXRhIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdG9yLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5pZDwvQ09ERT4gLSBCeSBjb252ZW50aW9uIHRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICAgaWQuIEZvciBleGFtcGxlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLkhUTUxWYWxpZGF0b3IKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW55IGFyYml0cmFyeSBkYXRhIHRoYXQgdGhlIHZhbGlkYXRvciBtaWdodCBmaW5kIHVzZWZ1bCwKLSAgICAgICAgaW5jbHVkaW5nIG51bGwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0aW9uU3RhdGUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NWIwMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1WYWxpZGF0b3IuTGV2ZWwKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJWYWxpZGF0b3IuTGV2ZWwiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvci5MZXZlbC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfc3VtbWFyeSI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9kZXRhaWwiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1FbnVtIFZhbGlkYXRvci5MZXZlbDwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+amF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+Jmd0OwotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbDwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4mZ3Q7PC9ERD4KLTwvREw+Ci08REw+Ci08RFQ+PEI+RW5jbG9zaW5nIGNsYXNzOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIHN0YXRpYyBlbnVtIDxCPlZhbGlkYXRvci5MZXZlbDwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4mZ3Q7PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoZSBsZXZlbCBvZiBjb25maWd1cmF0aW9uIGZvciB0aGUgdmFsaWRhdG9yLgotIDx1bD4KLSA8bGk+RXh0ZW5zaW9uIC0gRGVmaW5lZCBieSBhbiBleHRlbnNpb24gcG9pbnQuPC9saT4KLSA8bGk+R2xvYmFsIC0gRGVmaW5lZCBieSBhIGdsb2JhbCBwcmVmZXJlbmNlLjwvbGk+Ci0gPGxpPlByb2plY3QgLSBEZWZpbmVkIGJ5IGEgcHJvamVjdCBwcm9wZXJ0eS48L2xpPgotIDwvdWw+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PT09PSBFTlVNIENPTlNUQU5UIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImVudW1fY29uc3RhbnRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkVudW0gQ29uc3RhbnQgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCNFeHRlbnNpb24iPkV4dGVuc2lvbjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sI0dsb2JhbCI+R2xvYmFsPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwjUHJvamVjdCI+UHJvamVjdDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj52YWx1ZU9mPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwjdmFsdWVzKCkiPnZhbHVlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLkVudW0iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5FbnVtPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y29tcGFyZVRvLCBlcXVhbHMsIGdldERlY2xhcmluZ0NsYXNzLCBoYXNoQ29kZSwgbmFtZSwgb3JkaW5hbCwgdG9TdHJpbmcsIHZhbHVlT2Y8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Z2V0Q2xhc3MsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJlbnVtX2NvbnN0YW50X2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkVudW0gQ29uc3RhbnQgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkV4dGVuc2lvbiI+PCEtLSAtLT48L0E+PEgzPgotRXh0ZW5zaW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPiA8Qj5FeHRlbnNpb248L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iR2xvYmFsIj48IS0tIC0tPjwvQT48SDM+Ci1HbG9iYWw8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+IDxCPkdsb2JhbDwvQj48L1BSRT4KLTxETD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJQcm9qZWN0Ij48IS0tIC0tPjwvQT48SDM+Ci1Qcm9qZWN0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPiA8Qj5Qcm9qZWN0PC9CPjwvUFJFPgotPERMPgotPERMPgotPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0idmFsdWVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbHVlczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT5bXSA8Qj52YWx1ZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC4gIFRoaXMgbWV0aG9kIG1heSBiZSB1c2VkIHRvIGl0ZXJhdGUKLW92ZXIgdGhlIGNvbnN0YW50cyBhcyBmb2xsb3dzOgotPHByZT4KLWZvciAoVmFsaWRhdG9yLkxldmVsIGMgOiBWYWxpZGF0b3IuTGV2ZWwudmFsdWVzKCkpCi0mbmJzcDsgICBTeXN0ZW0ub3V0LnByaW50bG4oYyk7Ci08L3ByZT4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbHVlT2Y8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+IDxCPnZhbHVlT2Y8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotVGhlIHN0cmluZyBtdXN0IG1hdGNoIDxJPmV4YWN0bHk8L0k+IGFuIGlkZW50aWZpZXIgdXNlZCB0byBkZWNsYXJlIGFuCi1lbnVtIGNvbnN0YW50IGluIHRoaXMgdHlwZS4gIChFeHRyYW5lb3VzIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUgCi1ub3QgcGVybWl0dGVkLikKLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bmFtZTwvQ09ERT4gLSB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudCB0byBiZSByZXR1cm5lZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGVudW0gY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPmphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L0NPREU+IC0gaWYgdGhpcyBlbnVtIHR5cGUgaGFzIG5vIGNvbnN0YW50Ci13aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotPEREPjxDT0RFPmphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdG9yLkxldmVsLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1YzgzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVmFsaWRhdG9yLlYxLlYxQ29weQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRvci5WMS5WMUNvcHkiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDs8QSBIUkVGPSIjbmVzdGVkX2NsYXNzZXNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxIj5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIFZhbGlkYXRvci5WMS5WMUNvcHk8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjwvQT4KLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjE8L0E+Ci0gICAgICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMS5WMUNvcHk8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jmd0OzwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBjbGFzczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgPEI+VmFsaWRhdG9yLlYxLlYxQ29weTwvQj48RFQ+ZXh0ZW5kcyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9ETD4KLTwvUFJFPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09IE5FU1RFRCBDTEFTUyBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJuZXN0ZWRfY2xhc3Nlc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjEiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5OZXN0ZWQgY2xhc3Nlcy9pbnRlcmZhY2VzIGluaGVyaXRlZCBmcm9tIGNsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxLlYxQ29weTwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08QSBOQU1FPSJuZXN0ZWRfY2xhc3Nlc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5OZXN0ZWQgY2xhc3Nlcy9pbnRlcmZhY2VzIGluaGVyaXRlZCBmcm9tIGNsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sI1ZhbGlkYXRvci5WMS5WMUNvcHkoVmFsaWRhdG9yTWV0YURhdGEsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBJUHJvamVjdCkiPlZhbGlkYXRvci5WMS5WMUNvcHk8L0E+PC9CPihWYWxpZGF0b3JNZXRhRGF0YSZuYnNwO3ZtZCwKLSAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24mbmJzcDt2YywKLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCNzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPnNldEJ1aWxkVmFsaWRhdGlvbjwvQT48L0I+KGJvb2xlYW4mbmJzcDtib29sKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBieSB0aGUgYnVpbGQgcHJvY2Vzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwjc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuKSI+c2V0TWFudWFsVmFsaWRhdGlvbjwvQT48L0I+KGJvb2xlYW4mbmJzcDtib29sKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBhcyBwYXJ0IG9mIGEgbWFudWFsIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjEiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNhc0lWYWxpZGF0b3IoKSI+YXNJVmFsaWRhdG9yPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjYXNWMVZhbGlkYXRvcigpIj5hc1YxVmFsaWRhdG9yPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjY29weShib29sZWFuKSI+Y29weTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI2dldElkKCkiPmdldElkPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPmdldFZhbGlkYXRvckNsYXNzbmFtZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI2dldFZtZCgpIj5nZXRWbWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNWMlZhbGlkYXRvcigpIj5hc1YyVmFsaWRhdG9yPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYnVtcENoYW5nZUNvdW50R2xvYmFsKCkiPmJ1bXBDaGFuZ2VDb3VudEdsb2JhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2J1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzKCkiPmJ1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY2xlYW4oSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPmNsZWFuPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29tcGFyZVRvKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmNvbXBhcmVUbzwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvcHkoKSI+Y29weTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NyZWF0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIElQcm9qZWN0KSI+Y3JlYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY3JlYXRlKFZhbGlkYXRvck1ldGFEYXRhLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiwgSVByb2plY3QpIj5jcmVhdGU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRDaGFuZ2VDb3VudEdsb2JhbCgpIj5nZXRDaGFuZ2VDb3VudEdsb2JhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldENoYW5nZUNvdW50TWVzc2FnZXMoKSI+Z2V0Q2hhbmdlQ291bnRNZXNzYWdlczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldERlbGVnYXRpbmdJZCgpIj5nZXREZWxlZ2F0aW5nSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNYXJrZXJJZCgpIj5nZXRNYXJrZXJJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykiPmdldE1lc3NhZ2U8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNZXNzYWdlU2V0dGluZ3MoKSI+Z2V0TWVzc2FnZVNldHRpbmdzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0UHJvamVjdCgpIj5nZXRQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0U291cmNlSWQoKSI+Z2V0U291cmNlSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRWZXJzaW9uKCkiPmdldFZlcnNpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNHbG9iYWxDaGFuZ2VzKCkiPmhhc0dsb2JhbENoYW5nZXM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNoQ29kZUZvckNvbmZpZygpIj5oYXNoQ29kZUZvckNvbmZpZzwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzQnVpbGRWYWxpZGF0aW9uKCkiPmlzQnVpbGRWYWxpZGF0aW9uPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaXNDaGFuZ2VkKCkiPmlzQ2hhbmdlZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzTWFudWFsVmFsaWRhdGlvbigpIj5pc01hbnVhbFZhbGlkYXRpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNyZXNldENoYW5nZUNvdW50ZXJzKCkiPnJlc2V0Q2hhbmdlQ291bnRlcnM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzYW1lQ29uZmlnKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPnNhbWVDb25maWc8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXREZWxlZ2F0aW5nSWQoamF2YS5sYW5nLlN0cmluZykiPnNldERlbGVnYXRpbmdJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldE1hcmtlcklkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRNYXJrZXJJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldFNvdXJjZUlkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRTb3VyY2VJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldFZlcnNpb24oaW50KSI+c2V0VmVyc2lvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj5zaG91bGRDbGVhck1hcmtlcnM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj5zaG91bGRWYWxpZGF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSkiPnNob3VsZFZhbGlkYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBib29sZWFuLCBib29sZWFuKSI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlKSI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdG9TdHJpbmcoKSI+dG9TdHJpbmc8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj52YWxpZGF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25TdGFydGluZzwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IlZhbGlkYXRvci5WMS5WMUNvcHkoVmFsaWRhdG9yTWV0YURhdGEsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBJUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRvci5WMS5WMUNvcHk8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9CPihWYWxpZGF0b3JNZXRhRGF0YSZuYnNwO3ZtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25Db25maWd1cmF0aW9uJm5ic3A7dmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InNldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE1hbnVhbFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNldE1hbnVhbFZhbGlkYXRpb248L0I+KGJvb2xlYW4mbmJzcDtib29sKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4pIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlNldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYXMgcGFydCBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI3NldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPnNldE1hbnVhbFZhbGlkYXRpb248L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSBzZXR0aW5nIGNoYW5nZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEJ1aWxkVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2V0QnVpbGRWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7Ym9vbCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlNldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj5zZXRCdWlsZFZhbGlkYXRpb248L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSBzZXR0aW5nIGNoYW5nZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc2VzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWRmMDNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRvci5WMQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRvci5WMSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdG9yLlYxLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5WMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0b3IuVjE8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjwvQT4KLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjE8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jmd0OzwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkRpcmVjdCBLbm93biBTdWJjbGFzc2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9BPjwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBjbGFzczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBzdGF0aWMgY2xhc3MgPEI+VmFsaWRhdG9yLlYxPC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotQSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibmVzdGVkX2NsYXNzX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im5lc3RlZF9jbGFzc2VzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk5lc3RlZCBjbGFzc2VzL2ludGVyZmFjZXMgaW5oZXJpdGVkIGZyb20gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNWYWxpZGF0b3IuVjEoVmFsaWRhdG9yTWV0YURhdGEsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBJUHJvamVjdCkiPlZhbGlkYXRvci5WMTwvQT48L0I+KFZhbGlkYXRvck1ldGFEYXRhJm5ic3A7dm1kLAotICAgICAgICAgICAgIFZhbGlkYXRpb25Db25maWd1cmF0aW9uJm5ic3A7Y29uZmlnLAotICAgICAgICAgICAgIElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZSBhIG5ldyB2ZXJzaW9uIDEgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI2FzVjFWYWxpZGF0b3IoKSI+YXNWMVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHlvdSBhcmUgYSB2ZXJzaW9uIDEgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjY29weShib29sZWFuKSI+Y29weTwvQT48L0I+KGJvb2xlYW4mbmJzcDtpbmNsdWRlQ2hhbmdlQ291bnRzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNnZXROYW1lKCkiPmdldE5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7VmFsaWRhdG9yTWV0YURhdGE8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjZ2V0Vm1kKCkiPmdldFZtZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI3NldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuKSI+c2V0QnVpbGRWYWxpZGF0aW9uPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2J1aWxkVmFsaWRhdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuKSI+c2V0TWFudWFsVmFsaWRhdGlvbjwvQT48L0I+KGJvb2xlYW4mbmJzcDttYW51YWxWYWxpZGF0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBhcyBwYXJ0IG9mIGEgbWFudWFsIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2FzVjJWYWxpZGF0b3IoKSI+YXNWMlZhbGlkYXRvcjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2J1bXBDaGFuZ2VDb3VudEdsb2JhbCgpIj5idW1wQ2hhbmdlQ291bnRHbG9iYWw8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNidW1wQ2hhbmdlQ291bnRNZXNzYWdlcygpIj5idW1wQ2hhbmdlQ291bnRNZXNzYWdlczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj5jbGVhbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvbXBhcmVUbyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5jb21wYXJlVG88L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjb3B5KCkiPmNvcHk8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjcmVhdGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBJUHJvamVjdCkiPmNyZWF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NyZWF0ZShWYWxpZGF0b3JNZXRhRGF0YSwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24sIElQcm9qZWN0KSI+Y3JlYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0Q2hhbmdlQ291bnRHbG9iYWwoKSI+Z2V0Q2hhbmdlQ291bnRHbG9iYWw8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRDaGFuZ2VDb3VudE1lc3NhZ2VzKCkiPmdldENoYW5nZUNvdW50TWVzc2FnZXM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXREZWxlZ2F0aW5nSWQoKSI+Z2V0RGVsZWdhdGluZ0lkPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0TWFya2VySWQoKSI+Z2V0TWFya2VySWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNZXNzYWdlKGphdmEubGFuZy5TdHJpbmcpIj5nZXRNZXNzYWdlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0TWVzc2FnZVNldHRpbmdzKCkiPmdldE1lc3NhZ2VTZXR0aW5nczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldFByb2plY3QoKSI+Z2V0UHJvamVjdDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldFNvdXJjZUlkKCkiPmdldFNvdXJjZUlkPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0VmVyc2lvbigpIj5nZXRWZXJzaW9uPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaGFzR2xvYmFsQ2hhbmdlcygpIj5oYXNHbG9iYWxDaGFuZ2VzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaGFzaENvZGVGb3JDb25maWcoKSI+aGFzaENvZGVGb3JDb25maWc8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0J1aWxkVmFsaWRhdGlvbigpIj5pc0J1aWxkVmFsaWRhdGlvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzQ2hhbmdlZCgpIj5pc0NoYW5nZWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc01hbnVhbFZhbGlkYXRpb24oKSI+aXNNYW51YWxWYWxpZGF0aW9uPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjcmVzZXRDaGFuZ2VDb3VudGVycygpIj5yZXNldENoYW5nZUNvdW50ZXJzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2FtZUNvbmZpZyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5zYW1lQ29uZmlnPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0RGVsZWdhdGluZ0lkKGphdmEubGFuZy5TdHJpbmcpIj5zZXREZWxlZ2F0aW5nSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRNYXJrZXJJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TWFya2VySWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRTb3VyY2VJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0U291cmNlSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRWZXJzaW9uKGludCkiPnNldFZlcnNpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlLCBib29sZWFuLCBib29sZWFuKSI+c2hvdWxkVmFsaWRhdGU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUpIj5zaG91bGRWYWxpZGF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlUHJvamVjdChJUHJvamVjdCwgYm9vbGVhbiwgYm9vbGVhbikiPnNob3VsZFZhbGlkYXRlUHJvamVjdDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlUHJvamVjdChJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSkiPnNob3VsZFZhbGlkYXRlUHJvamVjdDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3RvU3RyaW5nKCkiPnRvU3RyaW5nPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+dmFsaWRhdGU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uRmluaXNoaW5nPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uU3RhcnRpbmc8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJWYWxpZGF0b3IuVjEoVmFsaWRhdG9yTWV0YURhdGEsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBJUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRvci5WMTwvSDM+Ci08UFJFPgotcHVibGljIDxCPlZhbGlkYXRvci5WMTwvQj4oVmFsaWRhdG9yTWV0YURhdGEmbmJzcDt2bWQsCi0gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25Db25maWd1cmF0aW9uJm5ic3A7Y29uZmlnLAotICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlIGEgbmV3IHZlcnNpb24gMSB2YWxpZGF0b3IuCi08UD4KLTxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dm1kPC9DT0RFPiAtIDxERD48Q09ERT5jb25maWc8L0NPREU+IC0gdGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZ2xvYmFsIGVuYWJsZW1lbnQgb3B0aW9ucy4gSW4gc29tZSBjYXNlIHRoaXMgY2FuIGJlIG51bGwuPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iYXNJVmFsaWRhdG9yKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFzSVZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+IDxCPmFzSVZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc0lWYWxpZGF0b3IoKSI+YXNJVmFsaWRhdG9yPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzVjFWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotYXNWMVZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT4gPEI+YXNWMVZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YxVmFsaWRhdG9yKCkiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+SWYgeW91IGFyZSBhIHZlcnNpb24gMSB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YxVmFsaWRhdG9yKCkiPmFzVjFWYWxpZGF0b3I8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY29weShib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotY29weTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4gPEI+Y29weTwvQj4oYm9vbGVhbiZuYnNwO2luY2x1ZGVDaGFuZ2VDb3VudHMpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvcHkoYm9vbGVhbikiPmNvcHk8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXROYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXROYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWbWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Vm1kPC9IMz4KLTxQUkU+Ci1wdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgPEI+Z2V0Vm1kPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRWYWxpZGF0b3JDbGFzc25hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+QW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRJZCgpIj5nZXRJZDwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEJ1aWxkVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2V0QnVpbGRWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7YnVpbGRWYWxpZGF0aW9uKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBieSB0aGUgYnVpbGQgcHJvY2Vzcy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPnNldEJ1aWxkVmFsaWRhdGlvbjwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHNldHRpbmcgY2hhbmdlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE1hbnVhbFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNldE1hbnVhbFZhbGlkYXRpb248L0I+KGJvb2xlYW4mbmJzcDttYW51YWxWYWxpZGF0aW9uKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4pIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlNldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYXMgcGFydCBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPnNldE1hbnVhbFZhbGlkYXRpb248L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSBzZXR0aW5nIGNoYW5nZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4gPEI+dmFsaWRhdGU8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5WYWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0byBiZSB2YWxpZGF0ZWQuPEREPjxDT0RFPmtpbmQ8L0NPREU+IC0gVGhlIGtpbmQgb2YgcmVzb3VyY2UgY2hhbmdlLCBzZWUgSVJlc291cmNlRGVsdGEgZm9yIHZhbHVlcy48REQ+PENPREU+b3BlcmF0aW9uPC9DT0RFPiAtIFRoZSBvcGVyYXRpb24gdGhhdCB0aGlzIHZhbGlkYXRpb24gaXMgcnVubmluZyB1bmRlci4gVGhpcyBjYW4KLSAgICAgICAgICAgIGJlIG51bGwuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gQSB3YXkgdG8gcmVwb3J0IHByb2dyZXNzLiBUaGlzIGNhbiBiZSBudWxsLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgcmVzdWx0IG9mIGRvaW5nIHRoZSB2YWxpZGF0aW9uLCBpdCBjYW4gYmUsIGJ1dCB1c3VhbGx5IGlzbid0Ci0gICAgICAgICBudWxsLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdG9yLlYxLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5WMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzlhYTk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTY4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRvci5WMgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRvci5WMiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdG9yLlYyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc2VzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0b3IuVjI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjwvQT4KLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjI8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jmd0OzwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBjbGFzczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgPEI+VmFsaWRhdG9yLlYyPC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotQSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibmVzdGVkX2NsYXNzX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibmVzdGVkX2NsYXNzZXNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TmVzdGVkIGNsYXNzZXMvaW50ZXJmYWNlcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2FkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCkiPmFkZDwvQT48L0I+KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJm5ic3A7ZmcpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2FzVjJWYWxpZGF0b3IoKSI+YXNWMlZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHlvdSBhcmUgYSB2ZXJzaW9uIDIgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjYnVtcENoYW5nZUNvdW50R3JvdXBzKCkiPmJ1bXBDaGFuZ2VDb3VudEdyb3VwczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2NsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj5jbGVhbjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TGV0IHRoZSB2YWxpZGF0b3Iga25vdyB0aGF0IGEgY2xlYW4gaXMgYWJvdXQgdG8gaGFwcGVuLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2NvcHkoYm9vbGVhbikiPmNvcHk8L0E+PC9CPihib29sZWFuJm5ic3A7aW5jbHVkZUNoYW5nZUNvdW50cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKSI+Z2V0QWRhcHRlcjwvQT48L0I+KGphdmEubGFuZy5DbGFzcyZuYnNwO2FkYXB0ZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldENoYW5nZUNvdW50R3JvdXBzKCkiPmdldENoYW5nZUNvdW50R3JvdXBzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldERlbGVnYXRlZFZhbGlkYXRvcigpIj5nZXREZWxlZ2F0ZWRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGFjdHVhbCB2YWxpZGF0b3IgdGhhdCBpcyBnb2luZyB0byBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cFtdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldEdyb3VwcygpIj5nZXRHcm91cHM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRvcidzIGZpbHRlciBncm91cHMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldExldmVsKCkiPmdldExldmVsPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldFZhbGlkYXRvcigpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZ1tdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldFZhbGlkYXRvckdyb3VwcygpIj5nZXRWYWxpZGF0b3JHcm91cHM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2hhc2hDb2RlRm9yQ29uZmlnKCkiPmhhc2hDb2RlRm9yQ29uZmlnPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGEgaGFzaCBjb2RlIGZvciB0aGUgY29uZmlndXJhYmxlIGZpZWxkcyBzbyB0aGF0IHdlIGNhbiBxdWlja2x5IGRldGVybWluZSBpZiB0d28KLSB2YWxpZGF0b3JzIGFyZSB0aGUgc2FtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNpc0NoYW5nZWQoKSI+aXNDaGFuZ2VkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SGFzIHRoZSB2YWxpZGF0b3IgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBjcmVhdGVkIG9yIGNvcGllZD88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNyZW1vdmUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXApIj5yZW1vdmU8L0E+PC9CPihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCZuYnNwO2dyb3VwKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjcmVwbGFjZUZpbHRlckdyb3VwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCkiPnJlcGxhY2VGaWx0ZXJHcm91cDwvQT48L0I+KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJm5ic3A7ZXhpc3RpbmcsCi0gICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXAmbmJzcDttZXJnZWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNyZXNldENoYW5nZUNvdW50ZXJzKCkiPnJlc2V0Q2hhbmdlQ291bnRlcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNzZXREZWxlZ2F0aW5nSWQoamF2YS5sYW5nLlN0cmluZykiPnNldERlbGVnYXRpbmdJZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZWxlZ2F0aW5nKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBpZCBvZiB0aGUgInJlYWwiIHZhbGlkYXRvciwgdGhhdCBpcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGRlbGVnYXRpbmcKLSB2YWxpZGF0b3IgaXMgYXNrZWQgdG8gdmFsaWRhdGUgc29tZXRoaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3NldEdyb3VwcyhqYXZhLnV0aWwuTGlzdCkiPnNldEdyb3VwczwvQT48L0I+KGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJmd0OyZuYnNwO2dyb3Vwcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3NldElkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRJZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3NldExldmVsKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbCkiPnNldExldmVsPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+Jm5ic3A7bGV2ZWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpIj5zZXROYW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2hvdWxkIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBmaXJzdCBjbGVhciB0aGUgbWFya2VycyB0aGF0IHRoaXMKLSB2YWxpZGF0b3IgaGFzIHBsYWNlZCBvbiB0aGlzIHJlc291cmNlPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZSB0aGUgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj52YWxpZGF0ZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yLAotICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uU3RhcnRpbmc8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGFueSB2YWxpZGF0aW9uIHRha2VzIHBsYWNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNWMVZhbGlkYXRvcigpIj5hc1YxVmFsaWRhdG9yPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYnVtcENoYW5nZUNvdW50R2xvYmFsKCkiPmJ1bXBDaGFuZ2VDb3VudEdsb2JhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2J1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzKCkiPmJ1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29tcGFyZVRvKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmNvbXBhcmVUbzwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvcHkoKSI+Y29weTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NyZWF0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIElQcm9qZWN0KSI+Y3JlYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY3JlYXRlKFZhbGlkYXRvck1ldGFEYXRhLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiwgSVByb2plY3QpIj5jcmVhdGU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRDaGFuZ2VDb3VudEdsb2JhbCgpIj5nZXRDaGFuZ2VDb3VudEdsb2JhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldENoYW5nZUNvdW50TWVzc2FnZXMoKSI+Z2V0Q2hhbmdlQ291bnRNZXNzYWdlczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldERlbGVnYXRpbmdJZCgpIj5nZXREZWxlZ2F0aW5nSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNYXJrZXJJZCgpIj5nZXRNYXJrZXJJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykiPmdldE1lc3NhZ2U8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNZXNzYWdlU2V0dGluZ3MoKSI+Z2V0TWVzc2FnZVNldHRpbmdzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0UHJvamVjdCgpIj5nZXRQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0U291cmNlSWQoKSI+Z2V0U291cmNlSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRWZXJzaW9uKCkiPmdldFZlcnNpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNHbG9iYWxDaGFuZ2VzKCkiPmhhc0dsb2JhbENoYW5nZXM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0J1aWxkVmFsaWRhdGlvbigpIj5pc0J1aWxkVmFsaWRhdGlvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzTWFudWFsVmFsaWRhdGlvbigpIj5pc01hbnVhbFZhbGlkYXRpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzYW1lQ29uZmlnKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPnNhbWVDb25maWc8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPnNldEJ1aWxkVmFsaWRhdGlvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPnNldE1hbnVhbFZhbGlkYXRpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRNYXJrZXJJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TWFya2VySWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRTb3VyY2VJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0U291cmNlSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRWZXJzaW9uKGludCkiPnNldFZlcnNpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj5zaG91bGRWYWxpZGF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSkiPnNob3VsZFZhbGlkYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBib29sZWFuLCBib29sZWFuKSI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlKSI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdG9TdHJpbmcoKSI+dG9TdHJpbmc8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFkZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+YWRkPC9CPihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCZuYnNwO2ZnKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYXNJVmFsaWRhdG9yKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFzSVZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+IDxCPmFzSVZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc0lWYWxpZGF0b3IoKSI+YXNJVmFsaWRhdG9yPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzVjJWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotYXNWMlZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT4gPEI+YXNWMlZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YyVmFsaWRhdG9yKCkiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+SWYgeW91IGFyZSBhIHZlcnNpb24gMiB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YyVmFsaWRhdG9yKCkiPmFzVjJWYWxpZGF0b3I8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY2xlYW4oSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLWNsZWFuPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5jbGVhbjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+TGV0IHRoZSB2YWxpZGF0b3Iga25vdyB0aGF0IGEgY2xlYW4gaXMgYWJvdXQgdG8gaGFwcGVuLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj5jbGVhbjwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgY2xlYW5lZC4gVGhpcyBjYW4gYmUgbnVsbCB3aGljaCBtZWFucyB0aGF0IHRoZSB3b3Jrc3BhY2UKLSBpcyBiZWluZyBjbGVhbmVkIChpbiB3aGljaCBjYXNlIGEgc2VwYXJhdGUgY2FsbCB3aWxsIGJlIG1hZGUgZm9yIGVhY2ggb3BlbiBwcm9qZWN0KS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY29weShib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotY29weTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4gPEI+Y29weTwvQj4oYm9vbGVhbiZuYnNwO2luY2x1ZGVDaGFuZ2VDb3VudHMpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvcHkoYm9vbGVhbikiPmNvcHk8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q2hhbmdlQ291bnRHcm91cHMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Q2hhbmdlQ291bnRHcm91cHM8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0Q2hhbmdlQ291bnRHcm91cHM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImJ1bXBDaGFuZ2VDb3VudEdyb3VwcygpIj48IS0tIC0tPjwvQT48SDM+Ci1idW1wQ2hhbmdlQ291bnRHcm91cHM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmJ1bXBDaGFuZ2VDb3VudEdyb3VwczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TGV2ZWwoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TGV2ZWw8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4gPEI+Z2V0TGV2ZWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldExldmVsKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldExldmVsPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRMZXZlbDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+Jm5ic3A7bGV2ZWwpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVsZWdhdGVkVmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT4gPEI+Z2V0RGVsZWdhdGVkVmFsaWRhdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBhY3R1YWwgdmFsaWRhdG9yIHRoYXQgaXMgZ29pbmcgdG8gcGVyZm9ybSB0aGUgdmFsaWRhdGlvbi4gSWYgdGhpcyBpcyBhIG5vcm1hbCB2YWxpZGF0b3IgdGhpcwotIG1ldGhvZCB3aWxsIHNpbXBseSBhbnN3ZXIgaXRzZWxmLiBIb3dldmVyIGlmIHRoaXMgaXMgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvciwgdGhlbiB0aGlzIHdpbGwgYW5zd2VyIHRoZQotICJyZWFsIiB2YWxpZGF0b3IuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRJZCgpIj5nZXRJZDwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRHcm91cHMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0R3JvdXBzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXBbXSA8Qj5nZXRHcm91cHM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHZhbGlkYXRvcidzIGZpbHRlciBncm91cHMuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gZW1wdHkgYXJyYXkgaWYgdGhlIHZhbGlkYXRvciBkb2VzIG5vdCBoYXZlIGFueSBmaWx0ZXIgZ3JvdXBzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXROYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXROYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT4gPEI+Z2V0VmFsaWRhdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRWYWxpZGF0b3JDbGFzc25hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+QW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvckdyb3VwcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3JHcm91cHM8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gPEI+Z2V0VmFsaWRhdG9yR3JvdXBzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJoYXNoQ29kZUZvckNvbmZpZygpIj48IS0tIC0tPjwvQT48SDM+Ci1oYXNoQ29kZUZvckNvbmZpZzwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5oYXNoQ29kZUZvckNvbmZpZzwvQj4oKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNoQ29kZUZvckNvbmZpZygpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPkFuc3dlciBhIGhhc2ggY29kZSBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBmaWVsZHMgc28gdGhhdCB3ZSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgaWYgdHdvCi0gdmFsaWRhdG9ycyBhcmUgdGhlIHNhbWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaGFzaENvZGVGb3JDb25maWcoKSI+aGFzaENvZGVGb3JDb25maWc8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNDaGFuZ2VkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQ2hhbmdlZDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aXNDaGFuZ2VkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gY2xhc3M6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzQ2hhbmdlZCgpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPkhhcyB0aGUgdmFsaWRhdG9yIGNoYW5nZWQgc2luY2UgaXQgd2FzIGxhc3QgY3JlYXRlZCBvciBjb3BpZWQ/IE9yIHdhcyBpdCBtaWdyYXRlZCBmcm9tIGFuIGVhcmxpZXIgdmVyc2lvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0NoYW5nZWQoKSI+aXNDaGFuZ2VkPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRDbGVhck1hcmtlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNob3VsZENsZWFyTWFya2VyczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5TaG91bGQgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGZpcnN0IGNsZWFyIHRoZSBtYXJrZXJzIHRoYXQgdGhpcwotIHZhbGlkYXRvciBoYXMgcGxhY2VkIG9uIHRoaXMgcmVzb3VyY2U/IFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5Ci0gdmFsaWRhdG9yIGltcGxlbWVudG9ycyB0byBwcm92aWRlIGEgdmFsaWRhdG9yIHNwZWNpZmljIGJlaGF2aW9yLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj5zaG91bGRDbGVhck1hcmtlcnM8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZXZlbnQ8L0NPREU+IC0gVGhlIHZhbGlkYXRpb24gZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHZhbGlkYXRpb24uCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNob3VsZCBmaXJzdCBjbGVhciBhbGwgdGhlCi0gICAgICAgICBtYXJrZXJzIHRoYXQgdGhpcyB2YWxpZGF0b3IgcHJvZHVjZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgIGJlaGF2aW9yLiBSZXR1cm4gZmFsc2UgdG8gbGVhdmUgdGhlIG1hcmtlcnMgdW5jaGFuZ2VkLiBJdCB0aGVuCi0gICAgICAgICBiZWNvbWVzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdmFsaWRhdG9yIHRvIG1hbmFnZSBpdCdzIG93bgotICAgICAgICAgbWFya2VycyBmb3IgdGhpcyByZXNvdXJjZSwgZm9yIHRoaXMgdmFsaWRhdGlvbiBldmVudC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldERlbGVnYXRpbmdJZChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0RGVsZWdhdGluZ0lkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXREZWxlZ2F0aW5nSWQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZWxlZ2F0aW5nKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXREZWxlZ2F0aW5nSWQoamF2YS5sYW5nLlN0cmluZykiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+U2V0IHRoZSBpZCBvZiB0aGUgInJlYWwiIHZhbGlkYXRvciwgdGhhdCBpcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGRlbGVnYXRpbmcKLSB2YWxpZGF0b3IgaXMgYXNrZWQgdG8gdmFsaWRhdGUgc29tZXRoaW5nLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldERlbGVnYXRpbmdJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0RGVsZWdhdGluZ0lkPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmRlbGVnYXRpbmc8L0NPREU+IC0gdGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdGhhdCBpcyBhY3R1YWxseSBnb2luZyB0byBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0R3JvdXBzKGphdmEudXRpbC5MaXN0KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0R3JvdXBzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRHcm91cHM8L0I+KGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJmd0OyZuYnNwO2dyb3Vwcyk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldElkKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRJZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0SWQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldE5hbWU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+IDxCPnZhbGlkYXRlPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+VmFsaWRhdGUgdGhlIHJlc291cmNlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdG8gYmUgdmFsaWRhdGVkLjxERD48Q09ERT5raW5kPC9DT0RFPiAtIFRoZSBraW5kIG9mIHJlc291cmNlIGNoYW5nZSwgc2VlIElSZXNvdXJjZURlbHRhIGZvciB2YWx1ZXMuPEREPjxDT0RFPm9wZXJhdGlvbjwvQ09ERT4gLSBUaGUgb3BlcmF0aW9uIHRoYXQgdGhpcyB2YWxpZGF0aW9uIGlzIHJ1bm5pbmcgdW5kZXIuIFRoaXMgY2FuCi0gICAgICAgICAgICBiZSBudWxsLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIEEgd2F5IHRvIHJlcG9ydCBwcm9ncmVzcy4gVGhpcyBjYW4gYmUgbnVsbC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHJlc3VsdCBvZiBkb2luZyB0aGUgdmFsaWRhdGlvbiwgaXQgY2FuIGJlLCBidXQgdXN1YWxseSBpc24ndAotICAgICAgICAgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+IDxCPnZhbGlkYXRlPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5WYWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+dmFsaWRhdGU8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC48REQ+PENPREU+a2luZDwvQ09ERT4gLSBUaGUga2luZCBvZiByZXNvdXJjZSBjaGFuZ2UsIHNlZSBJUmVzb3VyY2VEZWx0YSBmb3IgdmFsdWVzLjxERD48Q09ERT5vcGVyYXRpb248L0NPREU+IC0gVGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdmFsaWRhdGlvbiBpcyBydW5uaW5nIHVuZGVyLiBUaGlzIGNhbgotICAgICAgICAgICAgYmUgbnVsbC48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBBIHdheSB0byByZXBvcnQgcHJvZ3Jlc3MuIFRoaXMgY2FuIGJlIG51bGwuPEREPjxDT0RFPmV2ZW50PC9DT0RFPiAtIEFuIGV2ZW50IHRoYXQgZGVzY3JpYmVzIGluIG1vcmUgZGV0YWlsIHdoYXQgc2hvdWxkIGJlCi0gICAgICAgICAgICB2YWxpZGF0ZWQgYW5kIHdoeSBpdCBzaG91bGQgYmUgdmFsaWRhdGVkLiBUaGlzIGNhbiBiZSBudWxsLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgcmVzdWx0IG9mIGRvaW5nIHRoZSB2YWxpZGF0aW9uLCBpdCBjYW4gYmUsIGJ1dCB1c3VhbGx5IGlzbid0Ci0gICAgICAgICBudWxsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0aW9uU3RhcnRpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnZhbGlkYXRpb25TdGFydGluZzwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS4gSXQgYWxsb3dzIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkKLSBpbml0aWFsaXphdGlvbiB0aGF0IHRoZXkgbWlnaHQgbmVlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25TdGFydGluZzwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLiBGb3IgdGhlIHZlcnkgZmlyc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbiBwaGFzZSwKLSB0aGlzIHdpbGwgYmUgbnVsbC4gVGhhdCBpcyB0aGUgc2lnbmFsIHRvIHRoZSB2YWxpZGF0b3IgdGhhdCBhIHRvcCBsZXZlbCB2YWxpZGF0aW9uIGlzIHN0YXJ0aW5nLgotIFN1YnNlcXVlbnRseSwgdGhlIHByb2plY3Qgd2lsbCBiZSBzZXQsIGFzIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgcHJvamVjdHMgYXJlIHZhbGlkYXRlZC48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gYSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZSBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvCi0gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGlvbkZpbmlzaGluZzwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS4gSXQgYWxsb3dzIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkKLSBjbGVhbnVwIHRoYXQgdGhleSBtaWdodCBuZWVkIHRvIGRvLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgcHJvamVjdCB0aGF0IHdhcyB2YWxpZGF0ZWQuIFRoZSB2ZXJ5IGxhc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbiB3aWxsIHNldCB0aGlzIHRvIAotIG51bGwgc28gdGhhdCB0aGUgdmFsaWRhdG9yIGtub3dzIHRoYXQgYWxsIHRoZSBwcm9qZWN0cyBoYXZlIG5vdyBiZWVuIHZhbGlkYXRlZC48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gYSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZSBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvCi0gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBZGFwdGVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCA8Qj5nZXRBZGFwdGVyPC9CPihqYXZhLmxhbmcuQ2xhc3MmbmJzcDthZGFwdGVyKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVtb3ZlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwKSI+PCEtLSAtLT48L0E+PEgzPgotcmVtb3ZlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5yZW1vdmU8L0I+KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJm5ic3A7Z3JvdXApPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXNldENoYW5nZUNvdW50ZXJzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXJlc2V0Q2hhbmdlQ291bnRlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlc2V0Q2hhbmdlQ291bnRlcnM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjcmVzZXRDaGFuZ2VDb3VudGVycygpIj5yZXNldENoYW5nZUNvdW50ZXJzPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlcGxhY2VGaWx0ZXJHcm91cChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXApIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBsYWNlRmlsdGVyR3JvdXA8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlcGxhY2VGaWx0ZXJHcm91cDwvQj4ob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXAmbmJzcDtleGlzdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCZuYnNwO21lcmdlZCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvci5WMi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5WMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nlc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IiPk5FU1RFRDwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2MDZmNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVmFsaWRhdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVmFsaWRhdG9yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDs8QSBIUkVGPSIjbmVzdGVkX2NsYXNzX3N1bW1hcnkiPk5FU1RFRDwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotQ2xhc3MgVmFsaWRhdG9yPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jmd0OzwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkRpcmVjdCBLbm93biBTdWJjbGFzc2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBhYnN0cmFjdCBjbGFzcyA8Qj5WYWxpZGF0b3I8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDxEVD5pbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mZ3Q7PC9ETD4KLTwvUFJFPgotCi08UD4KLVJlcHJlc2VudHMgYSB2YWxpZGF0b3IuIFRoaXMgZ2V0cyBpbnN0YW50aWF0ZWQgdGhyb3VnaCBvbmUgb2YgdGhlIHZhbGlkYXRvciBleHRlbnNpb24gcG9pbnRzLgotIDxwPgotIDxiPlRoaXMgY2xhc3MgaXMgbm90IEFQSTwvYj4uCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT0gTkVTVEVEIENMQVNTIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im5lc3RlZF9jbGFzc19zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TmVzdGVkIENsYXNzIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbGV2ZWwgb2YgY29uZmlndXJhdGlvbiBmb3IgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgdmFsaWRhdG9yIHRoYXQgdXNlcyB2ZXJzaW9uIDEgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI1ZhbGlkYXRvcihJUHJvamVjdCkiPlZhbGlkYXRvcjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2FzVjFWYWxpZGF0b3IoKSI+YXNWMVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHlvdSBhcmUgYSB2ZXJzaW9uIDEgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNWMlZhbGlkYXRvcigpIj5hc1YyVmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgeW91IGFyZSBhIHZlcnNpb24gMiB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNidW1wQ2hhbmdlQ291bnRHbG9iYWwoKSI+YnVtcENoYW5nZUNvdW50R2xvYmFsPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYnVtcENoYW5nZUNvdW50TWVzc2FnZXMoKSI+YnVtcENoYW5nZUNvdW50TWVzc2FnZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjbGVhbihJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+Y2xlYW48L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBwcm9qZWN0IGlzIGJlaW5nIGNsZWFuZWQsIHRoaXMgbWV0aG9kIGdpdmVzIHRoZSB2YWxpZGF0b3IgYSBjaGFuY2UgdG8gZG8gYW55IHNwZWNpYWwgY2xlYW51cC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvbXBhcmVUbyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5jb21wYXJlVG88L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29tcGFyZSB5b3Vyc2VsZiBiYXNlZCBvbiBWYWxpZGF0b3IgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjb3B5KCkiPmNvcHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYSBkZWVwIGNvcHkgb2YgeW91cnNlbGYuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPmFic3RyYWN0ICZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29weShib29sZWFuKSI+Y29weTwvQT48L0I+KGJvb2xlYW4mbmJzcDtpbmNsdWRlQ2hhbmdlQ291bnRzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY3JlYXRlKElDb25maWd1cmF0aW9uRWxlbWVudCwgSVByb2plY3QpIj5jcmVhdGU8L0E+PC9CPihJQ29uZmlndXJhdGlvbkVsZW1lbnQmbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGEgbmV3IHZhbGlkYXRvciBiYXNlZCBvbiBhIGFic3RyYWN0IHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjcmVhdGUoVmFsaWRhdG9yTWV0YURhdGEsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBJUHJvamVjdCkiPmNyZWF0ZTwvQT48L0I+KFZhbGlkYXRvck1ldGFEYXRhJm5ic3A7dm1kLAotICAgICAgIFZhbGlkYXRpb25Db25maWd1cmF0aW9uJm5ic3A7Y29uZmlnLAotICAgICAgIElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZSBhIG5ldyB2YWxpZGF0b3IgYmFzZWQgb24gdmFsaWRhdG9yIG1ldGEgZGF0YS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldENoYW5nZUNvdW50R2xvYmFsKCkiPmdldENoYW5nZUNvdW50R2xvYmFsPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRDaGFuZ2VDb3VudE1lc3NhZ2VzKCkiPmdldENoYW5nZUNvdW50TWVzc2FnZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXREZWxlZ2F0aW5nSWQoKSI+Z2V0RGVsZWdhdGluZ0lkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7R2V0IHRoZSBpZCBvZiB0aGUgInJlYWwiIHZhbGlkYXRvciwgdGhhdCBpcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGRlbGVnYXRpbmcKLSB2YWxpZGF0b3IgaXMgYXNrZWQgdG8gdmFsaWRhdGUgc29tZXRoaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5hYnN0cmFjdCAmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldElkKCkiPmdldElkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0TWFya2VySWQoKSI+Z2V0TWFya2VySWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykiPmdldE1lc3NhZ2U8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0TWVzc2FnZVNldHRpbmdzKCkiPmdldE1lc3NhZ2VTZXR0aW5nczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhbGwgdGhlIG1lc3NhZ2Ugc2V0dGluZ3MgdGhhdCB0aGlzIHZhbGlkYXRvciBoYXMgZGVmaW5lZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+YWJzdHJhY3QgJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXROYW1lKCkiPmdldE5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVByb2plY3Q8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0UHJvamVjdCgpIj5nZXRQcm9qZWN0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBwcm9qZWN0IHRoYXQgeW91IHdlcmUgZW5hYmxlZCBvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRTb3VyY2VJZCgpIj5nZXRTb3VyY2VJZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5hYnN0cmFjdCAmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldFZhbGlkYXRvckNsYXNzbmFtZSgpIj5nZXRWYWxpZGF0b3JDbGFzc25hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0VmVyc2lvbigpIj5nZXRWZXJzaW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaGFzR2xvYmFsQ2hhbmdlcygpIj5oYXNHbG9iYWxDaGFuZ2VzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNoQ29kZUZvckNvbmZpZygpIj5oYXNoQ29kZUZvckNvbmZpZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGhhc2ggY29kZSBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBmaWVsZHMgc28gdGhhdCB3ZSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgaWYgdHdvCi0gdmFsaWRhdG9ycyBhcmUgdGhlIHNhbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaXNCdWlsZFZhbGlkYXRpb24oKSI+aXNCdWlsZFZhbGlkYXRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJcyB0aGlzIHZhbGlkYXRvciBjdXJyZW50bHkgZW5hYmxlZCBmb3IgdmFsaWRhdGlvbnMgdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IGJ1aWxkcz88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0NoYW5nZWQoKSI+aXNDaGFuZ2VkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SGFzIHRoZSB2YWxpZGF0b3IgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBjcmVhdGVkIG9yIGNvcGllZD88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc01hbnVhbFZhbGlkYXRpb24oKSI+aXNNYW51YWxWYWxpZGF0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SXMgdGhpcyB2YWxpZGF0b3IgY3VycmVudGx5IGVuYWJsZWQgZm9yIHZhbGlkYXRpb25zIHRoYXQgYXJlIHRyaWdnZXJlZCBtYW51YWxseT88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNyZXNldENoYW5nZUNvdW50ZXJzKCkiPnJlc2V0Q2hhbmdlQ291bnRlcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzYW1lQ29uZmlnKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPnNhbWVDb25maWc8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRydWUgaWYgeW91IGhhdmUgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBhcyB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj5zZXRCdWlsZFZhbGlkYXRpb248L0E+PC9CPihib29sZWFuJm5ic3A7YnVpbGRWYWxpZGF0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBieSB0aGUgYnVpbGQgcHJvY2Vzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXREZWxlZ2F0aW5nSWQoamF2YS5sYW5nLlN0cmluZykiPnNldERlbGVnYXRpbmdJZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZWxlZ2F0aW5nKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBpZCBvZiB0aGUgInJlYWwiIHZhbGlkYXRvciwgdGhhdCBpcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGRlbGVnYXRpbmcKLSB2YWxpZGF0b3IgaXMgYXNrZWQgdG8gdmFsaWRhdGUgc29tZXRoaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPnNldE1hbnVhbFZhbGlkYXRpb248L0E+PC9CPihib29sZWFuJm5ic3A7bWFudWFsVmFsaWRhdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYXMgcGFydCBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldE1hcmtlcklkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRNYXJrZXJJZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttYXJrZXJJZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldFNvdXJjZUlkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRTb3VyY2VJZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzb3VyY2VJZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldFZlcnNpb24oaW50KSI+c2V0VmVyc2lvbjwvQT48L0I+KGludCZuYnNwO3ZlcnNpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2hvdWxkIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBmaXJzdCBjbGVhciB0aGUgbWFya2VycyB0aGF0IHRoaXMKLSB2YWxpZGF0b3IgaGFzIHBsYWNlZCBvbiB0aGlzIHJlc291cmNlPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlKElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbikiPnNob3VsZFZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0cnVlIGlmIHRoaXMgdmFsaWRhdG9yLCBiYXNlZCBvbiBpdCdzIGZpbHRlcnMsIHNob3VsZCB2YWxpZGF0ZQotIHRoaXMgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlKSI+c2hvdWxkVmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUmbmJzcDt2YWxUeXBlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlCi0gdGhpcyByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZVByb2plY3QoSVByb2plY3QsIGJvb2xlYW4sIGJvb2xlYW4pIj5zaG91bGRWYWxpZGF0ZVByb2plY3Q8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc0J1aWxkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlIHRoaXMgcHJvamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZVByb2plY3QoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUpIj5zaG91bGRWYWxpZGF0ZVByb2plY3Q8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSZuYnNwO3R5cGUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUgdGhpcyBwcm9qZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3RvU3RyaW5nKCkiPnRvU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPmFic3RyYWN0ICZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPnZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZSB0aGUgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25TdGFydGluZzwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IlZhbGlkYXRvcihJUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxCPlZhbGlkYXRvcjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvUFJFPgotPERMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJjcmVhdGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBJUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IDxCPmNyZWF0ZTwvQj4oSUNvbmZpZ3VyYXRpb25FbGVtZW50Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGUgYSBuZXcgdmFsaWRhdG9yIGJhc2VkIG9uIGEgYWJzdHJhY3QgdmFsaWRhdG9yLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWxpZGF0b3I8L0NPREU+IC0gVGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHdyYXBwZWQuPEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gVGhlIHByb2plY3QgdGhhdCB5b3UgYXJlIGRlZmluZWQgaW4uIFRoaXMgY2FuIGJlIG51bGwgd2hpY2gKLSAgICAgICAgICAgIG1lYW5zIHRoYXQgeW91IGFyZSBhIGdsb2JhbCB2YWxpZGF0b3IuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjcmVhdGUoVmFsaWRhdG9yTWV0YURhdGEsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBJUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IDxCPmNyZWF0ZTwvQj4oVmFsaWRhdG9yTWV0YURhdGEmbmJzcDt2bWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24mbmJzcDtjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvUFJFPgotPERMPgotPEREPkNyZWF0ZSBhIG5ldyB2YWxpZGF0b3IgYmFzZWQgb24gdmFsaWRhdG9yIG1ldGEgZGF0YS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IHlvdSBhcmUgZGVmaW5lZCBpbi4gVGhpcyBjYW4gYmUgbnVsbCB3aGljaAotICAgICAgICAgICAgbWVhbnMgdGhhdCB5b3UgYXJlIGEgZ2xvYmFsIHZhbGlkYXRvci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzVjFWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotYXNWMVZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT4gPEI+YXNWMVZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPklmIHlvdSBhcmUgYSB2ZXJzaW9uIDEgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzVjJWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotYXNWMlZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT4gPEI+YXNWMlZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPklmIHlvdSBhcmUgYSB2ZXJzaW9uIDIgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1jbGVhbjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+Y2xlYW48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPlRoZSBwcm9qZWN0IGlzIGJlaW5nIGNsZWFuZWQsIHRoaXMgbWV0aG9kIGdpdmVzIHRoZSB2YWxpZGF0b3IgYSBjaGFuY2UgdG8gZG8gYW55IHNwZWNpYWwgY2xlYW51cC4KLSBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIHRoZSBwcm9qZWN0IGJlaW5nIGJ1aWx0LjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIHRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgY2xlYW4gdGFrZXMgYSBsb25nIHRpbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjb21wYXJlVG8ob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotY29tcGFyZVRvPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmNvbXBhcmVUbzwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvcik8L1BSRT4KLTxETD4KLTxERD5Db21wYXJlIHlvdXJzZWxmIGJhc2VkIG9uIFZhbGlkYXRvciBuYW1lLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPmNvbXBhcmVUbzwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPmphdmEubGFuZy5Db21wYXJhYmxlJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mZ3Q7PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY29weSgpIj48IS0tIC0tPjwvQT48SDM+Ci1jb3B5PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiA8Qj5jb3B5PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGEgZGVlcCBjb3B5IG9mIHlvdXJzZWxmLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjb3B5KGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1jb3B5PC9IMz4KLTxQUkU+Ci1wdWJsaWMgYWJzdHJhY3QgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiA8Qj5jb3B5PC9CPihib29sZWFuJm5ic3A7aW5jbHVkZUNoYW5nZUNvdW50cyk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRDbGVhck1hcmtlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNob3VsZENsZWFyTWFya2VyczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvUFJFPgotPERMPgotPEREPlNob3VsZCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZmlyc3QgY2xlYXIgdGhlIG1hcmtlcnMgdGhhdCB0aGlzCi0gdmFsaWRhdG9yIGhhcyBwbGFjZWQgb24gdGhpcyByZXNvdXJjZT8gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkKLSB2YWxpZGF0b3IgaW1wbGVtZW50b3JzIHRvIHByb3ZpZGUgYSB2YWxpZGF0b3Igc3BlY2lmaWMgYmVoYXZpb3IuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmV2ZW50PC9DT0RFPiAtIFRoZSB2YWxpZGF0aW9uIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSB2YWxpZGF0aW9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzaG91bGQgZmlyc3QgY2xlYXIgYWxsIHRoZQotICAgICAgICAgbWFya2VycyB0aGF0IHRoaXMgdmFsaWRhdG9yIHByb2R1Y2VkLiBUaGlzIGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICBiZWhhdmlvci4gUmV0dXJuIGZhbHNlIHRvIGxlYXZlIHRoZSBtYXJrZXJzIHVuY2hhbmdlZC4gSXQgdGhlbgotICAgICAgICAgYmVjb21lcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHZhbGlkYXRvciB0byBtYW5hZ2UgaXQncyBvd24KLSAgICAgICAgIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UsIGZvciB0aGlzIHZhbGlkYXRpb24gZXZlbnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRWYWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2hvdWxkVmFsaWRhdGU8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlCi0gdGhpcyByZXNvdXJjZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIGdsb2JhbCB2YWxpZGF0aW9uIG9yCi0gcHJvamVjdCB2YWxpZGF0aW9uIGhhcyBiZWVuIHN1c3BlbmRlZCBvciBub3QuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0byBiZSBjaGVja2VkLjxERD48Q09ERT5pc01hbnVhbDwvQ09ERT4gLSBJZiB0cnVlIHRoZW4gdGhpcyB2YWxpZGF0b3IgbXVzdCBhbHNvIGJlIGVuYWJsZWQgZm9yIG1hbnVhbAotICAgICAgICAgICAgdmFsaWRhdGlvbi48REQ+PENPREU+aXNCdWlsZDwvQ09ERT4gLSBJZiB0cnVlIHRoZW4gdGhpcyB2YWxpZGF0b3IgbXVzdCBhbHNvIGJlIGVuYWJsZWQgZm9yIGJ1aWxkZXIKLSAgICAgICAgICAgIGJhc2VkIHZhbGlkYXRpb24uCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHJlc291cmNlIHNob3VsZCBiZSB2YWxpZGF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUpIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRWYWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2hvdWxkVmFsaWRhdGU8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSZuYnNwO3ZhbFR5cGUpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlCi0gdGhpcyByZXNvdXJjZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIGdsb2JhbCB2YWxpZGF0aW9uIG9yCi0gcHJvamVjdCB2YWxpZGF0aW9uIGhhcyBiZWVuIHN1c3BlbmRlZCBvciBub3QuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0byBiZSBjaGVja2VkLjxERD48Q09ERT52YWxUeXBlPC9DT0RFPiAtIFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIHBlcmZvcm1pbmcgdGhlIGNoZWNrLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgdmFsaWRhdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlKSI+PCEtLSAtLT48L0E+PEgzPgotc2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5zaG91bGRWYWxpZGF0ZVByb2plY3Q8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlJm5ic3A7dHlwZSk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUgdGhpcyBwcm9qZWN0LiBUaGlzIG1ldGhvZAotIGRvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiBnbG9iYWwgdmFsaWRhdGlvbiBvciBwcm9qZWN0IHZhbGlkYXRpb24gaGFzIGJlZW4gc3VzcGVuZGVkIG9yIG5vdC4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgcHJvamVjdCB0byBiZSBjaGVja2VkPEREPjxDT0RFPnR5cGU8L0NPREU+IC0gVGhlIHR5cGUgb2YgdmFsaWRhdGlvbiByZXF1ZXN0Ci08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHByb2plY3Qgc2hvdWxkIGJlIHZhbGlkYXRlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZFZhbGlkYXRlUHJvamVjdChJUHJvamVjdCwgYm9vbGVhbiwgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNob3VsZFZhbGlkYXRlUHJvamVjdDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc0J1aWxkKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0cnVlIGlmIHRoaXMgdmFsaWRhdG9yLCBiYXNlZCBvbiBpdCdzIGZpbHRlcnMsIHNob3VsZCB2YWxpZGF0ZSB0aGlzIHByb2plY3QuIFRoaXMgbWV0aG9kCi0gZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIGdsb2JhbCB2YWxpZGF0aW9uIG9yIHByb2plY3QgdmFsaWRhdGlvbiBoYXMgYmVlbiBzdXNwZW5kZWQgb3Igbm90LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIHRoZSBwcm9qZWN0IHRvIGJlIGNoZWNrZWQ8REQ+PENPREU+aXNNYW51YWw8L0NPREU+IC0gaWYgdHJ1ZSB0aGVuIHRoaXMgdmFsaWRhdG9yIG11c3QgYWxzbyBiZSBlbmFibGVkIGZvciBtYW51YWwgdmFsaWRhdGlvbi48REQ+PENPREU+aXNCdWlsZDwvQ09ERT4gLSBpZiB0cnVlIHRoZW4gdGhpcyB2YWxpZGF0b3IgbXVzdCBhbHNvIGJlIGVuYWJsZWQgZm9yIGJ1aWxkZXIgYmFzZWQgdmFsaWRhdGlvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgcHJvamVjdCBzaG91bGQgYmUgdmFsaWRhdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYWJzdHJhY3QgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+IDxCPnZhbGlkYXRlPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD5WYWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0byBiZSB2YWxpZGF0ZWQuPEREPjxDT0RFPmtpbmQ8L0NPREU+IC0gVGhlIGtpbmQgb2YgcmVzb3VyY2UgY2hhbmdlLCBzZWUgSVJlc291cmNlRGVsdGEgZm9yIHZhbHVlcy48REQ+PENPREU+b3BlcmF0aW9uPC9DT0RFPiAtIFRoZSBvcGVyYXRpb24gdGhhdCB0aGlzIHZhbGlkYXRpb24gaXMgcnVubmluZyB1bmRlci4gVGhpcyBjYW4KLSAgICAgICAgICAgIGJlIG51bGwuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gQSB3YXkgdG8gcmVwb3J0IHByb2dyZXNzLiBUaGlzIGNhbiBiZSBudWxsLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgcmVzdWx0IG9mIGRvaW5nIHRoZSB2YWxpZGF0aW9uLCBpdCBjYW4gYmUsIGJ1dCB1c3VhbGx5IGlzbid0Ci0gICAgICAgICBudWxsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4gPEI+dmFsaWRhdGU8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvUFJFPgotPERMPgotPEREPlZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC48REQ+PENPREU+a2luZDwvQ09ERT4gLSBUaGUga2luZCBvZiByZXNvdXJjZSBjaGFuZ2UsIHNlZSBJUmVzb3VyY2VEZWx0YSBmb3IgdmFsdWVzLjxERD48Q09ERT5vcGVyYXRpb248L0NPREU+IC0gVGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdmFsaWRhdGlvbiBpcyBydW5uaW5nIHVuZGVyLiBUaGlzIGNhbgotICAgICAgICAgICAgYmUgbnVsbC48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBBIHdheSB0byByZXBvcnQgcHJvZ3Jlc3MuIFRoaXMgY2FuIGJlIG51bGwuPEREPjxDT0RFPmV2ZW50PC9DT0RFPiAtIEFuIGV2ZW50IHRoYXQgZGVzY3JpYmVzIGluIG1vcmUgZGV0YWlsIHdoYXQgc2hvdWxkIGJlCi0gICAgICAgICAgICB2YWxpZGF0ZWQgYW5kIHdoeSBpdCBzaG91bGQgYmUgdmFsaWRhdGVkLiBUaGlzIGNhbiBiZSBudWxsLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgcmVzdWx0IG9mIGRvaW5nIHRoZSB2YWxpZGF0aW9uLCBpdCBjYW4gYmUsIGJ1dCB1c3VhbGx5IGlzbid0Ci0gICAgICAgICBudWxsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0aW9uU3RhcnRpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnZhbGlkYXRpb25TdGFydGluZzwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD5UaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuIEl0IGFsbG93cyB2YWxpZGF0b3JzIHRvIHBlcmZvcm0gYW55Ci0gaW5pdGlhbGl6YXRpb24gdGhhdCB0aGV5IG1pZ2h0IG5lZWQuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyB2YWxpZGF0ZWQuIEZvciB0aGUgdmVyeSBmaXJzdCBjYWxsIGluIHRoZSB2YWxpZGF0aW9uIHBoYXNlLAotIHRoaXMgd2lsbCBiZSBudWxsLiBUaGF0IGlzIHRoZSBzaWduYWwgdG8gdGhlIHZhbGlkYXRvciB0aGF0IGEgdG9wIGxldmVsIHZhbGlkYXRpb24gaXMgc3RhcnRpbmcuCi0gU3Vic2VxdWVudGx5LCB0aGUgcHJvamVjdCB3aWxsIGJlIHNldCwgYXMgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBwcm9qZWN0cyBhcmUgdmFsaWRhdGVkLjxERD48Q09ERT5zdGF0ZTwvQ09ERT4gLSBhIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lIGludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8KLSB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIHRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgY2xlYW4gdGFrZXMgYSBsb25nIHRpbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0aW9uRmluaXNoaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj52YWxpZGF0aW9uRmluaXNoaW5nPC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+VGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLiBJdCBhbGxvd3MgdmFsaWRhdG9ycyB0byBwZXJmb3JtIGFueQotIGNsZWFudXAgdGhhdCB0aGV5IG1pZ2h0IG5lZWQgdG8gZG8uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gdGhlIHByb2plY3QgdGhhdCB3YXMgdmFsaWRhdGVkLiBUaGUgdmVyeSBsYXN0IGNhbGwgaW4gdGhlIHZhbGlkYXRpb24gd2lsbCBzZXQgdGhpcyB0byAKLSBudWxsIHNvIHRoYXQgdGhlIHZhbGlkYXRvciBrbm93cyB0aGF0IGFsbCB0aGUgcHJvamVjdHMgaGF2ZSBub3cgYmVlbiB2YWxpZGF0ZWQuPEREPjxDT0RFPnN0YXRlPC9DT0RFPiAtIGEgd2F5IHRvIHBhc3MgYXJiaXRyYXJ5LCB2YWxpZGF0b3Igc3BlY2lmaWMsIGRhdGEgZnJvbSBvbmUgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0bwotIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcGhhc2UuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gdGhlIG1vbml0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGlmIHRoZSBjbGVhbiB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzSVZhbGlkYXRvcigpIj48IS0tIC0tPjwvQT48SDM+Ci1hc0lWYWxpZGF0b3I8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiA8Qj5hc0lWYWxpZGF0b3I8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TWVzc2FnZShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWVzc2FnZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiA8Qj5nZXRNZXNzYWdlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRNZXNzYWdlU2V0dGluZ3MoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWVzc2FnZVNldHRpbmdzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiZndDsgPEI+Z2V0TWVzc2FnZVNldHRpbmdzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGFsbCB0aGUgbWVzc2FnZSBzZXR0aW5ncyB0aGF0IHRoaXMgdmFsaWRhdG9yIGhhcyBkZWZpbmVkLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIGVtcHR5IG1hcCBpZiB0aGUgdmFsaWRhdG9yIGRpZCBub3QgZGVmaW5lIGFueSBtZXNzYWdlIHNldHRpbmdzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaGFzaENvZGVGb3JDb25maWcoKSI+PCEtLSAtLT48L0E+PEgzPgotaGFzaENvZGVGb3JDb25maWc8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+aGFzaENvZGVGb3JDb25maWc8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYSBoYXNoIGNvZGUgZm9yIHRoZSBjb25maWd1cmFibGUgZmllbGRzIHNvIHRoYXQgd2UgY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIHR3bwotIHZhbGlkYXRvcnMgYXJlIHRoZSBzYW1lLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXROYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldE5hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFByb2plY3QoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UHJvamVjdDwvSDM+Ci08UFJFPgotcHVibGljIElQcm9qZWN0IDxCPmdldFByb2plY3Q8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHByb2plY3QgdGhhdCB5b3Ugd2VyZSBlbmFibGVkIG9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPm51bGwgaWYgeW91IGFyZSBhIGdsb2JhbCAoaS5lLiB3b3Jrc3BhY2UgbGV2ZWwpIHZhbGlkYXRvci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvckNsYXNzbmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3JDbGFzc25hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldFZhbGlkYXRvckNsYXNzbmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB2YWxpZGF0b3IuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzTWFudWFsVmFsaWRhdGlvbigpIj48IS0tIC0tPjwvQT48SDM+Ci1pc01hbnVhbFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmlzTWFudWFsVmFsaWRhdGlvbjwvQj4oKTwvUFJFPgotPERMPgotPEREPklzIHRoaXMgdmFsaWRhdG9yIGN1cnJlbnRseSBlbmFibGVkIGZvciB2YWxpZGF0aW9ucyB0aGF0IGFyZSB0cmlnZ2VyZWQgbWFudWFsbHk/Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE1hbnVhbFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNldE1hbnVhbFZhbGlkYXRpb248L0I+KGJvb2xlYW4mbmJzcDttYW51YWxWYWxpZGF0aW9uKTwvUFJFPgotPERMPgotPEREPlNldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYXMgcGFydCBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tYW51YWxWYWxpZGF0aW9uPC9DT0RFPiAtIAotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSBzZXR0aW5nIGNoYW5nZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0J1aWxkVmFsaWRhdGlvbigpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0J1aWxkVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aXNCdWlsZFZhbGlkYXRpb248L0I+KCk8L1BSRT4KLTxETD4KLTxERD5JcyB0aGlzIHZhbGlkYXRvciBjdXJyZW50bHkgZW5hYmxlZCBmb3IgdmFsaWRhdGlvbnMgdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IGJ1aWxkcz8KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNDaGFuZ2VkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQ2hhbmdlZDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aXNDaGFuZ2VkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SGFzIHRoZSB2YWxpZGF0b3IgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBjcmVhdGVkIG9yIGNvcGllZD8gT3Igd2FzIGl0IG1pZ3JhdGVkIGZyb20gYW4gZWFybGllciB2ZXJzaW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEJ1aWxkVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2V0QnVpbGRWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7YnVpbGRWYWxpZGF0aW9uKTwvUFJFPgotPERMPgotPEREPlNldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmJ1aWxkVmFsaWRhdGlvbjwvQ09ERT4gLSAKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgc2V0dGluZyBjaGFuZ2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0RGVsZWdhdGluZ0lkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERlbGVnYXRpbmdJZDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0RGVsZWdhdGluZ0lkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+R2V0IHRoZSBpZCBvZiB0aGUgInJlYWwiIHZhbGlkYXRvciwgdGhhdCBpcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGRlbGVnYXRpbmcKLSB2YWxpZGF0b3IgaXMgYXNrZWQgdG8gdmFsaWRhdGUgc29tZXRoaW5nLiBJZiB0aGlzIGlzbid0IGEgZGVsZWdhdGluZyB2YWxpZGF0b3IgYW5zd2VyIG51bGwuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldERlbGVnYXRpbmdJZChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0RGVsZWdhdGluZ0lkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXREZWxlZ2F0aW5nSWQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZWxlZ2F0aW5nKTwvUFJFPgotPERMPgotPEREPlNldCB0aGUgaWQgb2YgdGhlICJyZWFsIiB2YWxpZGF0b3IsIHRoYXQgaXMgdGhlIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBkZWxlZ2F0aW5nCi0gdmFsaWRhdG9yIGlzIGFza2VkIHRvIHZhbGlkYXRlIHNvbWV0aGluZy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZGVsZWdhdGluZzwvQ09ERT4gLSB0aGUgaWQgb2YgdGhlIHZhbGlkYXRvciB0aGF0IGlzIGFjdHVhbGx5IGdvaW5nIHRvIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24uPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWZXJzaW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZlcnNpb248L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0VmVyc2lvbjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0VmVyc2lvbihpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRWZXJzaW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRWZXJzaW9uPC9CPihpbnQmbmJzcDt2ZXJzaW9uKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U291cmNlSWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U291cmNlSWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldFNvdXJjZUlkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTb3VyY2VJZChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0U291cmNlSWQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldFNvdXJjZUlkPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c291cmNlSWQpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRDaGFuZ2VDb3VudEdsb2JhbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRDaGFuZ2VDb3VudEdsb2JhbDwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5nZXRDaGFuZ2VDb3VudEdsb2JhbDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaGFzR2xvYmFsQ2hhbmdlcygpIj48IS0tIC0tPjwvQT48SDM+Ci1oYXNHbG9iYWxDaGFuZ2VzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5oYXNHbG9iYWxDaGFuZ2VzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRDaGFuZ2VDb3VudE1lc3NhZ2VzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENoYW5nZUNvdW50TWVzc2FnZXM8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0Q2hhbmdlQ291bnRNZXNzYWdlczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYnVtcENoYW5nZUNvdW50TWVzc2FnZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotYnVtcENoYW5nZUNvdW50TWVzc2FnZXM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmJ1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXNldENoYW5nZUNvdW50ZXJzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXJlc2V0Q2hhbmdlQ291bnRlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlc2V0Q2hhbmdlQ291bnRlcnM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImJ1bXBDaGFuZ2VDb3VudEdsb2JhbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1idW1wQ2hhbmdlQ291bnRHbG9iYWw8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmJ1bXBDaGFuZ2VDb3VudEdsb2JhbDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2FtZUNvbmZpZyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1zYW1lQ29uZmlnPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5zYW1lQ29uZmlnPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0cnVlIGlmIHlvdSBoYXZlIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYXMgdmFsaWRhdG9yLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWxpZGF0b3I8L0NPREU+IC0gdGhpcyBjYW4gYmUgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE1hcmtlcklkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE1hcmtlcklkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRNYXJrZXJJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0TWFya2VySWQoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE1hcmtlcklkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRNYXJrZXJJZDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21hcmtlcklkKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdG9yLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmM2ViZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVmFsaWRhdG9yTWVzc2FnZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRvck1lc3NhZ2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIFZhbGlkYXRvck1lc3NhZ2U8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2U8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5WYWxpZGF0b3JNZXNzYWdlPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdheSBmb3IgYSB2YWxpZGF0b3IgdG8gcmV0dXJuIG1lc3NhZ2VzLCB0aGF0IGFyZSBlYXNpbHkKLSBjb252ZXJ0ZWQgaW50byBJTWFya2Vycy4KLSA8cD4KLSBUaGlzIGNsYXNzIGlzIGNvbXBsZXRlbHkgb3B0aW9uYWwgZm9yIHZhbGlkYXRvcnMuIEEgdmFsaWRhdG9yIGNhbiBjaG9vc2UgdG8KLSBkaXJlY3RseSBtYW5hZ2UgSU1hcmtlcnMuIEhvd2V2ZXIsIHNvbWUgdmFsaWRhdG9ycyB3YW50IHRvIGJlIHVzZWQgaW4KLSBtdWx0aXBsZSBjb250ZXh0cywgZm9yIGV4YW1wbGUgYXMteW91LXR5cGUgdmFsaWRhdGlvbiBhbmQgYnVpbGQgYmFzZWQKLSB2YWxpZGF0aW9uLiBGb3IgdGhlc2UgdHlwZXMgb2YgdmFsaWRhdG9ycyBpdCBpcyBub3QgcG9zc2libGUgZm9yIHRoZW0gdG8gdXNlCi0gb25seSBJTWFya2VycywgYmVjYXVzZSBvZnRlbiB0aGUgUmVzb3VyY2UgaGFzIG5vdCBiZWVuIHNhdmVkIHlldC4KLSA8L3A+Ci0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0Ci0gaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZQotIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0Ci0gZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdAotIHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSQotIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNWYWxpZGF0aW9uSWQiPlZhbGlkYXRpb25JZDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjYXNDb3B5KCkiPmFzQ29weTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGNvcHkgb2YgeW91cnNlbGYuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjY3JlYXRlKGphdmEubGFuZy5TdHJpbmcsIElSZXNvdXJjZSkiPmNyZWF0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlLAotICAgICAgIElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGEgbmV3IHZhbGlkYXRpb24gbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLk9iamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpIj5nZXRBdHRyaWJ1dGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikiPmdldEF0dHJpYnV0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtkZWZhdWx0VmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgaW50KSI+Z2V0QXR0cmlidXRlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgaW50Jm5ic3A7ZGVmYXVsdFZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QXR0cmlidXRlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2RlZmF1bHRWYWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHN0cmluZyB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5NYXA8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2dldEF0dHJpYnV0ZXMoKSI+Z2V0QXR0cmlidXRlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBtYXAgd2l0aCBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBtYXJrZXIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lSZXNvdXJjZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjZ2V0UmVzb3VyY2UoKSI+Z2V0UmVzb3VyY2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSByZXNvdXJjZSB3aXRoIHdoaWNoIHRoaXMgbWFya2VyIGlzIGFzc29jaWF0ZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2dldFR5cGUoKSI+Z2V0VHlwZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtYXJrZXIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKSI+c2V0QXR0cmlidXRlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3ZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgYm9vbGVhbiB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpIj5zZXRBdHRyaWJ1dGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICBpbnQmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIGludGVnZXIgdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPnNldEF0dHJpYnV0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNzZXRBdHRyaWJ1dGVzKGphdmEudXRpbC5NYXApIj5zZXRBdHRyaWJ1dGVzPC9BPjwvQj4oamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5PYmplY3QmZ3Q7Jm5ic3A7YXR0cmlidXRlcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbWFya2VyIHRvIGJlIHRoZSBvbmVzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4KLSB0YWJsZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjc2V0QXR0cmlidXRlcyhqYXZhLmxhbmcuU3RyaW5nW10sIGphdmEubGFuZy5PYmplY3RbXSkiPnNldEF0dHJpYnV0ZXM8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nW10mbmJzcDthdHRyaWJ1dGVOYW1lcywKLSAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdFtdJm5ic3A7dmFsdWVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgZ2l2ZW4gYXR0cmlidXRlIGtleS12YWx1ZSBwYWlycyBvbiB0aGlzIG1hcmtlci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjc2V0VHlwZShqYXZhLmxhbmcuU3RyaW5nKSI+c2V0VHlwZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt0eXBlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgbWFya2VyIHR5cGUuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJWYWxpZGF0aW9uSWQiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRpb25JZDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIDxCPlZhbGlkYXRpb25JZDwvQj48L1BSRT4KLTxETD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2UuVmFsaWRhdGlvbklkIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iY3JlYXRlKGphdmEubGFuZy5TdHJpbmcsIElSZXNvdXJjZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWNyZWF0ZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT4gPEI+Y3JlYXRlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlIGEgbmV3IHZhbGlkYXRpb24gbWVzc2FnZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSBUaGUgbG9jYWxpemVkIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYXNDb3B5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFzQ29weTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPiA8Qj5hc0NvcHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYSBjb3B5IG9mIHlvdXJzZWxmLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEF0dHJpYnV0ZTwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5PYmplY3QgPEI+Z2V0QXR0cmlidXRlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gVGhlIHJlc3VsdCBpcyBhbiBpbnN0YW5jZSBvZgotIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6IDxjb2RlPlN0cmluZzwvY29kZT4sIDxjb2RlPkludGVnZXI8L2NvZGU+LAotIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgaXMKLSB1bmRlZmluZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmF0dHJpYnV0ZU5hbWU8L0NPREU+IC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIGlzIHVuZGVmaW5lZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBdHRyaWJ1dGU8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0QXR0cmlidXRlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO2RlZmF1bHRWYWx1ZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gUmV0dXJucyB0aGUKLSBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkIG9yIHRoZSBtYXJrZXIgZG9lcyBub3QKLSBleGlzdCBvciBpcyBub3QgYW4gaW50ZWdlciB2YWx1ZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlTmFtZTwvQ09ERT4gLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLjxERD48Q09ERT5kZWZhdWx0VmFsdWU8L0NPREU+IC0gVGhlIHZhbHVlIHRvIHVzZSBpZiBubyBpbnRlZ2VyIHZhbHVlIGlzIGZvdW5kLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdmFsdWUgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm8gaW50ZWdlciB2YWx1ZSB3YXMgZm91bmQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEF0dHJpYnV0ZTwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0QXR0cmlidXRlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7ZGVmYXVsdFZhbHVlKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIHN0cmluZyB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuIFJldHVybnMgdGhlCi0gZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHVuZGVmaW5lZCBvciB0aGUgbWFya2VyIGRvZXMgbm90Ci0gZXhpc3Qgb3IgaXMgbm90IGEgc3RyaW5nIHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hdHRyaWJ1dGVOYW1lPC9DT0RFPiAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuPEREPjxDT0RFPmRlZmF1bHRWYWx1ZTwvQ09ERT4gLSBUaGUgdmFsdWUgdG8gdXNlIGlmIG5vIHZhbHVlIGlzIGZvdW5kLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdmFsdWUgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm8gdmFsdWUgd2FzIGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBdHRyaWJ1dGU8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmdldEF0dHJpYnV0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2RlZmF1bHRWYWx1ZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gUmV0dXJucyB0aGUKLSBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkIG9yIHRoZSBtYXJrZXIgZG9lcyBub3QKLSBleGlzdCBvciBpcyBub3QgYSBib29sZWFuIHZhbHVlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hdHRyaWJ1dGVOYW1lPC9DT0RFPiAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuPEREPjxDT0RFPmRlZmF1bHRWYWx1ZTwvQ09ERT4gLSBUaGUgdmFsdWUgdG8gdXNlIGlmIG5vIHZhbHVlIGlzIGZvdW5kLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdmFsdWUgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm8gdmFsdWUgd2FzIGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QXR0cmlidXRlcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBdHRyaWJ1dGVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS51dGlsLk1hcCA8Qj5nZXRBdHRyaWJ1dGVzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIG1hcCB3aXRoIGFsbCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIG1hcmtlci4gSWYgdGhlIG1hcmtlciBoYXMKLSBubyBhdHRyaWJ1dGVzIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSBtYXAgb2YgYXR0cmlidXRlIGtleXMgYW5kIHZhbHVlcyAoa2V5IHR5cGUgOgotICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIHR5cGUgOiA8Y29kZT5TdHJpbmc8L2NvZGU+LAotICAgICAgICA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgb3IgPGNvZGU+Qm9vbGVhbjwvY29kZT4pIG9yIDxjb2RlPm51bGw8L2NvZGU+LjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UmVzb3VyY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UmVzb3VyY2U8L0gzPgotPFBSRT4KLXB1YmxpYyBJUmVzb3VyY2UgPEI+Z2V0UmVzb3VyY2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSByZXNvdXJjZSB3aXRoIHdoaWNoIHRoaXMgbWFya2VyIGlzIGFzc29jaWF0ZWQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHJlc291cmNlIHdpdGggd2hpY2ggdGhpcyBtYXJrZXIgaXMgYXNzb2NpYXRlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VHlwZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRUeXBlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRUeXBlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIG1hcmtlci4gVGhlIHJldHVybmVkIG1hcmtlciB0eXBlIHdpbGwgbm90IGJlIAotIDxjb2RlPm51bGw8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSB0eXBlIG9mIHRoaXMgbWFya2VyPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRUeXBlKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRUeXBlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRUeXBlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dHlwZSk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBtYXJrZXIgdHlwZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dHlwZTwvQ09ERT4gLSBUaGUgbWFya2VyIGlkIHRvIHVzZSB3aGVuIGNyZWF0aW5nIG5ldyBtYXJrZXJzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEF0dHJpYnV0ZTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0QXR0cmlidXRlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBpbnRlZ2VyIHZhbHVlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSA8cD4KLSBUaGlzIG1ldGhvZCBjaGFuZ2VzIHJlc291cmNlczsgdGhlc2UgY2hhbmdlcyB3aWxsIGJlIHJlcG9ydGVkIGluIGEKLSBzdWJzZXF1ZW50IHJlc291cmNlIGNoYW5nZSBldmVudCwgaW5jbHVkaW5nIGFuIGluZGljYXRpb24gdGhhdCB0aGlzCi0gbWFya2VyIGhhcyBiZWVuIG1vZGlmaWVkLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlTmFtZTwvQ09ERT4gLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSBUaGUgdmFsdWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEF0dHJpYnV0ZTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0QXR0cmlidXRlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuIFRoZSB2YWx1ZSBtdXN0IGJlCi0gPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKLSA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgb3IgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmF0dHJpYnV0ZU5hbWU8L0NPREU+IC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gVGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIGlzIHRvIGJlIHVuZGVmaW5lZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0QXR0cmlidXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRBdHRyaWJ1dGU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBib29sZWFuIHZhbHVlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlTmFtZTwvQ09ERT4gLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLjxERD48Q09ERT52YWx1ZTwvQ09ERT4gLSBUaGUgdmFsdWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRBdHRyaWJ1dGVzKGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLk9iamVjdFtdKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0QXR0cmlidXRlczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0QXR0cmlidXRlczwvQj4oamF2YS5sYW5nLlN0cmluZ1tdJm5ic3A7YXR0cmlidXRlTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3RbXSZuYnNwO3ZhbHVlcyk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBnaXZlbiBhdHRyaWJ1dGUga2V5LXZhbHVlIHBhaXJzIG9uIHRoaXMgbWFya2VyLiBUaGUgdmFsdWVzIG11c3QKLSBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgotIDxjb2RlPlN0cmluZzwvY29kZT4sIDxjb2RlPkludGVnZXI8L2NvZGU+LCBvciA8Y29kZT5Cb29sZWFuPC9jb2RlPi4gSWYgYQotIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaXMgY29uc2lkZXJlZAotIHRvIGJlIHVuZGVmaW5lZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlTmFtZXM8L0NPREU+IC0gQW4gYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzLjxERD48Q09ERT52YWx1ZXM8L0NPREU+IC0gQW4gYXJyYXkgb2YgYXR0cmlidXRlIHZhbHVlcy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldEF0dHJpYnV0ZXMoamF2YS51dGlsLk1hcCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEF0dHJpYnV0ZXM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldEF0dHJpYnV0ZXM8L0I+KGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuT2JqZWN0Jmd0OyZuYnNwO2F0dHJpYnV0ZXMpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyBtYXJrZXIgdG8gYmUgdGhlIG9uZXMgY29udGFpbmVkIGluIHRoZSBnaXZlbgotIHRhYmxlLiBUaGUgdmFsdWVzIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKLSA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgb3IgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0gQXR0cmlidXRlcyBwcmV2aW91c2x5IHNldCBvbiB0aGUgbWFya2VyIGJ1dCBub3QgaW5jbHVkZWQgaW4gdGhlIGdpdmVuIG1hcAotIGFyZSBjb25zaWRlcmVkIHRvIGJlIHJlbW92YWxzLiBUaGlzIGluY2x1ZGVzIHRoZSB0ZXh0IG9mIHRoZSBtZXNzYWdlLgotIFNldHRpbmcgdGhlIGdpdmVuIG1hcCB0byBiZQotIDxjb2RlPm51bGw8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgYWxsIG1hcmtlciBhdHRyaWJ1dGVzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hdHRyaWJ1dGVzPC9DT0RFPiAtIEEgbWFwIG9mIGF0dHJpYnV0ZSBuYW1lcyB0byBhdHRyaWJ1dGUgdmFsdWVzIChrZXkgdHlwZSA6Ci0gICAgICAgICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSB0eXBlIDogPGNvZGU+U3RyaW5nPC9jb2RlPiwKLSAgICAgICAgICAgICAgICA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgb3IgPGNvZGU+Qm9vbGVhbjwvY29kZT4pIG9yIDxjb2RlPm51bGw8L2NvZGU+LjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdG9yTWVzc2FnZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvQWJzdHJhY3RWYWxpZGF0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1MWZiMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvQWJzdHJhY3RWYWxpZGF0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZUFic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkFic3RyYWN0VmFsaWRhdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkFic3RyYWN0VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldERlbGVnYXRlZFZhbGlkYXRvcigpIj5nZXREZWxlZ2F0ZWRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGFjdHVhbCB2YWxpZGF0b3IgdGhhdCBpcyBnb2luZyB0byBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkFic3RyYWN0VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldFZhbGlkYXRvcigpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJBYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0RlcGVuZGVudFJlc291cmNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvRGVwZW5kZW50UmVzb3VyY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhZjFhYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvRGVwZW5kZW50UmVzb3VyY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkRlcGVuZGVudFJlc291cmNlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5EZXBlbmRlbnRSZXNvdXJjZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZURlcGVuZGVudFJlc291cmNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5EZXBlbmRlbnRSZXNvdXJjZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkRlcGVuZGVudFJlc291cmNlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIHR5cGVzIHdpdGggYXJndW1lbnRzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5MaXN0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+RGVwZW5kZW50UmVzb3VyY2U8L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JRGVwZW5kZW5jeUluZGV4LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwjZ2V0KElSZXNvdXJjZSkiPmdldDwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZURlcGVuZGVudFJlc291cmNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9GcmllbmQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9GcmllbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0Zjc3My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvRnJpZW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5GcmllbmQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkZyaWVuZCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VGcmllbmQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJGcmllbmQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5GcmllbmQ8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uRnJpZW5kCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VGcmllbmQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJGcmllbmQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JRGVwZW5kZW5jeUluZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSURlcGVuZGVuY3lJbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjY5YWVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JRGVwZW5kZW5jeUluZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSURlcGVuZGVuY3lJbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklEZXBlbmRlbmN5SW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSURlcGVuZGVuY3lJbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JRGVwZW5kZW5jeUluZGV4PC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklEZXBlbmRlbmN5SW5kZXg8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JRGVwZW5kZW5jeUluZGV4PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SURlcGVuZGVuY3lJbmRleDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SURlcGVuZGVuY3lJbmRleDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldERlcGVuZGVuY3lJbmRleCgpIj5nZXREZXBlbmRlbmN5SW5kZXg8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGRlcGVuZGVuY3kgaW5kZXguPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZUlEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSU11dGFibGVWYWxpZGF0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JTXV0YWJsZVZhbGlkYXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTFhZDIxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JTXV0YWJsZVZhbGlkYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSU11dGFibGVWYWxpZGF0b3IiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sI2dldFZhbGlkYXRvcnMoKSI+Z2V0VmFsaWRhdG9yczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5NdXRhYmxlUHJvamVjdFNldHRpbmdzLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwjZ2V0VmFsaWRhdG9ycygpIj5nZXRWYWxpZGF0b3JzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5Db25zdHJ1Y3RvcnMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwjTXV0YWJsZVByb2plY3RTZXR0aW5ncyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSU11dGFibGVWYWxpZGF0b3JbXSkiPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklNdXRhYmxlVmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yW10sIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzVmFsdWVzKSI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W10mbmJzcDt2YWxpZGF0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzVmFsdWVzJm5ic3A7dmFsdWVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjk3ODBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JUGVyZm9ybWFuY2VNb25pdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwjZ2V0Q29sbGVjdGlvbkxldmVsKCkiPmdldENvbGxlY3Rpb25MZXZlbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgbGV2ZWwgb2YgcGVyZm9ybWFuY2UgZXZlbnRzIHRoYXQgYXJlIGJlaW5nIGNvbGxlY3RlZCBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsdWVPZjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCN2YWx1ZXMoKSI+dmFsdWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JUGVyZm9ybWFuY2VNb25pdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwjc2V0Q29sbGVjdGlvbkxldmVsKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsKSI+c2V0Q29sbGVjdGlvbkxldmVsPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPiZuYnNwO2xldmVsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBwZXJmb3JtYW5jZSBldmVudCBjb2xsZWN0aW9uIGxldmVsLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZUlQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWMyOWUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVBlcmZvcm1hbmNlTW9uaXRvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3IiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFBlcmZvcm1hbmNlTW9uaXRvcigpIj5nZXRQZXJmb3JtYW5jZU1vbml0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYSBwZXJmb3JtYW5jZSBtb25pdG9yIGZvciB0aGUgdmFsaWRhdG9ycy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZWMxZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklWYWxpZGF0b3JHcm91cExpc3RlbmVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklWYWxpZGF0b3JHcm91cExpc3RlbmVyCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwOTAzMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI2dldEN1cnJlbnQoKSI+Z2V0Q3VycmVudDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgY3VycmVudCBzZXZlcml0eSBmb3IgdGhlIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCNnZXREZWZhdWx0KCkiPmdldERlZmF1bHQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGRlZmF1bHQgc2V2ZXJpdHkgYXMgZGVmaW5lZCBieSB0aGUgdmFsaWRhdG9yIG93bmVyLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsdWVPZjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sI3ZhbHVlcygpIj52YWx1ZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwjc2V0Q3VycmVudChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5KSI+c2V0Q3VycmVudDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+Jm5ic3A7c2V2ZXJpdHkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIGN1cnJlbnQgbWVzc2FnZSBzZXZlcml0eS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNvbnN0cnVjdG9ycyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI01lc3NhZ2VTZXZlcml0eVNldHRpbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSkiPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4mbmJzcDtkZWZhdWx0U2V2ZXJpdHkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIGxhYmVsIGFuZCBhIG1lc3NhZ2Ugc2V2ZXJpdHkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMWU4ODguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmcKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmciOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZU1lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI2NvcHkoKSI+Y29weTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGNvcHkgb2YgdGhpcyBvYmplY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykiPmdldE1lc3NhZ2U8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNZXNzYWdlU2V0dGluZ3MoKSI+Z2V0TWVzc2FnZVNldHRpbmdzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFsbCB0aGUgbWVzc2FnZSBzZXR0aW5ncyB0aGF0IHRoaXMgdmFsaWRhdG9yIGhhcyBkZWZpbmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kIHBhcmFtZXRlcnMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHR5cGUgYXJndW1lbnRzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkZyaWVuZC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjc2V0TWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBqYXZhLnV0aWwuTWFwKSI+c2V0TWVzc2FnZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiZndDsmbmJzcDttYXApPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzU3YTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVQcm9qZWN0U2V0dGluZ3MKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVQcm9qZWN0U2V0dGluZ3MiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZU11dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVByb2plY3RTZXR0aW5nczwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFByb2plY3RTZXR0aW5ncyhJUHJvamVjdCkiPmdldFByb2plY3RTZXR0aW5nczwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIG9uIHRoZQotIHByb2plY3QuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNhcHBseUNoYW5nZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVByb2plY3RTZXR0aW5ncywgYm9vbGVhbikiPmFwcGx5Q2hhbmdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPiZuYnNwO3NldHRpbmdzLAotICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtwZXJzaXN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QXBwbHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gYmVlbiB0byB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VNdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQwN2ZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZU11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRXb3Jrc3BhY2VTZXR0aW5ncygpIj5nZXRXb3Jrc3BhY2VTZXR0aW5nczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGF0IHRoZSB3b3Jrc3BhY2UgbGV2ZWwuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjYXBwbHlDaGFuZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncywgYm9vbGVhbikiPmFwcGx5Q2hhbmdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT4mbmJzcDtzZXR0aW5ncywKLSAgICAgICAgICAgICBib29sZWFuJm5ic3A7cGVyc2lzdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FwcGx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGJlZW4gdG8gdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvUGVyZm9ybWFuY2VDb3VudGVycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWM4ZjViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VQZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlBlcmZvcm1hbmNlQ291bnRlcnM8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIHR5cGVzIHdpdGggYXJndW1lbnRzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklQZXJmb3JtYW5jZU1vbml0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNnZXRQZXJmb3JtYW5jZUNvdW50ZXJzKGJvb2xlYW4pIj5nZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2FzU3VtbWFyeSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHNvIGZhci48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVBlcmZvcm1hbmNlTW9uaXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sI2FkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzKSI+YWRkPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+Jm5ic3A7Y291bnRlcnMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBZGQgdGhpcyBwZXJmb3JtYW5jZSBjb3VudGVyIHRvIHRoZSBtb25pdG9yLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVBlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJQZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvUmVwb3J0ZXJIZWxwZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9SZXBvcnRlckhlbHBlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM3YmU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9SZXBvcnRlckhlbHBlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uUmVwb3J0ZXJIZWxwZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlJlcG9ydGVySGVscGVyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJSZXBvcnRlckhlbHBlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlJlcG9ydGVySGVscGVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlJlcG9ydGVySGVscGVyCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVJlcG9ydGVySGVscGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRXZlbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRXZlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1YjZjMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvbkV2ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQ8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj5zaG91bGRDbGVhck1hcmtlcnM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTaG91bGQgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGZpcnN0IGNsZWFyIHRoZSBtYXJrZXJzIHRoYXQgdGhpcwotIHZhbGlkYXRvciBoYXMgcGxhY2VkIG9uIHRoaXMgcmVzb3VyY2U/PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RWYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjc2hvdWxkQ2xlYXJNYXJrZXJzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPnNob3VsZENsZWFyTWFya2VyczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1Nob3VsZCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZmlyc3QgY2xlYXIgdGhlIG1hcmtlcnMgdGhhdCB0aGlzCi0gdmFsaWRhdG9yIGhhcyBwbGFjZWQgb24gdGhpcyByZXNvdXJjZT88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RWYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzdlZTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcgotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVjYWZkMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvbkZyYW1ld29yay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yawotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yayI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkZyYW1ld29yazwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkZyYW1ld29yazwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkZyYW1ld29yazwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0RGVmYXVsdCgpIj5nZXREZWZhdWx0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBzaW5nbGV0b24sIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZWU2ZTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RWYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZSB0aGUgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPmFic3RyYWN0ICZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYxLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj52YWxpZGF0ZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yLAotICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj52YWxpZGF0ZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yLAotICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5BYnN0cmFjdFZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50LAotICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZSB0aGUgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25SZXN1bHQuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNtZXJnZVJlc3VsdHMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdCkiPm1lcmdlUmVzdWx0czwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPiZuYnNwO3Jlc3VsdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO01lcmdlIHRoZSBtZXNzYWdlIGNvdW50cyBhbmQgbWVzc2FnZXMgZnJvbSBhbiBpbmRpdmlkdWFsIHZhbGlkYXRvciBpbnRvIHRoaXMgcmVzdWx0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+Q29uc3RydWN0b3JzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCNWYWxpZGF0aW9uUmVzdWx0cyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0KSI+VmFsaWRhdGlvblJlc3VsdHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4mbmJzcDtyZXN1bHQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvblJlc3VsdHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlNGMxNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvblJlc3VsdHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHRzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0cyI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0czwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0czwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdHM8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjdmFsaWRhdGUoSUZpbGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KElGaWxlJm5ic3A7ZmlsZSwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgYSBzcGVjaWZpYyBmaWxlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjdmFsaWRhdGUoSVByb2plY3RbXSwgYm9vbGVhbiwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oSVByb2plY3RbXSZuYnNwO3Byb2plY3RzLAotICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSBwcm9qZWN0cy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25TdGF0ZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25TdGF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFhNDBkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uU3RhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRpb25TdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25TdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI2NsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj5jbGVhbjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSBjYWxsIGJhY2sgbWV0aG9kIHRoYXQgbGV0cyB0aGUgdmFsaWRhdG9yIGtub3cgdGhhdCB0aGUgcHJvamVjdCBpcyBiZWluZwotIGNsZWFuZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5BYnN0cmFjdFZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uRmluaXNoaW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RWYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgdGhlIHZhbGlkYXRpb25TdGFydGluZyBtZXRob2Qgd2FzIGNhbGxlZCBvbiB0aGUgcmVzb3VyY2UsIHRoZW4gdGhpcwotIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCB2YWxpZGF0b3IgaGFzIHByb2Nlc3NlZCB0aGUKLSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwjdmFsaWRhdGlvblN0YXJ0aW5nKElSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCB2YWxpZGF0b3IgaW4gdGhlIGdyb3VwIHRoYXQgaXMgaW50ZXJlc3RlZAotIGluIHRoZSByZXNvdXJjZSBpcyBjYWxsZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuTGV2ZWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuTGV2ZWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0MTViMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLkxldmVsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuTGV2ZWwKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbDwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNnZXRMZXZlbCgpIj5nZXRMZXZlbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLkxldmVsLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj52YWx1ZU9mPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLkxldmVsLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCN2YWx1ZXMoKSI+dmFsdWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjc2V0TGV2ZWwob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLkxldmVsKSI+c2V0TGV2ZWw8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4mbmJzcDtsZXZlbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWVlYjE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjEuVjFDb3B5Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjEuVjFDb3B5IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMS5WMUNvcHk8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxLlYxQ29weQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLlYxLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLlYxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjU4MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvci5WMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjEiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdG9yLlYxLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYxLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+U3ViY2xhc3NlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YxVmFsaWRhdG9yKCkiPmFzVjFWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJZiB5b3UgYXJlIGEgdmVyc2lvbiAxIHZhbGlkYXRvciwgYW5zd2VyIHlvdXJzZWxmIGFzIG9uZSwgb3RoZXJ3aXNlIGFuc3dlciBudWxsLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjYXNWMVZhbGlkYXRvcigpIj5hc1YxVmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuVjEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxN2VkOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLlYyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuVjIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjI8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2FzVjJWYWxpZGF0b3IoKSI+YXNWMlZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHlvdSBhcmUgYSB2ZXJzaW9uIDIgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNhc1YyVmFsaWRhdG9yKCkiPmFzVjJWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5BYnN0cmFjdFZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCNnZXRQYXJlbnQoKSI+Z2V0UGFyZW50PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSB2YWxpZGF0b3IgdGhhdCB5b3UgYmVsb25nIHRvLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdG9yLlYyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWY3MjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+U3ViY2xhc3NlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAxIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMS5WMUNvcHk8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAyIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29weSgpIj5jb3B5PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGEgZGVlcCBjb3B5IG9mIHlvdXJzZWxmLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5hYnN0cmFjdCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29weShib29sZWFuKSI+Y29weTwvQT48L0I+KGJvb2xlYW4mbmJzcDtpbmNsdWRlQ2hhbmdlQ291bnRzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYxLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNjb3B5KGJvb2xlYW4pIj5jb3B5PC9BPjwvQj4oYm9vbGVhbiZuYnNwO2luY2x1ZGVDaGFuZ2VDb3VudHMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2NvcHkoYm9vbGVhbikiPmNvcHk8L0E+PC9CPihib29sZWFuJm5ic3A7aW5jbHVkZUNoYW5nZUNvdW50cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY3JlYXRlKElDb25maWd1cmF0aW9uRWxlbWVudCwgSVByb2plY3QpIj5jcmVhdGU8L0E+PC9CPihJQ29uZmlndXJhdGlvbkVsZW1lbnQmbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGEgbmV3IHZhbGlkYXRvciBiYXNlZCBvbiBhIGFic3RyYWN0IHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NyZWF0ZShWYWxpZGF0b3JNZXRhRGF0YSwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24sIElQcm9qZWN0KSI+Y3JlYXRlPC9BPjwvQj4oVmFsaWRhdG9yTWV0YURhdGEmbmJzcDt2bWQsCi0gICAgICAgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24mbmJzcDtjb25maWcsCi0gICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGEgbmV3IHZhbGlkYXRvciBiYXNlZCBvbiB2YWxpZGF0b3IgbWV0YSBkYXRhLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRlcGVuZGVudFJlc291cmNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sI2dldFZhbGlkYXRvcigpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRvciB0aGF0IGFzc2VydGVkIHRoZSBkZXBlbmRlbmN5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZykiPmdldFZhbGlkYXRvcjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxCPkRlcHJlY2F0ZWQuPC9CPiZuYnNwOzxJPlVzZSBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KSB3aXRoIGEgbnVsbCBwcm9qZWN0IGluc3RlYWQuPC9JPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZywgSVByb2plY3QpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQgdGhhdCBpcyBpbiBlZmZlY3QgZm9yIHRoZSBnaXZlbgotIHByb2plY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0VmFsaWRhdG9ycygpIj5nZXRWYWxpZGF0b3JzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGNvcGllcyBvZiBhbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QoSVByb2plY3QpIj5nZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3Q8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0b3JzIGNhbiB1c2UgcHJvamVjdCBsZXZlbCBzZXR0aW5ncyAoUHJvamVjdCBuYXR1cmVzIGFuZCBmYWNldHMpIHRvCi0gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGFwcGxpY2FibGUgdG8gdGhlIHByb2plY3Qgb3Igbm90LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFZhbGlkYXRvcnNGb3IoSVJlc291cmNlKSI+Z2V0VmFsaWRhdG9yc0ZvcjwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhcHBsaWNhYmxlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0VmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj5nZXRWYWxpZGF0b3JzRm9yPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5TZXQmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldERpc2FibGVkVmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UpIj5nZXREaXNhYmxlZFZhbGlkYXRvcnNGb3I8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhbGwgdGhlIHZhbGlkYXRvcnMgdGhhdCBzaG91bGQgbm90IHZhbGlkYXRlIHRoZSByZXNvdXJjZSwgZWl0aGVyCi0gYmVjYXVzZSB0aGVpciBmaWx0ZXJzIGRvbid0IHN1cHBvcnQgdGhlIHJlc291cmNlLCBvciB0aGUgdmFsaWRhdG9yIGhhcwotIGJlZW4gZGlzYWJsZWQgZm9yIGJvdGggYnVpbGQgdmFsaWRhdGlvbiBhbmQgbWFudWFsIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29tcGFyZVRvKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmNvbXBhcmVUbzwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDb21wYXJlIHlvdXJzZWxmIGJhc2VkIG9uIFZhbGlkYXRvciBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNpc0xvYWRlZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5pc0xvYWRlZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiBhY3RpdmF0ZWQsIGkuZS4gaGFzIHRoZQotIGJ1bmRsZSB0aGF0IGRlZmluZXMgdGhlIHZhbGlkYXRvciBiZWVuIGxvYWRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5GcmllbmQuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sI2lzTG9hZGVkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmlzTG9hZGVkPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0hhcyB0aGUgdmFsaWRhdG9yJ3MgaW1wbGVtZW50YXRpb24gYmVlbiBsb2FkZWQgeWV0PzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2FtZUNvbmZpZyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5zYW1lQ29uZmlnPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0cnVlIGlmIHlvdSBoYXZlIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYXMgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNzYXZlVmFsaWRhdG9ycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JbXSkiPnNhdmVWYWxpZGF0b3JzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NhdmUgdGhlIHZhbGlkYXRvcnMgc2V0dGluZ3MgaW50byB0aGUgcGVyc2lzdGVudCBzdG9yZSwgdGhlcmUgYnkgbWFraW5nIHRoZWlyIHNldHRpbmdzIHRoZSBhY3RpdmUgc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RnJpZW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCNzZXRNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IsIGphdmEudXRpbC5NYXApIj5zZXRNZXNzYWdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Jmd0OyZuYnNwO21hcCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkZyaWVuZC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjc2V0TWlncmF0ZWQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBib29sZWFuKSI+c2V0TWlncmF0ZWQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgYm9vbGVhbiZuYnNwO21pZ3JhdGVkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RnJpZW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCNzaG91bGRWYWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IsIElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudFR5cGVXcmFwcGVyKSI+c2hvdWxkVmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlciZuYnNwO2NvbnRlbnRUeXBlV3JhcHBlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkZyaWVuZC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjc2hvdWxkVmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBJUmVzb3VyY2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlcikiPnNob3VsZFZhbGlkYXRlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgIElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSZuYnNwO3ZhbFR5cGUsCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50VHlwZVdyYXBwZXImbmJzcDtjb250ZW50VHlwZVdyYXBwZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNvbnN0cnVjdG9ycyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sI0RlcGVuZGVudFJlc291cmNlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+RGVwZW5kZW50UmVzb3VyY2U8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3JNZXNzYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGMxNTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2UKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yTWVzc2FnZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2FzQ29weSgpIj5hc0NvcHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYSBjb3B5IG9mIHlvdXJzZWxmLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yTWVzc2FnZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UpIj5jcmVhdGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSwKLSAgICAgICBJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZSBhIG5ldyB2YWxpZGF0aW9uIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25SZXN1bHRzLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sI2dldE1lc3NhZ2VzKCkiPmdldE1lc3NhZ2VzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFueSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRoYXQgd2VyZSBhZGRlZCBieSB0aGUgdmFsaWRhdGlvbiBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25SZXN1bHQuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXRNZXNzYWdlcygpIj5nZXRNZXNzYWdlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvblJlc3VsdC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldE1lc3NhZ2VzQXNDb3B5KCkiPmdldE1lc3NhZ2VzQXNDb3B5PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGEgY29weSBvZiBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvblJlc3VsdC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2FkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlKSI+YWRkPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgYW4gb3B0aW9uYWwgbWV0aG9kLCB0aGF0IGEgdmFsaWRhdG9yIGNhbiB1c2UgdG8gcmV0dXJuIGVycm9yCi0gbWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2RvYy1maWxlcy9mYXEuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2RvYy1maWxlcy9mYXEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5NmQwYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9kb2MtZmlsZXMvZmFxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlZhbGlkYXRpb24gRnJhbWV3b3JrIC0gRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+VmFsaWRhdGlvbiBGcmFtZXdvcmsgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvaDE+Ci08aDM+SG93IGRvIEkgY3JlYXRlIFByb2JsZW0gTWFya2Vycz88L2gzPgotPHA+VGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCB3YXlzIHRvIGNyZWF0ZSBwcm9ibGVtIG1hcmtlcnMuPC9wPgotPG9sPgotCTxsaT5Vc2UgdGhlIG5hdGl2ZSBzdXBwb3J0IGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L2xpPgotCTxsaT5NYW5hZ2UgeW91ciBvd24gbWFya2Vycy48L2xpPgotCTxsaT5Vc2UgdGhlIHN1cHBvcnQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvbGk+Ci08L29sPgotPHA+VGhlIGZpcnN0IGFwcHJvYWNoLCBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2guPC9wPgotCi08aDQ+MS4gVXNlIHRoZSBuYXRpdmUgc3VwcG9ydCBpbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcms8L2g0PgotPHA+QWZ0ZXIgeW91IGhhdmUgZmluaXNoZWQgcGVyZm9ybWluZyB5b3VyIHZhbGlkYXRpb24sIGFuZCBhcmUgcmV0dXJuaW5nIGNvbnRyb2wgYmFjayB0bwotdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBhZGQgeW91ciBtZXNzYWdlcyBpbnRvIHRoZSAKLTxhIGhyZWY9Ii4uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCI+VmFsaWRhdGlvblJlc3VsdDwvYT4gYnkgdXNpbmcKLXRoZSA8YSBocmVmPSIuLi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjYWRkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2UpIj5hZGQoVmFsaWRhdG9yTWVzc2FnZSBtZXNzYWdlKTwvYT4gbWV0aG9kLgotCi08aDQ+Mi4gTWFuYWdlIHlvdXIgb3duIG1hcmtlcnM8L2g0PgotCi08cD5DcmVhdGUgYW5kIHJlbW92ZSB5b3VyIG93biBtYXJrZXJzLiBTbyB0aGF0IHN1bW1hcnkgaW5mb3JtYXRpb24gY2FuIHN0aWxsIGJlIGRpc3BsYXllZCwgc2V0IHRoZSBjb3VudHMgb2YgYW55IG5ld2x5Ci1jcmVhdGVkIG1hcmtlcnMgaW4gdGhlIDxhIGhyZWY9Ii4uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCI+VmFsaWRhdGlvblJlc3VsdDwvYT4gYnkgdXNpbmcgdGhlIHNldFNldmVyaXR5WFhYKCkgbWV0aG9kcy4KLUZvciBleGFtcGxlLCBpZiB0aGlzIHZhbGlkYXRpb24gcGFzcyBnZW5lcmF0ZWQgdHdvIGVycm9yIG1hcmtlcnMsIHlvdSB3b3VsZCBjYWxsIAotPGEgaHJlZj0iLi4vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldFNldmVyaXR5RXJyb3IoaW50KSI+c2V0U2V2ZXJpdHlFcnJvcigyKTwvYT4uIAotPC9wPgotCi08aDQ+My4gVXNlIHRoZSBzdXBwb3J0IGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yazwvaDQ+Ci0KLTxwPklmIHlvdSBhcmUgcG9ydGluZyBhIHZhbGlkYXRvciB0aGF0IHVzZWQgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBhbmQgeW91IHdpc2ggdG8gY29udGludWUgdG8gdXNlIGFuCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIj5JUmVwb3J0ZXI8L2E+IHRvCi1yZXBvcnQgeW91ciBtYXJrZXJzLCB5b3UgY2FuIGNvbnRpbnVlIHRvIGRvIHNvLjwvcD4KLTxwPkZvciB0aGlzIGFwcHJvYWNoLCB1c2UgdGhlCi08YSBocmVmPSIuLi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvcikiPmdldFJlcG9ydGVyKElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvYT4gbWV0aG9kLAotYW5kIHJldHVybiB5b3VyIG1lc3NhZ2VzIHRocm91Z2ggdGhlIElSZXBvcnRlci4gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGl0IGlzIGFzc3VtZWQgYnkgdGhlIGZyYW1ld29yaywgCi10aGF0IHRoaXMgSVJlcG9ydGVyIHdpbGwgYmUgdXNlZCBhcyB0aGUgb25seSB3YXkgb2YgcGFzc2luZyBtZXNzYWdlcyBiYWNrIHRvIHRoZSBmcmFtZXdvcmsuIAotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4ZDdmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLUlNZXNzYWdlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSU1lc3NhZ2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lNZXNzYWdlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElNZXNzYWdlPC9IMj4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SU1lc3NhZ2U8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLTxwPgotIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLgotIDwvcD4KLSA8cD4KLSBHaXZlbiB0aGVzZSB0aHJlZSB2YWx1ZXMgYXMgaW5wdXQsIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSBxdWVyaWVkIGZvciB0aGUgZmluYWwgbWVzc2FnZSBzdHJpbmcuCi0gKGkuZS4sIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBhcmFtZXRlcnMgYWxyZWFkeSBzdWJzdGl0dXRlZCBpbi4pIEVpdGhlciB0aGUgZGVmYXVsdCBMb2NhbGUgY2FuIGJlCi0gdXNlZCwgb3IgdGhlIGNhbGxlciBjYW4gc3BlY2lmeSBhIExvY2FsZS4KLSA8L3A+Ci0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PT09PSBGSUVMRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjQUxMX01FU1NBR0VTIj5BTExfTUVTU0FHRVM8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U3BlY2lmeSBhbGwgdHlwZXMgb2YgbWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjRVJST1JfQU5EX1dBUk5JTkciPkVSUk9SX0FORF9XQVJOSU5HPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NwZWNpZnkgaGlnaCAoZXJyb3IpIGFuZCBub3JtYWwgKHdhcm5pbmcpIG1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI0hJR0hfU0VWRVJJVFkiPkhJR0hfU0VWRVJJVFk8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VHlwaWNhbGx5IHVzZWQgdG8gc3BlY2lmeSBlcnJvciBtZXNzYWdlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNMSU5FTk9fVU5TRVQiPkxJTkVOT19VTlNFVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNMT1dfU0VWRVJJVFkiPkxPV19TRVZFUklUWTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUeXBpY2FsbHkgdXNlZCB0byBzcGVjaWZ5IGluZm9ybWF0aW9uIG1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI05PUk1BTF9TRVZFUklUWSI+Tk9STUFMX1NFVkVSSVRZPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1R5cGljYWxseSB1c2VkIHRvIHNwZWNpZnkgd2FybmluZyBtZXNzYWdlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNPRkZTRVRfVU5TRVQiPk9GRlNFVF9VTlNFVDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjVGFyZ2V0UmVzb3VyY2UiPlRhcmdldFJlc291cmNlPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RhcmdldFJlc291cmNlIC0gVGhlIGtleSB0byB1c2Ugd2hlbiBhc3NvY2lhdGluZyBhIHJlc291cmNlIHdpdGggYSBtZXNzYWdlIHZpYSBhbgotIGF0dHJpYnV0ZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5PYmplY3Q8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QXR0cmlidXRlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtQcm92aWRlcyBhIHdheSB0byBzdG9yZSBzb21lIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0aGF0IGEgbWVzc2FnZSB3b3VsZCBsaWtlIHRvIHN0b3JlCi0gdGhhdCBjYW4gdXNlZCBieSBzb21lIG90aGVyIHBhcnRpZXMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aG9zZSBhdHRyaWJ1dGUgdmFsdWVzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuSGFzaE1hcDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0QXR0cmlidXRlcygpIj5nZXRBdHRyaWJ1dGVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJuIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBhIE1lc3NhZ2Ugb2JqZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRCdW5kbGVOYW1lKCkiPmdldEJ1bmRsZU5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0R3JvdXBOYW1lKCkiPmdldEdyb3VwTmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RvIHN1cHBvcnQgcmVtb3ZhbCBvZiBhIHN1YnNldCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBhbiBJVmFsaWRhdG9yIG1heSBhc3NpZ24gZ3JvdXAgbmFtZXMKLSB0byBJTWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldElkKCkiPmdldElkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgaWQgb2YgdGhlIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0TGVuZ3RoKCkiPmdldExlbmd0aDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldExpbmVOdW1iZXIoKSI+Z2V0TGluZU51bWJlcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHRoZXJlIGlzIGEgdGFyZ2V0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTWVzc2FnZSwgYW5kIHRoYXQgdGFyZ2V0IG9iamVjdCBpcyBhIGZpbGUsCi0gdGhlbiBhbiBvcHRpb25hbCBsaW5lIG51bWJlciBtYXkgYmUgc2V0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRNYXJrZXJJZCgpIj5nZXRNYXJrZXJJZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybiB0aGUgbWFya2VyIGlkIGlmIG9uZSBpcyBzZXQgb24gdGhpcyBvYmplY3Qgd2hlbiBjcmVhdGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldE9mZnNldCgpIj5nZXRPZmZzZXQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmdbXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0UGFyYW1zKCkiPmdldFBhcmFtczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0U2V2ZXJpdHkoKSI+Z2V0U2V2ZXJpdHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBSZXR1cm5zIHRoZSBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLk9iamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0VGFyZ2V0T2JqZWN0KCkiPmdldFRhcmdldE9iamVjdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybiB0aGUgb2JqZWN0IHRoYXQgdGhpcyBJTWVzc2FnZSBpcyByZXBvcnRpbmcgdGhlIHByb2JsZW0gYWdhaW5zdCwgaWYgYW55LiBudWxsIHdpbGwgYmUKLSByZXR1cm5lZCBpZiB0aGlzIGlzIGEgZ2VuZXJhbCBtZXNzYWdlIHdoaWNoIGRvZXMgbm90IGFwcGx5IHRvIGEgcGFydGljdWxhciBvYmplY3Q7IGZvcgotIGV4YW1wbGUsICJpbnRlcm5hbCBlcnJvciIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldFRleHQoKSI+Z2V0VGV4dDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRUZXh0KGphdmEubGFuZy5DbGFzc0xvYWRlcikiPmdldFRleHQ8L0E+PC9CPihqYXZhLmxhbmcuQ2xhc3NMb2FkZXImbmJzcDtjbGFzc0xvYWRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRUZXh0KGphdmEudXRpbC5Mb2NhbGUpIj5nZXRUZXh0PC9BPjwvQj4oamF2YS51dGlsLkxvY2FsZSZuYnNwO2xvY2FsZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRUZXh0KGphdmEudXRpbC5Mb2NhbGUsIGphdmEubGFuZy5DbGFzc0xvYWRlcikiPmdldFRleHQ8L0E+PC9CPihqYXZhLnV0aWwuTG9jYWxlJm5ic3A7bG9jYWxlLAotICAgICAgICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXImbmJzcDtjbGFzc0xvYWRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPnNldEF0dHJpYnV0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB0aGUgYXR0cmlidXRlTmFtZSBhbmQgdmFsdWUgYXMga2V5IHZhbHVlIHBhaXIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI3NldEJ1bmRsZU5hbWUoamF2YS5sYW5nLlN0cmluZykiPnNldEJ1bmRsZU5hbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YnVuZGxlTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB0aGUgbmFtZSBvZiB0aGUgYnVuZGxlIHdoaWNoIHRoaXMgbWVzc2FnZSBpcyBjb250YWluZWQgaW4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI3NldEdyb3VwTmFtZShqYXZhLmxhbmcuU3RyaW5nKSI+c2V0R3JvdXBOYW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkgYXNzaWduIGdyb3VwIG5hbWVzCi0gdG8gSU1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0SWQ8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmV3SWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIGlkIG9mIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRMZW5ndGgoaW50KSI+c2V0TGVuZ3RoPC9BPjwvQj4oaW50Jm5ic3A7bGVuZ3RoKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9ibGVtLCBzdGFydGluZyBmcm9tIHRoZSBvZmZzZXQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI3NldExpbmVObyhpbnQpIj5zZXRMaW5lTm88L0E+PC9CPihpbnQmbmJzcDtsaW5lTnVtYmVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgdGhlcmUgaXMgYSB0YXJnZXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElNZXNzYWdlLCBhbmQgdGhhdCB0YXJnZXQgb2JqZWN0IGlzIGEgZmlsZSwKLSB0aGVuIGFuIG9wdGlvbmFsIGxpbmUgbnVtYmVyIG1heSBiZSBzZXQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI3NldE1hcmtlcklkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRNYXJrZXJJZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttYXJrZXJJZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB0aGUgbWFya2VyIGlkIG9uIGEgTWVzc2FnZSBvYmplY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI3NldE9mZnNldChpbnQpIj5zZXRPZmZzZXQ8L0E+PC9CPihpbnQmbmJzcDtvZmZzZXQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI3NldFBhcmFtcyhqYXZhLmxhbmcuU3RyaW5nW10pIj5zZXRQYXJhbXM8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nW10mbmJzcDtuZXdQYXJhbXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRTZXZlcml0eShpbnQpIj5zZXRTZXZlcml0eTwvQT48L0I+KGludCZuYnNwO25ld1NldmVyaXR5KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI3NldFRhcmdldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KSI+c2V0VGFyZ2V0T2JqZWN0PC9BPjwvQj4oamF2YS5sYW5nLk9iamVjdCZuYnNwO29iaik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fzc29jaWF0ZSB0aGlzIElNZXNzYWdlIHdpdGggdGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgcHJvYmxlbS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJPRkZTRVRfVU5TRVQiPjwhLS0gLS0+PC9BPjxIMz4KLU9GRlNFVF9VTlNFVDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5PRkZTRVRfVU5TRVQ8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLk9GRlNFVF9VTlNFVCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJMSU5FTk9fVU5TRVQiPjwhLS0gLS0+PC9BPjxIMz4KLUxJTkVOT19VTlNFVDwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5MSU5FTk9fVU5TRVQ8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLkxJTkVOT19VTlNFVCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJISUdIX1NFVkVSSVRZIj48IS0tIC0tPjwvQT48SDM+Ci1ISUdIX1NFVkVSSVRZPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPkhJR0hfU0VWRVJJVFk8L0I+PC9QUkU+Ci08REw+Ci08REQ+VHlwaWNhbGx5IHVzZWQgdG8gc3BlY2lmeSBlcnJvciBtZXNzYWdlcy4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5ISUdIX1NFVkVSSVRZIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Ik5PUk1BTF9TRVZFUklUWSI+PCEtLSAtLT48L0E+PEgzPgotTk9STUFMX1NFVkVSSVRZPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPk5PUk1BTF9TRVZFUklUWTwvQj48L1BSRT4KLTxETD4KLTxERD5UeXBpY2FsbHkgdXNlZCB0byBzcGVjaWZ5IHdhcm5pbmcgbWVzc2FnZXMuCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IkxPV19TRVZFUklUWSI+PCEtLSAtLT48L0E+PEgzPgotTE9XX1NFVkVSSVRZPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPkxPV19TRVZFUklUWTwvQj48L1BSRT4KLTxETD4KLTxERD5UeXBpY2FsbHkgdXNlZCB0byBzcGVjaWZ5IGluZm9ybWF0aW9uIG1lc3NhZ2VzLgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLkxPV19TRVZFUklUWSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJFUlJPUl9BTkRfV0FSTklORyI+PCEtLSAtLT48L0E+PEgzPgotRVJST1JfQU5EX1dBUk5JTkc8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+RVJST1JfQU5EX1dBUk5JTkc8L0I+PC9QUkU+Ci08REw+Ci08REQ+U3BlY2lmeSBoaWdoIChlcnJvcikgYW5kIG5vcm1hbCAod2FybmluZykgbWVzc2FnZXMuIFR5cGljYWxseSB1c2VkIHdpdGggYSBNZXNzYWdlRmlsdGVyLCB0bwotIGZpbHRlciBvdXQgaW5mb3JtYXRpb24gbWVzc2FnZXMuCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuRVJST1JfQU5EX1dBUk5JTkciPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iQUxMX01FU1NBR0VTIj48IS0tIC0tPjwvQT48SDM+Ci1BTExfTUVTU0FHRVM8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+QUxMX01FU1NBR0VTPC9CPjwvUFJFPgotPERMPgotPEREPlNwZWNpZnkgYWxsIHR5cGVzIG9mIG1lc3NhZ2VzLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGEgTWVzc2FnZUZpbHRlci4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5BTExfTUVTU0FHRVMiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iVGFyZ2V0UmVzb3VyY2UiPjwhLS0gLS0+PC9BPjxIMz4KLVRhcmdldFJlc291cmNlPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyA8Qj5UYXJnZXRSZXNvdXJjZTwvQj48L1BSRT4KLTxETD4KLTxERD5UYXJnZXRSZXNvdXJjZSAtIFRoZSBrZXkgdG8gdXNlIHdoZW4gYXNzb2NpYXRpbmcgYSByZXNvdXJjZSB3aXRoIGEgbWVzc2FnZSB2aWEgYW4KLSBhdHRyaWJ1dGUuIAotIDxwPgotIE5vcm1hbGx5LCB0aGUgdGFyZ2V0IGlzIHN0b3JlZCB1c2luZyB0aGUgc2V0VGFyZ2V0T2JqZWN0KCkgbWV0aG9kLCBidXQKLSBzb21lIG9mIHRoZSBsZWdhY3kgdmFsaWRhdG9ycyB1c2VkIHRoaXMgZmllbGQgZm9yIG9iamVjdHMgdGhhdCB3aGVyZSBub3QgSVJlc291cmNlcy4KLSBJbiBvcmRlciB0byBhc3NvY2lhdGUgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcHJvcGVyIElSZXNvdXJjZSB0aGUgdmFsaWRhdG9yIGNhbiBzdG9yZQotIHRoZSBJUmVzb3VyY2UgYXMgYW4gYXR0cmlidXRlIGFuZCB1c2UgdGhpcyBzdHJpbmcgYXMgdGhlIGtleS4KLSA8L3A+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuVGFyZ2V0UmVzb3VyY2UiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRCdW5kbGVOYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEJ1bmRsZU5hbWU8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0QnVuZGxlTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbmFtZSBvZiB0aGUgYnVuZGxlIHdoaWNoIHRoaXMgbWVzc2FnZSBpcyBjb250YWluZWQgaW4uPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRHcm91cE5hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0R3JvdXBOYW1lPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldEdyb3VwTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlRvIHN1cHBvcnQgcmVtb3ZhbCBvZiBhIHN1YnNldCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBhbiBJVmFsaWRhdG9yIG1heSBhc3NpZ24gZ3JvdXAgbmFtZXMKLSB0byBJTWVzc2FnZXMuIEFuIElNZXNzYWdlIHN1YnNldCB3aWxsIGJlIGlkZW50aWZpZWQgYnkgdGhlIG5hbWUgb2YgaXRzIGdyb3VwLiBEZWZhdWx0IChudWxsKQotIG1lYW5zIG5vIGdyb3VwLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBuYW1lIG9mIHRoZSBncm91cCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SWQ8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0SWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBpZCBvZiB0aGUgbWVzc2FnZS4gTWVzc2FnZSBpZHMgYXJlIHVzZWQgYXMgdGhlIGNvbnN0YW50cyBpbiBwcm9wZXJ0eSBidW5kbGVzCi0gd2hpY2ggbG9jYWxpemUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtZXNzYWdlIGluIGEgbG9jYWxlLWluZGVwZW5kZW50IGZhc2hpb24uIFRoZSBpZCBpcyB0aGUKLSBrZXksIGluIHRoZSByZXNvdXJjZSBidW5kbGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIHN0cmluZyB0byBiZSBsb2FkZWQuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwKLSBvciB0aGUgZW1wdHkgc3RyaW5nLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBpZCBvZiB0aGUgbWVzc2FnZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TGVuZ3RoKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldExlbmd0aDwvSDM+Ci08UFJFPgotaW50IDxCPmdldExlbmd0aDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbGVuZ3RoIG9mIHRoZSBwcm9ibGVtIGFyZWEsIHN0YXJ0aW5nIGZyb20gdGhlIG9mZnNldC4gSWYgdW5zZXQsIHZhbHVlID0KLSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldE9mZnNldCgpIj48Q09ERT5nZXRPZmZzZXQoKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRMaW5lTnVtYmVyKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldExpbmVOdW1iZXI8L0gzPgotPFBSRT4KLWludCA8Qj5nZXRMaW5lTnVtYmVyPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SWYgdGhlcmUgaXMgYSB0YXJnZXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElNZXNzYWdlLCBhbmQgdGhhdCB0YXJnZXQgb2JqZWN0IGlzIGEgZmlsZSwKLSB0aGVuIGFuIG9wdGlvbmFsIGxpbmUgbnVtYmVyIG1heSBiZSBzZXQuIFRoZSBsaW5lIG51bWJlciBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUKLSBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhpcyBtZXNzYWdlLiBJZiBubyBsaW5lIG51bWJlciBoYXMgYmVlbiBzZXQsICNMSU5FTk9fVU5TRVQgd2lsbCBiZQotIHJldHVybmVkLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmxpbmUgbnVtYmVyIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvYmxlbS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE9mZnNldCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRPZmZzZXQ8L0gzPgotPFBSRT4KLWludCA8Qj5nZXRPZmZzZXQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuIElmIHVuc2V0LCB2YWx1ZSA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVC4gRm9yIGV4YW1wbGUsIGlmCi0gdGhlIGphdmEgY29tcGlsZXIgd2VyZSBhIHZhbGlkYXRvciwgYW5kIGl0IHJlcG9ydGVkIHRoYXQgYSB2YXJpYWJsZSBuYW1lIHdhcyB1bmtub3duLCBvZmZzZXQKLSB3b3VsZCBpZGVudGlmeSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdW5rbm93biB2YXJpYWJsZS4gVGhlIHBvc2l0aW9uIGlzCi0gaWRlbnRpZmllZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+b2Zmc2V0IG9mIHRoZSBtZXNzYWdlPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQYXJhbXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UGFyYW1zPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nW10gPEI+Z2V0UGFyYW1zPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbWVzc2FnZS4gTWVzc2FnZSBwYXJhbWV0ZXJzIGFyZSB0aGUgdmFsdWVzIHdoaWNoIGFyZQotIHN1YnN0aXR1dGVkIGludG8gcGFyYW1ldGVyIHNsb3RzIGluIGxvY2FsaXplZCBtZXNzYWdlIHRleHQgZGVzY3JpcHRpb25zLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnBhcmFtZXRlcnMgb2YgdGhlIG1lc3NhZ2U8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNldmVyaXR5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNldmVyaXR5PC9IMz4KLTxQUkU+Ci1pbnQgPEI+Z2V0U2V2ZXJpdHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48cD4KLSBSZXR1cm5zIHRoZSBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZS4gT25lIG9mIFNldmVyaXR5RW51bSBjb25zdGFudHMuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI0hJR0hfU0VWRVJJVFkiPjxDT0RFPkhJR0hfU0VWRVJJVFk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjTk9STUFMX1NFVkVSSVRZIj48Q09ERT5OT1JNQUxfU0VWRVJJVFk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjTE9XX1NFVkVSSVRZIj48Q09ERT48L3A+PC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFRhcmdldE9iamVjdCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRUYXJnZXRPYmplY3Q8L0gzPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QgPEI+Z2V0VGFyZ2V0T2JqZWN0PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJuIHRoZSBvYmplY3QgdGhhdCB0aGlzIElNZXNzYWdlIGlzIHJlcG9ydGluZyB0aGUgcHJvYmxlbSBhZ2FpbnN0LCBpZiBhbnkuIG51bGwgd2lsbCBiZQotIHJldHVybmVkIGlmIHRoaXMgaXMgYSBnZW5lcmFsIG1lc3NhZ2Ugd2hpY2ggZG9lcyBub3QgYXBwbHkgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdDsgZm9yCi0gZXhhbXBsZSwgImludGVybmFsIGVycm9yIi4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdGFyZ2V0IG9iamVjdCBmb3IgdGhlIG1lc3NhZ2U8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFRleHQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VGV4dDwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRUZXh0PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0dGVkIGluIHRoZSBkZWZhdWx0IExvY2FsZSwgd2l0aCB0aGUKLSBidW5kbGUgbG9hZGVkIGJ5IHRoZSBkZWZhdWx0IENsYXNzTG9hZGVyLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VGV4dChqYXZhLmxhbmcuQ2xhc3NMb2FkZXIpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRUZXh0PC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldFRleHQ8L0I+KGphdmEubGFuZy5DbGFzc0xvYWRlciZuYnNwO2NsYXNzTG9hZGVyKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+Y2xhc3NMb2FkZXI8L0NPREU+IC0gVGhlIENsYXNzTG9hZGVyIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBsb2FkIHRoZSBSZXNvdXJjZUJ1bmRsZS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYWxlLCB3aXRoIHRoZQotIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIHNwZWNpZmllZCBDbGFzc0xvYWRlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFRleHQoamF2YS51dGlsLkxvY2FsZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFRleHQ8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VGV4dDwvQj4oamF2YS51dGlsLkxvY2FsZSZuYnNwO2xvY2FsZSk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmxvY2FsZTwvQ09ERT4gLSBUaGUgbG9jYWxlIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGludG8uCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0dGVkIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLCB3aXRoIHRoZQotIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIGRlZmF1bHQgQ2xhc3NMb2FkZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRUZXh0KGphdmEudXRpbC5Mb2NhbGUsIGphdmEubGFuZy5DbGFzc0xvYWRlcikiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFRleHQ8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VGV4dDwvQj4oamF2YS51dGlsLkxvY2FsZSZuYnNwO2xvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3NMb2FkZXImbmJzcDtjbGFzc0xvYWRlcik8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmxvY2FsZTwvQ09ERT4gLSBUaGUgbG9jYWxlIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGludG8uPEREPjxDT0RFPmNsYXNzTG9hZGVyPC9DT0RFPiAtIFRoZSBDbGFzc0xvYWRlciB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbG9hZCB0aGUgUmVzb3VyY2VCdW5kbGUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0dGVkIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLCB3aXRoIHRoZQotIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIHNwZWNpZmllZCBDbGFzc0xvYWRlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QXR0cmlidXRlPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0IDxCPmdldEF0dHJpYnV0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUpPC9QUkU+Ci08REw+Ci08REQ+UHJvdmlkZXMgYSB3YXkgdG8gc3RvcmUgc29tZSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdGhhdCBhIG1lc3NhZ2Ugd291bGQgbGlrZSB0byBzdG9yZQotIHRoYXQgY2FuIHVzZWQgYnkgc29tZSBvdGhlciBwYXJ0aWVzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhvc2UgYXR0cmlidXRlIHZhbHVlcy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlTmFtZTwvQ09ERT4gLSAKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gT2JqZWN0IGJhc2ljYWxseSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QgbmFtZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0QXR0cmlidXRlPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldEF0dHJpYnV0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0IHRoZSBhdHRyaWJ1dGVOYW1lIGFuZCB2YWx1ZSBhcyBrZXkgdmFsdWUgcGFpci4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlTmFtZTwvQ09ERT4gLSA8RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpIj48Q09ERT5nZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldEJ1bmRsZU5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEJ1bmRsZU5hbWU8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0QnVuZGxlTmFtZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2J1bmRsZU5hbWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0IHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgd2hpY2ggdGhpcyBtZXNzYWdlIGlzIGNvbnRhaW5lZCBpbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YnVuZGxlTmFtZTwvQ09ERT4gLSBOYW1lIG9mIHRoZSBidW5kbGUgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRHcm91cE5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEdyb3VwTmFtZTwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRHcm91cE5hbWU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPlRvIHN1cHBvcnQgcmVtb3ZhbCBvZiBhIHN1YnNldCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBhbiBJVmFsaWRhdG9yIG1heSBhc3NpZ24gZ3JvdXAgbmFtZXMKLSB0byBJTWVzc2FnZXMuIEFuIElNZXNzYWdlIHN1YnNldCB3aWxsIGJlIGlkZW50aWZpZWQgYnkgdGhlIG5hbWUgb2YgaXRzIGdyb3VwLiBEZWZhdWx0IChudWxsKQotIG1lYW5zIG5vIGdyb3VwLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5uYW1lPC9DT0RFPiAtIE5hbWUgb2YgdGhlIGdyb3VwLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0SWQoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldElkPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldElkPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmV3SWQpPC9QUkU+Ci08REw+Ci08REQ+U2V0IHRoZSBpZCBvZiB0aGUgbWVzc2FnZS4gTWVzc2FnZSBpZHMgYXJlIHVzZWQgYXMgdGhlIGNvbnN0YW50cyBpbiBwcm9wZXJ0eSBidW5kbGVzIHdoaWNoCi0gbG9jYWxpemUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtZXNzYWdlIGluIGEgbG9jYWxlLWluZGVwZW5kZW50IGZhc2hpb24uIFRoZSBpZCBpcyB0aGUga2V5LAotIGluIHRoZSByZXNvdXJjZSBidW5kbGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIHN0cmluZyB0byBiZSBsb2FkZWQuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwgb3IKLSB0aGUgZW1wdHkgc3RyaW5nLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5uZXdJZDwvQ09ERT4gLSBJZCBvZiB0aGUgbWVzc2FnZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldExlbmd0aChpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRMZW5ndGg8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0TGVuZ3RoPC9CPihpbnQmbmJzcDtsZW5ndGgpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9ibGVtLCBzdGFydGluZyBmcm9tIHRoZSBvZmZzZXQuIElmIHVuc2V0LCB2YWx1ZSA9Ci0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VULgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5sZW5ndGg8L0NPREU+IC0gU2V0cyB0aGUgbGVuZ3RoLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRPZmZzZXQoaW50KSI+PENPREU+c2V0T2Zmc2V0KGludCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0TGluZU5vKGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldExpbmVObzwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRMaW5lTm88L0I+KGludCZuYnNwO2xpbmVOdW1iZXIpPC9QUkU+Ci08REw+Ci08REQ+SWYgdGhlcmUgaXMgYSB0YXJnZXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElNZXNzYWdlLCBhbmQgdGhhdCB0YXJnZXQgb2JqZWN0IGlzIGEgZmlsZSwKLSB0aGVuIGFuIG9wdGlvbmFsIGxpbmUgbnVtYmVyIG1heSBiZSBzZXQuIFRoZSBsaW5lIG51bWJlciBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUKLSBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhpcyBtZXNzYWdlLiBUbyBpbmRpY2F0ZSBubyBsaW5lIG51bWJlciwgdXNlICNMSU5FTk9fVU5TRVQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmxpbmVOdW1iZXI8L0NPREU+IC0gU2V0cyB0aGUgbGluZSBudW1iZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRPZmZzZXQoaW50KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0T2Zmc2V0PC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldE9mZnNldDwvQj4oaW50Jm5ic3A7b2Zmc2V0KTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIG9mZnNldCBvZiB0aGUgbWVzc2FnZS4gSWYgdW5zZXQsIHZhbHVlID0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VULiBGb3IgZXhhbXBsZSwgaWYgdGhlCi0gamF2YSBjb21waWxlciB3ZXJlIGEgdmFsaWRhdG9yLCBhbmQgaXQgcmVwb3J0ZWQgdGhhdCBhIHZhcmlhYmxlIG5hbWUgd2FzIHVua25vd24sIG9mZnNldAotIHdvdWxkIGlkZW50aWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB1bmtub3duIHZhcmlhYmxlLiBUaGUgcG9zaXRpb24gaXMKLSBpZGVudGlmaWVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+b2Zmc2V0PC9DT0RFPiAtIFNldHMgdGhlIG9mZnNldCBvZiB0aGUgbWVzc2FnZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFBhcmFtcyhqYXZhLmxhbmcuU3RyaW5nW10pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRQYXJhbXM8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0UGFyYW1zPC9CPihqYXZhLmxhbmcuU3RyaW5nW10mbmJzcDtuZXdQYXJhbXMpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbWVzc2FnZS4gTWVzc2FnZSBwYXJhbWV0ZXJzIGFyZSB0aGUgdmFsdWVzIHdoaWNoIGFyZSBzdWJzdGl0dXRlZAotIGludG8gcGFyYW1ldGVyIHNsb3RzIGluIGxvY2FsaXplZCBtZXNzYWdlIHRleHQgZGVzY3JpcHRpb25zLgotIDxwPgotIEZvciBleGFtcGxlLCBpZiBnZXRJZCgpIHJldHVybnMgIk1ZX0lEIiwgdGhlbiB0aGUgUmVzb3VyY2VCdW5kbGUgaWRlbnRpZmllZCBieQotIGdldEJ1bmRsZU5hbWUoKSBpcyBzZWFyY2hlZCBmb3IgdGhlIG1lc3NhZ2UgbmFtZWQgIk1ZX0lEIiwgYW5kIGlmIGZvdW5kLAotIGhhcyBpdCdzIHBhcmFtZXRlcnMgc2V0LgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bmV3UGFyYW1zPC9DT0RFPiAtIFBhcmFtZXRlcnMgb2YgdGhlIG1lc3NhZ2UuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PENPREU+aXMgaW52b2tlZCBvbiB0aGUgbWVzc2FnZSwgd2l0aAotICAgICAgPGNvZGU+bmV3UGFyYW1zPC9jb2RlPiBwYXNzZWQgaW4gYXMgdGhlIE9iamVjdFtdLjwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNldmVyaXR5KGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFNldmVyaXR5PC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldFNldmVyaXR5PC9CPihpbnQmbmJzcDtuZXdTZXZlcml0eSk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZS4gT25lIG9mIFNldmVyaXR5RW51bSBjb25zdGFudHMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5ld1NldmVyaXR5PC9DT0RFPiAtIFNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNISUdIX1NFVkVSSVRZIj48Q09ERT5ISUdIX1NFVkVSSVRZPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI05PUk1BTF9TRVZFUklUWSI+PENPREU+Tk9STUFMX1NFVkVSSVRZPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI0xPV19TRVZFUklUWSI+PENPREU+TE9XX1NFVkVSSVRZPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFRhcmdldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0VGFyZ2V0T2JqZWN0PC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldFRhcmdldE9iamVjdDwvQj4oamF2YS5sYW5nLk9iamVjdCZuYnNwO29iaik8L1BSRT4KLTxETD4KLTxERD5Bc3NvY2lhdGUgdGhpcyBJTWVzc2FnZSB3aXRoIHRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHByb2JsZW0uIEEgbnVsbCB2YWx1ZSBpcyBwZXJtaXR0ZWQuIElmIGEKLSBtZXNzYWdlIGlzIGFwcGxpY2FibGUgdG8gb25lIG9iamVjdCwgdGhlbiB0aGlzIHZhbHVlIHNob3VsZCBiZSBzZXQuIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQKLSB2YWx1ZSAobnVsbCkgc2hvdWxkIGJlIGtlcHQuIEdpdmVuIHRoaXMgdGFyZ2V0IG9iamVjdCwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNhbGN1bGF0ZSB0aGUKLSBleGFjdCBsb2NhdGlvbiBvZiB0aGUgcHJvYmxlbS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+b2JqPC9DT0RFPiAtIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHByb2JsZW0uPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBdHRyaWJ1dGVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEF0dHJpYnV0ZXM8L0gzPgotPFBSRT4KLWphdmEudXRpbC5IYXNoTWFwIDxCPmdldEF0dHJpYnV0ZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm4gYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIGEgTWVzc2FnZSBvYmplY3QuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE1hcmtlcklkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE1hcmtlcklkPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldE1hcmtlcklkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJuIHRoZSBtYXJrZXIgaWQgaWYgb25lIGlzIHNldCBvbiB0aGlzIG9iamVjdCB3aGVuIGNyZWF0ZWQuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE1hcmtlcklkKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRNYXJrZXJJZDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRNYXJrZXJJZDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21hcmtlcklkKTwvUFJFPgotPERMPgotPEREPlNldCB0aGUgbWFya2VyIGlkIG9uIGEgTWVzc2FnZSBvYmplY3QuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lNZXNzYWdlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwOWI2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotSU1ldGFNb2RlbENvbnRleHQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJTWV0YU1vZGVsQ29udGV4dCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSU1ldGFNb2RlbENvbnRleHQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJTWV0YU1vZGVsQ29udGV4dDwvSDI+Ci08REw+Ci08RFQ+PEI+QWxsIFN1cGVyaW50ZXJmYWNlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SU1ldGFNb2RlbENvbnRleHQ8L0I+PERUPmV4dGVuZHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+PC9ETD4KLTwvUFJFPgotCi08UD4KLTxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLk9iamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwjZ2V0TW9kZWwoamF2YS5sYW5nLlN0cmluZykiPmdldE1vZGVsPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO1VSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjZ2V0VVJJcygpIj5nZXRVUklzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCNsb2FkTW9kZWwoamF2YS5sYW5nLlN0cmluZykiPmxvYWRNb2RlbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjbG9hZE1vZGVsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkiPmxvYWRNb2RlbDwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRNb2RlbChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TW9kZWw8L0gzPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QgPEI+Z2V0TW9kZWw8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtVUkkpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDJkN2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0PC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0PC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IGV4dGVuZHMgSVZhbGlkYXRpb25Db250ZXh0IHRvIHByb3ZpZGUgYWNjZXNzIHRvIGEKLSByZWZlcmVuY2UgdG8gdGhlIHByb2plY3Qgb24gd2hpY2ggYSB2YWxpZGF0b3IgaXMgYmVpbmcgaW52b2tlZC4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lQcm9qZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sI2dldFByb2plY3QoKSI+Z2V0UHJvamVjdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1Byb3ZpZGVzIHRoZSBwcm9qZWN0IG9uIHdoaWNoIHRoZSB2YWxpZGF0b3IgaXMgYmVpbmcgaW52b2tlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT48L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sI2dldFVSSXMoKSI+Z2V0VVJJczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjbG9hZE1vZGVsKGphdmEubGFuZy5TdHJpbmcpIj5sb2FkTW9kZWw8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sI2xvYWRNb2RlbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pIj5sb2FkTW9kZWw8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0UHJvamVjdCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQcm9qZWN0PC9IMz4KLTxQUkU+Ci1JUHJvamVjdCA8Qj5nZXRQcm9qZWN0PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UHJvdmlkZXMgdGhlIHByb2plY3Qgb24gd2hpY2ggdGhlIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIElQcm9qZWN0IHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBvbiB3aGljaCB0aGUgdmFsaWRhdG9yIGlzCi0gICAgICAgICBiZWluZyBpbnZva2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2U1NWVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotSVJlcG9ydGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVJlcG9ydGVyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JUmVwb3J0ZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklSZXBvcnRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJUmVwb3J0ZXI8L0gyPgotPERMPgotPERUPjxCPkFsbCBLbm93biBJbXBsZW1lbnRpbmcgQ2xhc3Nlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlJlcG9ydGVySGVscGVyPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JUmVwb3J0ZXI8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoZSBpbnRlcmZhY2UgdXNlZCBieSBJVmFsaWRhdG9yJ3MgdG8gcmVwb3J0IG1lc3NhZ2VzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElSZXBvcnRlciBjb3VsZAotIHNpbXBseSBsb2cgdGhlIG1lc3NhZ2VzIHRvIHN0ZG91dCwgYSBmaWxlLCBvciByZXRhaW4gdGhlbSBpbiBhIGJ1ZmZlciBmb3IgbGF0ZXIgYWNjZXNzIGJ5IGEgdXNlcgotIGludGVyZmFjZS4KLSA8cD4KLSBSZXBvcnRlciBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGtlZXAgbm9uLWxvY2FsaXplZCB2ZXJzaW9ucyBvZiB0aGVpciBtZXNzYWdlcy4KLSA8L3A+Ci0gPHA+Ci0gQW55IG1lc3NhZ2VzIHdoaWNoIG5lZWQgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFyZSBkb25lIHRocm91Z2ggdGhpcyBjbGFzcywgYW5kIGlmIHRoZSB1c2VyCi0gY2FuY2VscyB0aGUgY3VycmVudCBmdW5jdGlvbiwgdGhpcyBjbGFzcyBpcyB0aGUgb25lIHdoaWNoIHJlZ2lzdGVycyB0aGUgY2FuY2VsbGF0aW9uLgotIDwvcD4KLSA8cD4KLSBUaGUgSVJlcG9ydGVyIGluc3RhbmNlIGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgdmFsaWRhdGlvbiBiZWdpbnMgYW5kIGVuZHMgd2hlbiB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLgotIFRoZXJlIGlzIG9ubHkgb25lIElSZXBvcnRlciBpbnN0YW5jZSBjcmVhdGVkIGZvciBhbGwgdmFsaWRhdG9ycyB0aGF0IGFyZSBydW4gb24gYSBJUmVzb3VyY2UuIFRoZSBJUmVzb3VyY2UKLSBwcm92aWRlcyBhIHdheSB0byBnZXQgbWVzc2FnZXMgcHV0IG91dCBlYWNoIHZhbGlkYXRvciBhbmQgYWRkIGFuZCBkZWxldGUgbWVzc2FnZXMgZm9yIG9uZSB2YWxpZGF0b3IKLSBhdCBhIHRpbWUuIAotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI2FkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+YWRkTWVzc2FnZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotIEFkZCBhIGxvY2FsZS1pbmRlcGVuZGVudCB2YWxpZGF0aW9uIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5kaXNwbGF5U3VidGFzazwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTaG93IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UsIGZvcm1hdHRlZCBpbiB0aGUgZGVmYXVsdAotIExvY2FsZSwgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5MaXN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjZ2V0TWVzc2FnZXMoKSI+Z2V0TWVzc2FnZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI2lzQ2FuY2VsbGVkKCkiPmlzQ2FuY2VsbGVkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgY2FuY2VsZWQgdmFsaWRhdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcikiPnJlbW92ZUFsbE1lc3NhZ2VzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMgZW50ZXJlZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QpIj5yZW1vdmVBbGxNZXNzYWdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcywgZW50ZXJlZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IsCi0gcGVydGFpbmluZyB0byB0aGUgT2JqZWN0IHByb3ZpZGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjcmVtb3ZlTWVzc2FnZVN1YnNldChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpIj5yZW1vdmVNZXNzYWdlU3Vic2V0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmosCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtncm91cE5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkKLSBhc3NpZ24gZ3JvdXAgbmFtZXMgdG8gSU1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iYWRkTWVzc2FnZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj48IS0tIC0tPjwvQT48SDM+Ci1hZGRNZXNzYWdlPC9IMz4KLTxQUkU+Ci12b2lkIDxCPmFkZE1lc3NhZ2U8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPjxwPgotIEFkZCBhIGxvY2FsZS1pbmRlcGVuZGVudCB2YWxpZGF0aW9uIG1lc3NhZ2UuIEl0IHdpbGwgYmUgZGlzcGxheWVkIGxhdGVyLCB3aXRoIGFsbCBvZiB0aGUKLSBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotIDwvcD4KLSA8cD4KLSBUaGUgSVZhbGlkYXRvciBwYXNzZWQgaW4gaXMgbmVlZGVkIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uICh3aGVuIGEgbWVzc2FnZSBuZWVkcyB0byBiZQotIHJlbW92ZWQsIG9uZSB2YWxpZGF0b3Igc2hvdWxkIG5vdCByZW1vdmUgbWVzc2FnZXMgZW50ZXJlZCBieSBhbm90aGVyIHZhbGlkYXRvci4pIFRoZQotIHZhbGlkYXRvciBpcyBhbHNvIHF1ZXJpZWQgZm9yIGluZm9ybWF0aW9uIGFib3V0IGl0cyByZXNvdXJjZSBidW5kbGUsIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgotIGxvY2FsaXphdGlvbiBvZiBtZXNzYWdlcyBpbiBhIGNsaWVudC1zZXJ2ZXIgZW52aXJvbm1lbnQuCi0gPC9wPgotIDxwPgotIEJvdGggcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+b3JpZ2luPC9DT0RFPiAtIFRoZSB2YWxpZGF0b3Igd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiB0aGUgbWVzc2FnZS48REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSBBIG1lc3NhZ2UgdG8gYmUgcmVwb3J0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj48IS0tIC0tPjwvQT48SDM+Ci1kaXNwbGF5U3VidGFzazwvSDM+Ci08UFJFPgotdm9pZCA8Qj5kaXNwbGF5U3VidGFzazwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPlNob3cgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSwgZm9ybWF0dGVkIGluIHRoZSBkZWZhdWx0Ci0gTG9jYWxlLCB0byB0aGUgdXNlciBpbW1lZGlhdGVseS4gVGhpcyBtZXNzYWdlIGluZGljYXRlcyB3aGljaCBzdWJ0YXNrIGlzCi0gY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIG1lc3NhZ2UgaXMgbm90IHN0b3JlZC4gVGhlIHN1YnRhc2sgbWVzc2FnZQotIGluIHRoaXMgY29udGV4dCBpcyB0aGUgc3VidGFzayBpbiBhIElQcm9ncmVzc01vbnRpb3IKLSA8cD4KLSBCb3RoIHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbC4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcjwvQ09ERT4gLSBUaGUgdmFsaWRhdG9yIGlzc3VpbmcgdGhlIHN1YnRhc2sgbWVzc2FnZS48REQ+PENPREU+bWVzc2FnZTwvQ09ERT4gLSBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRNZXNzYWdlcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNZXNzYWdlczwvSDM+Ci08UFJFPgotamF2YS51dGlsLkxpc3QgPEI+Z2V0TWVzc2FnZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1lc3NhZ2UgYWNjZXNzIGludGVyZmFjZSB0byB0aGlzIHJlcG9ydGVyLCBvciBudWxsIGlmIG1lc3NhZ2UgYWNjZXNzIGlzIG5vdAotIHN1cHBvcnRlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzQ2FuY2VsbGVkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQ2FuY2VsbGVkPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzQ2FuY2VsbGVkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgY2FuY2VsZWQgdmFsaWRhdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0gY2FsbGVkIGJ5IElWYWxpZGF0b3JzIHBlcmlvZGljYWxseSwgYmVjYXVzZSBubyBldmVudCBpcyBmaXJlZCB0byBub3RpZnkgSVZhbGlkYXRvcnMgdGhhdCB0aGUKLSB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24uIElmIGEgdmFsaWRhdG9yIGRvZXMgbm90IGNoZWNrIHRoaXMgbWV0aG9kLCBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0Ci0gaXMgaWdub3JlZC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1yZW1vdmVBbGxNZXNzYWdlczwvSDM+Ci08UFJFPgotdm9pZCA8Qj5yZW1vdmVBbGxNZXNzYWdlczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4pPC9QUkU+Ci08REw+Ci08REQ+UmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZAotIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLiAKLSA8cD4KLSBUaGUgSVZhbGlkYXRvciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm9yaWdpbjwvQ09ERT4gLSBPcmlnaW5hdG9yIHZhbGlkYXRvciBvZiB0aGUgbWVzc2FnZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLXJlbW92ZUFsbE1lc3NhZ2VzPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnJlbW92ZUFsbE1lc3NhZ2VzPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iamVjdCk8L1BSRT4KLTxETD4KLTxERD5SZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMsIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLAotIHBlcnRhaW5pbmcgdG8gdGhlIE9iamVjdCBwcm92aWRlZC4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgZm9yCi0gaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gPGJyPgotIDxicj4KLSBJZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIG51bGwsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJlbW92ZSBhbGwKLSBtZXNzYWdlcyBvd25lZCBieSB0aGUgdmFsaWRhdG9yLiAoaS5lLiwgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHRoZQotIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IpIG1ldGhvZC4pIDxicj4KLSA8YnI+Ci0gPHA+Ci0gVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5vcmlnaW48L0NPREU+IC0gT3JpZ2luYXRvciB2YWxpZGF0b3Igb2YgdGhlIG1lc3NhZ2UuPEREPjxDT0RFPm9iamVjdDwvQ09ERT4gLSBPYmplY3QgdG8gd2hpY2ggdGhlIG1lc3NhZ2UgYmVsb25ncy4gT2JqZWN0IGlzIHRoZSB0YXJnZXQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgdGhhdCB3YXMgc2V0IG9uIHRoZSBJTWVzc2FnZSB3aGVuIGFkZGluZyB0aGUgbWVzc2FnZSBhcyBwcm9ibGVtCi0gICAgICAgICAgICAgICAgbWFya2VyLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVtb3ZlTWVzc2FnZVN1YnNldChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1yZW1vdmVNZXNzYWdlU3Vic2V0PC9IMz4KLTxQUkU+Ci12b2lkIDxCPnJlbW92ZU1lc3NhZ2VTdWJzZXQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2dyb3VwTmFtZSk8L1BSRT4KLTxETD4KLTxERD5UbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkKLSBhc3NpZ24gZ3JvdXAgbmFtZXMgdG8gSU1lc3NhZ2VzLiBBbiBJTWVzc2FnZSBzdWJzZXQgd2lsbCBiZSBpZGVudGlmaWVkIGJ5Ci0gdGhlIG5hbWUgb2YgaXRzIGdyb3VwLiBUaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSBvbmx5IHRoZSBJTWVzc2FnZSdzIHRoYXQKLSBhcmUgaW4gdGhlIGdyb3VwIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLiAKLSA8cD4KLSBUaGUgSVZhbGlkYXRvciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KLSA8L3A+Ci0gPHA+Ci0gSWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBudWxsLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByZW1vdmUgYWxsCi0gbWVzc2FnZXMgb3duZWQgYnkgdGhlIHZhbGlkYXRvci4gKGkuZS4sIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUKLSByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yKSBtZXRob2QuKQotIDwvcD4KLSA8cD4KLSBJZiBncm91cE5hbWUgaXMgbnVsbCwgdGhhdCdzIHRoZSBzYW1lIGFzIG5vIGdyb3VwIChpLmUuLCB0aGUgc2FtZQotIGJlaGF2aW91ciBhcyB0aGUgPGNvZGU+cmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KTwvY29kZT4KLSBtZXRob2QuKQotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsaWRhdG9yPC9DT0RFPiAtIE9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLjxERD48Q09ERT5vYmo8L0NPREU+IC0gT2JqZWN0IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuPEREPjxDT0RFPmdyb3VwTmFtZTwvQ09ERT4gLSBOYW1lIG9mIHRoZSBncm91cCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVJlcG9ydGVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUmVwb3J0ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYmJmNGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1JVmFsaWRhdGlvbkNvbnRleHQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJVmFsaWRhdGlvbkNvbnRleHQiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElWYWxpZGF0aW9uQ29udGV4dDwvSDI+Ci08REw+Ci08RFQ+PEI+QWxsIEtub3duIFN1YmludGVyZmFjZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXRhTW9kZWxDb250ZXh0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVZhbGlkYXRpb25Db250ZXh0PC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIGlzIHVzZWQgdG8gdG8gc2VwYXJhdGUgdGhlIElWYWxpZGF0b3IgZnJvbSB0aGUgbW9kZWwgbG9hZGluZy4gQSBtb2RlbCAKLSBpcyBhIGdyb3VwIG9mIG9iamVjdChzKSB0aGF0IG11c3QgZm9sbG93IHNvbWUgcnVsZXMuCi0gPHA+Ci0gVGhlIG1vZGVsIGlzIGxvYWRlZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdmFsaWRhdG9yIGlzIHJ1bm5pbmcgaW4gCi0gYXMteW91LXR5cGUgb3IgYnVpbGRlciBiYXNlZCBjb250ZXh0LiBJZiB0aGUgPGNvZGU+bG9hZE1vZGVsPC9jb2RlPiBtZXRob2Qgd2FzIGEgbWV0aG9kIG9uIHRoZSBJVmFsaWRhdG9yLCAKLSB0aGVuIHRoZXJlIHdvdWxkIG5lZWQgdG8gYmUgdHdvIHZlcnNpb25zIG9mIHZhbGlkYXRvcnMsIG9uZSBmb3IgYXMteW91LXR5cGUgYW5kIG9uZSBmb3IgCi0gYnVpbGRlciBiYXNlZC4gQmVjYXVzZSA8Y29kZT5sb2FkTW9kZWw8L2NvZGU+IGlzIHNlcGFyYXRlIGZyb20gdGhlIElWYWxpZGF0b3IsIHdlIHByb3ZpZGUgCi0gdHdvIGRpZmZlcmVudCBJSGVscGVycyBpbnN0ZWFkLCBhbmQgc2hpcCB0aGUgb25lIHNwZWNpZmljIHRvIHRoZSBlbnZpcm9ubWVudC4KLSA8L3A+Ci0gPHA+Ci0gRWFjaCBJVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50YXRpb24gbG9hZHMgYSBzcGVjaWZpYyBtb2RlbCBhcyBpZGVudGlmaWVkIGJ5IGEgU3RyaW5nCi0gPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPi4gVGhlIHN5bWJvbGljTmFtZSBjYW4gYmUgYW55IHZhbHVlIGV4Y2VwdCBudWxsIG9yIHRoZSAKLSBlbXB0eSBzdHJpbmcuIEVhY2ggdmFsaWRhdG9yIGlkZW50aWZpZXMgdGhlIHN5bWJvbGljIG5hbWVzIHdoaWNoIGl0IG5lZWRzLCBhbmQgdGhlCi0gdHlwZSBvZiBtb2RlbCB3aGljaCBuZWVkcyB0byBiZSByZXR1cm5lZCB3aGVuIHRoYXQgc3ltYm9saWMgbmFtZSBpcyBsb2FkZWQgdmlhIGEgCi0gPGNvZGU+bG9hZE1vZGVsPC9jb2RlPiBtZXRob2QuIEFuIElWYWxpZGF0aW9uQ29udGV4dCBjYW4gc3VwcG9ydCBtb3JlIHRoYW4gb25lIElWYWxpZGF0b3I7IAotIHRoZSBoZWxwZXIgbmVlZHMgdG8gc3VwcG9ydCBldmVyeSBtb2RlbCB0aGF0IGVhY2ggdmFsaWRhdG9yIG5lZWRzLgotIDwvcD4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmdbXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sI2dldFVSSXMoKSI+Z2V0VVJJczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjbG9hZE1vZGVsKGphdmEubGFuZy5TdHJpbmcpIj5sb2FkTW9kZWw8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c3ltYm9saWNOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gTG9hZCB0aGUgbW9kZWwgaWRlbnRpZmllZCBieSA8Y29kZT5zeW1ib2xpY05hbWU8L2NvZGU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjbG9hZE1vZGVsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkiPmxvYWRNb2RlbDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzeW1ib2xpY05hbWUsCi0gICAgICAgICAgamF2YS5sYW5nLk9iamVjdFtdJm5ic3A7cGFybXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBMb2FkIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gYW5kIDxjb2RlPnBhcm1zPC9jb2RlPi48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImxvYWRNb2RlbChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotbG9hZE1vZGVsPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0IDxCPmxvYWRNb2RlbDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3N5bWJvbGljTmFtZSk8L1BSRT4KLTxETD4KLTxERD48cD4KLSBMb2FkIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4uIDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gCi0gbXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSB2YWxpZGF0b3IgbmVlZHMgdG8gYmUgcnVuIGluIGJvdGggCi0gYXMteW91LXR5cGUgYW5kIGJ1aWxkZXIgYmFzZWQgdmFsaWRhdGlvbi4KLSA8L3A+Ci0gPHA+Ci0gVGhlIHN5bWJvbGljTmFtZSBpcyBhIHN0cmluZyBuYW1lIHRoYXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gSVZhbGlkYXRvckNvbnRleHQuIEZvciBhbiBleGFtcGxlIG91ciBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbG9hZE1vZGVsIHVzZQotIG1ldGhvZCBuYW1lcyBmb3Igc3ltYm9saWNOYW1lcyB0byBsb2FkIHRoZSBtb2RlbCBvYmplY3QgdG8gYmUgdmFsaWRhdGVkLiBVc2VycyBjYW4KLSB1c2UgdGhlaXIgb3duIG1vZGVsIGxvYWQgbWVjaGFuaXNtLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxjb2RlPldvcmtiZW5jaENvbnRleHQ8L2NvZGU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsb2FkTW9kZWwoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKSI+PCEtLSAtLT48L0E+PEgzPgotbG9hZE1vZGVsPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0IDxCPmxvYWRNb2RlbDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3N5bWJvbGljTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3RbXSZuYnNwO3Bhcm1zKTwvUFJFPgotPERMPgotPEREPjxwPgotIExvYWQgdGhlIG1vZGVsIGlkZW50aWZpZWQgYnkgPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPiBhbmQgPGNvZGU+cGFybXM8L2NvZGU+LgotIDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gbXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSB2YWxpZGF0b3IgCi0gbmVlZHMgdG8gYmUgcnVuIGluIGJvdGggYXMteW91LXR5cGUgYW5kIGJ1aWxkZXIgYmFzZWQgdmFsaWRhdGlvbi4gCi0gSWYgPGNvZGU+cGFybXM8L2NvZGU+IGlzIG51bGwgdGhlbiB0aGlzCi0gbWV0aG9kIGJlaGF2ZXMgdGhlIHNhbWUgYXMKLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3ltYm9saWNOYW1lPC9DT0RFPiAtIFN0cmluZyBpZGVudGlmaWVyIGZvciBtb2RlbC48REQ+PENPREU+cGFybXM8L0NPREU+IC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgdGhlIG1vZGVsIHRha2VzIGZvciBpbnZvY2F0aW9uLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VVJJcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRVUklzPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nW10gPEI+Z2V0VVJJczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIHN0cmluZyBhcnJheSB3aXRoIHRoZSBsaXN0IG9mIFVSSSdzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQgaW4gdGhlCi0gY2FzZSBvZiBJbmNyZW1lbnRhbCBidWlsZC48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMWM2NmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotSVZhbGlkYXRvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklWYWxpZGF0b3IiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lWYWxpZGF0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElWYWxpZGF0b3I8L0gyPgotPERMPgotPERUPjxCPkFsbCBLbm93biBTdWJpbnRlcmZhY2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3JKb2I8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklWYWxpZGF0b3I8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgaXMgdGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhbGwgVmFsaWRhdG9ycy4gQSBWYWxpZGF0b3IgaXMgYSBjbGFzcyB3aGljaCB2ZXJpZmllcyB0aGF0IG9iamVjdHMKLSBmb2xsb3cgc29tZSBydWxlcy4gRm9yIGV4YW1wbGUsIGluIGEgTU9GIG1vZGVsIHdoaWNoIHJlcHJlc2VudHMgYW4gRUpCIGphciwgdGhlIEVKQiBzcGVjaWZpY2F0aW9uCi0gZGV0ZXJtaW5lcyB0aGUgcnVsZXMuIAotIDxwPgotIEEgdmFsaWRhdG9yIGNhbiBwZXJmb3JtIGZ1bGwgdmFsaWRhdGlvbiBvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLiBBbGwgdmFsaWRhdG9ycyBtdXN0IGltcGxlbWVudAotIGZ1bGwgdmFsaWRhdGlvbiBidXQgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiBpcyBvcHRpb25hbC4KLSA8L3A+Ci0gPHA+Ci0gRWFjaCB2YWxpZGF0b3IgbXVzdCBub3QgYmUgdGllZCB0byBhbnkgcGFydGljdWxhciB3b3JrYmVuY2ggaW1wbGVtZW50YXRpb24uCi0gPC9wPgotIDxwPgotIEEgdmFsaWRhdG9yJ3MgdmVyaWZpY2F0aW9uIHN0YXJ0cyB3aGVuIHRoZSBWYWxpZGF0b3JMYXVuY2hlciBzaW5nbGV0b24gY2FsbHMKLSA8Y29kZT52YWxpZGF0ZTwvY29kZT4uCi0gPC9wPgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCNjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+Y2xlYW51cDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cCBvbmNlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4mbmJzcDtyZXBvcnRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgb2JqZWN0cy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImNsZWFudXAob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpIj48IS0tIC0tPjwvQT48SDM+Ci1jbGVhbnVwPC9IMz4KLTxQUkU+Ci12b2lkIDxCPmNsZWFudXA8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvUFJFPgotPERMPgotPEREPlBlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAgb25jZSB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLiBJZiBjbGVhbnVwIHdpbGwgdGFrZSBzb21lIHRpbWUsIHRoZQotIElWYWxpZGF0b3Igc2hvdWxkIHJlcG9ydCBzdWJ0YXNrIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHRocm91Z2ggdGhlIElSZXBvcnRlciBwYXJhbWV0ZXIuIFRoZQotIElSZXBvcnRlciBwYXJhbWV0ZXIgd2lsbCBub3QgYmUgbnVsbC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVwb3J0ZXI8L0NPREU+IC0gVXNlZCBmb3IgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZTwvSDM+Ci08UFJFPgotdm9pZCA8Qj52YWxpZGF0ZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+Jm5ic3A7aGVscGVyLAotICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4mbmJzcDtyZXBvcnRlcikKLSAgICAgICAgICAgICAgdGhyb3dzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPlRoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgb2JqZWN0cy4KLSA8cD4KLSA8Y29kZT5oZWxwZXI8L2NvZGU+IGFuZCA8Y29kZT5yZXBvcnRlcjwvY29kZT4gbWF5IG5vdCBiZSBudWxsLiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+Ci0gbWF5IGJlIG51bGwsIGlmIGEgZnVsbCBidWlsZCBpcyBkZXNpcmVkLiA8YnI+Ci0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5oZWxwZXI8L0NPREU+IC0gTG9hZHMgYW4gb2JqZWN0LjxERD48Q09ERT5yZXBvcnRlcjwvQ09ERT4gLSBJcyBhbiBpbnN0YW5jZSBvZiBhbiBJUmVwb3J0ZXIgaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGZvciBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1c2VyLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVZhbGlkYXRvci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2ZWZlOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1JVmFsaWRhdG9ySm9iCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVZhbGlkYXRvckpvYiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVZhbGlkYXRvckpvYi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJVmFsaWRhdG9ySm9iPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklWYWxpZGF0b3JKb2I8L0I+PERUPmV4dGVuZHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBpcyB0aGUgSm9iIGludGVyZmFjZSBmb3IgdGhlIHZhbGlkYXRvci4gVmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgYXJlIGV4ZWN1dGVkIGFzCi0gYmFja2dyb3VuZCBqb2JzLiAKLSBGb2xsb3dpbmcgaXMgYSBzZXF1ZW5jZSBvZiAgY2FsbHM6Ci0gPHVsPgotIDxsaT52YWxpZGF0b3IuZ2V0U2NoZWR1bGluZ1J1bGUoaGVscGVyKQotIDxsaT52YWxpZGF0b3IudmFsaWRhdGUocmVwb3J0ZXIpCi0gPC91bD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7SVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCNPS19TVEFUVVMiPk9LX1NUQVRVUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lTY2hlZHVsaW5nUnVsZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCNnZXRTY2hlZHVsaW5nUnVsZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCkiPmdldFNjaGVkdWxpbmdSdWxlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+Jm5ic3A7aGVscGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7R2V0IHRoZSBzY2hlZHVsaW5nIHJ1bGUsIHdoaWNoIHRoZSBmcmFtZXdvcmsgYXBwbGllcyB0byB0aGUgVmFsaWRhdG9yIGpvYi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPnZhbGlkYXRlSW5Kb2I8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sI2NsZWFudXAob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpIj5jbGVhbnVwPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+dmFsaWRhdGU8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IEZJRUxEIERFVEFJTCA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik9LX1NUQVRVUyI+PCEtLSAtLT48L0E+PEgzPgotT0tfU1RBVFVTPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgSVN0YXR1cyA8Qj5PS19TVEFUVVM8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlSW5Kb2I8L0gzPgotPFBSRT4KLUlTdGF0dXMgPEI+dmFsaWRhdGVJbkpvYjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+Jm5ic3A7aGVscGVyLAotICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5UaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIG9iamVjdHMuCi0gPHA+Ci0gPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IG1heSBub3QgYmUgbnVsbC4gPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPgotIG1heSBiZSBudWxsLCBpZiBhIGZ1bGwgYnVpbGQgaXMgZGVzaXJlZC4gPGJyPgotIDwvcD4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVwb3J0ZXI8L0NPREU+IC0gSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUKLSAgICAgICAgICAgIHVzZXIuPEREPjxDT0RFPmhlbHBlcjwvQ09ERT4gLSBXaWxsIG5vdCBiZSBudWxsLCBsb2FkcyBhbiBvYmplY3QuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb248L0NPREU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTY2hlZHVsaW5nUnVsZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNjaGVkdWxpbmdSdWxlPC9IMz4KLTxQUkU+Ci1JU2NoZWR1bGluZ1J1bGUgPEI+Z2V0U2NoZWR1bGluZ1J1bGU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPiZuYnNwO2hlbHBlcik8L1BSRT4KLTxETD4KLTxERD5HZXQgdGhlIHNjaGVkdWxpbmcgcnVsZSwgd2hpY2ggdGhlIGZyYW1ld29yayBhcHBsaWVzIHRvIHRoZSBWYWxpZGF0b3Igam9iLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5oZWxwZXI8L0NPREU+IC0gV2lsbCBub3QgYmUgbnVsbCwgbG9hZHMgYW4gb2JqZWN0LjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVZhbGlkYXRvckpvYi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0NzA0My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLU1lc3NhZ2VMaW1pdEV4Y2VwdGlvbgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVCBDTEFTUzwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik1lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuVGhyb3dhYmxlIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7TUVUSE9EPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9GT05UPgotPEJSPgotQ2xhc3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuVGhyb3dhYmxlCi0gICAgICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+amF2YS5sYW5nLkV4Y2VwdGlvbgotICAgICAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotICAgICAgICAgICAgICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb248L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmlvLlNlcmlhbGl6YWJsZTwvREQ+Ci08L0RMPgotPEhSPgotPEI+RGVwcmVjYXRlZC48L0I+Jm5ic3A7PEk+VGhpcyBjbGFzcyBpcyBub3QgbG9uZ2VyIHVzZWQgYnkgdGhlIGZyYW1ld29yay4gVGhlIGZyYW1ld29yayBpcwotICBub3QgZ29pbmcgdG8gbGltaXQgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBkaXNwbGF5ZWQgYnkgYSB2YWxpZGF0b3IuPC9JPgotPFA+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+TWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uPC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieQotPFA+Ci0KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPjxDT0RFPm1ldGhvZCBpZiBubyBtb3JlIG1lc3NhZ2VzIGNhbiBiZSByZXBvcnRlZAotICAgICAgYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaGFzIGJlZW4gcmVwb3J0ZWQuPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb24iPlNlcmlhbGl6ZWQgRm9ybTwvQT48L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sI01lc3NhZ2VMaW1pdEV4Y2VwdGlvbigpIj5NZXNzYWdlTGltaXRFeGNlcHRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Qj5EZXByZWNhdGVkLjwvQj4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuVGhyb3dhYmxlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuVGhyb3dhYmxlPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZmlsbEluU3RhY2tUcmFjZSwgZ2V0Q2F1c2UsIGdldExvY2FsaXplZE1lc3NhZ2UsIGdldE1lc3NhZ2UsIGdldFN0YWNrVHJhY2UsIGluaXRDYXVzZSwgcHJpbnRTdGFja1RyYWNlLCBwcmludFN0YWNrVHJhY2UsIHByaW50U3RhY2tUcmFjZSwgc2V0U3RhY2tUcmFjZSwgdG9TdHJpbmc8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik1lc3NhZ2VMaW1pdEV4Y2VwdGlvbigpIj48IS0tIC0tPjwvQT48SDM+Ci1NZXNzYWdlTGltaXRFeGNlcHRpb248L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5NZXNzYWdlTGltaXRFeGNlcHRpb248L0I+KCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXByZWNhdGVkLjwvQj4mbmJzcDs8L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5UaHJvd2FibGUiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDtNRVRIT0Q8L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSU1lc3NhZ2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lNZXNzYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjY1OWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSU1lc3NhZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQj48L0E+PC9URD4KLTxURD5BbiBlYXJsaWVyIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIHR5cGVzIHdpdGggYXJndW1lbnRzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+UmVwb3J0ZXJIZWxwZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjZ2V0TWVzc2FnZXMoKSI+Z2V0TWVzc2FnZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlJlcG9ydGVySGVscGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI2FkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+YWRkTWVzc2FnZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlJlcG9ydGVySGVscGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI2Rpc3BsYXlTdWJ0YXNrKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmRpc3BsYXlTdWJ0YXNrPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklSZXBvcnRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmFkZE1lc3NhZ2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBBZGQgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklSZXBvcnRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5kaXNwbGF5U3VidGFzazwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTaG93IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UsIGZvcm1hdHRlZCBpbiB0aGUgZGVmYXVsdAotIExvY2FsZSwgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSU1ldGFNb2RlbENvbnRleHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkYWM4MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1ldGFNb2RlbENvbnRleHQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXRhTW9kZWxDb250ZXh0IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvXGNsYXNzLXVzZUlNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWV0YU1vZGVsQ29udGV4dDwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXRhTW9kZWxDb250ZXh0Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjU0ZDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvXGNsYXNzLXVzZUlQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9cY2xhc3MtdXNlSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lSZXBvcnRlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVJlcG9ydGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzMyZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVJlcG9ydGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9cY2xhc3MtdXNlSVJlcG9ydGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVJlcG9ydGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQj48L0E+PC9URD4KLTxURD5BbiBlYXJsaWVyIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCBpbXBsZW1lbnQgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlJlcG9ydGVySGVscGVyPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgYSB0ZW1wb3JhcnkgY2xhc3MgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uUmVzdWx0LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvcikiPmdldFJlcG9ydGVyPC9BPjwvQj4oSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYW4gSVJlcG9ydGVyIGZvciBoYW5kaW5nIGVycm9yIG1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFJlcG9ydGVyKElQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yKSI+Z2V0UmVwb3J0ZXI8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCNjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+Y2xlYW51cDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cCBvbmNlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4mbmJzcDtyZXBvcnRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgb2JqZWN0cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVmFsaWRhdG9ySm9iLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPnZhbGlkYXRlSW5Kb2I8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvXGNsYXNzLXVzZUlSZXBvcnRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklSZXBvcnRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkN2Y2ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9CPjwvQT48L1REPgotPFREPkFuIGVhcmxpZXIgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPlN1YmludGVyZmFjZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnRlcmZhY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXRhTW9kZWxDb250ZXh0PC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50ZXJmYWNlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCBleHRlbmRzIElWYWxpZGF0aW9uQ29udGV4dCB0byBwcm92aWRlIGFjY2VzcyB0byBhCi0gcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IG9uIHdoaWNoIGEgdmFsaWRhdG9yIGlzIGJlaW5nIGludm9rZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVNjaGVkdWxpbmdSdWxlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklWYWxpZGF0b3JKb2IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sI2dldFNjaGVkdWxpbmdSdWxlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0KSI+Z2V0U2NoZWR1bGluZ1J1bGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtHZXQgdGhlIHNjaGVkdWxpbmcgcnVsZSwgd2hpY2ggdGhlIGZyYW1ld29yayBhcHBsaWVzIHRvIHRoZSBWYWxpZGF0b3Igam9iLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklWYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPnZhbGlkYXRlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+Jm5ic3A7aGVscGVyLAotICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+Jm5ic3A7cmVwb3J0ZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIG9iamVjdHMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lTdGF0dXM8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVZhbGlkYXRvckpvYi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwjdmFsaWRhdGVJbkpvYihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpIj52YWxpZGF0ZUluSm9iPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+Jm5ic3A7aGVscGVyLAotICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4mbmJzcDtyZXBvcnRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgb2JqZWN0cy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2OGYxYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9cY2xhc3MtdXNlSVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9CPjwvQT48L1REPgotPFREPkFuIGVhcmxpZXIgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2FzSVZhbGlkYXRvcigpIj5hc0lWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYxLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNhc0lWYWxpZGF0b3IoKSI+YXNJVmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlJlcG9ydGVySGVscGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI2FkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+YWRkTWVzc2FnZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlJlcG9ydGVySGVscGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI2Rpc3BsYXlTdWJ0YXNrKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmRpc3BsYXlTdWJ0YXNrPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlJlcG9ydGVySGVscGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcikiPnJlbW92ZUFsbE1lc3NhZ2VzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5SZXBvcnRlckhlbHBlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QpIj5yZW1vdmVBbGxNZXNzYWdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlJlcG9ydGVySGVscGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI3JlbW92ZU1lc3NhZ2VTdWJzZXQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+cmVtb3ZlTWVzc2FnZVN1YnNldDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7b2JqLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7Z3JvdXBOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+U3ViaW50ZXJmYWNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50ZXJmYWNlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3JKb2I8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgSm9iIGludGVyZmFjZSBmb3IgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVJlcG9ydGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI2FkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+YWRkTWVzc2FnZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotIEFkZCBhIGxvY2FsZS1pbmRlcGVuZGVudCB2YWxpZGF0aW9uIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVJlcG9ydGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI2Rpc3BsYXlTdWJ0YXNrKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmRpc3BsYXlTdWJ0YXNrPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1Nob3cgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSwgZm9ybWF0dGVkIGluIHRoZSBkZWZhdWx0Ci0gTG9jYWxlLCB0byB0aGUgdXNlciBpbW1lZGlhdGVseS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JUmVwb3J0ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yKSI+cmVtb3ZlQWxsTWVzc2FnZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcyBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JUmVwb3J0ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0KSI+cmVtb3ZlQWxsTWVzc2FnZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMsIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLAotIHBlcnRhaW5pbmcgdG8gdGhlIE9iamVjdCBwcm92aWRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JUmVwb3J0ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjcmVtb3ZlTWVzc2FnZVN1YnNldChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpIj5yZW1vdmVNZXNzYWdlU3Vic2V0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmosCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtncm91cE5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkKLSBhc3NpZ24gZ3JvdXAgbmFtZXMgdG8gSU1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVZhbGlkYXRvckpvYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVZhbGlkYXRvckpvYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQwMDY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0b3JKb2IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJVmFsaWRhdG9ySm9iLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvXGNsYXNzLXVzZUlWYWxpZGF0b3JKb2IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9ySm9iLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzRjYmRiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvXGNsYXNzLXVzZU1lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik1lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VNZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLWZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZjE2MTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZVRpdGxlRm9udCI+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1JbnRlcmZhY2VzPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklNZXNzYWdlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JTWV0YU1vZGVsQ29udGV4dDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVJlcG9ydGVyPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVZhbGlkYXRpb25Db250ZXh0PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklWYWxpZGF0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVZhbGlkYXRvckpvYjwvST48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUV4Y2VwdGlvbnM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJNZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+TWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTFmNzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgUEFDS0FHRTwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxIMj4KLVBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZQotPC9IMj4KLUFuIGVhcmxpZXIgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuCi08UD4KLTxCPlNlZTo8L0I+Ci08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8QSBIUkVGPSIjcGFja2FnZV9kZXNjcmlwdGlvbiI+PEI+RGVzY3JpcHRpb248L0I+PC9BPgotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+SW50ZXJmYWNlIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPjwvQj48L1REPgotPFREPgotIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXRhTW9kZWxDb250ZXh0PC9BPjwvQj48L1REPgotPFREPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ8L0E+PC9CPjwvVEQ+Ci08VEQ+SVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCBleHRlbmRzIElWYWxpZGF0aW9uQ29udGV4dCB0byBwcm92aWRlIGFjY2VzcyB0byBhCi0gcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IG9uIHdoaWNoIGEgdmFsaWRhdG9yIGlzIGJlaW5nIGludm9rZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0I+PC9URD4KLTxURD5UaGUgaW50ZXJmYWNlIHVzZWQgYnkgSVZhbGlkYXRvcidzIHRvIHJlcG9ydCBtZXNzYWdlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPjwvQj48L1REPgotPFREPlRoaXMgY2xhc3MgaXMgdXNlZCB0byB0byBzZXBhcmF0ZSB0aGUgSVZhbGlkYXRvciBmcm9tIHRoZSBtb2RlbCBsb2FkaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIFZhbGlkYXRvcnMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9ySm9iPC9BPjwvQj48L1REPgotPFREPlRoaXMgaXMgdGhlIEpvYiBpbnRlcmZhY2UgZm9yIHRoZSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkV4Y2VwdGlvbiBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5NZXNzYWdlTGltaXRFeGNlcHRpb248L0E+PC9CPjwvVEQ+Ci08VEQ+PEI+RGVwcmVjYXRlZC48L0I+Jm5ic3A7PEk+VGhpcyBjbGFzcyBpcyBub3QgbG9uZ2VyIHVzZWQgYnkgdGhlIGZyYW1ld29yay48L0k+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotPEEgTkFNRT0icGFja2FnZV9kZXNjcmlwdGlvbiI+PCEtLSAtLT48L0E+PEgyPgotUGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIERlc2NyaXB0aW9uCi08L0gyPgotCi08UD4KLTxwPkFuIGVhcmxpZXIgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuPC9wPgotPHA+VGhpcyBmcmFtZXdvcmsgaXMgYmVpbmcgcmVwbGFjZWQgYnkgdGhlIDxjb2RlPm5ld2VyIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9jb2RlPiBmcmFtZXdvcmsuPC9wPgotPFA+Ci0KLTxQPgotPERMPgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgUEFDS0FHRTwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXVzZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXVzZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUxMWU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS11c2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgUGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIFBhY2thZ2U8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQj48L0E+PC9URD4KLTxURD5BbiBlYXJsaWVyIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSU1lc3NhZ2UuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+SU1lc3NhZ2U8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGxvY2FsZS1pbmRlcGVuZGVudCB2YWxpZGF0aW9uIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JUmVwb3J0ZXIuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+SVJlcG9ydGVyPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBpbnRlcmZhY2UgdXNlZCBieSBJVmFsaWRhdG9yJ3MgdG8gcmVwb3J0IG1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVZhbGlkYXRvci5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5JVmFsaWRhdG9yPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhbGwgVmFsaWRhdG9ycy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lNZXNzYWdlLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+SU1lc3NhZ2U8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGxvY2FsZS1pbmRlcGVuZGVudCB2YWxpZGF0aW9uIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JUmVwb3J0ZXIuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5JUmVwb3J0ZXI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGludGVyZmFjZSB1c2VkIGJ5IElWYWxpZGF0b3IncyB0byByZXBvcnQgbWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5JVmFsaWRhdGlvbkNvbnRleHQ8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRvIHNlcGFyYXRlIHRoZSBJVmFsaWRhdG9yIGZyb20gdGhlIG1vZGVsIGxvYWRpbmcuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdG9yLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+SVZhbGlkYXRvcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIFZhbGlkYXRvcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlZGUzNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lVGl0bGVGb250Ij4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotSW50ZXJmYWNlczwvRk9OVD4mbmJzcDsKLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KLTxCUj4KLTxBIEhSRUY9IklEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JRGVwZW5kZW5jeUluZGV4PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SU11dGFibGVWYWxpZGF0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklQZXJmb3JtYW5jZU1vbml0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcjwvST48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUNsYXNzZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJBYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+Ci08QlI+Ci08QSBIUkVGPSJEZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+RGVwZW5kZW50UmVzb3VyY2U8L0E+Ci08QlI+Ci08QSBIUkVGPSJGcmllbmQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkZyaWVuZDwvQT4KLTxCUj4KLTxBIEhSRUY9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Ci08QlI+Ci08QSBIUkVGPSJNdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPgotPEJSPgotPEEgSFJFRj0iTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+Ci08QlI+Ci08QSBIUkVGPSJQZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPgotPEJSPgotPEEgSFJFRj0iUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlJlcG9ydGVySGVscGVyPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Ci08QlI+Ci08QSBIUkVGPSJWYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJWYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uUmVzdWx0PC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRpb25SZXN1bHRzPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uU3RhdGU8L0E+Ci08QlI+Ci08QSBIUkVGPSJWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRvcjwvQT4KLTxCUj4KLTxBIEhSRUY9IlZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYxPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYxLlYxQ29weTwvQT4KLTxCUj4KLTxBIEhSRUY9IlZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYyPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotRW51bXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJJUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4KLTxCUj4KLTxBIEhSRUY9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4KLTxCUj4KLTxBIEhSRUY9IlZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q2ODc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMCkgb24gVHVlIEphbiAyNyAwNDoyODozMyBFU1QgMjAwOSAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5QYWNrYWdlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBQQUNLQUdFJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5ORVhUIFBBQ0tBR0U8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCi08L0gyPgotQSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4KLTxQPgotPEI+U2VlOjwvQj4KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxBIEhSRUY9IiNwYWNrYWdlX2Rlc2NyaXB0aW9uIj48Qj5EZXNjcmlwdGlvbjwvQj48L0E+Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5JbnRlcmZhY2UgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklEZXBlbmRlbmN5SW5kZXg8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBzZXJ2aWNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVzb3VyY2VzIHRoYXQgYSBwYXJ0aWN1bGFyIHJlc291cmNlIGRlcGVuZHMgb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT48L0I+PC9URD4KLTxURD5BIHZhbGlkYXRvciB0aGF0IGhhcyBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvcjwvQT48L0I+PC9URD4KLTxURD5BIHNlcnZpY2UgdGhhdCBjb2xsZWN0cyBwZXJmb3JtYW5jZSBpbmZvcm1hdGlvbiBvbiB2YWxpZGF0aW9uIG9wZXJhdGlvbnMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcjwvQT48L0I+PC9URD4KLTxURD5WYWxpZGF0b3JzIG1heSB3aXNoIHRvIGpvaW4gdmFsaWRhdG9yIGdyb3VwcyBmb3IgcGVyZm9ybWFuY2Ugb3Igb3RoZXIKLSByZWFzb25zLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5DbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhlIGNsYXNzIHRoYXQgYWxsIFZhbGlkYXRvcnMgdGhhdCB3aXNoIHRvIHVzZSB2ZXJzaW9uIHR3byBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgbXVzdCBzdWJjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+RGVwZW5kZW50UmVzb3VyY2U8L0E+PC9CPjwvVEQ+Ci08VEQ+QSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCBvbiBhbm90aGVyIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+RnJpZW5kPC9BPjwvQj48L1REPgotPFREPlRoaXMgY2xhc3MgaXMgb25seSB0byBiZSBjYWxsZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFuZCBpdCdzIHRlc3QgY2FzZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQT48L0I+PC9URD4KLTxURD5Bc3NvY2lhdGUgYSBtZXNzYWdlIHNldmVyaXR5IHdpdGggYSBtZXNzYWdlIGNhdGVnb3J5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBjbGFzcyBob2xkcyB0aGUgb3ZlcmFsbCBwcm9qZWN0IHZhbGlkYXRpb24gc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBjbGFzcyBob2xkcyB0aGUgb3ZlcmFsbCB3b3Jrc3BhY2UgdmFsaWRhdGlvbiBzZXR0aW5ncy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvQj48L1REPgotPFREPlNvbWUgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gZm9yIGEgdmFsaWRhdGlvbiBpbnZvY2F0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5SZXBvcnRlckhlbHBlcjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGlzIGEgdGVtcG9yYXJ5IGNsYXNzIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgdmFsaWRhdGlvbiBmcmFtZXdvcmsuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+PC9CPjwvVEQ+Ci08VEQ+QW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHdoaWNoIG9iamVjdCBzaG91bGQgYmUgdmFsaWRhdGVkIGFuZCB3aGF0IHRyaWdnZXJlZCBpdHMgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPjwvQj48L1REPgotPFREPlRoZSBjZW50cmFsIGNsYXNzIG9mIHRoZSBWYWxpZGF0aW9uIEZyYW1ld29yay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQj48L1REPgotPFREPlRoZSByZXN1bHQgb2YgcnVubmluZyBhIHZhbGlkYXRlIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdHM8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhlIGNvbWJpbmVkIHJlc3VsdHMgb2YgdmFsaWRhdGluZyBtdWx0aXBsZSByZXNvdXJjZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+PC9CPjwvVEQ+Ci08VEQ+S2VlcCB0cmFjayBvZiBhcmJpdHJhcnkgdmFsaWRhdGlvbiBkYXRhLCBkdXJpbmcgdGhlIGNvdXJzZSBvZiBhIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9CPjwvVEQ+Ci08VEQ+UmVwcmVzZW50cyBhIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0I+PC9URD4KLTxURD5BIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAxIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9BPjwvQj48L1REPgotPFREPiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvQj48L1REPgotPFREPkEgdmFsaWRhdG9yIHRoYXQgdXNlcyB2ZXJzaW9uIDIgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBjbGFzcyBwcm92aWRlcyBhIHdheSBmb3IgYSB2YWxpZGF0b3IgdG8gcmV0dXJuIG1lc3NhZ2VzLCB0aGF0IGFyZSBlYXNpbHkKLSBjb252ZXJ0ZWQgaW50byBJTWFya2Vycy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0I+PC9URD4KLTxURD5UaGUgbGV2ZWwgb2YgaW5mb3JtYXRpb24gdG8gY29sbGVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT48L0I+PC9URD4KLTxURD5UaGUgbGV2ZWwgb2YgY29uZmlndXJhdGlvbiBmb3IgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci08QSBOQU1FPSJwYWNrYWdlX2Rlc2NyaXB0aW9uIj48IS0tIC0tPjwvQT48SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIERlc2NyaXB0aW9uCi08L0gyPgotCi08UD4KLTxwPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuPC9wPgotPHA+QWxzbyBzZWUgPGEgaHJlZj0iZG9jLWZpbGVzL2ZhcS5odG1sIj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvYT48L3A+Ci08cD4KLVRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiB2YWxpZGF0aW9uLCA8Yj5idWlsZCBiYXNlZDwvYj4gYW5kIAotPGI+YXMgeW91IHR5cGU8L2I+LiBUaGlzIGZyYW1ld29yayBzdXBwb3J0cyBidWlsZCBiYXNlZAotdmFsaWRhdGlvbi4gSWYgYXV0byBidWlsZCBpcyB0dXJuZWQgb24gdGhlbiB0aGUgdmFsaWRhdG9ycyBhcmUgY2FsbGVkCi13aGVuIHRoZSB1c2VyIHNhdmVzIHRoZWlyIGZpbGUuIElmIGF1dG8gYnVpbGQgaXMgbm90IHR1cm5lZCBvbiB0aGVuCi10aGUgdmFsaWRhdG9ycyBhcmUgY2FsbGVkIHdoZW4gdGhlIHVzZXIgc3RhcnRzIGEgYnVpbGQuPC9wPgotPHA+VGhpcyBmcmFtZXdvcmsgd2FzIGFkZGVkIHRvIFdUUCBpbiB2ZXJzaW9uIDMuMC48L3A+Ci08aDM+RGVwZW5kZW5jeSBTdXBwb3J0PC9oMz4KLTxwPlNvbWV0aW1lcyByZXNvdXJjZXMgZGVwZW5kIG9uIG90aGVyIHJlc291cmNlcywgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhleSBhcmUgCi12YWxpZCBvciBub3QuIEFuIGV4YW1wbGUgd291bGQgYmUgdGhhdCBhbiBYTUwgcmVzb3VyY2UgY291bGQgZGVwZW5kIG9uIGEgRFRELiBJZiBhdCBzb21lIAotcG9pbnQgaW4gdGhlIGZ1dHVyZSB0aGUgRFREIGNoYW5nZXMsIHRoZW4gdGhlIGRlcGVuZGVudCBYTUwgcmVzb3VyY2Ugc2hvdWxkIGJlIAotcmV2YWxpZGF0ZWQgdG8gZW5zdXJlIHRoYXQgaXQgc3RpbGwgbWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgY2hhbmdlZCBEVEQgCi1maWxlLiBJbiBvcmRlciB0byBkbyB0aGlzIGVmZmljaWVudGx5LCB0aGVyZSBuZWVkcyB0byBiZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIAotdGhlIERURCBhbmQgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBkZXBlbmQgb24gaXQuPHA+VG8gYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgYWxsb3dzIAotdGhpcyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHRvIGJlIHJldHVybmVkIGFzIHBhcnQgb2YgYQotPGEgaHJlZj0iQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UsIGludCwgVmFsaWRhdGlvblN0YXRlLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikiPgotdmFsaWRhdGUgb3BlcmF0aW9uPC9hPi4gU2luY2UgdGhlIHZhbGlkYXRvciBuZWVkZWQgdG8gZmlndXJlIHRoaXMgb3V0IGFueXdheXMsIAotd2h5IG5vdCBwYXNzIHRoaXMgaW5mb3JtYXRpb24gYmFjayB0byB0aGUgZnJhbWV3b3JrLCBzbyB0aGF0IGl0IGNhbiBiZSBzYXZlZC4gCi1UaGlzIHNhdmVzIHRoZSBjb3N0IG9mIGhhdmluZyB0byBwYXJzZSB0aGUgZmlsZSBhdCBzb21lIGxhdGVyIHBvaW50IGluIHRpbWUgCi0od2hlbiB0aGUgZmlsZSBpcyBwcm9iYWJseSBzaXR0aW5nIGNvbGQgb24gZGlzaykuIFRoZSBmZXdlciB0aW1lcyB0aGF0IHdlIG5lZWQgCi10byBvcGVuLCByZWFkIGFuZC9vciBwYXJzZSB0aGUgc2FtZSBmaWxlLCB3aWxsIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSAKLXByb2R1Y3QuCi08cD5JbiBwYXJ0aWN1bGFyIHdoZW4gdGhlIHZhbGlkYXRlIG1ldGhvZCByZXR1cm5zLCBhCi08YSBocmVmPSJWYWxpZGF0aW9uUmVzdWx0Lmh0bWwiPlZhbGlkYXRpb25SZXN1bHQ8L2E+IG11c3QgYmUgcmV0dXJuZWQsIGluc2lkZSBvZiAKLXRoaXMgcmVzdWx0LCBhbGwgeW91ciBkZXBlbmRlbmNpZXMgbmVlZCB0byBiZSBzcGVjaWZpZWQgd2l0aCB0aGUKLTxhIGhyZWY9IlZhbGlkYXRpb25SZXN1bHQuaHRtbCNzZXREZXBlbmRzT24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlW10pIj4KLXNldERlcGVuZHNPbjwvYT4gbWV0aG9kLjxwPkluIGFkZGl0aW9uIHRvIGtlZXBpbmcgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gCi11cC10by1kYXRlIHRocm91Z2ggdGhlIG5vcm1hbCBjb3Vyc2Ugb2YgdmFsaWRhdGlvbiwgZGlyZWN0IGFjY2VzcyBpcyBhbHNvIAotcHJvdmlkZWQgdG8gdGhlIGRlcGVuZGVuY3kgc3VwcG9ydCB0aHJvdWdoIHRoZQotPGEgaHJlZj0iVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldERlcGVuZGVuY3lJbmRleCgpIj5nZXREZXBlbmRlbmN5SW5kZXg8L2E+IAotbWV0aG9kLiBUaGUgPGEgaHJlZj0iSURlcGVuZGVuY3lJbmRleC5odG1sIj5JRGVwZW5kZW5jeUluZGV4PC9hPiBhbGxvd3MgeW91IHRvIAotZGlyZWN0bHkgbWFuaXB1bGF0ZSB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IgYSB2YWxpZGF0b3IuCi08aDM+RW50cnkgUG9pbnRzIGludG8gdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrPC9oMz4KLTxwPkhlcmUgYXJlIHNvbWUgb2YgdGhlIHBvaW50cyB3aGVyZSB0aGUgcGxhdGZvcm0gY2FsbHMgaW50byB0aGUgZnJhbWV3b3JrOjwvcD4KLTx1bD4KLTxsaT48Yj5CdWlsZGVyPC9iPiAtIFZhbGlkYXRpb25CdWlsZGVyPC9saT4KLTxsaT48Yj5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjwvYj4gLSBWYWxNYW5hZ2VyPC9saT4KLTxsaT48Yj5JSm9iQ2hhbmdlTGlzdGVuZXI8L2I+IC0gVmFsaWRhdGlvbk9wZXJhdGlvbiwgVmFsaWRhdGlvbk9wZXJhdGlvbi5WYWxpZGF0aW9uTGF1bmNoZXJKb2I8L2xpPgotPGxpPjxiPklQcm9qZWN0Q2hhbmdlTGlzdGVuZXI8L2I+IC0gVmFsTWFuYWdlcjwvbGk+Ci08bGk+PGI+SVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2I+IC0gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24sIERpc2FibGVkUmVzb3VyY2VNYW5hZ2VyPC9saT4KLTxsaT48Yj5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjwvYj4gLSBFdmVudE1hbmdlcjwvbGk+Ci08bGk+PGI+SVZhbENoYW5nZWRMaXN0ZW5lcjwvYj4gLSBWYWxNYW5hZ2VyLCBEaXNhYmxlZFZhbGlkYXRvck1hbmFnZXI8L2xpPgotPC91bD4KLTxQPgotCi08UD4KLTxETD4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5QYWNrYWdlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBQQUNLQUdFJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Qj5ORVhUIFBBQ0tBR0U8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtdXNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXVzZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDI5ZDNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtdXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDA5LTAxLTI3Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBQYWNrYWdlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB1c2VkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+QWJzdHJhY3RWYWxpZGF0b3I8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGNsYXNzIHRoYXQgYWxsIFZhbGlkYXRvcnMgdGhhdCB3aXNoIHRvIHVzZSB2ZXJzaW9uIHR3byBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgbXVzdCBzdWJjbGFzcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9EZXBlbmRlbnRSZXNvdXJjZS5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5EZXBlbmRlbnRSZXNvdXJjZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHJlc291cmNlIHRoYXQgaXMgZGVwZW5kZW50IG9uIGFub3RoZXIgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSURlcGVuZGVuY3lJbmRleC5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5JRGVwZW5kZW5jeUluZGV4PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgc2VydmljZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlc291cmNlcyB0aGF0IGEgcGFydGljdWxhciByZXNvdXJjZSBkZXBlbmRzIG9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPklNdXRhYmxlVmFsaWRhdG9yPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgdmFsaWRhdG9yIHRoYXQgaGFzIGZpZWxkcyB0aGF0IGNhbiBiZSB1cGRhdGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+SVBlcmZvcm1hbmNlTW9uaXRvcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHNlcnZpY2UgdGhhdCBjb2xsZWN0cyBwZXJmb3JtYW5jZSBpbmZvcm1hdGlvbiBvbiB2YWxpZGF0aW9uIG9wZXJhdGlvbnMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGxldmVsIG9mIGluZm9ybWF0aW9uIHRvIGNvbGxlY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fzc29jaWF0ZSBhIG1lc3NhZ2Ugc2V2ZXJpdHkgd2l0aCBhIG1lc3NhZ2UgY2F0ZWdvcnkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNsYXNzIGhvbGRzIHRoZSBvdmVyYWxsIHByb2plY3QgdmFsaWRhdGlvbiBzZXR0aW5ncy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgY2xhc3MgaG9sZHMgdGhlIG92ZXJhbGwgd29ya3NwYWNlIHZhbGlkYXRpb24gc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NvbWUgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gZm9yIGEgdmFsaWRhdGlvbiBpbnZvY2F0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25FdmVudC5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5WYWxpZGF0aW9uRXZlbnQ8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHdoaWNoIG9iamVjdCBzaG91bGQgYmUgdmFsaWRhdGVkIGFuZCB3aGF0IHRyaWdnZXJlZCBpdHMgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlZhbGlkYXRpb25GcmFtZXdvcms8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGNlbnRyYWwgY2xhc3Mgb2YgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+VmFsaWRhdGlvblJlc3VsdDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSB2YWxpZGF0ZSBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvblJlc3VsdHMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+VmFsaWRhdGlvblJlc3VsdHM8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGNvbWJpbmVkIHJlc3VsdHMgb2YgdmFsaWRhdGluZyBtdWx0aXBsZSByZXNvdXJjZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvblN0YXRlLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlZhbGlkYXRpb25TdGF0ZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtLZWVwIHRyYWNrIG9mIGFyYml0cmFyeSB2YWxpZGF0aW9uIGRhdGEsIGR1cmluZyB0aGUgY291cnNlIG9mIGEgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+VmFsaWRhdG9yPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcHJlc2VudHMgYSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLkxldmVsLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlZhbGlkYXRvci5MZXZlbDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgbGV2ZWwgb2YgY29uZmlndXJhdGlvbiBmb3IgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjEuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+VmFsaWRhdG9yLlYxPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgdmFsaWRhdG9yIHRoYXQgdXNlcyB2ZXJzaW9uIDEgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvci5WMi5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5WYWxpZGF0b3IuVjI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yTWVzc2FnZS5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5WYWxpZGF0b3JNZXNzYWdlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgY2xhc3MgcHJvdmlkZXMgYSB3YXkgZm9yIGEgdmFsaWRhdG9yIHRvIHJldHVybiBtZXNzYWdlcywgdGhhdCBhcmUgZWFzaWx5Ci0gY29udmVydGVkIGludG8gSU1hcmtlcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+U2VyaWFsaXplZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5NDJlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wKSBvbiBUdWUgSmFuIDI3IDA0OjI4OjMzIEVTVCAyMDA5IC0tPgotPFRJVExFPgotT3ZlcnZpZXcgTGlzdAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEggQUxJR049ImxlZnQiIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lVGl0bGVGb250Ij4KLTxCPjwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPkFsbCBDbGFzc2VzPC9BPjwvRk9OVD4KLTxQPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLVBhY2thZ2VzPC9GT05UPgotPEJSPgotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD4KLTxCUj4KLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2UtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPgotPEJSPgotPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLSZuYnNwOwotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTM4MTYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL292ZXJ2aWV3LXN1bW1hcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1PdmVydmlldwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAwOS0wMS0yNyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik92ZXJ2aWV3IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5PdmVydmlldzwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InNlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/b3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgxPgotV2ViIFRvb2xzIFBsYXRmb3JtOiBWYWxpZGF0aW9uIEZyYW1ld29yawotPC9IMT4KLTwvQ0VOVEVSPgotQSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4KLTxQPgotPEI+U2VlOjwvQj4KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxBIEhSRUY9IiNvdmVydmlld19kZXNjcmlwdGlvbiI+PEI+RGVzY3JpcHRpb248L0I+PC9BPgotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+UGFja2FnZXM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjIwJSI+PEI+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvQj48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMjAlIj48Qj48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPjwvQj48L1REPgotPFREPkFuIGVhcmxpZXIgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLSZuYnNwOzxBIE5BTUU9Im92ZXJ2aWV3X2Rlc2NyaXB0aW9uIj48IS0tIC0tPjwvQT4KLTxQPgotPHA+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC48L3A+Ci08aDI+QXBwcm9hY2g8L2gyPgotPHA+SW4gV1RQIDMuMCBhIG5ldyB2YWxpZGF0aW9uIGZyYW1ld29yayBoYXMgYmVlbiBhZGRlZC4gVGhpcyB3YXMgZGV2ZWxvcGVkIGF0IAotdGhlIHJlcXVlc3Qgb2YgdmFsaWRhdG9yIG93bmVycyBhbmQgZW5kIHVzZXJzLiBUbyBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoaXMgCi1uZXcgZnJhbWV3b3JrLCB0aGF0IGFwcHJvYWNoIHRoYXQgaGFzIGJlZW4gdGFrZW4gaXMgdG8gc3VwcG9ydCBib3RoIHRoZSBvbGQgYW5kIAotdGhlIG5ldyBmcmFtZXdvcmtzIGZvciBhIHdoaWxlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9sZCB2YWxpZGF0b3JzIHdvcmsgZXhhY3RseSAKLWxpa2UgdGhleSB1c2VkIHRvLiBUaGV5IGNhbiBzdGlsbCBwbHVnIGludG8gdGhlIG9sZCBmcmFtZXdvcmsgYW5kIHdpbGwgY29udGludWUgCi10byBiZSBydW4gYnkgdGhlIG9sZCBmcmFtZXdvcmsuIFRoaXMgYWxsb3dzIHZhbGlkYXRvciBvd25lcnMgdG8gbWlncmF0ZSBhdCB0aGVpciAKLW93biBwYWNlLjwvcD4KLTxwPkZvciB2YWxpZGF0b3Igb3duZXJzIHRoYXQgd2lzaCB0byBleHBsb2l0IHRoZSBuZXcgZnJhbWV3b3JrLCBpdCBoYXMgYmVlbiAKLWRlc2lnbmVkIG4gc3VjaCBhIHdheSB0byBtaW5pbWl6ZSB0aGUgdHJhbnNpdGlvbiBmcm9tIHRoZSBvbGQgZnJhbWV3b3JrIHRvIHRoZSAKLW5ldyBmcmFtZXdvcmsuIFRoZXJlIGlzIGEgbmV3IGV4dGVuc2lvbiBwb2ludCB0aGF0IG5lZWRzIHRvIGJlIHNwZWNpZmllZCwgYW5kIGEgCi1uZXcgYWJzdHJhY3QgY2xhc3MgdGhhdCBuZWVkcyB0byBiZSBleHRlbmRlZC48L3A+Ci08aDM+QmVuZWZpdHM8L2gzPgotPHA+V2hhdCBiZW5lZml0cyBkb2VzIHRoZSBuZXcgZnJhbWV3b3JrIGhhdmUgdG8gb2ZmZXI/IE9yIGFza2VkIGFub3RoZXIgd2F5LCBhcyAKLWEgdmFsaWRhdG9yIG93bmVyLCB3aHkgd291bGQgSSB3YW50IHRvIHN3aXRjaD88L3A+Ci08aDQ+UGVyZm9ybWFuY2U8L2g0PgotPGg1PlR1bmluZzwvaDU+Ci08cD5UaGUgbWFpbiByZWFzb24gZm9yIGNyZWF0aW5nIGEgbmV3IGZyYW1ld29yayB3YXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gQXMgCi1tb3JlIGFuZCBtb3JlIHZhbGlkYXRvcnMgYXJlIGFkZGVkLCB2YWxpZGF0aW9uIGlzIGNvbnN1bWluZyBhIGJpZ2dlciBzbGljZSBvZiAKLXRoZSByZXNvdXJjZXMgdGhhdCBpdCB0YWtlcyB0byBwZXJmb3JtIGEgYnVpbGQuPC9wPgotPHA+VGhlIGJlc3QgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaXMgZWxpbWluYXRpbmcgdW5uZWNlc3Nhcnkgd29yay4gV2UgCi1lbGltaW5hdGUgd29yaywgYnkgcHJvdmlkaW5nIHNpZ25pZmljYW50bHkgbW9yZSB0dW5pbmcgb3B0aW9ucy4gVmFsaWRhdGlvbiAKLW93bmVycyBjYW4gdHVuZSB3aGljaCByZXNvdXJjZXMgdGhleSBhcmUgY2FsbGVkIG9uLiBUaGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgdXNlIAotb2YgZmlsdGVyIHJ1bGVzLiBUaGVzZSBmaWx0ZXIgcnVsZXMgYXJlIGdyb3VwZWQgaW50byBpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbiAKLWdyb3Vwcy4gSWYgeW91IGhhdmUgbXVsdGlwbGUgaW5jbHVzaW9uIGdyb3VwcyB0aGV5IGFyZSAmcXVvdDthbmRlZCZxdW90OyB0b2dldGhlciwgbWVhbmluZyAKLXRoYXQgZWFjaCBvZiB0aGUgaW5jbHVzaW9uIGdyb3VwcyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN1Y2Nlc3NmdWwgZmlsdGVyIHJ1bGUuIAotRXhjbHVzaW9uIGdyb3VwcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoYXQgZG9lc24ndCBnZXQgdmFsaWRhdGVkLiBFeGNsdXNpb24gCi1ncm91cHMgaGF2ZSBhIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gaW5jbHVzaW9uIGdyb3Vwcy4gSWYgYW4gZXhjbHVzaW9uIGdyb3VwIAotZXhjbHVkZXMgYSByZXNvdXJjZSB0aGFuIGl0IGlzIGV4Y2x1ZGVkIG5vIG1hdHRlciB3aGF0IHRoZSBpbmNsdXNpb24gZ3JvdXBzIG1heSAKLXNheS48L3A+Ci08cD5UaGV5IGFyZSBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyBvZiBmaWx0ZXIgcnVsZXM6PC9wPgotPHVsPgotICAgICAgICA8bGk+PHN0cm9uZz5GaWxlIGV4dGVuc2lvbjwvc3Ryb25nPiAtIFJ1bGVzIGJhc2VkIG9uIHRoZSBmaWxlIGV4dGVuc2lvbi4gRm9yIAotICAgICAgICBleGFtcGxlLCBpbmNsdWRlIGFsbCB0aGUgZmlsZXMgd2l0aCBleHRlbnNpb24gKi54bWwuPC9saT4KLSAgICAgICAgPGxpPjxzdHJvbmc+Rm9sZGVyIG9yIEZpbGUgbmFtZTwvc3Ryb25nPiAtIFJ1bGVzIGJhc2VkIG9uIHRoZSBmb2xkZXIgb3IgZmlsZSAKLSAgICAgICAgbmFtZS4gRm9yIGV4YW1wbGUgZXhjbHVkZSBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgYnVpbGQgZm9sZGVyLiBGaWxlIG5hbWVzIAotICAgICAgICBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkLCBwcm9qZWN0IHJlbGF0aXZlIG5hbWVzLCBlLmcuIDxzdHJvbmc+V2ViQ29udGVudC9XRUItSU5GL3dlYi54bWw8L3N0cm9uZz4sIAotICAgICAgICBvciBzaW1wbGUgbmFtZXMsIDxzdHJvbmc+d2ViLnhtbDwvc3Ryb25nPi48L2xpPgotICAgICAgICA8bGk+PHN0cm9uZz5Qcm9qZWN0IG5hdHVyZTwvc3Ryb25nPiAtIFByb2plY3RzIHdpdGggY2VydGFpbiBuYXR1cmVzIGNhbiBiZSAKLSAgICAgICAgZWl0aGVyIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLjwvbGk+Ci0gICAgICAgIDxsaT48c3Ryb25nPkZhY2V0PC9zdHJvbmc+IC0gUHJvamVjdHMgd2l0aCBjZXJ0YWluIGZhY2V0cyBjYW4gYmUgZWl0aGVyIAotICAgICAgICBpbmNsdWRlZCBvciBleGNsdWRlZC48L2xpPgotICAgICAgICA8bGk+PHN0cm9uZz5Db250ZW50IFR5cGUgPC9zdHJvbmc+LSBSZXNvdXJjZXMgb2YgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSAKLSAgICAgICAgY2FuIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLjwvbGk+Ci08L3VsPgotPHA+VGhlIGZpbHRlciBydWxlcyBhbmQgZ3JvdXBzIGZvcm0gdGhlIGJ1aWxkaW5nIGJsb2NrcyBvZiB3aGF0IGdldHMgdmFsaWRhdGVkLgotPC9wPgotPHA+SW4gdGVybXMgb2YgdHVuaW5nIGhvd2V2ZXIsIHRoZSBlbmQgdXNlciBoYXMgdGhlIGZpbmFsIHNheS4gVGhlIHZhbGlkYXRvciAKLW93bmVycyBzcGVjaWZ5IHRoZSBkZWZhdWx0IGZpbHRlciBydWxlcyBhbmQgZ3JvdXBzIGZvciB0aGVpciB2YWxpZGF0b3IsIGJ1dCB0aGUgCi1lbmQgdXNlciB0aHJvdWdoIHRoZSB1c2Ugb2YgcHJlZmVyZW5jZXMgY2FuIG92ZXJyaWRlIHRoZXNlIHNldHRpbmdzLiA8L3A+Ci08aDU+Q2FjaGluZzwvaDU+Ci08cD5Bbm90aGVyIHdheSB0aGF0IHBlcmZvcm1hbmNlIGlzIGltcHJvdmVkIGlzIHRocm91Z2ggbW9yZSBlZmZlY3RpdmUgY2FjaGluZy4gCi1XaXRoIHRoZSBwcmV2aW91cyBmcmFtZXdvcmsgd2Ugd2VyZSBub3RpY2luZyB0aGF0IGRpZmZlcmVudCB2YWxpZGF0b3JzIHdvdWxkIGJlIAotb3BlbmluZyBhbmQgcHJvY2Vzc2luZyB0aGUgc2FtZSBmaWxlLCBidXQgdGhhdCB0aGlzIHdvdWxkIGhhcHBlbiBmYXIgZW5vdWdoIAotYXBhcnQsIHRoYXQgY2FjaGVzIHdlcmVuJ3QgZWZmZWN0aXZlLiBFdmVuIGlmIGZpbGVzIHdlcmUgYmVpbmcgY2FjaGVkLCB0aGUgCi1zZWNvbmQgKG9yIHRoaXJkLCBvciBmb3J0aCwgLi4uKSBvcGVuIHdvdWxkIGhhcHBlbiBmYXIgZW5vdWdoIGEgbWVhbnMgdGhhdCB3YXkgCi10aGF0IHRoZSBmaWxlIHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUuIEluIHRoZSBuZXcgCi1mcmFtZXdvcmssIHRoZSBwcm9jZXNzaW5nIG9yZGVyIGlzIG1vcmUgdGlnaHRseSBjb250cm9sbGVkLiBUaGUgZnJhbWV3b3JrIGNhbGxzIAotdGhlIHZhbGlkYXRvciBhbmQgdGVsbHMgaXQgd2hhdCB0byB2YWxpZGF0ZS4gVGhpcyB3YXkgZmlsZXMgYXJlIHByb2Nlc3NlZCBpbiAKLW9yZGVyLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjaGFuY2Ugb2YgdGhlbSBiZWluZyBhIGNhY2hlIGlzIG11Y2ggaGlnaGVyLiBFdmVyeSAKLXZhbGlkYXRvciB0aGF0IGlzIGludGVyZXN0ZWQgaW4gZmlsZSBBIHByb2Nlc3NlcyBpdCwgYW5kIHRoZW4gd2UgbW92ZSBvbiBhbmQgCi1ldmVyeSB2YWxpZGF0b3IgdGhhdCBpcyBpbnRlcmVzdGVkIGluIGZpbGUgQiBwcm9jZXNzZXMgaXQsIGV0Yy48L3A+Ci08cD5BbHNvIGJlY2F1c2Ugc3RhdGUgaW5mb3JtYXRpb24gaXMga2VwdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWxpZGF0aW9uIAotb3BlcmF0aW9uLCB2YWxpZGF0b3JzIGNhbiBjYWNoZSBleHBlbnNpdmUgb3BlcmF0aW9ucywgbGlrZSBtb2RlbCBjcmVhdGlvbiwgdGhhdCAKLW1pZ2h0IGJlIG5lZWRlZCBhcyBwYXJ0IG9mIHZhbGlkYXRpbmcgc2V2ZXJhbCBmaWxlcy4gPC9wPgotPGg1PkpvYiBDb250cm9sPC9oNT4KLTxwPldpdGggdGhlIGVhcmxpZXIgZnJhbWV3b3JrLCB0aGVyZSB3ZXJlIHRvbyBtYW55IGpvYnMvdGhyZWFkcyBydW5uaW5nIAotY29uY3VycmVudGx5LiBUaGlzIGlzIG5vdyBtb3JlIHRpZ2h0bHkgY29udHJvbGxlZC48L3A+Ci08aDQ+RGVwZW5kZW5jeSBTdXBwb3J0PC9oND4KLTxwPkFub3RoZXIgbmV3IGZlYXR1cmUgaXMgZGVwZW5kZW5jeSBzdXBwb3J0LiBBIHZhbGlkYXRvciBjYW4gbm93IGFzc2VydCB0aGF0IGEgCi1yZXNvdXJjZSBpcyBkZXBlbmRhbnQgb24gc29tZSBvdGhlciByZXNvdXJjZXMuIEZvciBleGFtcGxlIHRoYXQgYSBYTUwgZmlsZSBpcyAKLWRlcGVuZGFudCBvbiBhIFhTRCBmaWxlLiBOb3cgaWYgdGhlIFhTRCBmaWxlIGNoYW5nZXMgdGhlIFhNTCBjYW4gYmUgcmV2YWxpZGF0ZWQuIAotQXMgdGhlIHVzZXIgY29tZXMgdG8gdHJ1c3QgdGhpcyBkZXBlbmRlbmN5IHN1cHBvcnQsIHRoZXkgd29udCBwZXJmb3JtIGFzIG1hbnkgCi1jbGVhbiBidWlsZHMuPC9wPgotPGg0PlByaW1hcnkgRnJhbWV3b3JrPC9oND4KLTxwPlRoaXMgaXMgdGhlIHByaW1hcnkgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIEF0IHNvbWUgcG9pbnQsIHRoZSBlYXJsaWVyIAotZnJhbWV3b3JrIHdpbGwgYmUgZGVwcmVjYXRlZCBhbmQgdGhlbiByZW1vdmVkLiBBbGwgdGhlIG5ldyBpbnZlc3RtZW50IHdpbGwgCi1oYXBwZW4gaW4gdGhpcyBmcmFtZXdvcmsuIDwvcD4KLTxwPlRoZSBmcmFtZXdvcmsgY29sbGF0ZXJhbCB3aWxsIGNvbnRpbnVlIHRvIGJlIGVuaGFuY2VkIChqdW5pdCB0ZXN0Y2FzZXMsIAotZG9jdW1lbnRhdGlvbiwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLCAuLi4pPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5PdmVydmlldzwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InNlcmlhbGl6ZWQtZm9ybS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/b3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3BhY2thZ2UtbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3BhY2thZ2UtbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjYjI0ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9wYWNrYWdlLWxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9yZXNvdXJjZXMvaW5oZXJpdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9yZXNvdXJjZXMvaW5oZXJpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTQ4NjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcmVzb3VyY2VzL2luaGVyaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9zZXJpYWxpemVkLWZvcm0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3OTk2OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9zZXJpYWxpemVkLWZvcm0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjApIG9uIFR1ZSBKYW4gMjcgMDQ6Mjg6MzMgRVNUIDIwMDkgLS0+Ci08VElUTEU+Ci1TZXJpYWxpemVkIEZvcm0KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMDktMDEtMjciPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJTZXJpYWxpemVkIEZvcm0iOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5TZXJpYWxpemVkPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/c2VyaWFsaXplZC1mb3JtLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0ic2VyaWFsaXplZC1mb3JtLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMT4KLVNlcmlhbGl6ZWQgRm9ybTwvSDE+Ci08L0NFTlRFUj4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImNlbnRlciI+PEZPTlQgU0laRT0iKzIiPgotPEI+UGFja2FnZTwvQj4gPEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q2xhc3MgPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9BPiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotPEI+c2VyaWFsVmVyc2lvblVJRDombmJzcDs8L0I+LTcwMzQ4OTcxOTA3NDU3NjY5NDBMCi0KLTxQPgotCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlNlcmlhbGl6ZWQ8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9zZXJpYWxpemVkLWZvcm0uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJzZXJpYWxpemVkLWZvcm0uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3N0eWxlc2hlZXQuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvc3R5bGVzaGVldC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTllNTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvc3R5bGVzaGVldC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBKYXZhZG9jIHN0eWxlIHNoZWV0ICovCi0KLS8qIERlZmluZSBjb2xvcnMsIGZvbnRzIGFuZCBvdGhlciBzdHlsZSBhdHRyaWJ1dGVzIGhlcmUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzICovCi0KLS8qIFBhZ2UgYmFja2dyb3VuZCBjb2xvciAqLwotYm9keSB7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IGNvbG9yOiMwMDAwMDAgfQotCi0vKiBIZWFkaW5ncyAqLwotaDEgeyBmb250LXNpemU6IDE0NSUgfQotCi0vKiBUYWJsZSBjb2xvcnMgKi8KLS5UYWJsZUhlYWRpbmdDb2xvciAgICAgeyBiYWNrZ3JvdW5kOiAjQ0NDQ0ZGOyBjb2xvcjojMDAwMDAwIH0gLyogRGFyayBtYXV2ZSAqLwotLlRhYmxlU3ViSGVhZGluZ0NvbG9yICB7IGJhY2tncm91bmQ6ICNFRUVFRkY7IGNvbG9yOiMwMDAwMDAgfSAvKiBMaWdodCBtYXV2ZSAqLwotLlRhYmxlUm93Q29sb3IgICAgICAgICB7IGJhY2tncm91bmQ6ICNGRkZGRkY7IGNvbG9yOiMwMDAwMDAgfSAvKiBXaGl0ZSAqLwotCi0vKiBGb250IHVzZWQgaW4gbGVmdC1oYW5kIGZyYW1lIGxpc3RzICovCi0uRnJhbWVUaXRsZUZvbnQgICB7IGZvbnQtc2l6ZTogMTAwJTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGNvbG9yOiMwMDAwMDAgfQotLkZyYW1lSGVhZGluZ0ZvbnQgeyBmb250LXNpemU6ICA5MCU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBjb2xvcjojMDAwMDAwIH0KLS5GcmFtZUl0ZW1Gb250ICAgIHsgZm9udC1zaXplOiAgOTAlOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgY29sb3I6IzAwMDAwMCB9Ci0KLS8qIE5hdmlnYXRpb24gYmFyIGZvbnRzIGFuZCBjb2xvcnMgKi8KLS5OYXZCYXJDZWxsMSAgICB7IGJhY2tncm91bmQtY29sb3I6I0VFRUVGRjsgY29sb3I6IzAwMDAwMH0gLyogTGlnaHQgbWF1dmUgKi8KLS5OYXZCYXJDZWxsMVJldiB7IGJhY2tncm91bmQtY29sb3I6IzAwMDA4QjsgY29sb3I6I0ZGRkZGRn0gLyogRGFyayBCbHVlICovCi0uTmF2QmFyRm9udDEgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6IzAwMDAwMDtjb2xvcjojMDAwMDAwO30KLS5OYXZCYXJGb250MVJldiB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjojRkZGRkZGO2NvbG9yOiNGRkZGRkY7fQotCi0uTmF2QmFyQ2VsbDIgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOyBjb2xvcjojMDAwMDAwfQotLk5hdkJhckNlbGwzICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsgY29sb3I6IzAwMDAwMH0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkNGUxNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0gICAgCTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVFJBTlNJVElPTkFMLy9FTiI+Ci0JCTxodG1sIHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCI+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLQkJPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIE9yYWNsZSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDguIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLQotICAgCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIAkJPHRpdGxlPlZhbGlkYXRpb24gRnJhbWV3b3JrIEV4dGVuc2lvbiBQb2ludHM8L3RpdGxlPgotCQk8TElOSyBSRUw9IlNUWUxFU0hFRVQiIEhSRUY9Ii4uLy4uL2Jvb2suY3NzIiBDSEFSU0VUPSJJU08tODg1OS0xIiBUWVBFPSJ0ZXh0L2NzcyI+Ci0JCTwvaGVhZD4KLTxib2R5IGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODAwMDgwIj4KLTxjZW50ZXI+Ci08aDE+VmFsaWRhdGlvbiBGcmFtZXdvcmsgRXh0ZW5zaW9uIFBvaW50cyA8L2gxPgotPC9jZW50ZXI+VGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnRzIGNhbiBiZSB1c2VkIHRvIGFkZCBuZXcgdmFsaWRhdG9yczogPGgzPgotPGEgbmFtZT0idmYiPjwvYT5WYWxpZGF0aW9uIEZyYW1ld29yazwvaDM+Ci08dWw+Ci08bGk+Ci08YSBocmVmPSJ2Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JHcm91cC5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JHcm91cDwvYT4KLTwvbGk+Ci08bGk+Ci08YSBocmVmPSJ2Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JWMi5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMjwvYT4KLTwvbGk+Ci08L3VsPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX2V4Y2x1ZGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl9leGNsdWRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMjcxZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX2V4Y2x1ZGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5WYWxpZGF0b3IgRXhjbHVzaW9uPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL2Jvb2suY3NzIik7PC9zdHlsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL3NjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEJPRFk+Ci08SDEgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj5WYWxpZGF0b3IgRXhjbHVzaW9uPC9IMT4KLTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPklkZW50aWZpZXI6IDwvaDY+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhjbHVkZTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PldlYlRvb2xzIDMuMAotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj5BIHdheSB0byBhZGQgYWRkaXRpb25hbCBleGNsdXNpb24gZmlsdGVycyB0byBhIFYyIHZhbGlkYXRvci48cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2g2PgotPHA+PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leHRlbnNpb24iPmV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLnZhbGlkYXRvciI+dmFsaWRhdG9yPC9hPispJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnBvaW50Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gQSBzaG9ydCBpZCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHBsdWctaW4sIHNvIHRoYXQgdGhpcyBzZXQgb2YgZXh0cmEgZXhjbHVzaW9uIGZpbHRlcnMgY2FuIGJlIGlkZW50aWZpZWQuPC9saT4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBzaG9ydCB1c2VyIGZyaWVuZGx5IG5hbWUgZm9yIHRoZSBleGNsdXNpb24uPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS52YWxpZGF0b3IiPnZhbGlkYXRvcjwvYT4gKDxhIGhyZWY9IiNlLmV4Y2x1ZGUiPmV4Y2x1ZGU8L2E+KSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCB2YWxpZGF0b3I8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwO0lEUkVGICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotSWRlbnRpZmllcyB0aGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgZXh0ZW5kZWQuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gVGhlIGZ1bGx5IHF1YWxpZmVkIHZhbGlkYXRvciBpZCB0aGF0IGlzIGJlaW5nIGV4dGVuZGVkLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXhjbHVkZSI+ZXhjbHVkZTwvYT4gKDxhIGhyZWY9IiNlLnJ1bGVzIj5ydWxlczwvYT4pJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGNvbnRhaW5zIGEgc2V0IG9mIGV4Y2x1c2lvbiBydWxlcywgdXNlZCBpbiBmaWx0ZXJpbmcgd2hpY2ggcmVzb3VyY2VzIGdldCB2YWxpZGF0ZWQuIElmIGFueSBvZiB0aGVzZSBydWxlcyBhcmUgbWF0Y2hlZCwgdGhlbiB0aGUgdmFsaWRhdG9yIGlzIG5vdCBjYWxsZWQgb24gdGhpcyByZXNvdXJjZS48L3A+Ci08YnI+PGJyPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5maWxlZXh0Ij5maWxlZXh0PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBmaWxlZXh0PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+ZXh0Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2FzZVNlbnNpdGl2ZSZuYnNwOyh0cnVlIHwgZmFsc2UpICZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotQSBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgaHRtbC48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5leHQ8L2I+IC0gVGhlIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSBodG1sLjwvbGk+Ci08bGk+PGI+Y2FzZVNlbnNpdGl2ZTwvYj4gLSBJZiB0aGUgZmlsZSBleHRlbnNpb24gaXMgY2FzZSBzZW5zaXRpdmUsIHRoZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZS48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnByb2plY3ROYXR1cmUiPnByb2plY3ROYXR1cmU8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHByb2plY3ROYXR1cmU8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVXNlZCB0byBmaWx0ZXIgb24gcHJvamVjdCBuYXR1cmVzLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFRoZSBmdWxseSBxdWFsaWZpZWQgcHJvamVjdCBuYXR1cmUgaWQsIGZvciBleGFtcGxlICJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIi48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmZpbGUiPmZpbGU8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGZpbGU8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2FzZVNlbnNpdGl2ZSZuYnNwOyh0cnVlIHwgZmFsc2UpIDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnR5cGUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoZm9sZGVyfGZpbGV8ZnVsbCkgJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPm5hbWU8L2I+IC0gVGhlIGZpbGUgb3IgZm9sZGVyIG5hbWUuIFRoZSBmaWxlIG5hbWUgY2FuIGJlIGZ1bGx5IHF1YWxpZmllZCwgdGhhdCBpcyBpdCBzdGFydHMgd2l0aCBhIGxlYWRpbmcgc2xhc2ggKCIvIiksIG9yIGl0IGNhbiBiZSBhIHJlbGF0aXZlIG5hbWUuIEZvbGRlciBuYW1lcyBhcmUgc2VwYXJhdGVkIHdpdGggdGhlIGZvcndhcmQgc2xhc2ggKCIvIikgY2hhcmFjdGVyLjwvbGk+Ci08bGk+PGI+Y2FzZVNlbnNpdGl2ZTwvYj4gLSBJZiB0aGUgZmlsZSBuYW1lIGlzIG5vdCBjYXNlIHNlbnN0aXRpdmUsIHRoZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gZmFsc2UuPC9saT4KLTxsaT48Yj50eXBlPC9iPiAtIFR5cGUgb2YgbmFtZSwgdGhlcmUgYXJlIHRocmVlIGNob2ljZXMuIDx1bD48bGk+Zm9sZGVyIC0gc3BlY2lmaWVzIGEgcHJvamVjdCByZWxhdGl2ZSBmb2xkZXIgbmFtZS48L2xpPjxsaT5maWxlIC0gYSBzaW1wbGUgZmlsZSBuYW1lIChpLmUuIG5vIHBhdGggaW5mb3JtYXRpb24pLjwvbGk+PGxpPmZ1bGwgLSBhIGZ1bGx5IHF1YWxpZmllZCAocHJvamVjdCByZWxhdGl2ZSkgZmlsZSBuYW1lLjwvbGk+PC91bD48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnJ1bGVzIj5ydWxlczwvYT4gKDxhIGhyZWY9IiNlLmZpbGVleHQiPmZpbGVleHQ8L2E+KiAsIDxhIGhyZWY9IiNlLmZpbGUiPmZpbGU8L2E+KiAsIDxhIGhyZWY9IiNlLnByb2plY3ROYXR1cmUiPnByb2plY3ROYXR1cmU8L2E+KiAsIDxhIGhyZWY9IiNlLmZhY2V0Ij5mYWNldDwvYT4qICwgPGEgaHJlZj0iI2UuY29udGVudFR5cGUiPmNvbnRlbnRUeXBlPC9hPiogLCA8YSBocmVmPSIjZS5wYXR0ZXJuIj5wYXR0ZXJuPC9hPiopJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1BIHNldCBvZiBydWxlcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYSByZXNvdXJjZSBpcyBwYXNzZWQgdG8gdGhpcyB2YWxpZGF0b3Igb3Igbm90LiBUaGUgcnVsZXMgYXJlIE9SJ2VkIHRvZ2V0aGVyLjwvcD4KLTxicj48YnI+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmZhY2V0Ij5mYWNldDwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZmFjZXQ8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBUaGUgZmFjZXQgaWQuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5jb250ZW50VHlwZSI+Y29udGVudFR5cGU8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGNvbnRlbnRUeXBlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5leGFjdE1hdGNoJm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1Vc2VkIHRvIGZpbHRlciBiYXNlZCBvbiBjb250ZW50IHR5cGVzLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFRoZSBjb250ZW50IHR5cGUgaWQuPC9saT4KLTxsaT48Yj5leGFjdE1hdGNoPC9iPiAtIFNldCB0byB0cnVlIGlmIHRoZSBjb250ZW50IHR5cGUgbmVlZHMgdG8gbWF0Y2ggZXhhY3RseS4gU2V0IHRvIGZhbHNlIGlmIHN1YiB0eXBlcyBhcmUgY29uc2lkZXJlZCBtYXRjaGVzIGFzIHdlbGwuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5wYXR0ZXJuIj5wYXR0ZXJuPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBwYXR0ZXJuPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cmVnZXgmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jYXNlU2Vuc2l0aXZlJm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1Ib2xkcyBhIHJlZ3VhbHIgZXhwcmVzc2lvbiwgdGhhdCBtYXRjaGVzIHRoZSByZXNvdXJjZSdzIHByb2plY3QgcmVsYXRpdmUgbmFtZS48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5yZWdleDwvYj4gLSBIb2xkcyBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLiBTZWUgdGhlIGNsYXNzIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIGZvciBtb3JlIGRldGFpbHMuIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQgYWdhaW5zdCBhIHJlc291cmNlJ3MgcHJvamVjdCByZWxhdGl2ZSBwYXRoLCBhZnRlciB0aGF0IHBhdGggaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBwb3J0YWJsZSBwYXRoLgotPHA+VGhlIHBhdGggd2lsbCBhbHdheXMgc3RhcnQgd2l0aCBhIGZvcndhcmQgc2xhc2ggKC8pIHNvIHRoYXQgZm9sZGVyIG5hbWVzIGNhbiBiZSBtb3JlIGVhc2lseSBtYXRjaGVkLjwvbGk+Ci08bGk+PGI+Y2FzZVNlbnNpdGl2ZTwvYj4gLSBJZiB0aGUgZmlsZSBuYW1lIGlzIG5vdCBjYXNlIHNlbnN0aXRpdmUsIHRoZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gZmFsc2UuPC9saT4KLTwvdWw+Ci08YnI+PGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RXhhbXBsZXM6IDwvaDY+PCEtLSBBIHBsdWctaW4gaXMgdHVybmluZyBvZmYgdGhlIFQxQSB2YWxpZGF0b3IgZm9yIHByb2plY3RzIHRoYXQgaGF2ZSB0aGUgTW9kdWxlQ29yZU5hdHVyZSAtLT4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9ImV4Y2x1ZGUxIgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5leGNsdWRlIj4KLSAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5UMUEiPgotICAgICAgIDxleGNsdWRlPgotICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICA8cHJvamVjdE5hdHVyZQotICAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgICAgICAgICA8L3Byb2plY3ROYXR1cmU+Ci0gICAgICAgICAgPC9ydWxlcz4KLSAgICAgICA8L2V4Y2x1ZGU+Ci0gICAgPC92YWxpZGF0b3I+Ci0gPC9leHRlbnNpb24+Ci08cD48L3A+Ci0KLTxicj4KLTxwIGNsYXNzPSJub3RlIFNjaGVtYUNvcHlyaWdodCI+Ci08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fcmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fcmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTM5NTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+UmVmZXJlbmNpYWwgRmlsZSBWYWxpZGF0b3I8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPlJlZmVyZW5jaWFsIEZpbGUgVmFsaWRhdG9yPC9IMT4KLTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPklkZW50aWZpZXI6IDwvaDY+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+U2luY2U6IDwvaDY+PGI+VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy48L2I+Ci08cD48L3A+Ci0KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkRlc2NyaXB0aW9uOiA8L2g2PlRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgZm9yIHJlZmVyZW50aWFsIGZpbGUgdmFsaWRhdGlvbi4gVGhpcyBleHRlbnNpb24gcG9pbnQgc2hvdWxkIGJlIGV4dGVuZGVkIGlmIHlvdSBoYXZlIGZpbGVzIHRoYXQgcmVmZXJlbmNlIG90aGVyIGZpbGVzIGFuZCB3b3VsZCBsaWtlIHRoZSB2YWxpZGF0aW9uIG9uIHJlZmVyZW5jZWQgZmlsZXMgdG8gcnVuIHdoZW4gdGhlIHZhbGlkYXRpb24gb24gdGhlIHJlZmVyZW5jaW5nIGZpbGUgaXMgcnVuLiBUaGUgUG9zdCBWYWxpZGF0b3Igb3BlcmF0aW9uIHRoYXQgaXMgdXNlZCBieSB0aGlzIGV4dGVuc2lvbiBwb2ludCBleHBlY3RzIGEgZmxhdCBsaXN0IG9mIGZpbGVzIHRvIHJ1biB2YWxpZGF0aW9uIG9uIHJlZmVyZW5jZWQgZmlsZXMuPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS5yZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IiPnJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcjwvYT4pJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnBvaW50Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRCZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5wb2ludDwvYj4gLSBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50PC9saT4KLTxsaT48Yj5pZDwvYj4gLSBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5yZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IiPnJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcjwvYT4gKDxhIGhyZWY9IiNlLnJ1biI+cnVuPC9hPikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5ydW4iPnJ1bjwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcnVuPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2xhc3MmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci48L2xpPgotPC91bD4KLTxicj48YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLjxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdGlvbkhlbHBlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRpb25IZWxwZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmZmQ5MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdGlvbkhlbHBlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+VmFsaWRhdGlvbiBIZWxwZXI8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPlZhbGlkYXRpb24gSGVscGVyPC9IMT4KLTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPklkZW50aWZpZXI6IDwvaDY+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdGlvbkhlbHBlcjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PjxiPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuPC9iPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj48cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2g2PgotPHA+PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leHRlbnNpb24iPmV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLnZhbGlkYXRpb25IZWxwZXIiPnZhbGlkYXRpb25IZWxwZXI8L2E+KSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+cG9pbnQ8L2I+IC0gYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludDwvbGk+Ci08bGk+PGI+aWQ8L2I+IC0gYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlPC9saT4KLTxsaT48Yj5uYW1lPC9iPiAtIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUudmFsaWRhdGlvbkhlbHBlciI+dmFsaWRhdGlvbkhlbHBlcjwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgdmFsaWRhdGlvbkhlbHBlcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmhlbHBlckNsYXNzJm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aGVscGVyQ2xhc3M8L2I+IC0gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLklQcm9qZWN0VmFsaWRhdGlvbkhlbHBlci48L2xpPgotPGxpPjxiPmlkPC9iPiAtIDwvbGk+Ci08L3VsPgotPGJyPjxicj4KLTxwIGNsYXNzPSJub3RlIFNjaGVtYUNvcHlyaWdodCI+Ci1Db3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuPGJyPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Ci0KLTwvcD4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YmVjOTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5WYWxpZGF0aW9uIFNlbGVjdGlvbiBIYW5kbGVyPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL2Jvb2suY3NzIik7PC9zdHlsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL3NjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEJPRFk+Ci08SDEgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj5WYWxpZGF0aW9uIFNlbGVjdGlvbiBIYW5kbGVyPC9IMT4KLTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPklkZW50aWZpZXI6IDwvaDY+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TaW5jZTogPC9oNj48Yj5UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLjwvYj4KLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+PHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS52YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciI+dmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI8L2E+KykmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnBvaW50PC9iPiAtIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQ8L2xpPgotPGxpPjxiPmlkPC9iPiAtIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIj52YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcjwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmhhbmRsZXJDbGFzcyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnNlbGVjdGlvblR5cGUmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gPC9saT4KLTxsaT48Yj5oYW5kbGVyQ2xhc3M8L2I+IC0gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBJVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIgaW50ZXJmYWNlLjwvbGk+Ci08bGk+PGI+c2VsZWN0aW9uVHlwZTwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLjxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMTNjMWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPlZhbGlkYXRvcjwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+VmFsaWRhdG9yPC9IMT4KLTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPklkZW50aWZpZXI6IDwvaDY+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+U2luY2U6IDwvaDY+PGI+VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy48L2I+Ci08cD48L3A+Ci0KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkRlc2NyaXB0aW9uOiA8L2g2PlRoaXMgZXh0ZW5zaW9uIHBvaW50IGdpdmUgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIGEgbmV3IHZhbGlkYXRvciB0aGF0IGNhbiB2YWxpZGF0ZSByZXNvdXJjZXMgaW4gYSBKYXZhIFByb2plY3QuIFRoZSB2YWxpZGF0b3IgbmVlZHMgdG8gcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBuYXR1cmUgb2YgdGhlIHByb2plY3QgZm9yIGl0IHRvIHJ1biBvbiB0aGF0IHByb2plY3QuIFRoZSB1c2VyIGNhbiBzcGVjaWZpeSBmaWxlIGZpbHRlcnMgdG8gZmlsdGVyIG91dCBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkLiBUaGUgbmV3IHZhbGlkYXRvciByZWdpc3RlcmVkIGJ5IHRoZSBwcm9qZWN0IG5hdHVyZSBvbiB0aGUgcHJvamVjdCBjYW4gYmUgcnVuIG1hbnVhbGx5IG9yIGluY3JlbWVudGFsbHkgaWYgIEF1dG8gQnVpbGQgaXMgdHVybmVkIG9uLCBkdXJpbmcgaW5jcmVtZW50YWwgYnVpbGRzIHRoZSBjaGFuZ2VkIGRlbHRhIG9mIGZpbGVzIGFyZSBvbmx5IHZhbGlkYXRlZCBpZiB0aG9zZSBmaWxlcyBhcmUgcGFydCBvZiB0aGUgdmFsaWRhdGlvbiBmaWx0ZXJzIHNwZWNpZmllZC48cD4KLTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UudmFsaWRhdG9yIj52YWxpZGF0b3I8L2E+KSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5wb2ludDwvYj4gLSBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50PC9saT4KLTxsaT48Yj5pZDwvYj4gLSBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS52YWxpZGF0b3IiPnZhbGlkYXRvcjwvYT4gKDxhIGhyZWY9IiNlLnByb2plY3ROYXR1cmUiPnByb2plY3ROYXR1cmU8L2E+KiAsIDxhIGhyZWY9IiNlLmZpbHRlciI+ZmlsdGVyPC9hPiogLCA8YSBocmVmPSIjZS5lbmFibGVtZW50Ij5lbmFibGVtZW50PC9hPiogLCA8YSBocmVmPSIjZS5oZWxwZXIiPmhlbHBlcjwvYT4gLCA8YSBocmVmPSIjZS5kZXBlbmRlbnRWYWxpZGF0b3IiPmRlcGVuZGVudFZhbGlkYXRvcjwvYT4/ICwgPGEgaHJlZj0iI2UucnVuIj5ydW48L2E+ICwgPGEgaHJlZj0iI2UubWFya2VySWQiPm1hcmtlcklkPC9hPj8gLCA8YSBocmVmPSIjZS5mYWNldCI+ZmFjZXQ8L2E+KiAsIDxhIGhyZWY9IiNlLmNvbnRlbnRUeXBlQmluZGluZyI+Y29udGVudFR5cGVCaW5kaW5nPC9hPiopJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHZhbGlkYXRvcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnRvJm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5mcm9tJm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+dG88L2I+IC0gT3B0aW9uYWwgbWlncmF0aW9uIHRhZzwvbGk+Ci08bGk+PGI+ZnJvbTwvYj4gLSBPcHRpb25hbCBtaWdyYXRpb24gdGFnPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5wcm9qZWN0TmF0dXJlIj5wcm9qZWN0TmF0dXJlPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBwcm9qZWN0TmF0dXJlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pbmNsdWRlJm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIDwvbGk+Ci08bGk+PGI+aW5jbHVkZTwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmNvbnRlbnRUeXBlQmluZGluZyI+Y29udGVudFR5cGVCaW5kaW5nPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBjb250ZW50VHlwZUJpbmRpbmc8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jb250ZW50VHlwZUlkJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1Bc3NvY2lhdGVzIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUgd2l0aCB0aGUgY3VycmVudCB2YWxpZGF0b3IsIGFuZCBlbmFibGVzIHRoZSB2YWxpZGF0b3IgdG8gYmUgcnVuIG9uIHJlc291cmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZS48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5jb250ZW50VHlwZUlkPC9iPiAtIFRoZSBjb250ZW50IHR5cGUgaWRlbnRpZmllci4gVGhpcyBpcyBhbiBJRCBkZWZpbmVkIGJ5IHRoZSAnb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcycgZXh0ZW5zaW9uIHBvaW50LjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZmlsdGVyIj5maWx0ZXI8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGZpbHRlcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm9iamVjdENsYXNzJm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZUZpbHRlciZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNhc2VTZW5zaXRpdmUmbmJzcDsodHJ1ZSB8IGZhbHNlKSA8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5hY3Rpb24mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRCZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5vYmplY3RDbGFzczwvYj4gLSA8L2xpPgotPGxpPjxiPm5hbWVGaWx0ZXI8L2I+IC0gPC9saT4KLTxsaT48Yj5jYXNlU2Vuc2l0aXZlPC9iPiAtIDwvbGk+Ci08bGk+PGI+YWN0aW9uPC9iPiAtIDwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuaGVscGVyIj5oZWxwZXI8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGhlbHBlcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmNsYXNzPC9iPiAtIDwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZGVwZW5kZW50VmFsaWRhdG9yIj5kZXBlbmRlbnRWYWxpZGF0b3I8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGRlcGVuZGVudFZhbGlkYXRvcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmRlcFZhbFZhbHVlJm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmRlcFZhbFZhbHVlPC9iPiAtIDwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucnVuIj5ydW48L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHJ1bjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aW5jcmVtZW50YWwmbmJzcDsodHJ1ZSB8IGZhbHNlKSA8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5lbmFibGVkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KHRydWUgfCBmYWxzZSkgPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+ZnVsbEJ1aWxkJm5ic3A7Jm5ic3A7Jm5ic3A7KHRydWUgfCBmYWxzZSkgPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+YXN5bmMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsodHJ1ZSB8IGZhbHNlKSAmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gPC9saT4KLTxsaT48Yj5pbmNyZW1lbnRhbDwvYj4gLSA8L2xpPgotPGxpPjxiPmVuYWJsZWQ8L2I+IC0gPC9saT4KLTxsaT48Yj5mdWxsQnVpbGQ8L2I+IC0gPC9saT4KLTxsaT48Yj5hc3luYzwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLm1hcmtlcklkIj5tYXJrZXJJZDwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgbWFya2VySWQ8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5tYXJrZXJJZFZhbHVlJm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoZSBtYXJrZXJJZCBlbGVtZW50IGlzIGlzIHVzZWQgdG8gZ2V0IGEgY3VzdG9tIHByb2JsZW0gbWFya2VyIGZvciB0aGUgY3VzdG9tIHZhbGlkYXRvciBpbXBsZW1lbnRlZCB1c2luZyB0aGlzIGV4dGVuc2lvbiBwb2ludAotCi1UaGlzIG1hcmtlcklkIGVsZW1lbnQgYWxzbyBuZWVkcyBhIGNvcnJlc3BvbmRpbmcgcHJvYmxlbU1hcmtlciBleHRlbnNpb24gdG8gYmUgZGVmaW5lZCBieXRoaXMgdmFsaWRhdG9yIHdpdGggdGhlIHNhbWUgSWQgYXMgdGhlIG1ha2VySWRWYWx1ZSBmb3IgdGhlIHZhbGlkYXRvciB0byBoYXZlIGl0cyBvd24gbWFya2VyIHR5cGUuIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGUgYSBwcm9ibGVtTWFya2VyIGV4dGVuc2lvbiBkZWZpbmVkIGZvciBhIG1hcmtlcklkVmFsdWUgIkZvb01hcmtlciIKLQotIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJGb29NYXJrZXIiCi0gICAgICAgICBuYW1lPSIlRUpCX1ZBTElEQVRJT05fUFJPQkxFTU1BUktFUl9OQU1FIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIj4KLSAgICAgIDwvc3VwZXI+Ci0gICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9wZXJzaXN0ZW50PgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ib3duZXIiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ2YWxpZGF0aW9uU2V2ZXJpdHkiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ0YXJnZXRPYmplY3QiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJncm91cE5hbWUiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJtZXNzYWdlSWQiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgV2l0aG91dCBhIHByb2JsZW1NYXJrZXIgZXh0ZW5zaW9uIGRlZmluZWQsIHRoZSBjdXN0b21lciB2YWxpZGF0b3Igd2lsbCB1c2UgdGhlIGJhc2UgVmFsaWRhdGlvbiBNZXNzYWdlIHByb2JsZW1NYXJrZXIgdHlwZS48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5tYXJrZXJJZFZhbHVlPC9iPiAtIDwvbGk+Ci08L3VsPgotPGJyPjxkaXYgc3R5bGU9ImNvbG9yOiByZWQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPlRoZSA8Yj5mYWNldDwvYj4gZWxlbWVudCBpcyBkZXByZWNhdGVkPC9kaXY+IDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZmFjZXQiPmZhY2V0PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBmYWNldDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmZhY2V0SWQmbmJzcDtDREFUQSAjSU1QTElFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgYW5kIGVuYWJsZW1lbnQgaXMgdGhlIG5ldyByZWNvbW1lbmRlZCBhcHByb2FjaCB0byBmaWx0ZXIgdmFsaWRhdG9ycyBiYXNlZCBvbiBmYWNldHMuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+ZmFjZXRJZDwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmVuYWJsZW1lbnQiPmVuYWJsZW1lbnQ8L2E+ICg8YSBocmVmPSIjZS5ub3QiPm5vdDwvYT4gLCA8YSBocmVmPSIjZS5hbmQiPmFuZDwvYT4gLCA8YSBocmVmPSIjZS5vciI+b3I8L2E+ICwgPGEgaHJlZj0iI2UuaW5zdGFuY2VvZiI+aW5zdGFuY2VvZjwvYT4gLCA8YSBocmVmPSIjZS50ZXN0Ij50ZXN0PC9hPiAsIDxhIGhyZWY9IiNlLnN5c3RlbVRlc3QiPnN5c3RlbVRlc3Q8L2E+ICwgPGEgaHJlZj0iI2UuZXF1YWxzIj5lcXVhbHM8L2E+ICwgPGEgaHJlZj0iI2UuY291bnQiPmNvdW50PC9hPiAsIDxhIGhyZWY9IiNlLndpdGgiPndpdGg8L2E+ICwgPGEgaHJlZj0iI2UucmVzb2x2ZSI+cmVzb2x2ZTwvYT4gLCA8YSBocmVmPSIjZS5hZGFwdCI+YWRhcHQ8L2E+ICwgPGEgaHJlZj0iI2UuaXRlcmF0ZSI+aXRlcmF0ZTwvYT4gLCA8YSBocmVmPSIjZS5yZWZlcmVuY2UiPnJlZmVyZW5jZTwvYT4pKiZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotQSBnZW5lcmljIHJvb3QgZWxlbWVudC4gVGhlIGVsZW1lbnQgY2FuIGJlIHVzZWQgaW5zaWRlIGFuIGV4dGVuc2lvbiBwb2ludCB0byBkZWZpbmUgaXRzIGVuYWJsZW1lbnQgZXhwcmVzc2lvbi4KLSAgICAgICAgICAgIFRoZSBjaGlsZHJlbiBvZiBhbiBlbmFibGVtZW50IGV4cHJlc3Npb24gYXJlIGNvbWJpbmVkIHVzaW5nIHRoZSBhbmQgb3BlcmF0b3IuPC9wPgotPGJyPjxicj4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUubm90Ij5ub3Q8L2E+ICg8YSBocmVmPSIjZS5ub3QiPm5vdDwvYT4gfCA8YSBocmVmPSIjZS5hbmQiPmFuZDwvYT4gfCA8YSBocmVmPSIjZS5vciI+b3I8L2E+IHwgPGEgaHJlZj0iI2UuaW5zdGFuY2VvZiI+aW5zdGFuY2VvZjwvYT4gfCA8YSBocmVmPSIjZS50ZXN0Ij50ZXN0PC9hPiB8IDxhIGhyZWY9IiNlLnN5c3RlbVRlc3QiPnN5c3RlbVRlc3Q8L2E+IHwgPGEgaHJlZj0iI2UuZXF1YWxzIj5lcXVhbHM8L2E+IHwgPGEgaHJlZj0iI2UuY291bnQiPmNvdW50PC9hPiB8IDxhIGhyZWY9IiNlLndpdGgiPndpdGg8L2E+IHwgPGEgaHJlZj0iI2UucmVzb2x2ZSI+cmVzb2x2ZTwvYT4gfCA8YSBocmVmPSIjZS5hZGFwdCI+YWRhcHQ8L2E+IHwgPGEgaHJlZj0iI2UuaXRlcmF0ZSI+aXRlcmF0ZTwvYT4gfCA8YSBocmVmPSIjZS5yZWZlcmVuY2UiPnJlZmVyZW5jZTwvYT4pJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgcmVwcmVzZW50IGEgTk9UIG9wZXJhdGlvbiBvbiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgaXQncyBzdWItZWxlbWVudCBleHByZXNzaW9uLjwvcD4KLTxicj48YnI+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmFuZCI+YW5kPC9hPiAoPGEgaHJlZj0iI2Uubm90Ij5ub3Q8L2E+ICwgPGEgaHJlZj0iI2UuYW5kIj5hbmQ8L2E+ICwgPGEgaHJlZj0iI2Uub3IiPm9yPC9hPiAsIDxhIGhyZWY9IiNlLmluc3RhbmNlb2YiPmluc3RhbmNlb2Y8L2E+ICwgPGEgaHJlZj0iI2UudGVzdCI+dGVzdDwvYT4gLCA8YSBocmVmPSIjZS5zeXN0ZW1UZXN0Ij5zeXN0ZW1UZXN0PC9hPiAsIDxhIGhyZWY9IiNlLmVxdWFscyI+ZXF1YWxzPC9hPiAsIDxhIGhyZWY9IiNlLmNvdW50Ij5jb3VudDwvYT4gLCA8YSBocmVmPSIjZS53aXRoIj53aXRoPC9hPiAsIDxhIGhyZWY9IiNlLnJlc29sdmUiPnJlc29sdmU8L2E+ICwgPGEgaHJlZj0iI2UuYWRhcHQiPmFkYXB0PC9hPiAsIDxhIGhyZWY9IiNlLml0ZXJhdGUiPml0ZXJhdGU8L2E+ICwgPGEgaHJlZj0iI2UucmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+KSomZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCByZXByZXNlbnQgYW4gQU5EIG9wZXJhdGlvbiBvbiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYWxsIGl0J3Mgc3ViLWVsZW1lbnRzIGV4cHJlc3Npb25zLjwvcD4KLTxicj48YnI+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLm9yIj5vcjwvYT4gKDxhIGhyZWY9IiNlLm5vdCI+bm90PC9hPiAsIDxhIGhyZWY9IiNlLmFuZCI+YW5kPC9hPiAsIDxhIGhyZWY9IiNlLm9yIj5vcjwvYT4gLCA8YSBocmVmPSIjZS5pbnN0YW5jZW9mIj5pbnN0YW5jZW9mPC9hPiAsIDxhIGhyZWY9IiNlLnRlc3QiPnRlc3Q8L2E+ICwgPGEgaHJlZj0iI2Uuc3lzdGVtVGVzdCI+c3lzdGVtVGVzdDwvYT4gLCA8YSBocmVmPSIjZS5lcXVhbHMiPmVxdWFsczwvYT4gLCA8YSBocmVmPSIjZS5jb3VudCI+Y291bnQ8L2E+ICwgPGEgaHJlZj0iI2Uud2l0aCI+d2l0aDwvYT4gLCA8YSBocmVmPSIjZS5yZXNvbHZlIj5yZXNvbHZlPC9hPiAsIDxhIGhyZWY9IiNlLmFkYXB0Ij5hZGFwdDwvYT4gLCA8YSBocmVmPSIjZS5pdGVyYXRlIj5pdGVyYXRlPC9hPiAsIDxhIGhyZWY9IiNlLnJlZmVyZW5jZSI+cmVmZXJlbmNlPC9hPikqJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgcmVwcmVzZW50IGFuICBPUiBvcGVyYXRpb24gb24gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIGFsbCBpdCdzIHN1Yi1lbGVtZW50IGV4cHJlc3Npb25zLjwvcD4KLTxicj48YnI+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmluc3RhbmNlb2YiPmluc3RhbmNlb2Y8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGluc3RhbmNlb2Y8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52YWx1ZSZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gcGVyZm9ybSBhbiBpbnN0YW5jZW9mIGNoZWNrIG9mIHRoZSBvYmplY3QgaW4gZm9jdXMuIFRoZSBleHByZXNzaW9uIHJldHVybnMKLSAgICAgICAgICAgIEV2YWx1YXRpb25SZXN1bHQuVFJVRSBpZiB0aGUgb2JqZWN0J3MgdHlwZSBpcyBhIHN1YiB0eXBlIG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSB0aGUgYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgICAgT3RoZXJ3aXNlIEV2YWx1YXRpb25SZXN1bHQuRkFMU0UgaXMgcmV0dXJuZWQuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+dmFsdWU8L2I+IC0gYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIG9yIGludGVyZmFjZS48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnRlc3QiPnRlc3Q8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHRlc3Q8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wcm9wZXJ0eSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmFyZ3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnZhbHVlJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5mb3JjZVBsdWdpbkFjdGl2YXRpb24mbmJzcDsodHJ1ZSB8IGZhbHNlKSAmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGV2YWx1YXRlIHRoZSBwcm9wZXJ0eSBzdGF0ZSBvZiB0aGUgb2JqZWN0IGluIGZvY3VzLiBUaGUgc2V0IG9mCi0gICAgICAgICAgICB0ZXN0YWJsZSBwcm9wZXJ0aWVzIGNhbiBiZSBleHRlbmRlZCB1c2luZyB0aGUgcHJvcGVyeSB0ZXN0ZXIgZXh0ZW5zaW9uIHBvaW50LiBUaGUgdGVzdAotICAgICAgICAgICAgZXhwcmVzc2lvbiByZXR1cm5zIEV2YWx1YXRpb25SZXN1bHQuTk9UX0xPQURFRCBpZiB0aGUgcHJvcGVydHkgdGVzdGVyIGRvaW5nIHRoZSBhY3R1YWwKLSAgICAgICAgICAgIHRlc3RpbmcgaXNuJ3QgbG9hZGVkIHlldCBhbmQgdGhlIGF0dHJpYnV0ZSBmb3JjZVBsdWdpbkFjdGl2YXRpb24gaXMgc2V0IHRvIGZhbHNlLiAKLSAgICAgICAgICAgIElmIGZvcmNlUGx1Z2luQWN0aXZhdGlvbiBpcyBzZXQgdG8gdHJ1ZSBhbmQgdGhlIGV2YWx1YXRpb24gY29udGV4dCB1c2VkIHRvIGV2YWx1YXRlCi0gICAgICAgICAgICB0aGlzIGV4cHJlc3Npb24gc3VwcG9ydCBwbHVnLWluIGFjdGl2YXRpb24gdGhlbiBldmFsdWF0aW5nIHRoZSBwcm9wZXJ0eSB3aWxsIHJlc3VsdCBpbiAKLSAgICAgICAgICAgIGFjdGl2YXRpbmcgdGhlIHBsdWctaW4gZGVmaW5pbmcgdGhlIHRlc3Rlci48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5wcm9wZXJ0eTwvYj4gLSB0aGUgbmFtZSBvZiBhbiBvYmplY3QncyBwcm9wZXJ0eSB0byB0ZXN0LjwvbGk+Ci08bGk+PGI+YXJnczwvYj4gLSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHByb3BlcnR5IHRlc3Rlci4gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBzZXBlcmF0ZWQKLSAgICAgICAgICAgICAgICAgIGJ5IGNvbW1hcy4gRWFjaCBpbmRpdmlkdWFsIGFyZ3VtZW50IGlzIGNvbnZlcnRlZCBpbnRvIGEgSmF2YSBiYXNlIHR5cGUgdXNpbmcgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAgIHJ1bGVzIGFzIGRlZmluZWQgZm9yIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhlIHRlc3QgZXhwcmVzc2lvbi48L2xpPgotPGxpPjxiPnZhbHVlPC9iPiAtIHRoZSBleHBlY3RlZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIENhbiBiZSBvbWl0dGVkIGlmIHRoZSBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAgICAgIGlzIGEgYm9vbGVhbiBwcm9wZXJ0eS4gVGhlIHRlc3QgZXhwcmVzc2lvbiBpcyBzdXBwb3NlZCB0byByZXR1cm4gCi1FdmFsdWF0aW9uUmVzdWx0LlRSVUUgaWYgdGhlIHByb3BlcnR5IG1hdGNoZXMgdGhlIHZhbHVlIGFuZCBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFCi1vdGhlcndpc2UuIFRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgY29udmVydGVkIGludG8gYSBKYXZhIGJhc2UgdHlwZSB1c2luZyB0aGUgZm9sbG93aW5nCi1ydWxlczoKLTx1bD4KLSA8bGk+dGhlIHN0cmluZyAmcXVvdDt0cnVlJnF1b3Q7IGlzIGNvbnZlcnRlZCBpbnRvIEJvb2xlYW4uVFJVRTwvbGk+Ci0gPGxpPnRoZSBzdHJpbmcgJnF1b3Q7ZmFsc2UmcXVvdDsgaXMgY29udmVydGVkIGludG8gQm9vbGVhbi5GQUxTRTwvbGk+Ci0gPGxpPmlmIHRoZSBzdHJpbmcgY29udGFpbnMgYSBkb3QgdGhlbiB0aGUgaW50ZXJwcmV0ZXIgdHJpZXMgdG8gY29udmVydAotIHRoZSB2YWx1ZSBpbnRvIGEgRmxvYXQgb2JqZWN0LiBJZiB0aGlzIGZhaWxzIHRoZSBzdHJpbmcgaXMgdHJlYXRlZCBhcyBhCi0gamF2YS5sYW5nLlN0cmluZzwvbGk+Ci0gPGxpPmlmIHRoZSBzdHJpbmcgb25seSBjb25zaXN0cyBvZiBudW1iZXJzIHRoZW4gdGhlIGludGVycHJldGVyCi0gY29udmVydHMgdGhlIHZhbHVlIGluIGFuIEludGVnZXIgb2JqZWN0LjwvbGk+Ci0gPGxpPmluIGFsbCBvdGhlciBjYXNlcyB0aGUgc3RyaW5nIGlzIHRyZWF0ZWQgYXMgYSBqYXZhLmxhbmcuU3RyaW5nPC9saT4KLSA8bGk+dGhlIGNvbnZlcnNpb24gb2YgdGhlIHN0cmluZyBpbnRvIGEgQm9vbGVhbiwgRmxvYXQsIG9yIEludGVnZXIgY2FuCi0gYmUgc3VwcHJlc3NlZCBieSBzdXJyb3VuZGluZyB0aGUgc3RyaW5nIHdpdGggc2luZ2xlIHF1b3Rlcy4gRm9yCi0gZXhhbXBsZSwgdGhlIGF0dHJpYnV0ZSB2YWx1ZT0mcXVvdDsndHJ1ZScmcXVvdDsgaXMgY29udmVydGVkIGludG8gdGhlCi0gc3RyaW5nICZxdW90O3RydWUmcXVvdDs8L2xpPgotPC91bD48L2xpPgotPGxpPjxiPmZvcmNlUGx1Z2luQWN0aXZhdGlvbjwvYj4gLSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwbHVnLWluIGNvbnRyaWJ1dGluZyB0aGUgcHJvcGVydHkgdGVzdGVyCi0gICAgICAgICAgICAgICAgICBzaG91bGQgYmUgbG9hZGVkIGlmIG5lY2Vzc2FyeS4gQXMgc3VjaCwgdGhpcyBmbGFnIHNob3VsZCBiZSB1c2VkIGp1ZGljaW91c2x5LCAKLSAgICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHBsdWctaW4gYWN0aXZhdGlvbnMuIE1vc3QgY2xpZW50cyBzaG91bGQgYXZvaWQKLSAgICAgICAgICAgICAgICAgIHNldHRpbmcgdGhpcyBmbGFnIHRvIHRydWUuIFRoaXMgZmxhZyBpcyBvbmx5IGhvbm9yZWQgaWYgdGhlIGV2YWx1YXRpb24gY29udGV4dAotICAgICAgICAgICAgICAgICAgdXNlZCB0byBldmFsdWF0ZSB0aGlzIGV4cHJlc3Npb24gYWxsb3dzIHBsdWctaW4gYWN0aXZhdGlvbi4gT3RoZXJ3aXNlIHRoZSBmbGFnCi0gICAgICAgICAgICAgICAgICBpcyBpZ25vcmVkIGFuZCBubyBwbHVnLWluIGxvYWRpbmcgdGFrZXMgcGxhY2UuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5zeXN0ZW1UZXN0Ij5zeXN0ZW1UZXN0PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBzeXN0ZW1UZXN0PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cHJvcGVydHkmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52YWx1ZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGVzdHMgYSBzeXN0ZW0gcHJvcGVydHkgYnkgY2FsbGluZyB0aGUgU3lzdGVtLmdldFByb3BlcnR5IG1ldGhvZCBhbmQgY29tcGFyZXMgdGhlIHJlc3VsdAotICAgICAgICAgICAgd2l0aCB0aGUgdmFsdWUgc3BlY2lmaWVkIHRocm91Z2ggdGhlIHZhbHVlIGF0dHJpYnV0ZS48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5wcm9wZXJ0eTwvYj4gLSB0aGUgbmFtZSBvZiBhbiBzeXN0ZW0gcHJvcGVydHkgdG8gdGVzdC48L2xpPgotPGxpPjxiPnZhbHVlPC9iPiAtIHRoZSBleHBlY3RlZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIFRoZSB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyB2YWx1ZS48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmVxdWFscyI+ZXF1YWxzPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBlcXVhbHM8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52YWx1ZSZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gcGVyZm9ybSBhbiBlcXVhbHMgY2hlY2sgb2YgdGhlIG9iamVjdCBpbiBmb2N1cy4gVGhlIGV4cHJlc3Npb24gcmV0dXJucwotICAgICAgICAgICAgRXZhbHVhdGlvblJlc3VsdC5UUlVFIGlmIHRoZSBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBhdHRyaWJ1dGUgdmFsdWUuIE90aGVyd2lzZQotICAgICAgICAgICAgRXZhbHVhdGlvblJlc3VsdC5GQUxTRSBpcyByZXR1cm5lZC48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj52YWx1ZTwvYj4gLSB0aGUgZXhwZWN0ZWQgdmFsdWUuIFRoZSB2YWx1ZSBwcm92aWRlZCBhcyBhIHN0cmluZyBpcyBjb252ZXJ0ZWQgaW50bwotICAgICAgICAgICAgICAgICAgYSBKYXZhIGJhc2UgdHlwZSB1c2luZyB0aGUgc2FtZSBydWxlcyBhcyBmb3IgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiB0aGUgdGVzdCBleHByZXNzaW9uLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuY291bnQiPmNvdW50PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBjb3VudDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnZhbHVlJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgaXMgdXNlZCB0byB0ZXN0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBjb2xsZWN0aW9uLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnZhbHVlPC9iPiAtIGFuIGV4cHJlc3Npb24gdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgbGlzdC4gRm9sbG93aW5nIHdpbGRjYXJkCi0gICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIGNhbiBiZSB1c2VkOgotICAgICAgICAgICAgICAgICAgPGRsPgotICAgICAgICAgICAgICAgICAgICA8ZHQ+KjwvZHQ+IDxkZD5hbnkgbnVtYmVyIG9mIGVsZW1lbnRzPC9kZD4KLSAgICAgICAgICAgICAgICAgICAgPGR0Pj88L2R0PiA8ZGQ+bm8gZWxlbWVudHMgb3Igb25lIGVsZW1lbnQ8L2RkPgotICAgICAgICAgICAgICAgICAgICA8ZHQ+KzwvZHQ+IDxkZD5vbmUgb3IgbW9yZSBlbGVtZW50czwvZGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkdD4hPC9kdD4gPGRkPm5vIGVsZW1lbnRzPC9kZD4KLSAgICAgICAgICAgICAgICAgICAgPGR0PmludGVnZXIgdmFsdWU8L2R0PiA8ZGQ+dGhlIGxpc3QgbXVzdCBjb250YWluIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHM8L2RkPgotICAgICAgICAgICAgICAgICAgPC9kbD48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLndpdGgiPndpdGg8L2E+ICg8YSBocmVmPSIjZS5ub3QiPm5vdDwvYT4gLCA8YSBocmVmPSIjZS5hbmQiPmFuZDwvYT4gLCA8YSBocmVmPSIjZS5vciI+b3I8L2E+ICwgPGEgaHJlZj0iI2UuaW5zdGFuY2VvZiI+aW5zdGFuY2VvZjwvYT4gLCA8YSBocmVmPSIjZS50ZXN0Ij50ZXN0PC9hPiAsIDxhIGhyZWY9IiNlLnN5c3RlbVRlc3QiPnN5c3RlbVRlc3Q8L2E+ICwgPGEgaHJlZj0iI2UuZXF1YWxzIj5lcXVhbHM8L2E+ICwgPGEgaHJlZj0iI2UuY291bnQiPmNvdW50PC9hPiAsIDxhIGhyZWY9IiNlLndpdGgiPndpdGg8L2E+ICwgPGEgaHJlZj0iI2UucmVzb2x2ZSI+cmVzb2x2ZTwvYT4gLCA8YSBocmVmPSIjZS5hZGFwdCI+YWRhcHQ8L2E+ICwgPGEgaHJlZj0iI2UuaXRlcmF0ZSI+aXRlcmF0ZTwvYT4gLCA8YSBocmVmPSIjZS5yZWZlcmVuY2UiPnJlZmVyZW5jZTwvYT4pKiZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCB3aXRoPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dmFyaWFibGUmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCBjaGFuZ2VzIHRoZSBvYmplY3QgdG8gYmUgaW5zcGVjdGVkIGZvciBhbGwgaXRzIGNoaWxkIGVsZW1lbnQgdG8gdGhlIG9iamVjdAotICAgICAgICAgICAgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gdmFyaWFibGUuIElmIHRoZSB2YXJpYWJsZSBjYW4gbm90IGJlIHJlc29sdmVkIHRoZW4gdGhlIGV4cHJlc3Npb24KLSAgICAgICAgICAgIHdpbGwgdGhyb3cgYSBFeHByZXNzaW9uRXhjZXB0aW9uIHdoZW4gZXZhbHVhdGluZyBpdC4gVGhlIGNoaWxkcmVuIG9mIGEgd2l0aCBleHByZXNzaW9uIAotICAgICAgICAgICAgYXJlIGNvbWJpbmVkIHVzaW5nIHRoZSBhbmQgb3BlcmF0b3IuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+dmFyaWFibGU8L2I+IC0gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHVzZWQgZm9yIGZ1cnRoZXIgaW5zcGVjdGlvbi4gSXQgaXMgdXAgdG8gdGhlIGV2YWx1YXRvcgotICAgICAgICAgICAgICAgICAgb2YgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIHByb3ZpZGUgdGhlIHZhcmlhYmxlIGluIHRoZSB2YXJpYWJsZSBwb29sLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucmVzb2x2ZSI+cmVzb2x2ZTwvYT4gKDxhIGhyZWY9IiNlLm5vdCI+bm90PC9hPiAsIDxhIGhyZWY9IiNlLmFuZCI+YW5kPC9hPiAsIDxhIGhyZWY9IiNlLm9yIj5vcjwvYT4gLCA8YSBocmVmPSIjZS5pbnN0YW5jZW9mIj5pbnN0YW5jZW9mPC9hPiAsIDxhIGhyZWY9IiNlLnRlc3QiPnRlc3Q8L2E+ICwgPGEgaHJlZj0iI2Uuc3lzdGVtVGVzdCI+c3lzdGVtVGVzdDwvYT4gLCA8YSBocmVmPSIjZS5lcXVhbHMiPmVxdWFsczwvYT4gLCA8YSBocmVmPSIjZS5jb3VudCI+Y291bnQ8L2E+ICwgPGEgaHJlZj0iI2Uud2l0aCI+d2l0aDwvYT4gLCA8YSBocmVmPSIjZS5yZXNvbHZlIj5yZXNvbHZlPC9hPiAsIDxhIGhyZWY9IiNlLmFkYXB0Ij5hZGFwdDwvYT4gLCA8YSBocmVmPSIjZS5pdGVyYXRlIj5pdGVyYXRlPC9hPiAsIDxhIGhyZWY9IiNlLnJlZmVyZW5jZSI+cmVmZXJlbmNlPC9hPikqJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHJlc29sdmU8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52YXJpYWJsZSZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmFyZ3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IGNoYW5nZXMgdGhlIG9iamVjdCB0byBiZSBpbnNwZWN0ZWQgZm9yIGFsbCBpdHMgY2hpbGQgZWxlbWVudCB0byB0aGUgb2JqZWN0Ci0gICAgICAgICAgICByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiB2YXJpYWJsZS4gSWYgdGhlIHZhcmlhYmxlIGNhbiBub3QgYmUgcmVzb2x2ZWQgdGhlbiB0aGUgZXhwcmVzc2lvbgotICAgICAgICAgICAgd2lsbCB0aHJvdyBhIEV4cHJlc3Npb25FeGNlcHRpb24gd2hlbiBldmFsdWF0aW5nIGl0LiBUaGUgY2hpbGRyZW4gb2YgYSB3aXRoIGV4cHJlc3Npb24gCi0gICAgICAgICAgICBhcmUgY29tYmluZWQgdXNpbmcgdGhlIGFuZCBvcGVyYXRvci48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj52YXJpYWJsZTwvYj4gLSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgcmVzb2x2ZWQuIFRoaXMgdmFyaWFibGUgaXMgdGhlbiB1c2VkIGFzIHRoZSBvYmplY3QgaW4gZm9jdXMKLSAgICAgICAgICAgICAgICAgIGZvciBjaGlsZCBlbGVtZW50IGV2YWx1YXRpb24uIEl0IGlzIHVwIHRvIHRoZSBldmFsdWF0b3Igb2YgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIHByb3ZpZGUgYSAKLSAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgcmVzb2x2ZXIgKHNlZSBJVmFyaWFibGVSZXNvbHZlcikgdGhyb3VnaCB0aGUgZXZhbHVhdGlvbiBjb250ZXh0IHBhc3NlZAotICAgICAgICAgICAgICAgICAgdG8gdGhlIHJvb3QgZXhwcmVzc2lvbiBlbGVtZW50IHdoZW4gZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbi48L2xpPgotPGxpPjxiPmFyZ3M8L2I+IC0gYWRkaXRpb25hbCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSB2YXJpYWJsZSByZXNvbHZlci4gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBzZXBlcmF0ZWQKLSAgICAgICAgICAgICAgICAgIGJ5IGNvbW1hcy4gRWFjaCBpbmRpdmlkdWFsIGFyZ3VtZW50IGlzIGNvbnZlcnRlZCBpbnRvIGEgSmF2YSBiYXNlIHR5cGUgdXNpbmcgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAgIHJ1bGVzIGFzIGRlZmluZWQgZm9yIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhlIHRlc3QgZXhwcmVzc2lvbi48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmFkYXB0Ij5hZGFwdDwvYT4gKDxhIGhyZWY9IiNlLm5vdCI+bm90PC9hPiAsIDxhIGhyZWY9IiNlLmFuZCI+YW5kPC9hPiAsIDxhIGhyZWY9IiNlLm9yIj5vcjwvYT4gLCA8YSBocmVmPSIjZS5pbnN0YW5jZW9mIj5pbnN0YW5jZW9mPC9hPiAsIDxhIGhyZWY9IiNlLnRlc3QiPnRlc3Q8L2E+ICwgPGEgaHJlZj0iI2Uuc3lzdGVtVGVzdCI+c3lzdGVtVGVzdDwvYT4gLCA8YSBocmVmPSIjZS5lcXVhbHMiPmVxdWFsczwvYT4gLCA8YSBocmVmPSIjZS5jb3VudCI+Y291bnQ8L2E+ICwgPGEgaHJlZj0iI2Uud2l0aCI+d2l0aDwvYT4gLCA8YSBocmVmPSIjZS5yZXNvbHZlIj5yZXNvbHZlPC9hPiAsIDxhIGhyZWY9IiNlLmFkYXB0Ij5hZGFwdDwvYT4gLCA8YSBocmVmPSIjZS5pdGVyYXRlIj5pdGVyYXRlPC9hPiAsIDxhIGhyZWY9IiNlLnJlZmVyZW5jZSI+cmVmZXJlbmNlPC9hPikqJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGFkYXB0PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dHlwZSZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gYWRhcHQgdGhlIG9iamVjdCBpbiBmb2N1cyB0byB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgdGhlIGF0dHJpYnV0ZQotICAgICAgICAgICAgdHlwZS4gVGhlIGV4cHJlc3Npb24gcmV0dXJucyBub3QgbG9hZGVkIGlmIGVpdGhlciB0aGUgYWRhcHRlciBvciB0aGUgdHlwZSByZWZlcmVuY2VkIGlzbid0Ci0gICAgICAgICAgICBsb2FkZWQgeWV0LiBJdCB0aHJvd3MgYSBFeHByZXNzaW9uRXhjZXB0aW9uIGR1cmluZyBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIG5hbWUgZG9lc24ndCBleGlzdCAKLSAgICAgICAgICAgIGF0IGFsbC4gVGhlIGNoaWxkcmVuIG9mIGFuIGFkYXB0IGV4cHJlc3Npb24gYXJlIGNvbWJpbmVkIHVzaW5nIHRoZSBhbmQgb3BlcmF0b3IuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+dHlwZTwvYj4gLSB0aGUgdHlwZSB0byB3aGljaCB0aGUgb2JqZWN0IGluIGZvY3VzIGlzIHRvIGJlIGFkYXB0ZWQuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5pdGVyYXRlIj5pdGVyYXRlPC9hPiAoPGEgaHJlZj0iI2Uubm90Ij5ub3Q8L2E+ICwgPGEgaHJlZj0iI2UuYW5kIj5hbmQ8L2E+ICwgPGEgaHJlZj0iI2Uub3IiPm9yPC9hPiAsIDxhIGhyZWY9IiNlLmluc3RhbmNlb2YiPmluc3RhbmNlb2Y8L2E+ICwgPGEgaHJlZj0iI2UudGVzdCI+dGVzdDwvYT4gLCA8YSBocmVmPSIjZS5zeXN0ZW1UZXN0Ij5zeXN0ZW1UZXN0PC9hPiAsIDxhIGhyZWY9IiNlLmVxdWFscyI+ZXF1YWxzPC9hPiAsIDxhIGhyZWY9IiNlLmNvdW50Ij5jb3VudDwvYT4gLCA8YSBocmVmPSIjZS53aXRoIj53aXRoPC9hPiAsIDxhIGhyZWY9IiNlLnJlc29sdmUiPnJlc29sdmU8L2E+ICwgPGEgaHJlZj0iI2UuYWRhcHQiPmFkYXB0PC9hPiAsIDxhIGhyZWY9IiNlLml0ZXJhdGUiPml0ZXJhdGU8L2E+ICwgPGEgaHJlZj0iI2UucmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+KSomZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgaXRlcmF0ZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm9wZXJhdG9yJm5ic3A7KG9yfGFuZCkgPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWZFbXB0eSZuYnNwOyZuYnNwOyh0cnVlIHwgZmFsc2UpICZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIGEgdmFyaWFibGUgdGhhdCBpcyBvZiB0eXBlIGphdmEudXRpbC5Db2xsZWN0aW9uLiBJZgotICAgICAgICAgICAgdGhlIG9iamVjdCBpbiBmb2N1cyBpcyBub3Qgb2YgdHlwZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiB0aGVuIGFuIEV4cHJlc3Npb25FeGNlcHRpb24gd2lsbAotICAgICAgICAgICAgYmUgdGhyb3duIHdoaWxlIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24uPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+b3BlcmF0b3I8L2I+IC0gZWl0aGVyICJhbmQiIG9yICJvciIuIFRoZSBvcGVyYXRvciBkZWZpbmVzIGhvdyB0aGUgY2hpbGQKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHdpbGwgYmUgY29tYmluZWQuIElmIG5vdCBzcGVjaWZpZWQsICJhbmQiIHdpbGwgYmUgdXNlZC48L2xpPgotPGxpPjxiPmlmRW1wdHk8L2I+IC0gdGhlIHZhbHVlIHJldHVybiBmcm9tIHRoZSBpdGVyYXRlIGV4cHJlc3Npb24gaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuIElmCi0gICAgICAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgdGhlbiB0cnVlIGlzIHJldHVybmVkIHdoZW4gdGhlIG9wZXJhdG9yIGVxdWFscyAiYW5kIiAKLSAgICAgICAgICAgICAgICAgYW5kIGZhbHNlIGlzIHJldHVybiBpZiB0aGUgb3BlcmF0b3IgZXF1YWxzICJvciIuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5yZWZlcmVuY2UiPnJlZmVyZW5jZTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcmVmZXJlbmNlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+ZGVmaW5pdGlvbklkJm5ic3A7SURSRUYgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgaXMgdXNlZCB0byByZWZlcmVuY2UgYW4gZXhwcmVzc2lvbiBmcm9tIHRoZSA8Yj5vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zPC9iPiBleHRlbnNpb24gcG9pbnQuICBUaGUgZXhwcmVzc2lvbiBkZWZpbml0aW9uIHdpbGwgYmUgZXZhbHVhdGVkIHdpdGhpbiB0aGUgY3VycmVudCBleHByZXNzaW9uIGVsZW1lbnQgdXNpbmcgdGhlIGN1cnJlbnQgZXZhbHVhdGlvbiBjb250ZXh0LjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmRlZmluaXRpb25JZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIGFuIGV4cHJlc3Npb24gZnJvbSA8Yj5vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zPC9iPi48L2xpPgotPC91bD4KLTxicj48YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLjxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yRGVsZWdhdGVzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yRGVsZWdhdGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MGY0ZmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvckRlbGVnYXRlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+VmFsaWRhdG9yIERlbGVnYXRlczwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+VmFsaWRhdG9yIERlbGVnYXRlczwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckRlbGVnYXRlczxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PjxiPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuPC9iPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj5UaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdmFsaWRhdG9yIHByb3ZpZGVycyB0byBjb250cmlidXRlIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMgZm9yIGEgZGVsZWdhdGluZyB2YWxpZGF0b3IuPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS5kZWxlZ2F0ZSI+ZGVsZWdhdGU8L2E+KSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZGVsZWdhdGUiPmRlbGVnYXRlPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBkZWxlZ2F0ZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dGFyZ2V0Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotRGVmaW5lcyBhIHZhbGlkYXRvciBkZWxlZ2F0ZS4gRGVsZWdhdGluZyB2YWxpZGF0b3JzIGNhbiBoYXZlIG9uZSBvciBtb3JlIGRlbGVnYXRlcyByZWdpc3RlcmVkLCBvbmx5IG9uZSBvZiB3aGljaCBjYW4gYmUgYWN0aXZlIChzZWxlY3RlZCkgYXQgb25jZS48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5jbGFzczwvYj4gLSBTcGVjaWZpZXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGRlbGVnYXRlIHZhbGlkYXRvci4gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IElWYWxpZGF0b3JKb2IuPC9saT4KLTxsaT48Yj50YXJnZXQ8L2I+IC0gU3BlY2lmaWVzIHRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yIGV4dGVuc2lvbiBmb3Igd2hpY2ggdGhpcyBkZWxlZ2F0ZSBpcyBiZWluZyByZWdpc3RlcmVkLjwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5FeGFtcGxlczogPC9oNj48ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JEZWxlZ2F0ZXMiPgotICAgIDxkZWxlZ2F0ZQotICAgICAgICAgIGNsYXNzPSJjb20uYWNtZS5mYXN0LlN1cGVyRmFzdFZhbGlkYXRvciIKLSAgICAgICAgICBuYW1lPSJTdXBlciBmYXN0IHZhbGlkYXRvciIKLSAgICAgICAgICB0YXJnZXQ9Im9yZy5hY21lLmNvcmUuQUNNRURlbGVnYXRpbmdWYWxpZGF0b3IiLz4KLSA8L2V4dGVuc2lvbj4KLTxwPjwvcD4KLQotPGJyPgotPHAgY2xhc3M9Im5vdGUgU2NoZW1hQ29weXJpZ2h0Ij4KLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy48YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvckdyb3VwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yR3JvdXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0MGUxYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yR3JvdXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPlZhbGlkYXRvciBHcm91cDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+VmFsaWRhdG9yIEdyb3VwPC9IMT4KLTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPklkZW50aWZpZXI6IDwvaDY+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yR3JvdXA8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TaW5jZTogPC9oNj5XZWJUb29scyAzLjAKLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+RGVmaW5lcyBhIGdyb3VwaW5nIGZvciB2YWxpZGF0b3JzIHdpdGggbGlzdGVuZXJzIG5vdGlmaWVkIG9mIGdyb3VwIG1lbWJlcnMnIGFjdGl2aXRlcy4gIFVzZWZ1bCBmb3IgcHJlLWNhY2hpbmcgY29tbW9uIGluZm9ybWF0aW9uIHVzZWQgYnkgbXVsdGlwbGUgdmFsaWRhdG9ycyBhbmQgZGlzcG9zaW5nIG9mIHRoYXQgaW5mb3JtYXRpb24gd2hlbiB0aGV5J3JlIGFsbCBkb25lLjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UuZ3JvdXAiPmdyb3VwPC9hPispJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnBvaW50Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRCZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbjwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSBBIG5hbWUgZm9yIHRoaXMgZXh0ZW5zaW9uPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5saXN0ZW5lciI+bGlzdGVuZXI8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGxpc3RlbmVyPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2xhc3MmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLUEgbGlzdGVuZXIgZm9yIGFjdGl2aXRpZXMgaW4gdGhpcyBncm91cC48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5jbGFzczwvYj4gLSBUaGUgbGlzdGVuZXIncyBjbGFzcy48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmdyb3VwIj5ncm91cDwvYT4gKDxhIGhyZWY9IiNlLmxpc3RlbmVyIj5saXN0ZW5lcjwvYT4rKSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBncm91cDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7SURSRUYgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1EZWNsYXJlcyBhIHZhbGlkYXRvciBncm91cC4gIEEgZ3JvdXAgbWF5IGhhdmUgbXVsdGlwbGUgbGlzdGVuZXJzLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIDwvbGk+Ci08L3VsPgotPGJyPjxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkV4YW1wbGVzOiA8L2g2PkRlZmluZSBhIGxpc3RlbmVyIHRoYXQgc2ltcGx5IHByaW50cyB0aGF0IGl0IGhhcyBiZWVuIGNhbGxlZC4KLTxwcmUgY2xhc3M9IkV4YW1wbGUiPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JHcm91cCZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiZndDsKLSAgICZsdDtncm91cCBpZD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7dmFsaWRhdG9yR3JvdXAmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICZsdDtsaXN0ZW5lciBjbGFzcz08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhhbXBsZS5WYWxpZGF0b3JHcm91cExpc3RlbmVyJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+LyZndDsKLSAgICZsdDsvZ3JvdXAmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLQotcHVibGljIGNsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmV4YW1wbGUuVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciBpbXBsZW1lbnRzIElWYWxpZGF0b3JHcm91cExpc3RlbmVyIHsKLQotICBwdWJsaWMgVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcigpIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbFR5cGUgdmFsVHlwZSwgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hpbmc6IiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmFsaWRhdGlvblN0YXJ0aW5nKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxUeXBlIHZhbFR5cGUsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmc6IiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICB9Ci19Ci0gCi0mbHQ7ZXh0ZW5zaW9uIGlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtpZCZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiBuYW1lPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtuYW1lJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+IHBvaW50PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiZndDsKLSAgJmx0O3ZhbGlkYXRvciBjbGFzcz08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhhbXBsZS5WYWxpZGF0b3ImcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgJmx0O2dyb3VwIGlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5leGFtcGxlLnZhbGlkYXRvckdyb3VwJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+LyZndDsKLSAgJmx0Oy92YWxpZGF0b3ImZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLTwvc3Bhbj48L3ByZT4KLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+QVBJIEluZm9ybWF0aW9uOiA8L2g2PlByb3Zpc2lvbmFsIEFQSS4KLTxwPjwvcD4KLQotPGJyPgotPHAgY2xhc3M9Im5vdGUgU2NoZW1hQ29weXJpZ2h0Ij4KLUNvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy48YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvclYyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yVjIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1ZDgxMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yVjIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5WYWxpZGF0b3IgVjI8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPlZhbGlkYXRvciBWMjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvci12MjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PldlYlRvb2xzIDMuMC4KLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+VGhpcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgdmFsaWRhdG9yIHRvIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayAodmVyc2lvbiAyKS4gSW4gYWRkaXRpb24gdG8gc3BlY2lmeWluZyB0aGUgdmFsaWRhdG9yIHRvIGludm9rZSwgaXQgcmVnaXN0ZXJzIGEgc2V0IG9mIGRlZmF1bHQgZmlsdGVyIHJ1bGVzLCB0byBjb250cm9sIHdoaWNoIHJlc291cmNlcyBhcmUgcGFzc3NlZCB0byB0aGUgdmFsaWRhdG9yLjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UudmFsaWRhdG9yIj52YWxpZGF0b3I8L2E+KSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBBIHNob3J0IGlkIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgcGx1Zy1pbiwgc28gdGhhdCB0aGlzIHZhbGlkYXRvciBjYW4gYmUgaWRlbnRpZmllZC48L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gVGhlIHNob3J0IHVzZXIgZnJpZW5kbHkgbmFtZSBvZiB0aGUgdmFsaWRhdG9yLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUudmFsaWRhdG9yIj52YWxpZGF0b3I8L2E+ICg8YSBocmVmPSIjZS5pbmNsdWRlIj5pbmNsdWRlPC9hPiogLCA8YSBocmVmPSIjZS5leGNsdWRlIj5leGNsdWRlPC9hPj8gLCA8YSBocmVmPSIjZS5tZXNzYWdlQ2F0ZWdvcnkiPm1lc3NhZ2VDYXRlZ29yeTwvYT4qICwgPGEgaHJlZj0iI2UuZ3JvdXAiPmdyb3VwPC9hPiopJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHZhbGlkYXRvcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+YnVpbGQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsodHJ1ZSB8IGZhbHNlKSA8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5tYW51YWwmbmJzcDsmbmJzcDsmbmJzcDsodHJ1ZSB8IGZhbHNlKSA8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52ZXJzaW9uJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5zb3VyY2VpZCZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bWFya2VySWQmbmJzcDtDREFUQSAjSU1QTElFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotRGVmaW5lcyBhIHZhbGlkYXRvciB0byB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgdmFsaWRhdG9yLjwvbGk+Ci08bGk+PGI+YnVpbGQ8L2I+IC0gSXMgdGhpcyB2YWxpZGF0b3IgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBidWlsZCBiYXNlZCB2YWxpZGF0aW9ucz8gVGhlIGRlZmF1bHQgaXMgdHJ1ZS48L2xpPgotPGxpPjxiPm1hbnVhbDwvYj4gLSBJcyB0aGlzIHZhbGlkYXRvciBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIG1hbnVhbCBiYXNlZCB2YWxpZGF0aW9ucz8gVGhlIGRlZmF1bHQgaXMgdHJ1ZS48L2xpPgotPGxpPjxiPnZlcnNpb248L2I+IC0gVGhlIHZlcnNpb24gb2YgdGhlIGRlZmluaXRpb24uIEl0IGlzIGEgc2ltcGxlIGludGVnZXIuIElmIG5vdCBzcGVjaWZpZWQgdGhlIHZlcnNpb24gaXMgYXNzdW1lZCB0byBiZSAxLjwvbGk+Ci08bGk+PGI+c291cmNlaWQ8L2I+IC0gSWYgdGhpcyB2YWxpZGF0b3IgYWxzbyBzZXJ2ZXMgYXMgYW4gYXMteW91LXR5cGUgdmFsaWRhdG9yIChhbHNvIGtub3cgYXMgYW4gSVNvdXJjZVZhbGlkYXRvcikgdGhlbiBpdCdzIHNvdXJjZSBpZCBpcyBzcGVjaWZpZWQgaGVyZSwgc28gdGhhdCB0aGUgdHdvIHZhbGlkYXRvcnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmUgYW5vdGhlci4KLUJ5IHNvdXJjZSBpZCwgd2UgbWVhbiB0aGUgaWQgdGhhdCBpcyB1c2VkIGluIHRoZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZVZhbGlkYXRpb24gZXh0ZW5zaW9uIHBvaW50PC9saT4KLTxsaT48Yj5tYXJrZXJJZDwvYj4gLSBJZiB5b3VyIHZhbGlkYXRvciB3aXNoZXMgdG8gdXNlIGl0J3Mgb3duIG1hcmtlciwgaXQgY2FuIGRvIHNvIGJ5IHN1cHBseWluZyB0aGF0IG1hcmtlciBpZCBoZXJlLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuaW5jbHVkZSI+aW5jbHVkZTwvYT4gKDxhIGhyZWY9IiNlLnJ1bGVzIj5ydWxlczwvYT4pJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGNvbnRhaW5zIGEgc2V0IG9mIGluY2x1c2lvbiBydWxlcywgd2hpY2ggYXJlIHVzZWQgaW4gZmlsdGVyaW5nIHdoaWNoIHJlc291cmNlcyBnZXQgdmFsaWRhdGVkLiBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgcnVsZXMgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHRoZSB2YWxpZGF0b3IgdG8gYmUgY2FsbGVkIG9uIHRoZSBwYXJ0aWN1bGFyIHJlc291cmNlLjwvcD4KLTxicj48YnI+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4Y2x1ZGUiPmV4Y2x1ZGU8L2E+ICg8YSBocmVmPSIjZS5ydWxlcyI+cnVsZXM8L2E+KSZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBjb250YWlucyBhIHNldCBvZiBleGNsdXNpb24gcnVsZXMsIHVzZWQgaW4gZmlsdGVyaW5nIHdoaWNoIHJlc291cmNlcyBnZXQgdmFsaWRhdGVkLiBJZiBhbnkgb2YgdGhlc2UgcnVsZXMgYXJlIG1hdGNoZWQsIHRoZW4gdGhlIHZhbGlkYXRvciBpcyBub3QgY2FsbGVkIG9uIHRoaXMgcmVzb3VyY2UuPC9wPgotPGJyPjxicj4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZmlsZWV4dCI+ZmlsZWV4dDwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZmlsZWV4dDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmV4dCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNhc2VTZW5zaXRpdmUmbmJzcDsodHJ1ZSB8IGZhbHNlKSAmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLUEgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlIGh0bWwuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+ZXh0PC9iPiAtIFRoZSBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgaHRtbC48L2xpPgotPGxpPjxiPmNhc2VTZW5zaXRpdmU8L2I+IC0gSWYgdGhlIGZpbGUgZXh0ZW5zaW9uIGlzIGNhc2Ugc2Vuc2l0aXZlLCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5wcm9qZWN0TmF0dXJlIj5wcm9qZWN0TmF0dXJlPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBwcm9qZWN0TmF0dXJlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVVzZWQgdG8gZmlsdGVyIG9uIHByb2plY3QgbmF0dXJlcy48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBUaGUgZnVsbHkgcXVhbGlmaWVkIHByb2plY3QgbmF0dXJlIGlkLCBmb3IgZXhhbXBsZSAib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5maWxlIj5maWxlPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBmaWxlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNhc2VTZW5zaXRpdmUmbmJzcDsodHJ1ZSB8IGZhbHNlKSA8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij50eXBlJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KGZvbGRlcnxmaWxlfGZ1bGwpICZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBmaWxlIG9yIGZvbGRlciBuYW1lLiBUaGUgZmlsZSBuYW1lIGNhbiBiZSBmdWxseSBxdWFsaWZpZWQsIHRoYXQgaXMgaXQgc3RhcnRzIHdpdGggYSBsZWFkaW5nIHNsYXNoICgiLyIpLCBvciBpdCBjYW4gYmUgYSByZWxhdGl2ZSBuYW1lLiBGb2xkZXIgbmFtZXMgYXJlIHNlcGFyYXRlZCB3aXRoIHRoZSBmb3J3YXJkIHNsYXNoICgiLyIpIGNoYXJhY3Rlci48L2xpPgotPGxpPjxiPmNhc2VTZW5zaXRpdmU8L2I+IC0gSWYgdGhlIGZpbGUgbmFtZSBpcyBub3QgY2FzZSBzZW5zdGl0aXZlLCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIGZhbHNlLjwvbGk+Ci08bGk+PGI+dHlwZTwvYj4gLSBUeXBlIG9mIG5hbWUsIHRoZXJlIGFyZSB0aHJlZSBjaG9pY2VzLiA8dWw+PGxpPmZvbGRlciAtIHNwZWNpZmllcyBhIHByb2plY3QgcmVsYXRpdmUgZm9sZGVyIG5hbWUuPC9saT48bGk+ZmlsZSAtIGEgc2ltcGxlIGZpbGUgbmFtZSAoaS5lLiBubyBwYXRoIGluZm9ybWF0aW9uKS48L2xpPjxsaT5mdWxsIC0gYSBmdWxseSBxdWFsaWZpZWQgKHByb2plY3QgcmVsYXRpdmUpIGZpbGUgbmFtZS48L2xpPjwvdWw+PC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5ydWxlcyI+cnVsZXM8L2E+ICg8YSBocmVmPSIjZS5maWxlZXh0Ij5maWxlZXh0PC9hPiogLCA8YSBocmVmPSIjZS5maWxlIj5maWxlPC9hPiogLCA8YSBocmVmPSIjZS5wcm9qZWN0TmF0dXJlIj5wcm9qZWN0TmF0dXJlPC9hPiogLCA8YSBocmVmPSIjZS5mYWNldCI+ZmFjZXQ8L2E+KiAsIDxhIGhyZWY9IiNlLmNvbnRlbnRUeXBlIj5jb250ZW50VHlwZTwvYT4qICwgPGEgaHJlZj0iI2UucGF0dGVybiI+cGF0dGVybjwvYT4qKSZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotQSBzZXQgb2YgcnVsZXMgZm9yIGRldGVybWluaW5nIGlmIGEgcmVzb3VyY2UgaXMgcGFzc2VkIHRvIHRoaXMgdmFsaWRhdG9yIG9yIG5vdC4gVGhlIHJ1bGVzIGFyZSBPUidlZCB0b2dldGhlci48L3A+Ci08YnI+PGJyPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5mYWNldCI+ZmFjZXQ8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGZhY2V0PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52ZXJzaW9uJm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gVGhlIGZhY2V0IGlkLjwvbGk+Ci08bGk+PGI+dmVyc2lvbjwvYj4gLSBBIHZlcnNpb24gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZ1dGhlciBxdWFsaWZ5IHRoZSBtYXRjaC4gSWYgbm90IHNwZWNpZmVkLCB0aGVuIHZlcnNpb25zIGFyZSBub3QgdXNlZCBhcyBhIGNyaXRlcmlhIGZvciBzZWxlY3RpbmcgdGhlIGZhY2V0LiBUaGUgc3ludGF4IG9mIHRoaXMgZXhwcmVzc2lvbiwgaXMgdGhlIHNhbWUgc3ludGF4IHRoYXQgaXMgdXNlZCBieSB0aGUgZmFjZXQgZnJhbWV3b3JrLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZ3JvdXAiPmdyb3VwPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBncm91cDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7SURSRUYgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1EZWNsYXJlcyB0aGF0IHRoaXMgdmFsaWRhdG9yIGJlbG9uZ3MgdG8gdGhpcyB2YWxpZGF0aW9uIGdyb3VwLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFRoZSBmdWxseSBxdWFsaWZpZWQgSUQgb2YgdGhlIHZhbGlkYXRpb24gZ3JvdXAgdG8gd2hpY2ggdGhpcyB2YWxpZGF0b3IgYmVsb25ncy48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmNvbnRlbnRUeXBlIj5jb250ZW50VHlwZTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgY29udGVudFR5cGU8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmV4YWN0TWF0Y2gmbmJzcDsodHJ1ZSB8IGZhbHNlKSAmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVVzZWQgdG8gZmlsdGVyIGJhc2VkIG9uIGNvbnRlbnQgdHlwZXMuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gVGhlIGNvbnRlbnQgdHlwZSBpZC48L2xpPgotPGxpPjxiPmV4YWN0TWF0Y2g8L2I+IC0gU2V0IHRvIHRydWUgaWYgdGhlIGNvbnRlbnQgdHlwZSBuZWVkcyB0byBtYXRjaCBleGFjdGx5LiBTZXQgdG8gZmFsc2UgaWYgc3ViIHR5cGVzIGFyZSBjb25zaWRlcmVkIG1hdGNoZXMgYXMgd2VsbC48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLm1lc3NhZ2VDYXRlZ29yeSI+bWVzc2FnZUNhdGVnb3J5PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBtZXNzYWdlQ2F0ZWdvcnk8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmxhYmVsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+c2V2ZXJpdHkmbmJzcDsoZXJyb3J8d2FybmluZ3xpZ25vcmUpICZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVXNlZCB0byBncm91cCB0b2dldGhlciBhIHNldCBvZiBtZXNzYWdlcywgd2hlcmUgdGhlIHVzZXIgY2FuIGNoYW5nZSB0aGUgbWVzc2FnZSBzZXZlcml0eSBvZiBhbGwgdGhlIG1lc3NhZ2VzIGluIHRoZSBncm91cC4gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBzdXBwb3J0IGluIHRoZSBKRFQsIHdoZXJlIGZvciBleGFtcGxlIGEgdXNlciBjYW4gc3BlY2lmeSB3aGV0aGVyIHVzZWQgbWV0aG9kcyBzaG91bGQgYmUgZXJyb3JzLCB3YXJuaW5ncyBvciBpZ25vcmVkLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIEEgc2ltcGxlIGlkIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhpcyB2YWxpZGF0b3IuPC9saT4KLTxsaT48Yj5sYWJlbDwvYj4gLSBBIHNob3J0LCBvbmUgbGluZSBsYWJlbCB0aGF0IGlzIGRpc3BsYXllZCB0byB0aGUgZW5kIHVzZXIsIHRoYXQgZGVzY3JpYmVzIHRoZSBtZXNzYWdlIGNhdGVnb3J5LjwvbGk+Ci08bGk+PGI+c2V2ZXJpdHk8L2I+IC0gVGhlIGRlZmF1bHQgc2V2ZXJpdHkgZm9yIHRoaXMgY2F0ZWdvcnkuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5wYXR0ZXJuIj5wYXR0ZXJuPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBwYXR0ZXJuPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cmVnZXgmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jYXNlU2Vuc2l0aXZlJm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1Ib2xkcyBhIHJlZ3VhbHIgZXhwcmVzc2lvbiwgdGhhdCBtYXRjaGVzIHRoZSByZXNvdXJjZSdzIHByb2plY3QgcmVsYXRpdmUgbmFtZS48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5yZWdleDwvYj4gLSBIb2xkcyBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLiBTZWUgdGhlIGNsYXNzIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIGZvciBtb3JlIGRldGFpbHMuIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQgYWdhaW5zdCBhIHJlc291cmNlJ3MgcHJvamVjdCByZWxhdGl2ZSBwYXRoLCBhZnRlciB0aGF0IHBhdGggaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBwb3J0YWJsZSBwYXRoLgotPHA+VGhlIHBhdGggd2lsbCBhbHdheXMgc3RhcnQgd2l0aCBhIGZvcndhcmQgc2xhc2ggKC8pIHNvIHRoYXQgZm9sZGVyIG5hbWVzIGNhbiBiZSBtb3JlIGVhc2lseSBtYXRjaGVkLjwvbGk+Ci08bGk+PGI+Y2FzZVNlbnNpdGl2ZTwvYj4gLSBJZiB0aGUgZmlsZSBuYW1lIGlzIG5vdCBjYXNlIHNlbnN0aXRpdmUsIHRoZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gZmFsc2UuPC9saT4KLTwvdWw+Ci08YnI+PGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RXhhbXBsZXM6IDwvaDY+QW4gZXhhbXBsZSBvZiBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIHJlc291cmNlcyB0aGF0IGhhdmUgaHRtbCBvciBodG0gZmlsZSBleHRlbnNpb25zLgotPHByZSBjbGFzcz0iRXhhbXBsZSI+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3ImcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgIGlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtUZXN0JnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+IG5hbWU9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90OyVWYWxpZGF0b3IuTmFtZSZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiZndDsKLSAgICAgICZsdDt2YWxpZGF0b3IgY2xhc3M9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3QuVGVzdFZhbGlkYXRvciZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiZndDsKLSAgICAgICAgICZsdDtpbmNsdWRlJmd0OwotICAgICAgICAgICAgJmx0O3J1bGVzJmd0OwotICAgICAgICAgICAgICAgJmx0O2ZpbGVleHQgZXh0PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtodG1sJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+LyZndDsKLSAgICAgICAgICAgICAgICZsdDtmaWxlZXh0IGV4dD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7aHRtJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+LyZndDsKLSAgICAgICAgICAgICZsdDsvcnVsZXMmZ3Q7Ci0gICAgICAgICAmbHQ7L2luY2x1ZGUmZ3Q7Ci0gICAgICAmbHQ7L3ZhbGlkYXRvciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotPC9zcGFuPjwvcHJlPgotPHA+PC9wPgotCi08YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuPGJyPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Ci0KLTwvcD4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjM5ZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iVmFsaWRhdGlvbiBGcmFtZXdvcmsgSmF2YWRvYyIgCi0JbGlua190bz0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3JlZmVyZW5jZV90b2MueG1sI2phdmFkb2NfY29tbW9uIj4KLQk8dG9waWMgbGFiZWw9IlZhbGlkYXRpb24gRnJhbWV3b3JrIEFQSSBSZWZlcmVuY2UiICBocmVmPSJyZWZlcmVuY2UvYXBpL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiBocmVmPSJyZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIi8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJWYWxpZGF0aW9uIEZyYW1ld29yayBFeHRlbnNpb24gUG9pbnRzIFJlZmVyZW5jZSIgaHJlZj0icmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvaW5kZXguaHRtbCI+Ci0JPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3RvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3RvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI1ZWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi90b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0JIAk8dG9jIGxhYmVsPSJFeHRlbnNpb24gUG9pbnRzIFJlZmVyZW5jZSI+Ci08dG9waWMgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckdyb3VwIiBocmVmPSJyZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JHcm91cC5odG1sIi8+Ci08dG9waWMgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIiBocmVmPSJyZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JWMi5odG1sIi8+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvdmZleHRkb2NzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi92ZmV4dGRvY3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjQ2YWY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi92ZmV4dGRvY3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPGZpbGVzIGNvbXBvbmVudD0idmYiPjxmaWxlPm9yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvclYyLmh0bWw8L2ZpbGU+L24vbjxmaWxlPm9yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvckdyb3VwLmh0bWw8L2ZpbGU+PC9maWxlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjViNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmZTUyNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJVBsdWdpbi5wcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkNzIxYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvVmFsaWRhdGlvblByZWZzX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotCi08Y29udGV4dHM+Ci0JPCEtLSBFY2xpcHNlIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMgLS0+Ci08Y29udGV4dCBpZD0ianZncDAwMDAiPgotPGRlc2NyaXB0aW9uPlRoZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIHBhZ2UgYWxsb3dzIHlvdSB0byB2aWV3IG9yIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciBhbGwgd29ya2JlbmNoIHByb2plY3RzLiBBIHZhbGlkYXRvciBpcyBhIHRvb2wgdGhhdCBjaGVja3MgdGhhdCByZXNvdXJjZXMgY29uZm9ybSB0byBhIHNwZWNpZmljYXRpb24sIERURCwgb3Igc29tZSBvdGhlciBzZXQgb2YgcnVsZXMuCi0KLUVhY2ggdmFsaWRhdG9yIGNhbiBhcHBseSB0byBjZXJ0YWluIHR5cGVzIG9mIGZpbGVzLCBjZXJ0YWluIHByb2plY3QgbmF0dXJlcywgYW5kIGNlcnRhaW4gcHJvamVjdCBmYWNldHMuIFdoZW4gYSB2YWxpZGF0b3IgYXBwbGllcyB0byBhIHByb2plY3QgZmFjZXQgb3IgbmF0dXJlLCB0aGUgd29ya2JlbmNoIHVzZXMgdGhhdCB2YWxpZGF0b3Igb25seSBvbiBwcm9qZWN0cyB0aGF0IGhhdmUgdGhhdCBmYWNldCBvciBuYXR1cmUuIExpa2V3aXNlLCBtb3N0IHZhbGlkYXRvcnMgYXBwbHkgb25seSB0byBjZXJ0YWluIHR5cGVzIG9mIGZpbGVzLCBzbyB0aGUgd29ya2JlbmNoIHVzZXMgdGhvc2UgdmFsaWRhdG9ycyBvbmx5IG9uIHRob3NlIHR5cGVzIG9mIGZpbGVzLgotCi1TZWxlY3QgdGhlIDxiPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L2I+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0byBhbGxvdyBpbmRpdmlkdWFsIHByb2plY3RzIHRvIHNldCB0aGVpciBvd24gdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4gVG8gY29uZmlndXJlIG5ldyB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciBhbiBpbmRpdmlkdWFsIHByb2plY3QsIHNlbGVjdCB0aGUgcHJvamVjdCBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIGFuZCBzZWxlY3QgPGI+UHJvcGVydGllczwvYj4gJmd0OyA8Yj5WYWxpZGF0aW9uPC9iPi4KLQotU2VsZWN0IHRoZSA8Yj5TdXNwZW5kIGFsbCB2YWxpZGF0b3JzPC9iPiBjaGVjayBib3ggdG8gcHJldmVudCB2YWxpZGF0aW9uIGF0IHRoZSBnbG9iYWwgbGV2ZWwuCi0KLVNlbGVjdCB0aGUgPGI+U2F2ZSBhbGwgbW9kaWZpZWQgcmVzb3VyY2VzIGF1dG9tYXRpY2FsbHkgcHJpb3IgdG8gdmFsaWRhdGluZzwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvIHNhdmUgYW55IHJlc291cmNlcyB5b3UgaGF2ZSBtb2RpZmllZCBiZWZvcmUgdGhlIHZhbGlkYXRpb24gYmVnaW5zLgotCi1JbiB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzLCBzZWxlY3QgdGhlIGNoZWNrIGJveGVzIG5leHQgdG8gZWFjaCB2YWxpZGF0b3IgeW91IHdhbnQgdG8gdXNlIGF0IHRoZSBnbG9iYWwgbGV2ZWwuIEVhY2ggdmFsaWRhdG9yIGhhcyBhIGNoZWNrIGJveCB0byBzcGVjaWZ5IHdoZXRoZXIgaXQgaXMgdXNlZCBvbiBtYW51YWwgdmFsaWRhdGlvbiBvciBvbiBidWlsZCB2YWxpZGF0aW9uLiBDaG9vc2UgYW4gYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIGZvciBhIHZhbGlkYXRvciBvciB1cGRhdGUgaXQncyBkZXRhaWxlZCBzZXR0aW5ncyBieSBjbGlja2luZyB0aGUgYnV0dG9uIGluIHRoZSA8Yj5TZXR0aW5nczwvYj4gY29sdW1uLiBOb3QgYWxsIHZhbGlkYXRvcnMgaGF2ZSBkZXRhaWxlZCBzZXR0aW5ncy4KLQotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgbGFiZWw9IlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCIgbGFiZWw9Ik92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnR1bmV2YWxpZGF0Lmh0bWwiIGxhYmVsPSJUdW5pbmcgdmFsaWRhdG9ycyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydmFsZXJyLmh0bWwiIGxhYmVsPSJDb21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9ucyIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianZncDAxMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBOZXcgRmlsdGVyIFJ1bGUgZGlhbG9nIGFkZHMgYSBuZXcgcnVsZSB0byBlaXRoZXIgYW4gSW5jbHVkZSBHcm91cCBvciBhbiBFeGNsdWRlIEdyb3VwLiBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiBydWxlczoKLQotPGI+RmlsZSBleHRlbnNpb248L2I+IC0gQSBydWxlIHRoYXQgaXMgb25seSBjb25jZXJuZWQgd2l0aCBtYXRjaGluZyBmaWxlIGV4dGVuc2lvbnMsIGZvciBleGFtcGxlIGh0bWwgZm9yIEhUTUwgZmlsZXMgb3IgeG1sIGZvciBYTUwgZmlsZXMuCi0KLTxiPkZvbGRlciBvciBmaWxlIG5hbWU8L2I+IC0gQSBydWxlIGZvciBtYXRjaGluZyBmb2xkZXIgb3IgZmlsZSBuYW1lcy4gVGhlc2UgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIGEgcHJvamVjdC4KLQotPGI+UHJvamVjdCBuYXR1cmU8L2I+IC0gVGhlIG5leHQgcGFnZSBzaG93cyBhIGRyb3AgZG93biBsaXN0IG9mIGFsbCB0aGUga25vd24gcHJvamVjdCBuYXR1cmVzLgotCi08Yj5GYWNldDwvYj4gLSBUeXBpY2FsbHkgdGhpcyB3b3VsZCBvbmx5IGJlIHVzZWQgYnkgYWR2YW5jZWQgb3IgaW50ZXJuYWwgdXNlcnMsIGFzIHlvdSB3b3VsZCBuZWVkIHRvIGtub3cgdGhlIGludGVybmFsIGZhY2V0IGlkcy4KLQotPGI+Q29udGVudCBUeXBlPC9iPiAtIFRoZSBuZXh0IHBhZ2Ugd2lsbCBzaG93IGEgZHJvcCBkb3duIGxpc3Qgb2YgYWxsIHRoZSBrbm93biBjb250ZW50IHR5cGVzLiBDb250ZW50IHR5cGVzIGFyZSBtb3JlIHBvd2VyZnVsIHRoYW4gZmlsZSBleHRlbnNpb25zLCBidXQgYWxzbyBzbG93ZXIgdG8gbWF0Y2ggYXQgcnVudGltZS4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJqdmdwMDEwMSI+Ci08ZGVzY3JpcHRpb24+QSBydWxlIGZvciBtYXRjaGluZyBmaWxlIGV4dGVuc2lvbnMuIFRoZSBmaWxlIGNhbiBiZSBsb2NhdGVkIGFueXdoZXJlIGluIHRoZSBwcm9qZWN0LgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9Imp2Z3AwMTAyIj4KLTxkZXNjcmlwdGlvbj5Gb2xkZXIgb3IgZmlsZSBuYW1lcy4gWW91IGNhbiBlaXRoZXIgdXNlIEZpbGUgb3IgRm9sZGVyIGJyb3dzZXJzLCBvciB0eXBlIGluIGEgbmFtZSBkaXJlY3RseS4gVGhlc2UgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIGEgcHJvamVjdC4gCi0KLUlmIHlvdSBzZWxlY3QgYSBmaWxlIG9yIGZvbGRlciB0aGF0IGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIGEgcHJvamVjdCwgdGhlIHJ1bGUgd2lsbCBub3QgYmUgYWN0aXZhdGVkLgotCi1Gb3IgZmlsZXMgeW91IGNhbiBtYXRjaCBvbiBlaXRoZXIgc2ltcGxlIG5hbWVzLCBvciBxdWFsaWZpZWQgbmFtZXMuIEZvciBleGFtcGxlIG1hdGNoaW5nIG9uIHRoZSBzaW1wbGUgbmFtZSAicHJvZHVjdC54bWwiLCB3aWxsIG1hdGNoIHRoZSBmaWxlIGluIGFueSBkaXJlY3RvcnkuIEhvd2V2ZXIsIG1hdGNoaW5nIG9uIHRoZSBxdWFsaWZpZWQgbmFtZSAiV0VCLUlORi9wcm9kdWN0LnhtbCIgd2lsbCBvbmx5IG1hdGNoIHRoZSBmaWxlIGluIHRoZSBXRUItSU5GIGRpcmVjdG9yeS4gCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianZncDAxMDMiPgotPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBsaXN0IG9mIHRoZSByZWdpc3RlcmVkIFByb2plY3QgbmF0dXJlcy4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJqdmdwMDEwNCI+Ci08ZGVzY3JpcHRpb24+VGhlIGludGVybmFsIGZhY2V0IGlkIGlzIHNwZWNpZmllZCBoZXJlLiBTaW5jZSB5b3UgbmVlZCB0byBrbm93IGludGVybmFsIGlkcyB0aGlzIHNldHRpbmcgaXMgdHlwaWNhbGx5IG5vdCB1c2VkIGJ5IGVuZCB1c2Vycy4gCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianZncDAxMDUiPgotPGRlc2NyaXB0aW9uPkEgbGlzdCBvZiBhbGwgdGhlIHJlZ2lzdGVyZWQgQ29udGVudCBUeXBlcy4gQ29udGVudCB0eXBlcyBhcmUgbW9yZSBwb3dlcmZ1bCB0aGFuIHVzaW5nIGZpbGUgZXh0ZW5zaW9ucyBvciBmaWxlIG5hbWVzLCBhcyB0aGV5IGNhbiB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gbW9yZSBwcmVjaXNlbHkgZGVmaW5lIGl0J3MgdHlwZS4gSG93ZXZlciwgdGhleSByZXF1aXJlIG1vcmUgY29tcHV0ZXIgcmVzb3VyY2VzIHRvIGNhbGN1bGF0ZS4KLQotQ29udGVudCB0eXBlcyBmb3JtIGhpZXJhcmNoaWVzLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UgcmVxdWlyZSBhbiBleGFjdCBtYXRjaCwgb3Igd2hldGhlciBzdWJ0eXBlcyBpbiB0aGUgaGllcmFyY2h5IHNob3VsZCBtYXRjaCBhcyB3ZWxsLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWQ3ZDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTxjb250ZXh0cz4KLQk8IS0tIFZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIHByb2plY3QgLS0+Ci0KLTxjb250ZXh0IGlkPSJqdnBwMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIHByb2plY3QgdmFsaWRhdGlvbiBwYWdlIGFsbG93cyB5b3UgdG8gdmlldyBvciBjaGFuZ2UgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIGEgcHJvamVjdC4gQSB2YWxpZGF0b3IgaXMgYSB0b29sIHRoYXQgY2hlY2tzIHRoYXQgcmVzb3VyY2VzIGNvbmZvcm0gdG8gYSBzcGVjaWZpY2F0aW9uLCBEVEQsIG9yIHNvbWUgb3RoZXIgc2V0IG9mIHJ1bGVzLgotCi1FYWNoIHZhbGlkYXRvciBjYW4gYXBwbHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgY2VydGFpbiBwcm9qZWN0IG5hdHVyZXMsIGFuZCBjZXJ0YWluIHByb2plY3QgZmFjZXRzLiBXaGVuIGEgdmFsaWRhdG9yIGFwcGxpZXMgdG8gYSBwcm9qZWN0IGZhY2V0IG9yIG5hdHVyZSwgdGhlIHdvcmtiZW5jaCB1c2VzIHRoYXQgdmFsaWRhdG9yIG9ubHkgb24gcHJvamVjdHMgdGhhdCBoYXZlIHRoYXQgZmFjZXQgb3IgbmF0dXJlLiBMaWtld2lzZSwgbW9zdCB2YWxpZGF0b3JzIGFwcGx5IG9ubHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgc28gdGhlIHdvcmtiZW5jaCB1c2VzIHRob3NlIHZhbGlkYXRvcnMgb25seSBvbiB0aG9zZSB0eXBlcyBvZiBmaWxlcy4KLQotU2VsZWN0IHRoZSA8Yj5PdmVycmlkZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBzZXQgaW4gdGhlIHdvcmtiZW5jaCBQcmVmZXJlbmNlcyBwYWdlLiBJZiB0aGUgPGI+T3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYj4gY2hlY2sgYm94IGlzIG5vdCBlbmFibGVkLCBnbyB0byA8Yj5XaW5kb3c8L2I+ICZndDsgPGI+UHJlZmVyZW5jZXM8L2I+ICZndDsgPGI+VmFsaWRhdGlvbjwvYj4gYW5kIHNlbGVjdCB0aGUgPGI+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvYj4gY2hlY2sgYm94LgotCi1TZWxlY3QgdGhlIDxiPlN1c3BlbmQgYWxsIHZhbGlkYXRvcnM8L2I+IGNoZWNrIGJveCB0byBwcmV2ZW50IHZhbGlkYXRpb24gZm9yIHRoaXMgcHJvamVjdC4KLQotSW4gdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycywgc2VsZWN0IHRoZSBjaGVjayBib3hlcyBuZXh0IHRvIGVhY2ggdmFsaWRhdG9yIHlvdSB3YW50IHRvIHVzZSBmb3IgdGhpcyBwcm9qZWN0LiBFYWNoIHZhbGlkYXRvciBoYXMgYSBjaGVjayBib3ggdG8gc3BlY2lmeSB3aGV0aGVyIGl0IGlzIHVzZWQgb24gbWFudWFsIHZhbGlkYXRpb24gb3Igb24gYnVpbGQgdmFsaWRhdGlvbi4gQ2hvb3NlIGFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSB2YWxpZGF0b3Igb3IgY2hhbmdlIGl0J3MgZGV0YWlsZWQgc2V0dGluZ3MgYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbiBpbiB0aGUgPGI+U2V0dGluZ3M8L2I+IGNvbHVtbi4gTm90IGFsbCB2YWxpZGF0b3JzIGhhdmUgZGV0YWlsZWQgc2V0dGluZ3MuCi0KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIGxhYmVsPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIGxhYmVsPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J0dW5ldmFsaWRhdC5odG1sIiBsYWJlbD0iVHVuaW5nIHZhbGlkYXRvcnMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGVyci5odG1sIiBsYWJlbD0iQ29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnMiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9Imp2cHAwMTAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgTmV3IEZpbHRlciBSdWxlIGRpYWxvZyBhZGRzIGEgbmV3IHJ1bGUgdG8gZWl0aGVyIGFuIEluY2x1ZGUgR3JvdXAgb3IgYW4gRXhjbHVkZSBHcm91cC4gVGhlcmUgYXJlIHNldmVyYWwgdHlwZXMgb2YgcnVsZXM6Ci0KLTxiPkZpbGUgZXh0ZW5zaW9uPC9iPiAtIEEgcnVsZSB0aGF0IGlzIG9ubHkgY29uY2VybmVkIHdpdGggbWF0Y2hpbmcgZmlsZSBleHRlbnNpb25zLCBmb3IgZXhhbXBsZSBodG1sIGZvciBIVE1MIGZpbGVzIG9yIHhtbCBmb3IgWE1MIGZpbGVzLgotCi08Yj5Gb2xkZXIgb3IgZmlsZSBuYW1lPC9iPiAtIEEgcnVsZSBmb3IgbWF0Y2hpbmcgZm9sZGVyIG9yIGZpbGUgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byBhIHByb2plY3QuCi0KLTxiPkNvbnRlbnQgVHlwZTwvYj4gLSBUaGUgbmV4dCBwYWdlIHdpbGwgc2hvdyBhIGRyb3AgZG93biBsaXN0IG9mIGFsbCB0aGUga25vd24gY29udGVudCB0eXBlcy4gQ29udGVudCB0eXBlcyBhcmUgbW9yZSBwb3dlcmZ1bCB0aGFuIGZpbGUgZXh0ZW5zaW9ucywgYnV0IGFsc28gc2xvd2VyIHRvIG1hdGNoIGF0IHJ1bnRpbWUuCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2QzYmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIFZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMwNzA5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRyYW5zbGF0aW9uIEluc3RydWN0aW9uOiBzZWN0aW9uIHRvIGJlIHRyYW5zbGF0ZWQKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1QbHVnaW4ubmFtZSA9IFdTVCB2YWxpZGF0aW9uIGluZm9wb3AgcGx1Zy1pbgotUGx1Z2luLnByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmMjdiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgIDxjb250ZXh0cyBmaWxlPSJWYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IlZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpIiAvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyODEzNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA1ZGYxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9IkJ1aWxkIiBjb250ZW50PSJCdWlsZCI+Ci08dGl0bGU+V2ViIFRvb2xzIFBsYXRmb3JtIFBhdGNoIEJ1aWxkIE5vdGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5XVFAgMy4wLjUgUGF0Y2hlczwvaDE+Ci0KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg4NTQzJz4yODg1NDM8L2E+LiBDbGFzc3BhdGggY29udGFpbmVyIGZhY2V0IHJ1bnRpbWUgbWFwcGluZyBjYW4gYmVjb21lIG91dCBvZiBzeW5jPC9wPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDZhZDYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIGJvZHkgewotICAgIHNpemU6IDguNWluIDExLjBpbjsKLSAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47Ci0gICAgdGFiLWludGVydmFsOiAwLjVpbjsKLSAgICB9Ci0gIHAgeyAgIAotICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwotICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKLSAgICB9Ci0gIHAubGlzdCB7Ci0gICAgbWFyZ2luLWxlZnQ6IDAuNWluOwotICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOwotICAgIH0KLSAgPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci0KLTxwIGFsaWduPWNlbnRlcj48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+PC9wPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQotUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUwotQUdSRUVNRU5ULjwvcD4KLQotPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgotCi08cD4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCi1jb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvcD4KLTxwIGNsYXNzPSJsaXN0Ij53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbQotb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKLUNvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUKLVByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCi1Db250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KLWNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKQotYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwotdGhlIFByb2dyYW0uPC9wPgotCi08cD4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzJnF1b3Q7IG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cwotQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQotd2l0aCB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCi10aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgotCi08cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCi1vZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCi1vZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAotbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCi1Qcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKLXN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCi1ieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKLWNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKLWdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcwotYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQotcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAotQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQotYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCi1ncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bwotc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKLWV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Ci10byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCi10aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0Ci1oYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKLXRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgotCi08cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQotZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCi1vciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCi1jb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLWluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCi1BZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgotcGFydHk7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCi1mcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKLXJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKLWV4Y2hhbmdlLjwvcD4KLQotPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAotY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCi13aXRoaW4gdGhlIFByb2dyYW0uPC9wPgotCi08cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cwotQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAotUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KLQotPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgotCi08cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KLXJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQotbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCi10aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQotcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKLWluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCi0oJnF1b3Q7Q29tbWVyY2lhbCBDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kCi1pbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KQotYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykKLWFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAotcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCi1hY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cwotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKLW9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgotb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Ci10aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKLUluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCi1leHBlbnNlLjwvcD4KLQotPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQotY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQotYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bwotZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQotcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKLUNvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLW11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgotCi08cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUwotUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TCi1PRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKLUFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWQotT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLXRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsCi1kYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgotaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cD48Yj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVAotTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLUlOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcKLVdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KLQotPHA+PGI+Ny4gR0VORVJBTDwvYj48L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKLXRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgotYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+Ci0KLTxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQotKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCi1Qcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyCi1zb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlCi1kYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0Ci1mYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUKLWFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cwotdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+Ci0KLTxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZwotcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UKLUZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhCi1zdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlCi1naXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcwotZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8KLXJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcwotQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eQotdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlCi10aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cwotcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9wPgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzODlmNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XVFAgUGF0Y2hlcyBmb3Igb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1cCi1UaGUgYnVncyBhbmQgZml4ZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGJ1Z3ppbGxhIGVudHJpZXM6XG5cCi1cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg4NTQzIENsYXNzcGF0aCBjb250YWluZXIgZmFjZXQgcnVudGltZSBtYXBwaW5nIGNhbiBiZWNvbWUgb3V0IG9mIHN5bmNcblwKLVxuXAotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotQXVndXN0LCAyMDA4XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhYzk4OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb25fY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjAuMi52MjAwODA5MTAyMTI0LTI1MThzNzMzSTNHMzk1STc1IiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxZTFlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvZGVzY3JpcHRpb24udHh0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2gvZGVzY3JpcHRpb24udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZjNmQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhlIEhFQUQgYnJhbmNoIG9mIHRoaXMgcGF0Y2ggZmVhdHVyZSBpcyBpbnRlbnRpb25hbGx5IGVtcHR5LCAKLXRvIGF0dGVtcHQgdG8gdHJ5IGFuZCBhdm9pZCBjb25mdXNpb24uIAotCi1QbGVhc2UgbG9hZCB0aGUgY29ycmVjdCB2ZXJzaW9uIGZyb20gdGhlIGJyYW5jaCBvZiB0aGUgcmVsYXRlZCBwYXRjaC4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIwY2FhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTJmNDYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0NDgwYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkMjIzZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIENvcmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgY29tbW9uIGNvcmUgZnVuY3Rpb25hbGl0eS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiMjU4Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS51dGlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YWJmYjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzRmYzAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyNWIwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQwZjU0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBXU1QgY29tbW9uIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzRmYzAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyNWIwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzOTI1Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4NjI1MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczMGU3OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUsIGZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUuc291cmNlICAKLQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2ZTAwZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBDb21tb24gUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIGNvbW1vbiB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmZTBjOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5wYXRjaC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5wYXRjaC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmIxMmIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1MDI2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNDMyMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9IkJ1aWxkIiBjb250ZW50PSJCdWlsZCI+Ci08dGl0bGU+V1RQIDMuMC4xIFBhdGNoZXM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGgxPldUUCAzLjAuMSBQYXRjaGVzPC9oMT4KLQotPGgyPm9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZTwvaDI+Ci0KLTxwPkJ1ZyA8YQotCWhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU3NDUnPjI0NTc0NTwvYT4uCi1OdWxsUG9pbnRlckV4Y2VwdGlvbiBpbgotRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5pc0ZhY2V0QXZhaWxhYmxlKElQcm9qZWN0RmFjZXRWZXJzaW9uKTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxMmRmYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1RQIFBhdGNoZXMgZm9yIG9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLUNvbnRhaW5zIGZpeGVzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGJ1Z2lsbGlhKHMpOlxuXAotXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTc0NSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LmlzRmFjZXRBdmFpbGFibGUoSVByb2plY3RGYWNldFZlcnNpb24pXG5cCi1cblwKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotU2VwdGVtYmVyLCAyMDA4XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTZkYWMyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUiIHZlcnNpb249IjMuMC4xLnYyMDA4MDcyMjAxMzktN0M3OEVMV0U4VnJSVm9ySXItamIxQXNPYVhIVyIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGFmN2QuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjExNjRmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQ4N2E5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIFVJCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIGNvbW1vbiBVSSBmdW5jdGlvbmFsaXR5LgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNmU0N2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzE0ZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwYjczYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGE3ZGQ3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODYxY2ZiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIENvbW1vbiBVSS4KLQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzE0ZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwYjczYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTg4OTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamVtdXRpbCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamVtdXRpbC1ub253b3JrYm5lY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlYmRjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjU0MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2U9ZmFsc2UKLW9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlZmlsZT1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nbGV2ZWw9V0FSTklORwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGU0MTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0udXRpbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMyOTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIEFwciAxNSAyMToxNTo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU3OWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSNUdWUgSnVsIDMxIDIwOjM5OjQ4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhlMWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MTkgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fanZlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDZiMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI0ZyaSBNYXkgMTMgMTA6MTA6MDQgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MgotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MgotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MgotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxNGY3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS51dGlsOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5sczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iMy44LjEiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDEsMi4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUEVSRk1TUl9SRUFETUUudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9QRVJGTVNSX1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MGUyZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9QRVJGTVNSX1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlIHBlcmZtc3IuamFyIGxvYWRlZCBhcyBiaW5hcnkgaW4gdGhpcwotcHJvamVjdC4gU2luY2UgdGhpcyBpcyBvcHRpb25hbCwgd2UgbmVlZGVkIHRvIGJlIGFibGUgdG8gY29tcGlsZSB3aXRob3V0IHRoZSB0cnVlCi1wbHVnaW4gYmVpbmcgYXZhaWxhYmxlLiBTbyB3ZSBjcmVhdGVkIHRoZSBzdHViIGphciBjb250YWluaW5nIGp1c3Qgd2hhdCB3ZSBuZWVkZWQuCi0KLUlmIHRoZXJlIGlzIGEgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhlIHN0dWIgamFyLCB5b3Ugd2lsbCBuZWVkIHRvIGNoZWNrb3V0Ci10aGUgZm9sZGVyIG9yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLiBUaGlzIHdpbGwgdGhlbgotYmUgYSBzZXBhcmF0ZSBwcm9qZWN0LiBZb3UgY2FuIHRoZW4gbWFrZSB0aGUgY2hhbmdlcyB0aGVyZSwgYW5kIHRoZW4gZm9sbG93aW5nIHRoZQotUkVBRE1FIGluIHRoYXQgcHJvamVjdCB0byBjcmVhdGUgYW5kIGNvbW1pdCB0aGUgY2hhbmdlcy4gCi0KLVRoZSBqYXIgaXMgaW4gdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoLCBidXQgaXQgaXMgbm90IGV4cG9ydGVkIGFuZCBpcyBub3QgaW4KLXRoZSBwbHVnaW4ueG1sIG9yIGJ1aWxkLnByb3BlcnRpZXMuIFRoaXMgbWVhbnMgaXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGNvbXBpbGF0aW9uCi1idXQgaXQgd29uJ3Qgc2hvdyB1cCBpbiB0aGUgcnVudGltZSB3b3JrYmVuY2guCi0KLTA1LzEzLzIwMDkgU2VlIGJ1ZyAyNzQ1MzQgIkNhbiB3ZSByZW1vdmUgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlIgotTm90ZTogdGhlIG9wdGlvbmFsIHByZXJlcSwgCi0gb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi13YXMgcmVtb3ZlZCBzaW5jZSBpdCB3YXMgY29uZnVzaW5nIHRvIGJ1aWxkIG9yIHJlbGVuZyB0ZWFtcywgd2hvIHdhbnQgdG8gbWFrZSAKLXN1cmUgdGhleSBfY291bGRfIGdldCBhbGwgdGhlIGJ1bmRsZXMsIG9wdGlvbmFsIG9yIG5vdCwgaWYgdGhleSB3YW50ZWQgdG8uIAotV2hlcmVhcyB0aGlzIGphciBpcyBtb3JlIGZvciBkaWFnbm9zaW5nIG9yIGNoZWNraW5nIHBlcmZvcm1hbmNlIGlzc3VlcyAuLi4gbm90aGluZyAKLXRoYXQgaXMgZG9uZSBhbnkgbG9uZ2VyIG9uIHRoaXMgY29kZS4gVGhlIGNvZGUgaXRzZWxmIGhhc24ndCBiZWVuIGNoYW5nZWQsIHNvIHNob3VsZCBiZSAKLWVhc3kgdG8gcmVzdXJlY3QgaWYgZXZlciByZXF1aXJlZCBpbiB0aGUgZnV0dXJlLiBJZiB0aGlzIGNvZGUgaXMgZXZlciBjaGFuZ2VkIGRyYXN0aWNhbGx5LCAKLXN1Y2ggYXMgcmVmYWN0b3JlZCwgSSdtIG5vdCBzdXJlIHRoZSBvbGQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgY29kZSBuZWVkcyB0byBiZSBjYXJyaWVkIAotZm9yd2FyZCwgYXMgSSB0aGluayB0aGVyZSBhcmUgbmV3ZXIgbWV0aG9kcyBvZiBkb2luZyBzaW1pbGFyIHRoaW5ncywgdGhhdCB3b3VsZG4ndCByZXF1aXJlCi1hICJkZXZlbG9wbWVudCB0aW1lIG9ubHkiIGJ1bmRsZSBhcyBhbiBvcHRpb25hbCBwcmUtcmVxLiAgCmRpZmYgLS1naXQgImEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIgImIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOGU5NGEuLjAwMDAwMDAKLS0tICJhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1EbyBub3QgaW5jbHVkZSBhIG5ldyBkZXBlbmRlbmN5IHBsdWdpbiB0byB0aGUgTUFOSUZFU1QgZm9yIHRoaXMgcGx1Z2luZCEhIQotCi1UaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhpcyBwbHVnaW4gaXMgYWxzbyBleGVjdXRlZCBvdXRzaWRlIG9mIEVjbGlwc2UgZnJhbWV3b3JrLCBzdWNoIElCTSBXZWJzcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIChjKSBJQk0uIFdlIGNhbm5vdCBhZGQKLW5ldyBkZXBlbmRlbmNpZXMgdG8gdGhlIHBsdWdpbiBiZWNhdXNlIHRoZSBjdXJyZW50IHNldCBpcyBjb25zaWRlcmVkIHRvIGJlIEFQSS4gQWRkaW5nIGEgbmV3IHNldCB3aXRob3V0IGNvbnN1bHRpbmcgdGhvc2UgdXNlcnMgd291bGQgYnJlYWsKLXRoZW0uCi0KLVRoZSBleHRlcm5hbCBBUEkgaXMgYW55dGhpbmcgaW4gdGhlIGplbXV0aWwtbm9ud29ya2JlbmNoIGZvbGRlci4gSWYgaXQgaXMgb25seSBmb3IgYSBjbGFzcyBpbiB0aGUgb3RoZXIgc291cmNlIGZvbGRlcihzKSBpdCBtYXkgYmUgT0sgc2luY2UgdGhleSB3b3VsZCBub3QgYmUgCi11c2luZyB0aGF0IGNvZGUuIEJ1dCBpdCB3b3VsZCBiZSBiZXN0IHRvIGNvbnN1bHQgd2l0aCB0aGVtIGZpcnN0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjZWE1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQ8L3RpdGxlPgotCi0KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PC9oZWFkPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBkODUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IGplbXV0aWwvLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgamVtdXRpbC1ub253b3JrYm5lY2gvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1leHRyYS4uID0gLi9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvTG9nRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL0xvZ0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTcyZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvTG9nRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGx1Z2luIGVycm9yIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCB3aGVuIGxvZ2dpbmcgaW5mb3JtYXRpb24gd2hpY2ggc2hvdWxkIGJlIGdyb3VwZWQgdG9nZXRoZXIuIEluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBldmVyeSB0aW1lIGl0Ci0gKiBpcyBuZWVkZWQsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBjcmVhdGUgYW4gaW5zdGFuY2UgYW5kIHJldXNlIGl0LgotICogPHA+Ci0gKiBDdXJyZW50bHkgdGhlIG9ubHkgZmllbGRzIHRoYXQgYXJlIGxvZ2dlZCBhcmUgdGhlIHtAbGluayAjZ2V0VGV4dCgpfSBhbmQge0BsaW5rICNnZXRUYXJnZXRFeGNlcHRpb24oKX0uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTG9nRW50cnkgewotCi0JcHJpdmF0ZSBpbnQgX2V4ZWN1dGlvbk1hcCA9IDA7Ci0KLQlwcml2YXRlIFRocm93YWJsZSBfY2F1Z2h0RXhjZXB0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIF9wcm9wZXJ0aWVzRmlsZU5hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYWxlT2ZPcmlnaW4gPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgc291cmNlSWRlbnRpZmllcjsKLQotCXByaXZhdGUgU3RyaW5nIGVsYXBzZWRUaW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2VUeXBlSWRlbnRpZmllcjsKLQotCS8qKgotCSAqIFRoZSBmaWxlIG5hbWUgcGFyYW1ldGVyIG11c3QgYmUgYSBuYW1lIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IFJlc291cmNlQnVuZGxlIHRvIGxvYWQgdGhlIHN0cmluZyBmcm9tIHRoZSAucHJvcGVydGllcyBmaWxlLiBUaGUgcGFyYW1ldGVyIG11c3Qgbm90Ci0JICogYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzRmlsZU5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgTG9nRW50cnkoU3RyaW5nIHByb3BlcnRpZXNGaWxlTmFtZSkgewotCQlzZXRQcm9wZXJ0aWVzRmlsZU5hbWUocHJvcGVydGllc0ZpbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIExvZ0VudHJ5KCkgewotCX0KLQotCS8qKgotCSAqIEdldCBleGVjdXRpb24gbWFwCi0JICogCi0JICogQHJldHVybiBleGVjdXRpb24gbWFwCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGludCBnZXRFeGVjdXRpb25NYXAoKSB7Ci0JCXJldHVybiBfZXhlY3V0aW9uTWFwOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvcGVydGllcyBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIHByb3BlcnRpZXMgZmlsZSBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfcHJvcGVydGllc0ZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldCB0YXJnZXQgZXhjZXB0aW9uCi0JICogCi0JICogQHJldHVybiB0YXJnZXQgZXhjZXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRUYXJnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBfY2F1Z2h0RXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldCBsb2NhbGUgb2Ygb3JpZ2luCi0JICogCi0JICogQHJldHVybiBsb2NhbGUgb2Ygb3JpZ2luIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGVPZk9yaWdpbigpIHsKLQkJcmV0dXJuIGxvY2FsZU9mT3JpZ2luOwotCX0KLQotCS8qKgotCSAqIEdldCBzb3VyY2UgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIHNvdXJjZSBpZGVudGlmaWVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VpZGVudGlmaWVyKCkgewotCQlyZXR1cm4gc291cmNlSWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZWxhcHNlZCB0aW1lCi0JICogCi0JICogQHJldHVybiBlbGFwc2VkIHRpbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gZWxhcHNlZFRpbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtZXNzYWdlIHR5cGUgaWRlbnRpZmllcgotCSAqIAotCSAqIEByZXR1cm4gbWVzc2FnZSB0eXBlIGlkZW50aWZpZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VUeXBlSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VUeXBlSWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZXhlY3V0aW9uIG1hcAotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25NYXAoaW50IG1hcCkgewotCQlfZXhlY3V0aW9uTWFwID0gbWFwOwotCX0KLQotCS8qKgotCSAqIFNldCBwcm9wZXJ0aWVzIGZpbGUgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXNGaWxlTmFtZShTdHJpbmcgZk5hbWUpIHsKLQkJX3Byb3BlcnRpZXNGaWxlTmFtZSA9IGZOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCB0YXJnZXQgZXhjZXB0aW9uCi0JICogCi0JICogQHBhcmFtIGV4YwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjKSB7Ci0JCV9jYXVnaHRFeGNlcHRpb24gPSBleGM7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHN0YWNrdHJhY2Ugb2YgY3VycmVudCBzdGFjayAoYXQgdGhlIHRpbWUgb2YgY2FsbCB0byB0aGlzIG1ldGhvZCkgdG8gdGhlIHRleHQgYnVmZmVyLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFN0YWNrVHJhY2UoKSB7Ci0JCS8vIEdyYWIgdGhlIHN0YWNrIHRyYWNlIGZyb20gdGhlIFRocmVhZCAuLi4KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGJ5dGVPdXRwdXQpOwotCQkvLyBDYW4ndCBjYWxsIFRocmVhZC5kdW1wU3RhY2soKSBiZWNhdXNlIGl0IGRvZXNuJ3QgdGFrZSBhIHdyaXRlciBhcyBpbnB1dC4KLQkJLy8gQ29weSBpdHMgbWVjaGFuaXNtIGluc3RlYWQuCi0JCW5ldyBFeGNlcHRpb24oIlN0YWNrIHRyYWNlIikucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsgLy8kTk9OLU5MUy0xJAotCQlwcmludFdyaXRlci5mbHVzaCgpOwotCi0JCS8vIGFuZCB1cGRhdGUgdGhlIHRleHQgdG8gdGhlIExvZ0VudHJ5J3MgdGV4dC4KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRUZXh0KCkpOwotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoYnl0ZU91dHB1dC50b1N0cmluZygpKTsKLQkJc2V0VGV4dChidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGV4dCBvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB0ZXh0Ci0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHN0cmluZykgewotCQl0ZXh0ID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldCBldmVyeSBlbnRyeSB0byB0aGUgZGVmYXVsdCB2YWx1ZSBleGNlcHQgdGhlIHByb3BlcnRpZXMgZmlsZSBuYW1lLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzZXRFeGVjdXRpb25NYXAoMCk7Ci0JCXNldFRhcmdldEV4Y2VwdGlvbihudWxsKTsKLQkJbG9jYWxlT2ZPcmlnaW4gPSBudWxsOwotCQlzb3VyY2VJZGVudGlmaWVyID0gbnVsbDsKLQkJZWxhcHNlZFRpbWUgPSBudWxsOwotCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldCBsb2NhbGUgb2Ygb3JpZ2luLgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGVPZk9yaWdpbihTdHJpbmcgb3JpZ2luKSB7Ci0JCWxvY2FsZU9mT3JpZ2luID0gb3JpZ2luOwotCX0KLQotCS8qKgotCSAqIFNldCBzb3VyY2UgaWQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlSUQoU3RyaW5nIGlkKSB7Ci0JCXNvdXJjZUlkZW50aWZpZXIgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZWxhcHNlZCB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSB0aW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxhcHNlZFRpbWUobG9uZyB0aW1lKSB7Ci0JCWVsYXBzZWRUaW1lID0gU3RyaW5nLnZhbHVlT2YodGltZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNvdXJjZSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJc2V0U291cmNlSUQoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWVzc2FnZSB0eXBlIGlkZW50aWZpZXIuCi0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFRleHQoU3RyaW5nKX0gaW5zdGVhZCBhbmQgY2FsbGluZyBpdCB3aXRoIHRoZSByZXN1bHQgb2Yge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nKSB7Ci0JCW1lc3NhZ2VUeXBlSWRlbnRpZmllciA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWVzc2FnZSB0eXBlIGlkLiBTYW1lIGFzIDxjb2RlPnNldE1lc3NhZ2VUeXBlSWRlbnRpZmllci48L2NvZGU+Ci0JICogQHBhcmFtIHN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFRleHQoU3RyaW5nKX0gaW5zdGVhZCBhbmQgY2FsbGluZyBpdCB3aXRoIHRoZSByZXN1bHQgb2Yge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VUeXBlSUQoU3RyaW5nIHN0cmluZykgewotCQlzZXRNZXNzYWdlVHlwZUlkZW50aWZpZXIoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG9rZW5zLiAoQ3VycmVudGx5IHRoaXMgaXMgaWdub3JlZCkuCi0JICogCi0JICogQHBhcmFtIHN0cmluZ3MKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUZXh0KFN0cmluZyl9IGluc3RlYWQgYW5kIGNhbGxpbmcgaXQgd2l0aCB0aGUgcmVzdWx0IG9mIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb2tlbnMoU3RyaW5nW10gc3RyaW5ncykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGJ5dGVPdXRwdXQpOwotCQlpZiAodGV4dCAhPSBudWxsKQotCQkJcHJpbnRXcml0ZXIucHJpbnRsbih0ZXh0KTsKLQkJaWYgKF9jYXVnaHRFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJX2NhdWdodEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOwotCQl9Ci0JCXByaW50V3JpdGVyLmZsdXNoKCk7Ci0JCXJldHVybiBieXRlT3V0cHV0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjdmZGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbHVnaW4gZXJyb3IgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCi0gKiBCYXNpYyBsb2cgcmVuZGVyZXIgaW50ZXJmYWNlLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgZXh0ZW5zaW9uIDxjb2RlPklMb2dSZW5kZXJlcjIuPC9jb2RlPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nUmVuZGVyZXIgewotCi0JLyoqCi0JICogTG9nZ2VkIHRvIGNvbnNvbGUuCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OU09MRV9ERVNDUklQVElPTiA9ICJjb25zb2xlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTG9nZ2VkIHRvIHdvcmtiZW5jaC4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBXT1JLQkVOQ0hfREVTQ1JJUFRJT04gPSAid29ya2JlbmNoIGxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5vdCBsb2dnZWQuCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9MT0dfREVTQ1JJUFRJT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTG9nIGxldmVscy4gVGhlc2UgYXJlIGRlcHJlY2F0ZWQsIHVzZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT4gY29kZXMgaW5zdGVhZC4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBMT0dfRVJST1IgPSAwOwotCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX1RSQUNFID0gMTsKLQotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IExPR19XQVJOSU5HID0gMjsKLQotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IExPR19JTkZPID0gMzsKLQotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRQbHVnaW5JRCA9ICJvcmcuZWNsaXBzZS5qZW0udXRpbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExvZyB0aGUgc3RyaW5nIGF0IHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZywgaW50IHR5cGUpOwotCi0JLyoqCi0JICogU3RhcnQgb3Igc3RvcCB0aGUgdHJhY2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gRmxhZwotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc3RhcnQgdGhlIHRyYWNpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhY2VNb2RlKGJvb2xlYW4gRmxhZyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdiMTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLSAKLS8qKgotICogQGRlcHJlY2F0ZWQgUGx1Z2luIGVycm9yIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAotICogTG9nIHJlbmRlcmVyIHRoYXQgcHJvdmlkZXMgbW9yZSBmdW5jdGlvbi4gQmFzaWNhbGx5IGl0IGNhbiBoYW5kbGUKLSAqIHRoZSBsb2dnaW5nIG9mIHNwZWNpZmljIHR5cGVzIGluIGEgZGlmZmVyZW50IG1hbm5lciB0aGFuIHRoZSBkZWZhdWx0Ci0gKiBjb252ZXJzaW9uIHRvIHN0cmluZyBzdXBwbGllZCBieSBMb2dnZXIuCi0gKiAKLSAqIEl0IGFsc28gdXNlcyB0aGUgTGV2ZWwgY2xhc3NlcyBmcm9tIGphdmEudXRpbC5sb2dnaW5nIGFzIHRoZSBsb2dnaW5nIGxldmVscy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ1JlbmRlcmVyMiBleHRlbmRzIElMb2dSZW5kZXJlciB7Ci0JCi0JLyoqCi0JICogV2hlbiBMb2dnZXIuc2V0TGV2ZWwoREVGQVVMVCk6IHJlc3RvcmUgdG8gd2hhdCB0aGUgZGVmYXVsdCBsZXZlbCB3YXMuCi0JICogV2hlbiBsb2coLi4uLERFRkFVTFQpOiBMb2cgYXQgdGhlIGRlZmF1bHQgbGV2ZWwgZm9yIHRoZSB0eXBlIG9mIG9iamVjdC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgTGV2ZWwgREVGQVVMVCA9IG5ldyBMb2dnZXIuTG9jYWxMZXZlbCgiREVGQVVMVCIsIEludGVnZXIuTUFYX1ZBTFVFLTEpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogV2hlbiBsb2coLi4uLFRSQUNFKSA6IExvZyBvbmx5IHdoZW4gaW4gdHJhY2UgbW9kZS4KLQkgKiBEb24ndCB1c2UgaW4gTG9nZ2VyLnNldExldmVsKCkuIEhhcyBubyBtZWFuaW5nIGluIHRoYXQgY2FzZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgTGV2ZWwgVFJBQ0UgPSBuZXcgTG9nZ2VyLkxvY2FsTGV2ZWwoIlRSQUNFIiwgSW50ZWdlci5NQVhfVkFMVUUtMik7CSAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIHRocm93YWJsZSkuCi0JICogCi0JICogQHBhcmFtIHQKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhUaHJvd2FibGUgdCwgTGV2ZWwgbGV2ZWwpOwotCQotCS8qKgotCSAqIExvZyB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGFuIG9iamVjdCkuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhPYmplY3QgbywgTGV2ZWwgbGV2ZWwpOwotCQotCS8qKgotCSAqIExvZyB0aGUgYm9vbGVhbiBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGJvb2xlYW4pLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsZXZlbCk7CQotCi0JLyoqCi0JICogTG9nIHRoZSBjaGFyIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgY2hhcikuCi0JICogCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhjaGFyIGMsIExldmVsIGxldmVsKTsJCi0JCi0JLyoqCi0JICogTG9nIHRoZSBieXRlIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgYnl0ZSkuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhieXRlIGIsIExldmVsIGxldmVsKTsKLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNob3J0IGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgc2hvcnQpLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coc2hvcnQgcywgTGV2ZWwgbGV2ZWwpOwotCQotCS8qKgotCSAqIExvZyB0aGUgaW50IGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGFuIGludCkuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhpbnQgaSwgTGV2ZWwgbGV2ZWwpOwotCi0JLyoqCi0JICogTG9nIHRoZSBsb25nIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgbG9uZykuCi0JICogCi0JICogQHBhcmFtIGwKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhsb25nIGwsIExldmVsIGxldmVsKTsKLQotCS8qKgotCSAqIExvZyB0aGUgZmxvYXQgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBmbG9hdCkuCi0JICogCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhmbG9hdCBmLCBMZXZlbCBsZXZlbCk7Ci0KLQkvKioKLQkgKiBMb2cgdGhlIGRvdWJsZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGRvdWJsZSkuCi0JICogCi0JICogQHBhcmFtIGQKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhkb3VibGUgZCwgTGV2ZWwgbGV2ZWwpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSkRLQ29uc29sZVJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9KREtDb25zb2xlUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhMzk2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9KREtDb25zb2xlUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbHVnaW4gZXJyb3IgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCi0gKiBEZWZhdWx0IGxvZyByZW5kZXJlciB0byB1c2Ugd2hlbiBub3QgcnVubmluZyB1bmRlciBFY2xpcHNlLiBJdCBsb2dzIHRvIHN5c291dCBhbmQgc3lzZXJyLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgSkRLQ29uc29sZVJlbmRlcmVyIGltcGxlbWVudHMgSUxvZ1JlbmRlcmVyMiB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlRyYWNlTW9kZSA9IGZhbHNlOyAvLyB3aWxsIHdlIGFjdHVhbGx5IHB1bmNoIHRyYWNlIG1lc3NhZ2VkIG9yIG5vdAotCi0JcHJpdmF0ZSBib29sZWFuIGZTZXR0aW5nVHJhY2UgPSBmYWxzZTsKLQotCXByaXZhdGUgTG9nZ2VyIGZNeUxvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RlciB0YWtpbmcgYSBsb2dnZXIuCi0JICogCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBKREtDb25zb2xlUmVuZGVyZXIoTG9nZ2VyIGxvZ2dlcikgewotCQlzdXBlcigpOwotCQlmTXlMb2dnZXIgPSBsb2dnZXI7Ci0JCWZUcmFjZU1vZGUgPSBmTXlMb2dnZXIuZ2V0VHJhY2VNb2RlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKLQotCQlpZiAodHlwZSA9PSBJTG9nUmVuZGVyZXIuTE9HX1RSQUNFICYmICFmVHJhY2VNb2RlKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKHR5cGUgPT0gSUxvZ1JlbmRlcmVyLkxPR19FUlJPUikKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQllbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJcmV0dXJuIElMb2dSZW5kZXJlci5DT05TT0xFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlciNzZXRUcmFjZU1vZGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBmbGFnKSB7Ci0KLQkJaWYgKGZTZXR0aW5nVHJhY2UpCi0JCQlyZXR1cm47Ci0JCWZTZXR0aW5nVHJhY2UgPSB0cnVlOwotCQlmVHJhY2VNb2RlID0gZmxhZzsKLQkJZk15TG9nZ2VyLnNldFRyYWNlTW9kZShmbGFnKTsKLQkJZlNldHRpbmdUcmFjZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3RyaW5nIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybiA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9nKFN0cmluZyBtc2csIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBMZXZlbC5TRVZFUkUpCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJZWxzZQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCXJldHVybiBJTG9nUmVuZGVyZXIuQ09OU09MRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgaWYgbG9nZ2luZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwKLQkgKiAKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGxvZ2dpbmcgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTG9nZ2luZyhMZXZlbCBsb2dMZXZlbCkgewotCQlyZXR1cm4gZlRyYWNlTW9kZSB8fCBmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobG9nTGV2ZWwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGJvb2xlYW4sIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJvb2xlYW4gYiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGIpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGJ5dGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGIpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGNoYXIsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGNoYXIgYywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGMpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGRvdWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihkKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhmbG9hdCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGYpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGludCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coaW50IGksIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihpKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhsb25nLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihsKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhPYmplY3QgbywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKG8pLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKHNob3J0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YocyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coamF2YS5sYW5nLlRocm93YWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5TRVZFUkU7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcodCksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9Mb2dnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzlkOTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbHVnaW4gZXJyb3IgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCi0gKiBUaGlzIGlzIGEgYmFzZSwgVUkgaW5kZXBlbmRlbnQgbG9nZ2VyLiAgIEl0IHdpbGwKLSAqIGNvbnN0cnVjdCBhIGNvbnNpc3RlbnQgbXNnLiBib2R5LCBhbmQgY2FsbCBhbiBlbmZpcm9ubWVudCBzcGVjaWZpYyBJTG9nUmVuZGVyZXIuCi0gKiBCeSBkZWZhdWx0LCB0aGlzIGxvZ2dlciB3aWxsIHVzZSBhIGNvbnNvbGUgYmFzZWQgSUxvZ1JlbmRlcmVyLAotICogYW5kIGEgSjJFRSBQbHVnaW4gaWRlbnRpZmljYXRpb24uCi0gKiAKLSAqIDxwPgotICogV2hlbiBydW5uaW5nIG91dHNpZGUgb2YgRWNsaXBzZSwgdGhlIHRyYWNlIGFuZCBsb2dnaW5nIGxldmVsIGNvbWUgZnJvbSB0aGUgc3lzdGVtIHByb3BlcnRpZXMKLSAqIDx1bD4KLSAqIAkJPGxpPiJkZWJ1ZyIgKD0idHJ1ZSIpIC0gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LiAKLSAqIAkJPGxpPiJsb2dMZXZlbCIgKD0ibGV2ZWwiIHdoZXJlICJsZXZlbCIgaXMgYSBsZXZlbCBzdHJpbmcsIGUuZy4gU0VWRVJFLCBXQVJOSU5HLCBldGMuIGZyb20gdGhlIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsPC9jb2RlPiBjbGFzcykuCi0gKiAJCQlUaGUgZGVmYXVsdCBpcyAiV0FSTklORyIuCi0gKiA8L3VsPgotICogCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQkKLQkvLyBUaGlzIGlzIHVzZWQgYnkgSUxvZ1JlbmRlcmVyMiB0byBkZWZpbmUgdGhlIGRlZmF1bHQgbGV2ZWwuCi0Jc3RhdGljIGNsYXNzIExvY2FsTGV2ZWwgZXh0ZW5kcyBMZXZlbCB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjI3MzM1NzA3NDc2Nzg1NDg4M0w7Ci0KLQkJcHVibGljIExvY2FsTGV2ZWwoU3RyaW5nIG5hbWUsIGludCBsZXZlbCkgewotCQkJc3VwZXIobmFtZSwgbGV2ZWwpOwotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIGJvb2xlYW4gZlRyYWNlTW9kZSA9IGZhbHNlOyAvLyB3aWxsIHdlIGFjdHVhbGx5IHB1bmNoIHRyYWNlIG1lc3NhZ2VkIG9yIG5vdCAgICAgICAgICAgICAgCi0JcHJpdmF0ZSBTdHJpbmcgZlBsdWdpbklEOwotCXByaXZhdGUgSUxvZ1JlbmRlcmVyIGZSZW5kZXJlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTG9nUmVuZGVyZXIyIHJlbmRlcmVyMiA9IG51bGw7Ci0JcHVibGljIFN0cmluZyBmTGluZVNlcGVyYXRvcjsKLQlwcml2YXRlIExldmVsIGxldmVsOwotCXByaXZhdGUgTGV2ZWwgZGVmYXVsdExldmVsID0gTGV2ZWwuU0VWRVJFOwkvLyBCeSBkZWZhdWx0IG9ubHkgc2V2ZXJlIG9yIGdyZWF0ZXIgYXJlIGxvZ2dlZC4KLQlwcml2YXRlIFN0cmluZyBsb2dGaWxlTmFtZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRGVmYXVsdExvZ2dlclBsdWdpbiA9IElMb2dSZW5kZXJlci5EZWZhdWx0UGx1Z2luSUQ7Ci0Jc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIExvZ2dlcnMgPSBuZXcgSGFzaHRhYmxlKCk7IC8vIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSBMb2dnZXJzCi0JZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBMb2dNYXJrID0geyAiKioqIEVSUk9SICoqKiAiLCAvLyROT04tTkxTLTEkCi0JCSJbVHJhY2VdICIsIC8vJE5PTi1OTFMtMSQKLQkJIisrKyBXYXJuaW5nICsrKyAiLCAvLyROT04tTkxTLTEkCi0JCSJJbmZvICIgfTsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgRmlsbGVyID0gIiAgICAiOyAvLyBVc2UgdGhpcyB0byBpbmRlbnQgbXNnLiBib2R5IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgTG9nZ2VyKCkgewotCQl0aGlzKElMb2dSZW5kZXJlci5EZWZhdWx0UGx1Z2luSUQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9nZ2VyKFN0cmluZyBwbHVnaW5JRCkgewotCQlmUGx1Z2luSUQgPSBwbHVnaW5JRDsKLQkJc2V0UmVuZGVyZXIobmV3IEpES0NvbnNvbGVSZW5kZXJlcih0aGlzKSk7CS8vIFNldCB1cCBkZWZhdWx0IHRvIHRoaXMuIFNvbWVvbmUgY2FuIGNoYW5nZSBpdCBsYXRlci4KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0YWNrdHJhY2UgYXMgYSBwcmludCBmb3JtYXR0ZWQgc3RyaW5nLgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiB0aGUgc3RhY2t0cmFjZSBhcyBhIHN0cmluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4Y2VwdGlvblRvU3RyaW5nKFRocm93YWJsZSBlKSB7Ci0JCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpKTsKLQkJcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHN5c3RlbSBkZWZhdWx0IGxvZ2dlci4gVGhpcyBpcyB1c2VkIGZvciBjbGllbnRzIHRoYXQgZG9uJ3Qga25vdyBpZiB0aGV5Ci0JICogYXJlIHJ1bm5pbmcgaW4gRWNsaXBzZSBvciBvdXRzaWRlIG9mIGl0LiBUaGlzIHdheSB0aGV5IGhhdmUgYSBjb21tb24gbG9nZ2VyIGZvcm1hdAotCSAqIHdoaWNoIHN3aXRjaCBjb3JyZWN0bHkuCi0JICogQHJldHVybiBkZWZhdWx0IGxvZ2dlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlzdGF0aWMgcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCUxvZ2dlciBkZWZhdWx0TG9nZ2VyID0gKExvZ2dlcikgTG9nZ2Vycy5nZXQoRGVmYXVsdExvZ2dlclBsdWdpbik7Ci0JCWlmIChkZWZhdWx0TG9nZ2VyID09IG51bGwpIHsKLQkJCWRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7Ci0JCQlkZWZhdWx0TG9nZ2VyLmluaXQoKTsKLQkJCUxvZ2dlcnMucHV0KERlZmF1bHRMb2dnZXJQbHVnaW4sIGRlZmF1bHRMb2dnZXIpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0TG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyBwbHVnaW4uCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHJldHVybiBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgcGx1Z2dpbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlzdGF0aWMgcHVibGljIExvZ2dlciBnZXRMb2dnZXIoU3RyaW5nIHBsdWdpbklkKSB7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsKQotCQkJcmV0dXJuIExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJTG9nZ2VyIExvZ2dlciA9IChMb2dnZXIpIExvZ2dlcnMuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKExvZ2dlciA9PSBudWxsKSB7Ci0JCQlMb2dnZXIgPSBuZXcgTG9nZ2VyKHBsdWdpbklkKTsKLQkJCUxvZ2dlci5pbml0KCk7Ci0JCQlMb2dnZXJzLnB1dChwbHVnaW5JZCwgTG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gTG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGJ5IHN1YmNsYXNzIHRvIGdldCBhIGxvZ2dlciBpZiBpdCBleGlzdHMsIGJ1dCBub3QgY3JlYXRlIG9uZS4KLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuIGxvZ2dlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlzdGF0aWMgcHJvdGVjdGVkIExvZ2dlciBnZXRMb2dnZXJJZkV4aXN0cyhTdHJpbmcgcGx1Z2luSWQpIHsKLQkJaWYgKHBsdWdpbklkID09IG51bGwpCi0JCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcigpOwotCQllbHNlCi0JCQlyZXR1cm4gKExvZ2dlcikgTG9nZ2Vycy5nZXQocGx1Z2luSWQpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIGlkIGZvciB0aGlzIGxvZ2dlci4KLQkgKiBAcmV0dXJuIHBsdWdpbmlkCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIGZQbHVnaW5JRDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB0cmFjZSBtb2RlIGZvciB0aGlzIGxvZ2dlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHJhY2luZyBpcyBnb2luZyBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRUcmFjZU1vZGUoKSB7Ci0JCXJldHVybiBmVHJhY2VNb2RlOwotCX0KLQkKLQkvKgotCSAqIEluZGVudCB0aGUgTXNnLiBCb2R5IHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlYWQgdGhlIGxvZwotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRlbnRNc2coU3RyaW5nIG1zZywgU3RyaW5nQnVmZmVyIGxvZ01zZykgewotCQkvLyBMaW5lIHNlcGVyYXRvciBpcyBkaWZmZXJlbnQgb24gZGlmZmVyZW50IHBsYXRmb3JtLCB1bml4ID0gXG4sIHdpbmRvd3MgXHJcbiBhbmQgbWFjIFxyCi0JCVN0cmluZyBzZXAgPSBmTGluZVNlcGVyYXRvcjsKLQkJaWYgKG1zZy5pbmRleE9mKCJcclxuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXNlcCA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChtc2cuaW5kZXhPZigiXG4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc2VwID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChtc2cuaW5kZXhPZigiXHIiKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc2VwID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtc2csIHNlcCk7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlsb2dNc2cuYXBwZW5kKEZpbGxlciArIHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl9IGVsc2UKLQkJCQlsb2dNc2cuYXBwZW5kKGZMaW5lU2VwZXJhdG9yICsgRmlsbGVyICsgdG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJfQotCX0KLQkvKgotCSAqIElmIEVjbGlwc2UgaXMgc3RhcnRlZCB3aXRoIHRoZSAtWERlYnVnIG9yIC1kZWJ1ZyB0dXJuIHRyYWNlcyBvbiBmb3IgdGhpcyBMb2dnZXIKLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yMy8yMDAxIDc6Mzc6MDQgUE0pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImRlYnVnIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJZlRyYWNlTW9kZSA9IHRydWU7Ci0JCWxldmVsID0gZGVmYXVsdExldmVsID0gTGV2ZWwucGFyc2UoU3lzdGVtLmdldFByb3BlcnR5KCJsb2dMZXZlbCIsIExldmVsLldBUk5JTkcuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXRyeSB7Ci0JCQlmTGluZVNlcGVyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8gRGlmZiBvbiBXaW4vVW5peC9NYWMgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZkxpbmVTZXBlcmF0b3IgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyoKLQkgKiBHZW5lcmljIGxvZy4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yNC8yMDAxIDE6NTU6MzQgUE0pCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG1zZyBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHR5cGUgaW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbG9nQW55KFN0cmluZyBtc2csIGludCB0eXBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBsb2dNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxvZ01zZy5hcHBlbmQoZkxpbmVTZXBlcmF0b3IpOwotCQlsb2dNc2cuYXBwZW5kKExvZ01hcmtbdHlwZV0pOwotCQlyZXR1cm4gcHVuY2hMb2cobG9nUmVzdChtc2csIGxvZ01zZyksIHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHRvIGJlIHVzZWQgYnkgcmVuZGVyZXJzIHRoYXQgd2FudCB0byBwdXQgYSBtc2cgb3V0Ci0JICogaW4gYSBnZW5lcmljIGZvcm1hdC4gVGhpcyBqdXN0IHJldHVybnMgdGhlIHN0cmluZyB0aGF0Ci0JICogc2hvdWxkIGJlIGxvZ2dlZC4gSXQgcHV0cyB0aGluZ3MgbGlrZSBoZWFkZXJzIG9uIGl0LgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHJldHVybiBUaGUgZ2VuZXJpYyBtZXNzYWdlIGZvciB0aGUgc3RyaW5nIGFuZCBsZXZlbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyaWNNc2coU3RyaW5nIG1zZywgTGV2ZWwgYUxldmVsKSB7Ci0JCVN0cmluZ0J1ZmZlciBnZW5Nc2cgPSBuZXcgU3RyaW5nQnVmZmVyKG1zZy5sZW5ndGgoKSsxNik7Ci0JCWdlbk1zZy5hcHBlbmQoZkxpbmVTZXBlcmF0b3IpOwotCQlnZW5Nc2cuYXBwZW5kKGdldExldmVsSGVhZGVyKGFMZXZlbCkpOwotCQlnZW5Nc2cuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCWdlbk1zZy5hcHBlbmQobmV3IERhdGUoKSk7Ci0JCWluZGVudE1zZyhtc2csIGdlbk1zZyk7Ci0JCXJldHVybiBnZW5Nc2cudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGV2ZWxbXSBMRVZFTF9TRUFSQ0ggPSBuZXcgTGV2ZWxbXSB7Ci0JCUxldmVsLlNFVkVSRSwKLQkJTGV2ZWwuV0FSTklORywKLQkJTGV2ZWwuSU5GTywKLQkJSUxvZ1JlbmRlcmVyMi5UUkFDRQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEVWRUxfTUFSSyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSIqKiogRVJST1IgKioqIiwgLy8kTk9OLU5MUy0xJAotCQkiKysrIFdhcm5pbmcgKysrIiwgLy8kTk9OLU5MUy0xJAotCQkiSW5mbyIsIC8vJE5PTi1OTFMtMSQKLQkJIltUcmFjZV0iIC8vJE5PTi1OTFMtMSQKLQl9OwotCQotCXByaXZhdGUgU3RyaW5nIGdldExldmVsSGVhZGVyKExldmVsIGFMZXZlbCkgewotCQlmb3IgKGludCBpPTA7IGk8TEVWRUxfU0VBUkNILmxlbmd0aDsgaSsrKQotCQkJaWYgKExFVkVMX1NFQVJDSFtpXSA9PSBhTGV2ZWwpCi0JCQkJcmV0dXJuIExFVkVMX01BUktbaV07Ci0JCXJldHVybiBhTGV2ZWwuZ2V0TmFtZSgpOwkvLyBOb3QgZm91bmQsIGp1c3QgdXNlIGxldmVsIHN0cmluZy4KLQl9Ci0JCi0JLy8gVGhlIHdyaXRlJ3MgYXJlIGhlcmUgZm9yIGhpc3RvcnkuIFdpbGwgaW1wbGVtZW50IHVzaW5nIGxvZyhvYmosIExldmVsKSBmb3IgYWxsIG9mIHRoZSB0eXBlcy4KLQotCi0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKExldmVsLCBFeGNlcHRpb24pCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBsb2coYUxldmVsLCBleCk7Ci0JfQotCQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUpCi0JICogQHBhcmFtIGV4Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgd3JpdGUoVGhyb3dhYmxlIGV4KSB7Ci0JCXJldHVybiBsb2coZXgpOwotCX0KLQkKLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coT2JqZWN0LCBMZXZlbCkKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIGxvZ0VudHJ5Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgd3JpdGUoTGV2ZWwgYUxldmVsLCBPYmplY3QgbG9nRW50cnkpIHsKLQkJcmV0dXJuIGxvZyhsb2dFbnRyeSwgYUxldmVsKTsKLQl9Ci0JCi0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFN0cmluZywgTGV2ZWwpCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShMZXZlbCBhTGV2ZWwsIFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGxvZyhzdHJpbmcsIGFMZXZlbCk7Ci0JfQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShMZXZlbCBhTGV2ZWwsIFRocm93YWJsZSBleCkgewotCQlyZXR1cm4gbG9nKGV4LCBhTGV2ZWwpOwotCX0KLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coVGhyb3dhYmxlLCBMZXZlbCkKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIGV4Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKExldmVsIGFMZXZlbCwgRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBsb2coZXgsIGFMZXZlbCk7Ci0JfQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coTGV2ZWwgYUxldmVsLCBUaHJvd2FibGUgZXgpIHsKLQkJcmV0dXJuIGxvZyhleCwgYUxldmVsKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBsb2dnaW5nIGxldmVsCi0JICogQHJldHVybiBsb2dnaW5nIGxldmVsCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIExldmVsIGdldExldmVsKCkgewotCQlyZXR1cm4gbGV2ZWw7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgYmVpbmcgbG9nZ2VkLiAoZS5nLiBpZiBjdXJyZW50IGxldmVsIGlzIFNFVkVSRSwgdGhlbiBGSU5FIHdpbGwgbm90IGJlIGxvZ2dlZCkuCi0JICogQHBhcmFtIHJlcXVlc3RsZXZlbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxldmVsIHdpbGwgYmUgbG9nZ2VkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9nZ2luZ0xldmVsKExldmVsIHJlcXVlc3RsZXZlbCkgewotCQlpZiAocmVxdWVzdGxldmVsID09IElMb2dSZW5kZXJlcjIuVFJBQ0UgJiYgIWdldFRyYWNlTW9kZSgpKQotCQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBhcmVuJ3QgdHJhY2luZyBidXQgcmVxdWVzdGVkIHRyYWNlLgotCQkKLQkJcmV0dXJuICEocmVxdWVzdGxldmVsLmludFZhbHVlKCkgPCBnZXRMZXZlbCgpLmludFZhbHVlKCkgfHwgZ2V0TGV2ZWwoKSA9PSBMZXZlbC5PRkYpOwotCX0KLQotCS8qKgotCSAqIExvZyBhbiBlcnJvciBzdHJpbmcuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ0Vycm9yKFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIGxvZyhtc2csIExldmVsLlNFVkVSRSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHRocm93YWJsZQotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nRXJyb3IoVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIGxvZyhlLCBMZXZlbC5TRVZFUkUpOwotCX0KLQotCS8qKgotCSAqIExvZyBhbiBpbmZvIG1lc3NhZ2UuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ0luZm8oU3RyaW5nIG1zZykgewotCQlyZXR1cm4gbG9nKG1zZywgTGV2ZWwuSU5GTyk7Ci0JfQotCQotLyoqCi0gKiBMb2cgYSB0aHJvd2FibGUgYXMgYSB3YXJuaW5nLgotICogQHBhcmFtIGUKLSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ0luZm8oVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIGxvZyhlLCBMZXZlbC5JTkZPKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHN0cmluZyB0byBsb2dNc2cgYnVmZmVyIHBhc3NlZCBpbi4gQXBwZW5kIHRoZSBkYXRlIGFuZCBmb3JtYXQgdGhlCi0JICogc3RyaW5nIHdpdGggbmljZSBpbmRlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGxvZ01zZwotCSAqIEByZXR1cm4gdGhlIHN0cmluZyBmcm9tIHRoZSBsb2dNc2cgYWZ0ZXIgbG9nZ2luZyB0aGUgcmVzdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvZ1Jlc3QoU3RyaW5nIG1zZywgU3RyaW5nQnVmZmVyIGxvZ01zZykgewotCQlsb2dNc2cuYXBwZW5kKG5ldyBEYXRlKCkpOwotCQlpbmRlbnRNc2cobXNnLCBsb2dNc2cpOwotCQlyZXR1cm4gbG9nTXNnLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBtc2cgYXMgdHJhY2Ugb25seS4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nVHJhY2UoU3RyaW5nIG1zZykgewotCQlpZiAoZlRyYWNlTW9kZSkKLQkJCXJldHVybiBsb2cobXNnLCBJTG9nUmVuZGVyZXIyLlRSQUNFKTsKLQkJZWxzZQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5OT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhcyB0cmFjZSBvbmx5LgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nVHJhY2UoVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIGxvZyhlLCBJTG9nUmVuZGVyZXIyLlRSQUNFKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIG1lc3NhZ2UgYXMgd2FybmluZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nV2FybmluZyhTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBsb2cobXNnLCBMZXZlbC5XQVJOSU5HKTsKLQl9Ci0JLyoqCi0JICogTG9nIHRoZSB0aHJvd2FibGUgYXMgYSB3YXJuaW5nLgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nV2FybmluZyhUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIExldmVsLldBUk5JTkcpOwotCX0KLQkKLQkvKioKLQkgKiBBc2sgdGhlIFJlbmRlcmVyIHRvIHB1bmNoIHRoZSBtc2cuIGluIHRoZSBsb2cuLiBvbmUKLQkgKiBjYWxsZXIgYXQgdGhlIHRpbWUKLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yNC8yMDAxIDk6MTk6MTcgQU0pCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG1zZyBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHR5cGUgaW50Ci0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTdHJpbmcgcHVuY2hMb2coU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKLQkJcmV0dXJuIGZSZW5kZXJlci5sb2cobXNnLCB0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSByZW5kZXJlciB0byB1c2UuCi0JICogQHBhcmFtIHJlbmRlcmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVuZGVyZXIoSUxvZ1JlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCWZSZW5kZXJlciA9IHJlbmRlcmVyOwotCQlyZW5kZXJlcjIgPSAocmVuZGVyZXIgaW5zdGFuY2VvZiBJTG9nUmVuZGVyZXIyKSA/IChJTG9nUmVuZGVyZXIyKSByZW5kZXJlciA6IG51bGw7Ci0JCXJlbmRlcmVyLnNldFRyYWNlTW9kZShnZXRUcmFjZU1vZGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgdHJhY2UgbW9kZS4KLQkgKiBAcGFyYW0gZmxhZyA8Y29kZT50cnVlPC9jb2RlPiB0byB0dXJuIG9uIHRyYWNpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhY2VNb2RlKGJvb2xlYW4gZmxhZykgewotCQlmVHJhY2VNb2RlID0gZmxhZzsKLQkJaWYgKGZSZW5kZXJlciAhPSBudWxsKQotCQkJZlJlbmRlcmVyLnNldFRyYWNlTW9kZShmbGFnKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBsZXZlbCBjdXRvZmYgZm9yIGxvZ2dpbmcuIEFueXRoaW5nIGJlbG93IHRoaXMgbGV2ZWwgd2lsbCBub3QgbG9nLgotCSAqIERvIG5vdCBzZXQgbGV2ZWwgdG8gPGNvZGU+SUxvZ1JlbmRlcmVyMi5UUkFDRTwvY29kZT4uIEl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwgKFVzZSA8Y29kZT5JTG9nUmVuZGVyZXIyLkRFRkFVTFQ8L2NvZGU+IHRvIHJlc3RvcmUgdG8gZGVmYXVsdCBmb3IgdGhpcyBsb2dnZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoTGV2ZWwgbGV2ZWwpIHsKLQkJdGhpcy5sZXZlbCA9IGxldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogZGVmYXVsdExldmVsOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgbGV2ZWwgZm9yIHRoaXMgbG9nZ2VyLiBJdCB3b24ndCB0b3VjaCB0aGUgY3VycmVudCBsZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TGV2ZWwoTGV2ZWwgbGV2ZWwpIHsKLQkJdGhpcy5kZWZhdWx0TGV2ZWwgPSBsZXZlbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBsb2cgZmlsZSBuYW1lLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9nRmlsZU5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGxvZ0ZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbG9nIGZpbGUgbmFtZS4KLQkgKiBAcGFyYW0gbG9nRmlsZU5hbWUgVGhlIGxvZ0ZpbGVOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2dGaWxlTmFtZShTdHJpbmcgbG9nRmlsZU5hbWUpIHsKLQkJdGhpcy5sb2dGaWxlTmFtZSA9IGxvZ0ZpbGVOYW1lOwotCX0KLQkKLQkvLyBOb3cgYWxsIG9mIHRoZSBsb2coKSB0eXBlcyB0aGF0IHVzZSBhIExldmVsLgotCi0JLyoqCi0JICogTG9nIHRoZSB0aHJvd2FibGUgYXQgdGhlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgdGhyb3dhYmxlLiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgdGhyb3dhYmxlIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhUaHJvd2FibGUgZSwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhlLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCVN0cmluZyBzdGFja1RyYWNlID0gZXhjZXB0aW9uVG9TdHJpbmcoZSk7Ci0JCQlyZXR1cm4gbG9nQW55KHN0YWNrVHJhY2UsIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5TRVZFUkUpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxvZyhPYmplY3QgbykgewotCQlyZXR1cm4gbG9nKG8sIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhPYmplY3QgbywgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhvLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YobyksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLy8gVGhlIGZvbGxvd2luZyBhcmUgYWRkZWQgdG8gbWF0Y2ggdXAgd2l0aCBIeWFkZXMgc28gdGhhdCBwcmltaXRpdmVzIGNhbiBiZSBsb2dnZWQgdG9vLgotCQotCS8qKgotCSAqIExvZyBhIGJvb2xlYW4gYXQgdGhlIGRlZmF1bHQgbGV2ZWwuIAotCSAqIEBwYXJhbSBiCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJvb2xlYW4gYikgewotCQlyZXR1cm4gbG9nKGIsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyBhIGJvb2xlYW4gYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBiCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJvb2xlYW4gYiwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhiLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoYiksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogTG9nIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGMKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coY2hhciBjKSB7Ci0JCXJldHVybiBsb2coYywgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBjCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGNoYXIgYywgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhjLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoYyksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGJ5dGUgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGIKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYnl0ZSBiKSB7Ci0JCXJldHVybiBsb2coYiwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBieXRlIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gYgotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhieXRlIGIsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coYiwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGIpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIExvZyB0aGUgc2hvcnQgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIHMKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coc2hvcnQgcykgewotCQlyZXR1cm4gbG9nKHMsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgc2hvcnQgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKHNob3J0IHMsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2cocywgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKHMpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBpbnQgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGkKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coaW50IGkpIHsKLQkJcmV0dXJuIGxvZyhpLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGludCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gaQotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhpLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoaSksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGxvbmcgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2cobG9uZyBsKSB7Ci0JCXJldHVybiBsb2cobCwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBsb25nIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gbAotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2cobCwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGwpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIExvZyB0aGUgZmxvYXQgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGYKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZmxvYXQgZikgewotCQlyZXR1cm4gbG9nKGYsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgZmxvYXQgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGZsb2F0IGYsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coZiwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGYpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBkb3VibGUgYXQgdGhlIGRlZmF1bHQgbGV2ZWwKLQkgKiBAcGFyYW0gZAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhkb3VibGUgZCkgewotCQlyZXR1cm4gbG9nKGQsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgZG91YmxlIGF0IHRoZSBnaXZlbiBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBkCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGRvdWJsZSBkLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGQsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihkKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQkKLQkKLQkvKgotCSAqIFR1cm4gbmV3IHR5cGUgaW50byBvbGQgdHlwZS4gVGhlIGRlZmF1bHRMZXZlbCBpcyB0aGUKLQkgKiBsZXZlbCB0byB1c2UgaWYgdGhlIGluY29taW5nIGxldmVsIGlzIG1hcmtlZCBhcyBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgaW50IGdldE9sZFR5cGUoTGV2ZWwgYUxldmVsKSB7Ci0JCWlmIChhTGV2ZWwgPT0gTGV2ZWwuU0VWRVJFKQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfRVJST1I7Ci0JCWVsc2UgaWYgKGFMZXZlbCA9PSBMZXZlbC5XQVJOSU5HKQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfV0FSTklORzsKLQkJZWxzZSBpZiAoYUxldmVsID09IExldmVsLklORk8pCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19JTkZPOwotCQllbHNlIGlmIChhTGV2ZWwgPT0gSUxvZ1JlbmRlcmVyMi5UUkFDRSkKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX1RSQUNFOwotCQllbHNlCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19JTkZPOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGE0MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNCAkJCAgJCREYXRlOiAyMDA1LzA2LzE2IDIwOjE0OjI3ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IElOU1RBTkNFOwotCQotCXN0YXRpYyB7Ci0JCUlOU1RBTkNFID0gY3JlYXRlRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCXByaXZhdGUgZmluYWwgQ2xhc3MgQ09OVFJJQlVUT1JfQ0xBU1MgPSBJRU1GQ29udGV4dENvbnRyaWJ1dG9yLmNsYXNzOwotCXByb3RlY3RlZCBNYXAgZW1mQ29udGV4dENhY2hlID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSBjcmVhdGVGYWN0b3J5SW5zdGFuY2UoKSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IGZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5SW5zdGFuY2VGcm9tRXh0ZW5zaW9uKCk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQlmYWN0b3J5ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5KCk7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSBjcmVhdGVGYWN0b3J5SW5zdGFuY2VGcm9tRXh0ZW5zaW9uKCkgewotCQlmaW5hbCBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeVtdIGZhY3RvcnlIb2xkZXIgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlbMV07Ci0JCVJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBSZWdpc3RyeVJlYWRlcihKRU1VdGlsUGx1Z2luLklELCAiaW50ZXJuYWxXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSIpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJmYWN0b3J5Q2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0cnkgewotCQkJCQkJZmFjdG9yeUhvbGRlclswXSA9IChFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSllbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9CQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcmVhZGVyLnJlYWRSZWdpc3RyeSgpOwotCQlyZXR1cm4gZmFjdG9yeUhvbGRlclswXTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRU1GTmF0dXJlRmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNhY2hlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCwgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZW1mQ29udGV4dCkgewotCQlpZiAoYVByb2plY3QgIT0gbnVsbCAmJiBlbWZDb250ZXh0ICE9IG51bGwpCi0JCQllbWZDb250ZXh0Q2FjaGUucHV0KGFQcm9qZWN0LCBlbWZDb250ZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0Q2FjaGVkRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgewotCQlpZiAoYVByb2plY3QgIT0gbnVsbCkKLQkJCXJldHVybiAoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UpIGVtZkNvbnRleHRDYWNoZS5nZXQoYVByb2plY3QpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5hUHJvamVjdDwvY29kZT4gaXMgZWl0aGVyIGJlaW5nIGNsb3NlZCBvciBkZWxldGVkIHNvIHdlIG5lZWQgdG8gY2xlYW51cCBvdXIgY2FjaGUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2FjaGVkUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQlpZiAoYVByb2plY3QgIT0gbnVsbCkgCi0JCQllbWZDb250ZXh0Q2FjaGUucmVtb3ZlKGFQcm9qZWN0KTsgCi0JCQotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgb3IgZXhpc3RpbmcgRU1GTmF0dXJlIG9uIDxjb2RlPmFQcm9qZWN0PC9jb2RlPi4gQWxsb3cgdGhlIDxjb2RlPmNvbnRyaWJ1dG9yPC9jb2RlPgotCSAqIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIG5ldyBvciBleGlzdGluZyBuYXR1cmUgcHJpb3IgdG8gcmV0dXJuaW5nLgotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBjcmVhdGVFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0LCBJRU1GQ29udGV4dENvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yKSB7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiW0VNRldvcmtiZW5jaENvbnRleHRCYXNlXSIgKyBFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeV9VSV8wIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKCFhUHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIltFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV0iICsgRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlfVUlfMSIsIG5ldyBPYmplY3RbXXthUHJvamVjdC5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBjb250ZXh0ID0gZ2V0Q2FjaGVkRU1GQ29udGV4dChhUHJvamVjdCk7Ci0JCWJvb2xlYW4gY29udHJpYnV0b3JGb3VuZCA9IGZhbHNlOwotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQljb250ZXh0ID0gcHJpbUNyZWF0ZUVNRkNvbnRleHQoYVByb2plY3QpOwotCQkJY2FjaGVFTUZDb250ZXh0KGFQcm9qZWN0LCBjb250ZXh0KTsKLQkJCWNvbnRyaWJ1dG9yRm91bmQgPSBpbml0aWFsaXplRU1GQ29udGV4dEZyb21Db250cmlidXRvcnMoYVByb2plY3QsIGNvbnRleHQsIGNvbnRyaWJ1dG9yKTsKLQkJfQotCQlpZiAoY29udHJpYnV0b3IgIT0gbnVsbCAmJiBjb250ZXh0ICE9IG51bGwgJiYgIWNvbnRyaWJ1dG9yRm91bmQpCi0JCQljb250cmlidXRvci5wcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChjb250ZXh0KTsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVFTUZDb250ZXh0RnJvbUNvbnRyaWJ1dG9ycyhJUHJvamVjdCBhUHJvamVjdCwgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZW1mQ29udGV4dCwgSUVNRkNvbnRleHRDb250cmlidXRvciBjb250cmlidXRvcikgewotCQlib29sZWFuIGNvbnRyaWJ1dG9yRm91bmQgPSBmYWxzZTsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwgfHwgZW1mQ29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIGNvbnRyaWJ1dG9yRm91bmQ7Ci0JCUxpc3QgcnVudGltZXMgPSBFTUZOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzKGFQcm9qZWN0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lcy5zaXplKCk7IGkrKykgewotCQkJSVByb2plY3ROYXR1cmUgbmF0dXJlID0gKElQcm9qZWN0TmF0dXJlKSBydW50aW1lcy5nZXQoaSk7Ci0JCQlpZiAobmF0dXJlICE9IG51bGwgJiYgQ09OVFJJQlVUT1JfQ0xBU1MuaXNJbnN0YW5jZShuYXR1cmUpKSB7Ci0JCQkJaWYgKG5hdHVyZSA9PSBjb250cmlidXRvcikKLQkJCQkJY29udHJpYnV0b3JGb3VuZCA9IHRydWU7Ci0JCQkJKChJRU1GQ29udGV4dENvbnRyaWJ1dG9yKSBuYXR1cmUpLnByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KGVtZkNvbnRleHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250cmlidXRvckZvdW5kOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmF0dXJlRW5hYmxlZChJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYVByb2plY3QuaXNOYXR1cmVFbmFibGVkKG5hdHVyZUlkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TmF0dXJlSWRzKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIGFQcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdE5hdHVyZSBnZXROYXR1cmUoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBuYXR1cmVJZCkgewotCQl0cnkgewotCQkJcmV0dXJuIGFQcm9qZWN0LmdldE5hdHVyZShuYXR1cmVJZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgcHJpbUNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZShhUHJvamVjdCk7Ci0JfQotCS8qKgotCSAqIFJldHVybiBhbiBleGlzdGluZyBFTUZOYXR1cmUgb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBnZXRFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRDYWNoZWRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgY3JlYXRlU3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcihhUmVzb3VyY2VTZXQsIGFQcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3Njk0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMjggJCQgICQkRGF0ZTogMjAxMC8wMS8xNiAyMDo0NDoxMiAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsIGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsIGltcGxlbWVudHMgRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQgewotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE1vZHVsZVVSSSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQl9QUk9UT0NPTF9JTkRYID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPSkVDVF9OQU1FX0lORFggPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RVTEVfTkFNRV9JTkRYID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0lORFggPSAzOwotCX0KLQkKLQlwdWJsaWMgY2xhc3MgU3luY2hyb25pemVkUmVzb3VyY2VzRUxpc3Q8RSBleHRlbmRzIE9iamVjdCAmIFJlc291cmNlPiBleHRlbmRzIFJlc291cmNlc0VMaXN0PEU+IGltcGxlbWVudHMgRUxpc3Q8RT4gewotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIGZpbmFsIElMb2NrIGxvY2sgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQotCQlwdWJsaWMgdm9pZCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgRSBvYmplY3QpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlzdXBlci5tb3ZlKG5ld1Bvc2l0aW9uLCBvYmplY3QpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBFIG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBpbnQgb2xkUG9zaXRpb24pIHsKLQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2xkUG9zaXRpb24pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkKG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkQWxsKGMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkQWxsKGluZGV4LCBjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5jb250YWluc0FsbChjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5pbmRleE9mKG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmlzRW1wdHkoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5sYXN0SW5kZXhPZihvKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIubGlzdEl0ZXJhdG9yKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmxpc3RJdGVyYXRvcihpbmRleCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnJlbW92ZShvKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5yZW1vdmVBbGwoYyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5yZXRhaW5BbGwoYyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIEUgc2V0KGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnNldChpbmRleCwgZWxlbWVudCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBzaXplKCkgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5zaXplKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoYSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVsZWFzZSBsb2NrIGR1cmluZyBub3RpZmljYXRpb25zCi0JCXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQotCQkJaW50IGxvY2tEZXB0aDsKLQkJCWxvY2tEZXB0aCA9IGxvY2suZ2V0RGVwdGgoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yKGludCBpPTA7IGk8bG9ja0RlcHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpOwotCQkJCXN1cGVyLmRpc3BhdGNoTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcihpbnQgaT0wOyBpPGxvY2tEZXB0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBsb2NrLmFjcXVpcmUoKTsgIC8vIFJlLWFjcXVpcmUgbG9jayBhZnRlciBub3RpZnkKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZWFzaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByb3RlY3RlZCBMaXN0IHJlc291cmNlSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBPYmplY3QgcmVzb3VyY2VzTG9jayA9IG5ldyBPYmplY3QoKTsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKCkgewotCQlzZXRVUklSZXNvdXJjZU1hcChuZXcgSGFzaE1hcCgxMCkpOwkvLyBUZWxsIGl0IHRvIGNhY2hlIHVyaS0+cmVzb3VyY2UgYWNjZXNzLgotCQlnZXRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX1BBUlNFUl9QT09MLCBFTUZOYXR1cmUuU0hBUkVEX1BBUlNFUl9QT09MKTsKLQl9Ci0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldEltcGwoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdGhpcygpOwotCQlzZXRQcm9qZWN0KGFQcm9qZWN0KTsKLQkJaW5pdGlhbGl6ZVNoYXJlZENhY2hlTGlzdGVuZXIoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNoYXJlZENhY2hlTGlzdGVuZXIoKSB7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0U2hhcmVkQ2FjaGUoKS5iZWdpbkxpc3RlbmluZyh0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxlYXNpbmcoKSB7Ci0JCXJldHVybiBpc1JlbGVhc2luZzsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVsZWdhdGVkR2V0UmVzb3VyY2UoVVJJLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkZWxlZ2F0ZWRHZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlSZXNvdXJjZSByZXMgPSBzdXBlci5kZWxlZ2F0ZWRHZXRSZXNvdXJjZSh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJlcyA9IGdldFJlc291cmNlRnJvbUhhbmRsZXJzKHVyaSk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQkvL0NoZWNrIHRoZSBtYXAgZmlyc3Qgd2hlbiBjcmVhdGluZyB0aGUgcmVzb3VyY2UgYW5kIGRvIG5vdAotCQkvL25vcm1hbGl6ZSBpZiBhIHZhbHVlIGlzIGZvdW5kLgotCQlib29sZWFuIGlzTWFwcGVkID0gZGV0ZWN0VVJJTWFwcGluZyh1cmkpOwotCQlTdHJpbmcgY29udGVudFR5cGVOYW1lID0gZ2V0Q29udGVudFR5cGVOYW1lKHVyaSk7Ci0JCWJvb2xlYW4gaGFzQ29udGVudFR5cGUgPSAoY29udGVudFR5cGVOYW1lICE9IG51bGwpOwotCQlVUkkgY29udmVydGVkID0gdXJpOwotCQlpZiAoIWlzTWFwcGVkKQotCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWVsc2UgaWYgKGhhc0NvbnRlbnRUeXBlKQotCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCQotCQlpZiAoIWhhc0NvbnRlbnRUeXBlKSB7Ly8gQ2hlY2sgaWYgYWN0dWFsIHByb2plY3QgZmlsZSBleGlzdHMsIGFuZCBjYW4gZGV0ZXJtaW5lIGNvbnRlbnR0eXBlCi0JCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJCQljb250ZW50VHlwZU5hbWUgPSBkZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsvLyBOb3cgY2hlY2sgaWYgdXJpIGNvbnRhaW5zIHByb2plY3QsIHRoZW4gYWRkIGlmIG5lZWRlZAotCQkJCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOwotCQkJCWlmICghdXJpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKSB7Ci0JCQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUoY29udmVydGVkVXJpKTsKLQkJCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCQkJCQkJY29udGVudFR5cGVOYW1lID0gZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCi0JCQotCQkKLQkJUmVzb3VyY2UgcmVzdWx0ID0gY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoY29udmVydGVkKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IChjb250ZW50VHlwZU5hbWUgPT0gbnVsbCkgPyAKLQkJCQkJZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5KHVyaSk6Ci0JCQkJCWdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeSh1cmksY29udGVudFR5cGVOYW1lKTsKLQkJCQkJCQotCQkgICAgaWYgKHJlc291cmNlRmFjdG9yeSAhPSBudWxsKQotCQkgICAgey8vV2UgZ290IHRoZSByaWdodCBmYWN0b3J5LCBub3cgdXNlIHRoZSByaWdodCBVUkkKLQkJICAgICAgcmVzdWx0ID0gcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZVJlc291cmNlKGNvbnZlcnRlZCk7Ci0JCSAgICAgIGdldFJlc291cmNlcygpLmFkZChyZXN1bHQpOwotCQkgICAgfQotCQl9Ci0JCQkKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgQ29udGVudEhhbmRsZXIuVU5TUEVDSUZJRURfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGV0ZWN0VVJJTWFwcGluZyhVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gISgoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKWdldFVSSUNvbnZlcnRlcigpLmdldFVSSU1hcCgpKS5nZXRVUkkodXJpKS5lcXVhbHModXJpKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgSUZpbGUgZm9yIHRoZSA8Y29kZT51cmk8L2NvZGU+IHdpdGhpbiB0aGUgV29ya3NwYWNlLiBUaGlzIFVSSSBpcyBhc3N1bWVkIHRvIGJlCi0JICogYWJzb2x1dGUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6IHBsYXRmb3JtOi9yZXNvdXJjZS8uLi4uCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0cmluZyA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSk7Ci0JCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5sZW5ndGgoKSArIDEpOwotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQkvL0NoZWNrIHRoZSBtYXAgZmlyc3Qgd2hlbiBjcmVhdGluZyB0aGUgcmVzb3VyY2UgYW5kIGRvIG5vdAotCQkvL25vcm1hbGl6ZSBpZiBhIHZhbHVlIGlzIGZvdW5kLgotCQlib29sZWFuIGlzTWFwcGVkID0gZGV0ZWN0VVJJTWFwcGluZyh1cmkpOwotCQlib29sZWFuIGhhc0NvbnRlbnRUeXBlID0gKGdldENvbnRlbnRUeXBlTmFtZSh1cmkpICE9IG51bGwpOwotCQlVUkkgY29udmVydGVkID0gdXJpOwotCQlpZiAoIWlzTWFwcGVkKQotCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWVsc2UgaWYgKGhhc0NvbnRlbnRUeXBlKQotCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCVJlc291cmNlIHJlc3VsdCA9IGNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKGNvbnZlcnRlZCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCi0JCSAgICBpZiAocmVzb3VyY2VGYWN0b3J5ICE9IG51bGwpCi0JCSAgICB7Ci0JCSAgICAgIHJlc3VsdCA9IHJlc291cmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZShjb252ZXJ0ZWQpOwotCQkgICAgICBnZXRSZXNvdXJjZXMoKS5hZGQocmVzdWx0KTsKLQkJICAgICAgc3luY2hyb25pemVkIChyZXNvdXJjZXNMb2NrKSB7Ci0JCSAgICAgICAgICBnZXRVUklSZXNvdXJjZU1hcCgpLnB1dCh1cmksIHJlc3VsdCk7Ci0JCSAgICAgIH0KLQkJICAgICAgcmV0dXJuIHJlc3VsdDsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcmV0dXJuIG51bGw7Ci0JCSAgICB9Ci0JCSAgCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kTG9hZChSZXNvdXJjZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZW1hbmRMb2FkKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWlzUmVsZWFzaW5nKQotCQkJc3VwZXIuZGVtYW5kTG9hZChyZXNvdXJjZSk7Ci0JfQotCQotCS8qKgotCSAqIFNlZSBpZiBhbnkgcmVzb3VyY2UgaGFuZGxlcnMgZnJvbSB0aGUgV29ya2JlbmNoQ29udGV4dAotCSAqIGRlY2lkZSB0byBjcmVhdGUgdGhlIFJlc291cmNlIGluIGFub3RoZXIgbWFubmVyLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlSGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWhhbmRsZXIgPSAoUmVzb3VyY2VIYW5kbGVyKSByZXNvdXJjZUhhbmRsZXJzLmdldChpKTsKLQkJCXJlc291cmNlID0gaGFuZGxlci5jcmVhdGVSZXNvdXJjZSh0aGlzLCB1cmkpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKLQkgKiBjYW4gcmV0dXJuIGEgUmVzb3VyY2UgZnJvbSBhIDxjb2RlPnVyaTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSB1cmkpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoUmVzb3VyY2VIYW5kbGVyKSByZXNvdXJjZUhhbmRsZXJzLmdldChpKSkuZ2V0UmVzb3VyY2UodGhpcywgdXJpKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gU2VuZCBvdXQgbm90aWZpY2F0aW9uIG9mIHJlbGVhc2UuCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uSW1wbChTUEVDSUFMX05PVElGSUNBVElPTl9UWVBFLCBudWxsLCBudWxsLCBOb3RpZmljYXRpb24uTk9fSU5ERVgsIGZhbHNlKSB7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldEZlYXR1cmVJRChqYXZhLmxhbmcuQ2xhc3MpCi0JCQkJICovCi0JCQkJcHVibGljIGludCBnZXRGZWF0dXJlSUQoQ2xhc3MgZXhwZWN0ZWRDbGFzcykgewotCQkJCQlyZXR1cm4gUFJPSkVDVFJFU09VUkNFU0VUX0FCT1VUX1RPX1JFTEVBU0VfSUQ7Ci0JCQkJfQotCQkJCQotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXROb3RpZmllcigpCi0JCQkJICovCi0JCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJCQkJcmV0dXJuIFByb2plY3RSZXNvdXJjZVNldEltcGwudGhpczsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlzZXRJc1JlbGVhc2luZyh0cnVlKTsKLQkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQotCQkJc3luY2hyb25pemVyLmRpc3Bvc2UoKTsKLQkJc3luY2hyb25pemVyID0gbnVsbDsKLQkJcmVtb3ZlQW5kVW5sb2FkQWxsUmVzb3VyY2VzKCk7Ci0JCXJlc291cmNlSGFuZGxlcnMgPSBudWxsOwotCQllQWRhcHRlcnMoKS5jbGVhcigpOwotCQlzZXRQcm9qZWN0KG51bGwpOwotCQlKRU1VdGlsUGx1Z2luLmdldFNoYXJlZENhY2hlKCkuc3RvcExpc3RlbmluZyh0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5kVW5sb2FkQWxsUmVzb3VyY2VzKCkgewotCQlib29sZWFuIGNhdWdodEV4Y2VwdGlvbiA9IGZhbHNlOwotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlc0xvY2spIHsKLQkJCWlmIChnZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHJldHVybjsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KGdldFJlc291cmNlcygpKTsJCi0JCQlnZXRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQl9Ci0JCVJlc291cmNlIHJlczsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCXJlcy51bmxvYWQoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCWNhdWdodEV4Y2VwdGlvbiA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNhdWdodEV4Y2VwdGlvbikKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24ocykgdW5sb2FkaW5nIHJlc291cmNlcyAtIGNoZWNrIGxvZyBmaWxlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCXByb3RlY3RlZCB2b2lkIHNldElzUmVsZWFzaW5nKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJaXNSZWxlYXNpbmcgPSBhQm9vbGVhbjsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UodXJpLnRyaW1GcmFnbWVudCgpLCBsb2FkT25EZW1hbmQpOwotCQlFT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzTG9hZGVkKCkpCi0JCQlyZXN1bHQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHVyaS5mcmFnbWVudCgpKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gZ2V0RU9iamVjdEZyb21IYW5kbGVycyh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFNlZSBpZiBhbnkgcmVzb3VyY2UgaGFuZGxlcnMgZnJvbSB0aGUgV29ya2JlbmNoQ29udGV4dAotCSAqIGNhbiByZXR1cm4gYSBFT2JqZWN0IGZyb20gYSA8Y29kZT51cmk8L2NvZGU+IGFmdGVyCi0JICogZmFpbGluZyB0byBmaW5kIGl0IHVzaW5nIHRoZSBub3JtYWwgbWVjaGFuaXNtcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFT2JqZWN0RnJvbUhhbmRsZXJzKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCUVPYmplY3Qgb2JqID0gbnVsbDsKLQkJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlSGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWhhbmRsZXIgPSAoUmVzb3VyY2VIYW5kbGVyKSByZXNvdXJjZUhhbmRsZXJzLmdldChpKTsKLQkJCW9iaiA9IGhhbmRsZXIuZ2V0RU9iamVjdEZhaWxlZCh0aGlzLCB1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQlpZiAob2JqICE9IG51bGwpCi0JCQkJcmV0dXJuIG9iajsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWRkKFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpIHsKLQkJcmV0dXJuIHJlc291cmNlSGFuZGxlcnMuYWRkKHJlc291cmNlSGFuZGxlcik7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZEZpcnN0KFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpIHsKLQkJcmVzb3VyY2VIYW5kbGVycy5hZGQoMCwgcmVzb3VyY2VIYW5kbGVyKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpIHsKLQkJcmV0dXJuIHJlc291cmNlSGFuZGxlcnMucmVtb3ZlKHJlc291cmNlSGFuZGxlcik7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5bmNocm9uaXplci4KLQkgKiBAcmV0dXJuIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGdldFN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIHN5bmNocm9uaXplcjsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgc3luY2hyb25pemVyLgotCSAqIEBwYXJhbSBzeW5jaHJvbml6ZXIgVGhlIHN5bmNocm9uaXplciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCXRoaXMuc3luY2hyb25pemVyID0gc3luY2hyb25pemVyOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNzZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgZmFjdG9yeVJlZykgewotCQlpZiAocmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgIT0gbnVsbCAmJiBmYWN0b3J5UmVnICE9IG51bGwpIHsKLQkJCXByZXNlcnZlRW50cmllcyhmYWN0b3J5UmVnLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLCByZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKSk7Ci0JCQlwcmVzZXJ2ZUVudHJpZXMoZmFjdG9yeVJlZy5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLCByZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpKTsKLQkJfQotCQlzdXBlci5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShmYWN0b3J5UmVnKTsKLQl9Ci0JLyoKLQkgKiBQcmVzZXJ2ZSB0aGUgZW50cmllcyBmcm9tIG1hcDIgaW4gbWFwMSBpZiBubyBjb2xsaXNpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlc2VydmVFbnRyaWVzKE1hcCBtYXAxLCBNYXAgbWFwMikgewotCQlpZiAobWFwMi5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gbWFwMi5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIW1hcDEuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKQotCQkJCW1hcDEucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCi0JICAgIE1hcDxVUkksIFJlc291cmNlPiBtYXAgPSBnZXRVUklSZXNvdXJjZU1hcCgpOwotCSAgICBpZiAobWFwICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG1hcC5nZXQodXJpKTsKLQkgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKQotCSAgICAgICAgewotCSAgICAgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkgICAgICAgIH0gICAgICAgIAotCSAgICAgICAgcmV0dXJuIHJlc291cmNlOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgVVJJQ29udmVydGVyIHRoZVVSSUNvbnZlcnRlciA9IGdldFVSSUNvbnZlcnRlcigpOwotCSAgICBVUkkgbm9ybWFsaXplZFVSSSA9IHRoZVVSSUNvbnZlcnRlci5ub3JtYWxpemUodXJpKTsKLQkgICAgTGlzdCByZXNvdXJjZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgc3luY2hyb25pemVkIChyZXNvdXJjZXNMb2NrKSB7Ci0JCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZ2V0UmVzb3VyY2VzKCkpIHsKLQkJCQlpZiAodGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZShyZXNvdXJjZS5nZXRVUkkoKSkuZXF1YWxzKG5vcm1hbGl6ZWRVUkkpKSB7Ci0KLQkJCQkJaWYgKGdldENvbnRlbnRUeXBlTmFtZSh1cmkpID09IG51bGwpIHsgLy8gbG9hZGluZyBmcm9tIGxlZ2FjeSBhcmNoaXZlIGFwaSBvciBub24tdHlwZWQgcmVzb3VyY2UKLQkJCQkJCWlmIChsb2FkT25EZW1hbmQgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQlkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJCQkJbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVJlc291cmNlIGxvYWRlZFJlcyA9IGxvYWRXaXRoQ29udGVudFR5cGUocmVzb3VyY2UsIHVyaSwgbWFwLCBsb2FkT25EZW1hbmQsIHJlc291cmNlc1RvUmVtb3ZlKTsKLQkJCQkJCWlmIChsb2FkZWRSZXMgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gbG9hZGVkUmVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VzTG9jaykgewotCSAgICAvLyBDbGVhbnVwIGludmFsaWQgcmVzb3VyY2VzCi0JICAgIAlnZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwocmVzb3VyY2VzVG9SZW1vdmUpOwotCSAgICB9Ci0JICAgIFJlc291cmNlIGRlbGVnYXRlZFJlc291cmNlID0gZGVsZWdhdGVkR2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCSAgICBpZiAoZGVsZWdhdGVkUmVzb3VyY2UgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBtYXAucHV0KHVyaSwgZGVsZWdhdGVkUmVzb3VyY2UpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gZGVsZWdhdGVkUmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICBpZiAobG9hZE9uRGVtYW5kKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBkZW1hbmRDcmVhdGVSZXNvdXJjZSh1cmkpOwotCSAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGEgcmVzb3VyY2UgZm9yICciICsgdXJpICsgIic7IGEgcmVnaXN0ZXJlZCByZXNvdXJjZSBmYWN0b3J5IGlzIG5lZWRlZCIpOwotCSAgICAgIH0KLQkgICAgICAKLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkgICAgICB9ICAKLQotCSAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCi0JICAgICAgICAgIAotCSAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgfQotCi0JICAgIHJldHVybiBudWxsOwotCSAgCi0JfQotCXByaXZhdGUgUmVzb3VyY2UgbG9hZFdpdGhDb250ZW50VHlwZShSZXNvdXJjZSByZXNvdXJjZSwgVVJJIHVyaSwgTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCwgYm9vbGVhbiBsb2FkT25EZW1hbmQsIExpc3QgcmVzb3VyY2VzVG9SZW1vdmUpIHsKLQkJLy8gY29udGVudCB0eXBlIGlzIGtub3duCi0JCWJvb2xlYW4gcmVzb3VyY2VFeGlzdHMgPSBmYWxzZTsKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpCi0JCQlyZXNvdXJjZUV4aXN0cyA9IGZpbGUuZXhpc3RzKCk7Ci0JCVN0cmluZyByZXNvdXJjZUNvbnRlbnRUeXBlSUQgPSBnZXRDb250ZW50VHlwZUlEKHJlc291cmNlKTsKLQkJU3RyaW5nIHVyaUNvbnRlbnRUeXBlSUQgPSBnZXRDb250ZW50VHlwZU5hbWUodXJpKTsKLQkJU3RyaW5nIGV4aXN0aW5nTWFwS2V5VHlwZSA9IChmaW5kS2V5KHJlc291cmNlKSAhPSBudWxsKSA/IGdldENvbnRlbnRUeXBlTmFtZShmaW5kS2V5KHJlc291cmNlKSkgOiBudWxsOwotCQlpZigoIW1hcC5jb250YWluc1ZhbHVlKHJlc291cmNlKSB8fCAoKG1hcC5nZXQodXJpKSAhPSBudWxsKSAmJiBtYXAuZ2V0KHVyaSkuZXF1YWxzKHJlc291cmNlKSkpIC8vIGV4aXN0aW5nIHJlc291cmNlICB3aXRoIGFsdGVybmF0ZSBtYXBwaW5nIGRvZXNuJ3QgZXhpc3QgaW4gbWFwCi0JCQl8fCAgKChyZXNvdXJjZUNvbnRlbnRUeXBlSUQgIT0gbnVsbCAmJiByZXNvdXJjZUNvbnRlbnRUeXBlSUQuZXF1YWxzKHVyaUNvbnRlbnRUeXBlSUQpKSkpIHsKLQkJCQlpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCQkJCX0gLy8gaWYgZW1iZWRkZWQgdXJpIGNvbnRlbnQgdHlwZSBpcyBkaWZmZXJlbnQgdGhhbiByZXNvdXJjZSBjb250ZW50IHR5cGUsIGNvbnRpbnVlIHNlYXJjaGluZwotCQkJCWlmIChyZXNvdXJjZUNvbnRlbnRUeXBlSUQgIT0gbnVsbAotCQkJCQkJJiYgdXJpQ29udGVudFR5cGVJRCAhPSBudWxsKSB7Ci0JCQkJCWlmICgocmVzb3VyY2VDb250ZW50VHlwZUlELmVxdWFscyh1cmlDb250ZW50VHlwZUlEKSkgJiYgZXhpc3RpbmdNYXBLZXlUeXBlID09IG51bGwpIHJldHVybiBudWxsOwotCQkJCQlpZiAoKCFyZXNvdXJjZUNvbnRlbnRUeXBlSUQuZXF1YWxzKHVyaUNvbnRlbnRUeXBlSUQpKSB8fCAoZXhpc3RpbmdNYXBLZXlUeXBlICE9IG51bGwgJiYgIWV4aXN0aW5nTWFwS2V5VHlwZQotCQkJCQkJCS5lcXVhbHModXJpQ29udGVudFR5cGVJRCkpKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWVsc2UgaWYgKGV4aXN0aW5nTWFwS2V5VHlwZSA9PSBudWxsICYmICFyZXNvdXJjZUV4aXN0cykgewotCQkJCQkJcmVzb3VyY2VzVG9SZW1vdmUuYWRkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICh1cmlDb250ZW50VHlwZUlEICE9IG51bGwgJiYgcmVzb3VyY2VDb250ZW50VHlwZUlEID09IG51bGwgJiYgIXJlc291cmNlRXhpc3RzKSB7Ci0JCQkJCXJlc291cmNlc1RvUmVtb3ZlLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0JCQotCQkJCWlmIChtYXAgIT0gbnVsbCAmJiAobWFwLmdldCh1cmkpID09IG51bGwpKSB7Ci0JCQkJCW1hcC5wdXQodXJpLCByZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFJlc291cmNlIHJlcykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXMuZ2V0VVJJKCkpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlpZiAocmVzLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZShyZXMuZ2V0VVJJKCkpOwotCQkJCWlmICghcmVzLmdldFVSSSgpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKQotCQkJCQlmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKGNvbnZlcnRlZFVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldENvbnRlbnRUeXBlSUQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZSk7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZXNjID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBkZXNjLmdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgVVJJIGZpbmRLZXkoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJTWFwIGFNYXAgPSBnZXRVUklSZXNvdXJjZU1hcCgpOwotCQlTZXQga2V5cyA9IGFNYXAua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVVSSSBuYW1lID0gKFVSSSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFNYXAuZ2V0KG5hbWUpLmVxdWFscyhyZXNvdXJjZSkpCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldENvbnRlbnRUeXBlTmFtZShVUkkgdXJpKSB7Ci0JCQotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpIHx8ICFpc1ZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkodXJpKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVyID0gKHVyaS5zZWdtZW50Q291bnQoKSA+IDMgPyB1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpIDogbnVsbCk7Ci0JCWlmIChjb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSh1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpKSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoVVJJIGFNb2R1bGVVUkkpIHsKLQkJaWYgKGFNb2R1bGVVUkkuc2VnbWVudENvdW50KCkgPCAzKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kLCBSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQkKLQotCSAgICBNYXA8VVJJLCBSZXNvdXJjZT4gbWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKLQkgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXAuZ2V0KHVyaSk7Ci0JICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0JICAgICAgICB9ICAgICAgICAKLQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIFVSSUNvbnZlcnRlciB0aGVVUklDb252ZXJ0ZXIgPSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkgICAgVVJJIG5vcm1hbGl6ZWRVUkkgPSB0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VzTG9jaykgewotCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGdldFJlc291cmNlcygpKSB7Ci0JCQkJaWYgKHRoZVVSSUNvbnZlcnRlci5ub3JtYWxpemUocmVzb3VyY2UuZ2V0VVJJKCkpLmVxdWFscyhub3JtYWxpemVkVVJJKSkgewotCQkJCQlpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkJCQkJfQotCi0JCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQkJbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JICAgIAotCSAgICBSZXNvdXJjZSBkZWxlZ2F0ZWRSZXNvdXJjZSA9IGRlbGVnYXRlZEdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkgICAgaWYgKGRlbGVnYXRlZFJlc291cmNlICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIGRlbGVnYXRlZFJlc291cmNlKTsKLQkgICAgICB9Ci0JICAgICAgcmV0dXJuIGRlbGVnYXRlZFJlc291cmNlOwotCSAgICB9Ci0KLQkgICAgaWYgKGxvYWRPbkRlbWFuZCkKLQkgICAgewotCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gZGVtYW5kQ3JlYXRlUmVzb3VyY2UodXJpLHJlc291cmNlRmFjdG9yeSk7Ci0JICAgICAgaWYgKHJlc291cmNlID09IG51bGwpCi0JICAgICAgewotCSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgYSByZXNvdXJjZSBmb3IgJyIgKyB1cmkgKyAiJzsgYSByZWdpc3RlcmVkIHJlc291cmNlIGZhY3RvcnkgaXMgbmVlZGVkIik7Ci0JICAgICAgfQotCi0JICAgICAgZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0KLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkgICAgICB9ICAgICAgCi0JICAgICAgcmV0dXJuIHJlc291cmNlOwotCSAgICB9Ci0KLQkgICAgcmV0dXJuIG51bGw7Ci0JICAKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCNyZXNldE5vcm1hbGl6ZWRVUklDYWNoZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXROb3JtYWxpemVkVVJJQ2FjaGUoKSB7Ci0JCWlmIChnZXRVUklSZXNvdXJjZU1hcCgpICE9IG51bGwpCi0JCQlnZXRVUklSZXNvdXJjZU1hcCgpLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBSZXNvdXJjZSBkZW1hbmRDcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBGYWN0b3J5IHJlc291cmNlRmFjdG9yeSkgewotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLHJlc291cmNlRmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBFTGlzdDxSZXNvdXJjZT4gZ2V0UmVzb3VyY2VzKCkgewotCQkgaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkgICAgewotCQkgICAgICByZXNvdXJjZXMgPSBuZXcgU3luY2hyb25pemVkUmVzb3VyY2VzRUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCSAgICB9Ci0JCSAgICByZXR1cm4gcmVzb3VyY2VzOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkgICAgQWRhcHRlcltdIGVBZGFwdGVycyA9IGVCYXNpY0FkYXB0ZXJBcnJheSgpOwotCSAgICBpZiAoZUFkYXB0ZXJzICE9IG51bGwgJiYgZURlbGl2ZXIoKSkKLQkgICAgewotCSAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gZUFkYXB0ZXJzLmxlbmd0aDsgaSA8IHNpemU7ICsraSkKLQkgICAgICB7Ci0JICAgICAgCUFkYXB0ZXIgdGVtcDsKLQkgICAgCSAgaWYgKCh0ZW1wID0gZUFkYXB0ZXJzW2ldKSAhPSBudWxsKQotCSAgICAJCSAgdGVtcC5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzQxMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gcmVkaXJlY3QsIGlmIG5lY2Vzc2FyeSwgdG8gYW5vdGhlciAKLSAqIFJlc291cmNlU2V0LiAgVGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIKLSAqIHNvIHRoYXQgdGhlIFVSSXMgcGFzc2VkIHdpbGwgdXNlIHRoZSBwbGF0Zm9ybSBwcm90b2NvbC4gIEFueXRoaW5nIGVsc2Ugd2lsbCBiZSBjb25zaWRlcmVkCi0gKiB0byBiZSBhbWJpZ3VvdXMgYW5kIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gcmVkaXJlY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIgaW1wbGVtZW50cyBSZXNvdXJjZUhhbmRsZXIgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuCi0JICovCi0JcHVibGljIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoKLQkqIEBzZWUgSVJlc291cmNlSGFuZGxlciNnZXRSZXNvdXJjZShSZXNvdXJjZVNldCwgVVJJKQotCSovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZUZvclBsYXRmb3JtUHJvdG9jb2wob3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgdXJpKTsKLQkJVVJJIG1hcHBlZFVSSSA9ICgoVVJJQ29udmVydGVySW1wbC5VUklNYXApb3JpZ2luYXRpbmdSZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKHVyaSk7Ci0JCWlmIChpc0dsb2JhbFBsdWdpbkxvYWQobWFwcGVkVVJJKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZUZvclBsYXRmb3JtUGx1Z2luUHJvdG9jb2wob3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgdXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIFJlZGlyZWN0IHRvIHRoZSBjb3JyZWN0IHByb2plY3QgYmFzZWQgb24gdGhlIHByb2plY3QgbmFtZSBpbiB0aGUgPGNvZGU+dXJpPC9jb2RlPi4KLQkgKiBUaGUgPGNvZGU+dXJpPC9jb2RlPiB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAgIHBsYXRmb3JtOi9yZXNvdXJjZS9bcHJvamVjdCBuYW1lXS4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VGb3JQbGF0Zm9ybVByb3RvY29sKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gdXJpLnNlZ21lbnQoMSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvamVjdCk7Ci0JCQlpZiAob3JpZ2luYXRpbmdSZXNvdXJjZVNldCAhPSBzZXQpCi0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JCSAqIFJlZGlyZWN0IHRvIHRoZSBjb3JyZWN0IHByb2plY3QgYmFzZWQgb24gdGhlIHByb2plY3QgbmFtZSBpbiB0aGUgPGNvZGU+dXJpPC9jb2RlPi4KLQkJICogVGhlIDxjb2RlPnVyaTwvY29kZT4gd2lsbCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogICBwbGF0Zm9ybTovcmVzb3VyY2UvW3Byb2plY3QgbmFtZV0uCi0JCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUZvclBsYXRmb3JtUGx1Z2luUHJvdG9jb2woUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQkJCi0JCVJlc291cmNlU2V0IHNldCA9IEpFTVV0aWxQbHVnaW4uZ2V0UGx1Z2luUmVzb3VyY2VTZXQoKTsKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgc2V0KTsKLQkJfQotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCByZWRpcmVjdGVkUmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIHJlZGlyZWN0ZWRSZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCX0KLQkvKioKLQkgKiBSZWRpcmVjdCB0byB0aGUgY29ycmVjdCBwcm9qZWN0IGJhc2VkIG9uIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBmaWxlIG5hbWUuCi0JICogVGhpcyBpcyBmb3IgY29tcGF0YWJpbGl0eSBwdXJwb3NlcyBmb3IgcGVvcGxlIHVzaW5nIHRoZSBwbGF0Zm9ybTovcmVzb3VyY2UgcHJvdG9jb2wuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlRm9yUGxhdGZvcm1Qcm90b2NvbChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHVyaS5zZWdtZW50KDEpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpOwotCQkJaWYgKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQgIT0gc2V0KQotCQkJCXJldHVybiBnZXRSZXNvdXJjZSh1cmksIHNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCQkgKiBSZWRpcmVjdCB0byB0aGUgY29ycmVjdCBwcm9qZWN0IGJhc2VkIG9uIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBmaWxlIG5hbWUuCi0JCSAqIFRoaXMgaXMgZm9yIGNvbXBhdGFiaWxpdHkgcHVycG9zZXMgZm9yIHBlb3BsZSB1c2luZyB0aGUgcGxhdGZvcm06L3Jlc291cmNlIHByb3RvY29sLgotCQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JQbGF0Zm9ybVBsdWdpblByb3RvY29sKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJCQotCQlSZXNvdXJjZVNldCBzZXQgPSBKRU1VdGlsUGx1Z2luLmdldFBsdWdpblJlc291cmNlU2V0KCk7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSh1cmksIHNldCk7Ci0JCQkKLQl9Ci0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHJlZGlyZWN0ZWRSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gcmVkaXJlY3RlZFJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlJV29ya3NwYWNlIHdzID0gZ2V0V29ya3NwYWNlKCk7Ci0JCWlmICh3cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3cy5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UHJvamVjdChyZXNvdXJjZVNldCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVzb3VyY2VIYW5kbGVyI2NyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0LCBVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkKLQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUZvclBsYXRmb3JtUHJvdG9jb2wob3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgdXJpKTsKLQkJVVJJIG1hcHBlZFVSSSA9ICgoVVJJQ29udmVydGVySW1wbC5VUklNYXApb3JpZ2luYXRpbmdSZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKHVyaSk7Ci0JCWlmIChpc0dsb2JhbFBsdWdpbkxvYWQobWFwcGVkVVJJKSkKLQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUZvclBsYXRmb3JtUGx1Z2luUHJvdG9jb2wob3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgdXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVzb3VyY2VIYW5kbGVyI2dldEVPYmplY3RGYWlsZWQoUmVzb3VyY2VTZXQsIFVSSSwgYm9vbGVhbikKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0RmFpbGVkKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dsb2JhbFBsdWdpbkxvYWQoVVJJIGFVUkkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoYVVSSSkpIHsKLQkJCVN0cmluZ1tdIGdsb2JhbFBsdWdpbnMgPSBKRU1VdGlsUGx1Z2luLmdldEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpOwotCQkJZm9yIChpbnQgaT0wO2k8Z2xvYmFsUGx1Z2lucy5sZW5ndGg7aSsrKSB7Ci0JCQkJaWYgKGFVUkkuc2VnbWVudCgxKS5zdGFydHNXaXRoKGdsb2JhbFBsdWdpbnNbaV0pKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwYWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpZXJJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNhcHR1cmUgYWxsIEFERCBhbmQgUkVNT1ZFIG5vdGlmaWNhdGlvbnMgZnJvbSBlYWNoIFByb2plY3RSZXNvdXJjZVNldAotICogYW5kIGZvcndhcmQgaXQgb24gdG8gYW55IGludGVycmVzdGVkIGxpc3RlbmVycy4gIFRoaXMgaXMgdG8gYWxsb3cgeW91IHRvIGxpc3RlbiB0byBvbmUgb2JqZWN0Ci0gKiB0byBnYWluIGFsbCBBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb25zIGZvciBlYWNoIFJlc291cmNlU2V0IHdpdGhpbiB0aGUgc3lzdGVtLgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllciBleHRlbmRzIE5vdGlmaWVySW1wbCB7Ci0JcHJvdGVjdGVkIEFkYXB0ZXIgcHJvamVjdEFkYXB0ZXIgPSBuZXcgV29ya3NwYWNlUmVzb3VyY2VDYWNoZUFkYXB0ZXIoKTsKLQotCWNsYXNzIFdvcmtzcGFjZVJlc291cmNlQ2FjaGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQkvKioKLQkJICogRm9yd2FyZCBBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQkJCWVOb3RpZnkobXNnKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgV29ya3NwYWNlUmVzb3VyY2VDYWNoZS4KLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBCZWdpbiBsaXN0ZW5pbmcgdG8gYSBQcm9qZWN0UmVzb3VyY2VTZXQuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5MaXN0ZW5pbmcoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoYVJlc291cmNlU2V0ICE9IG51bGwpIHsgCi0JCQlpZiAoYVJlc291cmNlU2V0LmVBZGFwdGVycygpID09IG51bGwgfHwgIAotCQkJIWFSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5jb250YWlucyhwcm9qZWN0QWRhcHRlcikpCi0JCQlhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuYWRkKHByb2plY3RBZGFwdGVyKTsKLQkJfQotCX0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byBhIFByb2plY3RSZXNvdXJjZVNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJaWYgKGFSZXNvdXJjZVNldCAhPSBudWxsKQotCQkJYVJlc291cmNlU2V0LmVBZGFwdGVycygpLnJlbW92ZShwcm9qZWN0QWRhcHRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1ZjdiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogRU1GTmF0dXJlUmVnaXN0cnkuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi1wdWJsaWMgY2xhc3MgRU1GTmF0dXJlUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9SRUdJU1RSQVRJT05fUE9JTlQgPSAib3JnLmVjbGlwc2UuamVtLnV0aWwubmF0dXJlX3JlZ2lzdHJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFICA9ICJuYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBFTUZOYXR1cmVSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVNRk5hdHVyZVJlZ2lzdHJ5IHNpbmdsZXRvbjsKLQkKLQlwdWJsaWMgZmluYWwgU2V0IFJFR0lTVEVSRURfTkFUVVJFX0lEUyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JcHVibGljIHN0YXRpYyBFTUZOYXR1cmVSZWdpc3RyeSBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBFTUZOYXR1cmVSZWdpc3RyeSgpOwotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JLy8gcmVnaXN0ZXIgTmF0dXJlIElEcyBmb3IgdGhlIEoyRUVOYXR1cmVzCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2UgPSByLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihOQVRVUkVfUkVHSVNUUkFUSU9OX1BPSU5UKTsKLQkJU3RyaW5nIG5hdHVyZUlkOwotCQlmb3IgKGludCBpPTA7IGk8Y2UubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjZVtpXS5nZXROYW1lKCkuZXF1YWxzKE5BVFVSRSkpIHsKLQkJCQluYXR1cmVJZCA9IGNlW2ldLmdldEF0dHJpYnV0ZShTVEFUSUNfSUQpOwotCQkJCWlmIChuYXR1cmVJZCAhPSBudWxsKQotCQkJCQlyZWdpc3Rlck5hdHVyZUlEKG5hdHVyZUlkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3Rlck5hdHVyZUlEKFN0cmluZyBuYXR1cmVJZCkgewotCQlpZiAoIVJFR0lTVEVSRURfTkFUVVJFX0lEUy5jb250YWlucyhuYXR1cmVJZCkpCi0JCQlSRUdJU1RFUkVEX05BVFVSRV9JRFMuYWRkKG5hdHVyZUlkKTsKLQkJZWxzZQotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRk5hdHVyZVJlZ2lzdHJ5X0VSUk9SXzAiLCBuZXcgT2JqZWN0W10ge25hdHVyZUlkfSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9ubHMvRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9ubHMvRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYThlNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmxzL0VNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImVtZndvcmtiZW5jaCIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0JCQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JdHJ5IHtyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtyZXR1cm4gZ2V0U3RyaW5nKGtleSk7fQotCi19Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncywgaW50IHgpIHsKLQotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL0NoYXJhY3RlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9DaGFyYWN0ZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTJiMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL0NoYXJhY3RlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5VVEYxNjsKLSAKLQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluIHRoZSBuZXcgVVRGIG11bHRpLWNoYXIgZm9ybWF0LgotICogSXQgaXMgbmVlZGVkIGJlY2F1c2UgSUNVNEogY3VycmVudGx5IGRvZXNuJ3QgaGFuZGxlIHNvbWUgY29ycmVjdGx5IHlldCB0aGF0IHdlCi0gKiBuZWVkIHRvIGhhdmUgd29ya2luZy4gQXMgSUNVNEogZ2V0cyB0aGVtIHdvcmtpbmcsIHRoZSBtZXRob2RzIGhlcmUgd2lsbCBiZWNvbWUKLSAqIGRlcHJlY2F0ZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hhcmFjdGVyVXRpbCB7Ci0KLQlwcml2YXRlIENoYXJhY3RlclV0aWwoKSB7Ci0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBUT0RPIFNvIHVudGlsIElDVTRKIGRvZXMgd29yayBjb3JyZWN0bHkgdGhpcyB1dGlsIHdpbGwgYmUgbmVlZGVkLiBJdCB3aWxsCi0JICogc3RheSBhcm91bmQgYmVjYXVzZSBpdCBpcyBBUEksIGJ1dCBhdCB0aGF0IHRpbWUgaXQgd2lsbCBiZSBtYXJrZWQgZGVwcmVjYXRlZC4gSXQgc2hvdWxkCi0JICogYWxzbyB0aGVuIHJlcm91dGUgdG8gSUNVNEogaW5zdGVhZCBvZiBkb2luZyB0aGUgbWV0aG9kIHJlZmxlY3Rpb25zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1ldGhvZCBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJULCBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQ7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gVHJ5IHRvIGdldCB0aGUgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXIoaW50KSBtZXRob2QuIElmIHRoZXJlLCB0aGVuIHdlIGFyZSBpbiAxLjUgb3IgYWJvdmUuIEVsc2UgdXNlIHRoZSBjaGFyIGZvcm0uCi0JCXRyeSB7Ci0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUID0gQ2hhcmFjdGVyLmNsYXNzLmdldE1ldGhvZCgiaXNKYXZhSWRlbnRpZmllclN0YXJ0IiwgbmV3IENsYXNzW10ge0ludGVnZXIuVFlQRX0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCA9IG51bGw7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCA9IG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVCA9IENoYXJhY3Rlci5jbGFzcy5nZXRNZXRob2QoImlzSmF2YUlkZW50aWZpZXJQYXJ0IiwgbmV3IENsYXNzW10ge0ludGVnZXIuVFlQRX0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJUID0gbnVsbDsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCi0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgPSBudWxsOwotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBJcyBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIKLQkgKiBAcGFyYW0gaW50Q2hhciBpbnQgY2hhcmFjdGVyIChVVEYgbXVsdGktY2hhciBpcyB2YWxpZCkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN0YXJ0IG9mIGphdmEgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAc2VlIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyU3RhcnQoY2hhcikKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclN0YXJ0KGludCBpbnRDaGFyKSB7Ci0JCWlmIChNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoQm9vbGVhbikgTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbnRDaGFyKX0pKS5ib29sZWFuVmFsdWUoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KChjaGFyKSBpbnRDaGFyKTsKLQl9Ci0JCi0JLyoqCi0JICogSXMgc3RhcnQgb2YgamF2YSBpZGVudGlmaWVyCi0JICogQHBhcmFtIGludENoYXIgaW50IGNoYXJhY3RlciAoVVRGIG11bHRpLWNoYXIgaXMgdmFsaWQpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIuCi0JICogCi0JICogQHNlZSBDaGFyYWN0ZXIjaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIpCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJQYXJ0KGludCBpbnRDaGFyKSB7Ci0JCWlmIChNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChCb29sZWFuKSBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW50Q2hhcil9KSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KChjaGFyKSBpbnRDaGFyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoYXJJdGVyYXRvciB7Ci0KLQkJCi0JCXByb3RlY3RlZCBmaW5hbCBDaGFyU2VxdWVuY2UgY2hhclNlcTsKLQkJcHJpdmF0ZSBpbnQgcG9zID0gMDsKLQkJcHJpdmF0ZSBpbnQgbGFzdENoYXJJbmRleCA9IDA7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSB3aXRoIGEgc3RyaW5nLgotCQkgKiBAcGFyYW0gY2hhclNlcQotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgQWJzdHJhY3RDaGFySXRlcmF0b3IoQ2hhclNlcXVlbmNlIGNoYXJTZXEpIHsKLQkJCXRoaXMuY2hhclNlcSA9IGNoYXJTZXE7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXQgdGhlIG5leHQgY2hhciBpbmRleC4KLQkJICogQHBhcmFtIGluZGV4Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgewotCQkJcG9zID0gaW5kZXg7Ci0JCX0KLQotCQkvKioKLQkJICogSGFzIGFub3RoZXIgY2hhci4KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhbm90aGVyIGNoYXIgdG8gcmV0dXJuLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHBvcyA8IGNoYXJTZXEubGVuZ3RoKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBIYXMgYW5vdGhlciBjaGFyIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4gRG9pbmcgcHJldmlvdXMKLQkJICogd2lsbCByZXR1cm4gdGhlIGNoYXIgdGhhdCB3YXMganVzdCByZXR1cm5lZC4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJCXJldHVybiBwb3MgPiAwOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIG5leHQgY2hhciBmcm9tIHRoZSBvbmUgdGhhdCB3YXMganVzdCByZXR1cm5lZC4KLQkJICogQHJldHVybiBuZXh0IGNoYXIuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQotCQkJaW50IG5leHQgPSB1dGZDaGFyQXQocG9zKTsKLQkJCWxhc3RDaGFySW5kZXggPSBwb3M7Ci0JCQlwb3MgKz0gVVRGMTYuZ2V0Q2hhckNvdW50KG5leHQpOwotCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIFVURi0zMiBjaGFyIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KLQkJICogQHBhcmFtIHBvcwotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgdXRmQ2hhckF0KGludCBwb3MpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGZyb20gdGhlIG9uZSB0aGF0IHdhcyBqdXN0IHJldHVybmVkLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgcHJldmlvdXMoKSB7Ci0JCQlpZiAoIWhhc1ByZXZpb3VzKCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0JCQlpbnQgbmV4dDsKLQkJCWlmIChVVEYxNi5pc1RyYWlsU3Vycm9nYXRlKGNoYXJTZXEuY2hhckF0KC0tcG9zKSkpIHsKLQkJCQlpZiAocG9zID4gMCkKLQkJCQkJbmV4dCA9IHV0ZkNoYXJBdCgtLXBvcyk7Ci0JCQkJZWxzZQotCQkJCQluZXh0ID0gY2hhclNlcS5jaGFyQXQocG9zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV4dCA9IGNoYXJTZXEuY2hhckF0KHBvcyk7Ci0JCQl9Ci0JCQlsYXN0Q2hhckluZGV4ID0gcG9zOwotCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIFVURjE2IGNoYXJhY3RlciBwb3NpdGlvbiBvZiB0aGUgY2hhciB0aGF0IHdhcyBqdXN0IHJldHVybmVkIGZyb20gZWl0aGVyCi0JCSAqIHByZXZpb3VzIG9yIG5leHQuCi0JCSAqIFRoaXMgaXMgdGhlIChjaGFyKSBwb3NpdGlvbiBub3QgdGhlCi0JCSAqIHBvc2l0aW9uIG9mIGxvZ2ljYWwgaW50IGNoYXJzIHJldHVybmVkLiBGb3IgZXhhbXBsZSBhIHN0YW5kYXJkIHN0cmluZyBvZgotCQkgKiA8Y29kZT4iYWJjIjwvY29kZT4gdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyICdiJyBpcyAxLiBCdXQgdGFrZSB0aGUgc3RyaW5nCi0JCSAqIDxjb2RlPiJhYjFiMmMiPC9jb2RlPiB3aGVyZSAiYjFiMiIgaXMgb25lIFVURi0zMiBjaGFyLCB0aGVuIHRoZSBwb3NpdGlvbgotCQkgKiBvZiAnYycgaXMgMy4gSXQgd291bGQgbm90IGJlIDIsIHdoaWNoIGlzIHdoYXQgdGhlIGxvZ2ljYWwgY2hhciBwb3NpdGlvbgotCQkgKiB3b3VsZCBiZSBpZiB0YWtpbmcgVUZUMzIgaW50byBhY2NvdW50LgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCQlyZXR1cm4gbGFzdENoYXJJbmRleDsKLQkJfQotCQotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsIGNoYXIgaXRlcmF0b3IgdGhhdCByZXR1cm5zIGludHMgaW5zdGVhZCBvZiBjaGFycyBmb3IKLQkgKiB3YWxraW5nIHN0cmluZ3MgdGhhdCBjYW4gY29udGFpbiBVVEYgbXVsdGktY2hhcnMuIFRoaXMgaXMKLQkgKiBhIGxpbWl0ZWQgdmVyc2lvbiBvZiB7QGxpbmsgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yfS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0l0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGFySXRlcmF0b3IgewotCQkKLQotCQkvKioKLQkJICogQ3JlYXRlIHdpdGggYSBzdHJpbmcuCi0JCSAqIEBwYXJhbSBzdHIKLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIFN0cmluZ0l0ZXJhdG9yKFN0cmluZyBzdHIpIHsKLQkJCXN1cGVyKHN0cik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5DaGFyYWN0ZXJVdGlsLkFic3RyYWN0Q2hhckl0ZXJhdG9yI3V0ZkNoYXJBdChpbnQpCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IHV0ZkNoYXJBdChpbnQgcG9zKSB7Ci0JCQlyZXR1cm4gVVRGMTYuY2hhckF0KChTdHJpbmcpIGNoYXJTZXEsIHBvcyk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFNwZWNpYWwgY2hhciBpdGVyYXRvciB0aGF0IHJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGNoYXJzIGZvcgotCSAqIHdhbGtpbmcgc3RyaW5ncyB0aGF0IGNhbiBjb250YWluIFVURiBtdWx0aS1jaGFycy4gVGhpcyBpcwotCSAqIGEgbGltaXRlZCB2ZXJzaW9uIG9mIHtAbGluayBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3J9LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nQnVmZmVySXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENoYXJJdGVyYXRvciB7Ci0JCQotCi0JCS8qKgotCQkgKiBDcmVhdGUgd2l0aCBhIHN0cmluZy4KLQkJICogQHBhcmFtIHN0ckJ1ZmZlcgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nQnVmZmVySXRlcmF0b3IoU3RyaW5nQnVmZmVyIHN0ckJ1ZmZlcikgewotCQkJc3VwZXIoc3RyQnVmZmVyKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLkNoYXJhY3RlclV0aWwuQWJzdHJhY3RDaGFySXRlcmF0b3IjdXRmQ2hhckF0KGludCkKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgdXRmQ2hhckF0KGludCBwb3MpIHsKLQkJCXJldHVybiBVVEYxNi5jaGFyQXQoKFN0cmluZ0J1ZmZlcikgY2hhclNlcSwgcG9zKTsKLQkJfQotCQkKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL05vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9Ob3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWYyYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL05vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IE5vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4zICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLS8qKgotICogVGhpcyBpcyB0aGUgaW5zdGFudGlhdGlvbiB0byB1c2UgaWYgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQuIEl0IGJhc2ljYWxseSBkb2VzIG5vdGhpbmcuCi0gKiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvciBleHRlbmRzIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgewotCi0JLyoKLQkgKiBPbmx5IGluc3RhbnRpYXRlZCBmcm9tIHRoaXMgcGFja2FnZS4KLQkgKi8KLQlOb3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNzZXRWYXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcikgewotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjZG9TbmFwc2hvdChpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpIHsKLQl9Ci0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjZG9TbmFwc2hvdChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1BlcmZvcm1hbmNlTW9uaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmM2ExYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5JUGVyZm9ybWFuY2VNb25pdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHdyYXBwZXIgdG8gdGhlIElQZXJmb3JtYW5jZU1vbml0b3IgdGhhdCBoaWRlcyBpdCBzbyB0aGF0IHRoZSBhY3R1YWwgcGx1Z2luIGNhbiBiZSBvcHRpb25hbCBhbmQgbm90IHJlcXVpcmVkLgotICogCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIHsKLQkvKioKLQkgKiBFdmVudCBmb3IgUGVyZm9ybWFuY2VMaXN0ZW5lciBub3RpZmljYXRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJmb3JtYW5jZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQkKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjgwMDcxNDYyNzUwMTgwMzM5TDsKLQotCQlQZXJmb3JtYW5jZUV2ZW50KE9iamVjdCBzb3VyY2UsIGludCBzdGVwKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJc25hcHNob3dXaXRoVHlwZXMgPSBmYWxzZTsKLQkJCXRoaXMuc3RlcCA9IHN0ZXA7Ci0JCQl0aGlzLnR5cGVzID0gMDsJLy8gTm90IHNldC4KLQkJfQotCQkKLQkJUGVyZm9ybWFuY2VFdmVudChPYmplY3Qgc291cmNlLCBpbnQgc3RlcCwgaW50IHR5cGVzKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJc25hcHNob3dXaXRoVHlwZXMgPSB0cnVlOwotCQkJdGhpcy5zdGVwID0gc3RlcDsKLQkJCXRoaXMudHlwZXMgPSB0eXBlczsKLQkJfQotCi0JCQotCQkvKioKLQkJICogU25hcHNob3Qgd2l0aCB0eXBlcyBpZiA8Y29kZT50cnVlPC9jb2RlPi4KLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzbmFwc2hvd1dpdGhUeXBlczsKLQotCQkvKioKLQkJICogU3RlcCBvZiBzbmFwc2hvdAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBpbnQgc3RlcDsKLQkJCi0JCS8qKgotCQkgKiB0eXBlcyBvZiBzbmFwc2hvdC4KLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgaW50IHR5cGVzOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtYW5jZSBMaXN0ZW5lciBpbnRlcmZhY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFBlcmZvcm1hbmNlTGlzdGVuZXIgewotCQkvKioKLQkJICogU25hcHNob3Qgd2FzIGNhbGxlZC4KLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNuYXBzaG90KFBlcmZvcm1hbmNlRXZlbnQgZXZlbnQpOwotCX0KLQkKLQlwcml2YXRlIFBlcmZvcm1hbmNlTGlzdGVuZXJbXSBsaXN0ZW5lcnM7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFR5cGVzIHsKLQotCQkvKioKLQkJICogMSAtIFdyaXRlIG91dCB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVGhlc2UgaW5jbHVkZSB3b3JraW5nIHNldCwgcGVhayB3b3JraW5nIHNldCwgZWxhcHNlZCB0aW1lLCB1c2VyIHRpbWUsIGFuZAotCQkgKiBrZXJuZWwgdGltZS4KLQkJICovCi0JCWludCBPcGVyYXRpbmdTeXN0ZW1Db3VudGVycyA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuT3BlcmF0aW5nU3lzdGVtQ291bnRlcnM7Ci0KLQkJLyoqCi0JCSAqIDIgLSBXcml0ZSBvdXQgdGhlIGdsb2JhbCBwZXJmb3JtYW5jZSBpbmZvLiBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaWtlIHRoZSB0b3RhbCBjb21taXR0ZWQgbWVtb3J5IGZvciB0aGUgZW50aXJlIHN5c3RlbS4KLQkJICogCi0JCSAqIFRoaXMgZnVuY3Rpb24gZGVwZW5kcyBvbiB0aGUgR2V0UGVyZm9ybWFuY2VJbmZvKCkgZnVuY3Rpb24gYmVpbmcgYXZhaWxhYmxlIGluIHRoZSBXaW5kb3dzIHBzYXBpLmRsbC4gVGhpcyBpcyBhdmFpbGFibGUgaW4gWFAgYnV0IGlzIHVzdWFsbHkKLQkJICogbm90IGF2YWlsYWJsZSBpbiBXaW4vMjAwMC4gSWYgaXQgaXMgbm90IGF2YWlsYWJsZSB0aGVuIHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgotCQkgKi8KLQkJaW50IEdsb2JhbFN5c3RlbUNvdW50ZXJzID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5HbG9iYWxTeXN0ZW1Db3VudGVyczsKLQotCQkvKioKLQkJICogNCAtIFdyaXRlIG91dCB0aGUgc2l6ZSBvZiB0aGUgSmF2YSBIZWFwLgotCQkgKi8KLQkJaW50IEphdmFIZWFwU2l6ZSA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuSmF2YUhlYXBTaXplOwotCi0JCS8qKgotCQkgKiA4IC0gV3JpdGUgb3V0IGhvdyBtdWNoIG9mIHRoZSBKYXZhIGhlYXAgaXMgYmVpbmcgdXNlZC4gVGhpcyBjYWxscyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3Igc28gaXQgbWF5IHNrZXcgdGltaW5nIHJlc3VsdHMuCi0JCSAqLwotCQlpbnQgSmF2YUhlYXBVc2VkID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5KYXZhSGVhcFVzZWQ7Ci0KLQkJLyoqCi0JCSAqIDE2IC0gVGhlIHBsdWdpbiBzdGFydHVwIGFuZCBzaXplIGluZm9ybWF0aW9uLgotCQkgKi8KLQkJaW50IFBsdWdpbkluZm8gPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLlBsdWdpbkluZm87Ci0KLQkJLyoqIDB4ZmZmZiAtIEV2ZXJ5dGhpbmcuICovCi0JCWludCBBbGwgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLkFsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIHNoYXJlZE1vbml0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgZ2V0TW9uaXRvcigpIHsKLQkJaWYgKHNoYXJlZE1vbml0b3IgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuUGVyZk1zckNvcmVQbHVnaW4iKTsgLy8gVGhpcyBqdXN0IHRlc3RzIGlmIHRoZSBwZXJmb3JtYW5jZSBwbHVnaW4gaXMgYXZhaWxhYmxlLiBUaHJvd3MgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCQkJCSAvLyBleGNlcHRpb24gb3RoZXJ3aXNlLgotCQkJCUNsYXNzIHByZXNlbnRDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmplbS51dGlsLlByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IiKTsgLy8gR2V0IHRoZSBjbGFzcyB3ZSB1c2Ugd3JhcHBlciBpdC4gLy8kTk9OLU5MUy0xJAotCQkJCXNoYXJlZE1vbml0b3IgPSAoUGVyZm9ybWFuY2VNb25pdG9yVXRpbCkgcHJlc2VudENsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQkJaWYgKCFzaGFyZWRNb25pdG9yLmlzVmFsaWQoKSkKLQkJCQkJc2hhcmVkTW9uaXRvciA9IG51bGw7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZiBhbnkgcnVudGltZSBleGNlcHRpb24sIGp1c3QgdXNlIHRoZSBub3QgcHJlc2VudCBvbmUuCi0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJZiBjbGFzcyBub3QgZm91bmQsIHRoZW4gcGx1Z2luIG5vdCBhdmFpbGFibGUsIHNvIGp1c3QgdXNlIHRoZSBub3QgcHJlc2VudCBvbmUuCi0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBQcm9ibGVtIGluc3RhbnRpYXRpbmcsIHNvIGp1c3QgdXNlIHRoZSBub3QgcHJlc2VudCBvbmUuCi0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTb21lIGlsbGVnYWwgYWNjZXNzLCBzbyBqdXN0IHVzZSB0aGUgbm90IHByZXNlbnQgb25lLgotCQkJfQotCQkJaWYgKHNoYXJlZE1vbml0b3IgPT0gbnVsbCkgewotCQkJCS8vIENvdWxkbid0IGdldCB0aGUgcGVyZm9ybWFuY2Ugb25lIGZvciBzb21lIHJlYXNvbi4gVXNlIG5vdCBwcmVzZW50IG9uZSBpbnN0ZWFkLgotCQkJCXNoYXJlZE1vbml0b3IgPSBuZXcgTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaGFyZWRNb25pdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhcmlhdGlvbnMgdGhhdCBhcmUgaW4gZWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSB2YXIKLQkgKiAgICAgICAgICAgIGEgY29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiB2YXJpYXRpb24gbnVtYmVycwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZhcihTdHJpbmcgdmFyKTsKLQotCS8qKgotCSAqIFRha2UgYSBzbmFwc2hvdCBvZiBzb21lIGRlZmF1bHQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGVwCi0JICogICAgICAgICAgICB0aGlzIGlkZW50aWZpZXMgdGhlIHN0ZXAgdGhhdCB0aGUgc25hcHNob3QgaXMgZm9yCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc25hcHNob3QoaW50IHN0ZXApIHsKLQkJZG9TbmFwc2hvdChzdGVwKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJbm90aWZ5U25hcHNob3QobmV3IFBlcmZvcm1hbmNlRXZlbnQodGhpcywgc3RlcCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5U25hcHNob3QoUGVyZm9ybWFuY2VFdmVudCBldmVudCkgewotCQlQZXJmb3JtYW5jZUxpc3RlbmVyW10gbGlzdCA9IGxpc3RlbmVyczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlsaXN0W2ldLnNuYXBzaG90KGV2ZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEbyB0aGUgYWN0dWFsIHNuYXBzaG90Ci0JICogQHBhcmFtIHN0ZXAKLQkgKiAKLQkgKiBAc2VlICNzbmFwc2hvdChpbnQpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCk7Ci0KLQkvKioKLQkgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHNlbGVjdGVkIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RlcAotCSAqICAgICAgICAgICAgdGhpcyBpZGVudGlmaWVzIHRoZSBzdGVwIHRoYXQgdGhlIHNuYXBzaG90IGlzIGZvcgotCSAqIAotCSAqIEBwYXJhbSB0eXBlcwotCSAqICAgICAgICAgICAgVGhpcyBjb250cm9scyB3aGljaCBtZWFzdXJlbWVudHMgYXJlIHNlbGVjdGVkLiBJdCBpcyBhbiBvcidkIHRvZ2V0aGVyIGxpc3Qgb2YgdGhlIElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMgY29uc3RhbnRzLgotCSAqIAotCSAqIEBzZWUgSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpIHsKLQkJZG9TbmFwc2hvdChzdGVwLCB0eXBlcyk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCW5vdGlmeVNuYXBzaG90KG5ldyBQZXJmb3JtYW5jZUV2ZW50KHRoaXMsIHN0ZXAsIHR5cGVzKSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogRG8gdGhlIGFjdHVhbCBzbmFwc2hvdAotCSAqIEBwYXJhbSBzdGVwCi0JICogCi0JICogQHNlZSAjc25hcHNob3QoaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKTsJCi0JCi0JLyoqCi0JICogQWRkIGxpc3RlbmVyIHRvIGxpc3QuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGVyZm9ybWFuY2VMaXN0ZW5lcihQZXJmb3JtYW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmaW5kTGlzdGVuZXIobGlzdGVuZXIpICE9IC0xKQotCQkJcmV0dXJuOwotCQlQZXJmb3JtYW5jZUxpc3RlbmVyW10gbmV3TGlzdCA9IG5ldyBQZXJmb3JtYW5jZUxpc3RlbmVyW2xpc3RlbmVycyAhPSBudWxsID8gbGlzdGVuZXJzLmxlbmd0aCsxIDogMV07Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJzLCAwLCBuZXdMaXN0LCAwLCBsaXN0ZW5lcnMubGVuZ3RoKTsKLQkJbmV3TGlzdFtuZXdMaXN0Lmxlbmd0aC0xXSA9IGxpc3RlbmVyOwotCQlsaXN0ZW5lcnMgPSBuZXdMaXN0OwotCX0KLQkKLQlwcml2YXRlIGludCBmaW5kTGlzdGVuZXIoUGVyZm9ybWFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikKLQkJCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGxpc3QuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGVyZm9ybWFuY2VMaXN0ZW5lcihQZXJmb3JtYW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWludCBpbmRleCA9IGZpbmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmIChpbmRleCAhPSAtMSkgewotCQkJaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMSkgewotCQkJCWxpc3RlbmVycyA9IG51bGw7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJUGVyZm9ybWFuY2VMaXN0ZW5lcltdIG5ld0xpc3QgPSBuZXcgUGVyZm9ybWFuY2VMaXN0ZW5lcltsaXN0ZW5lcnMubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIG5ld0xpc3QsIDAsIGluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJzLCBpbmRleCsxLCBuZXdMaXN0LCBpbmRleCwgbmV3TGlzdC5sZW5ndGgtaW5kZXgpOwotCQkJbGlzdGVuZXJzID0gbmV3TGlzdDsKLQkJfQotCX0KLQkvKioKLQkgKiBVcGxvYWQgdGhlIHJlc3VsdHMgdG8gdGhlIHNlcnZlci4gVGhpcyBjYXVzZXMgdGhlIGZpbGUgdG8gYmUKLQkgKiBjbG9zZWQsIGFuZCB0aGUgbW9uaXRvciB0byBiZSBwbGFjZWQgaW50byB0aGUgZmluaXNoZWQgc3RhdGUuCi0JICogCi0JICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSB1cGxvYWRob3N0LCB1cGxvYWRwb3J0IGFuZCB1cGxvYWR1c2VyaWQKLQkgKiBoYXZlIGJlZW4gY29uZmlndXJlZCBiZWZvcmUgaGFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gKGl0IGNhbiBiZSBudWxsKQotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwbG9hZChTdHJpbmcgZGVzY3JpcHRpb24pe3JldHVybiBmYWxzZTt9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1ByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyMWNkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLklQZXJmb3JtYW5jZU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLlBlcmZNc3JDb3JlUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHZlcnNpb24gdXNlZCB3aGVuIHRoZSBwZXJmb3JtYW5jZSBwbHVnaW4gaXMgYXZhaWxhYmxlLgotICogCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IgZXh0ZW5kcyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjdXBsb2FkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBsb2FkKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlyZXR1cm4gbW9uaXRvci51cGxvYWQoZGVzY3JpcHRpb24pLnN1Y2Nlc3M7Ci0JfQotCQotCXByaXZhdGUgSVBlcmZvcm1hbmNlTW9uaXRvciBtb25pdG9yOwotCi0JLyoKLQkgKiBTbyB0aGF0IG9ubHkgaW5zdGFudGlhdGVkIGJ5IHRoaXMgcGFja2FnZS4KLQkgKi8KLQlQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yKCkgewotCQltb25pdG9yID0gUGVyZk1zckNvcmVQbHVnaW4uZ2V0UGVyZm9ybWFuY2VNb25pdG9yKHRydWUpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2lzVmFsaWQoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBtb25pdG9yICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI3NldFZhcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0JCW1vbml0b3Iuc2V0VmFyKHZhcik7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwKSB7Ci0JCW1vbml0b3Iuc25hcHNob3Qoc3RlcCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcykgewotCQltb25pdG9yLnNuYXBzaG90KHN0ZXAsIHR5cGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2Y2Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBSZWdpc3RyeVJlYWRlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjcgJCQgICQkRGF0ZTogMjAwOS8wOC8xMSAxNTozMDozMiAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQ2xhc3MgdG8gcmVhZCBhIHJlZ2lzdHJ5LiBJdCBpcyBtZWFudCB0byBiZSBzdWJjbGFzc2VkIHRvIHByb3ZpZGUgc3BlY2lmaWMgZnVuY3Rpb24uCi0gKiAKLSAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcikKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlciB7Ci0KLQlwdWJsaWMgUmVnaXN0cnlSZWFkZXIoU3RyaW5nIHBsdWdpbklELCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJc3VwZXIocGx1Z2luSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHBsdWdpbiBpZCBvZiBhIGNvbmZpZ3VhdGlvbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb25FbGVtZW50Ci0JICogQHJldHVybiBwbHVnaW4gaWQgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgKEBsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyLmdldFBsdWdpbklkKCkpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlci5nZXRQbHVnaW5JZChjb25maWd1cmF0aW9uRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlZ2lzdHJ5UmVhZGVyIHRha2luZyBhIHJlZ2lzdHJ5LCBwbHVnaW4gaWQsIGFuZCBleHRlbnNpb24gcG9pbnQgaWQuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogQHBhcmFtIHBsdWdpbklECi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlIFJlZ2lzdHJ5UmVhZGVyKHBsdWdpbiwgZXh0ZW5zaW9uUG9pbnQpIGluc3RlYWQuIFRoZSByZWdpc3RyeSBwYXNzZWQgaW4gaXMgaWdub3JlZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnlSZWFkZXIoSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQl0aGlzKHBsdWdpbklELCBleHRlbnNpb25Qb2ludCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdG8gc2VlIGlmIGl0IGlzIHZhbGlkIGF0IHRoaXMgcG9pbnQgaW4gdGltZSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSBleHRlbnNpb24uIEEgdmFsaWQgcmVhc29uIG5vdCB0byB3b3VsZCBiZSB0aGF0IHRoZSB3b3Jrc3BhY2UgaXMKLQkgKiBzaHV0dGluZyBkb253LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyB2YWxpZCBwb2ludCB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSBleHRlbnNpb24uCi0JICogCi0JICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgKEBsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyLmNhbkNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oKSkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXIuY2FuQ3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN5c3RlbSBidW5kbGUKLQkgKiAKLQkgKiBAcmV0dXJuIHN5c3RlbSBidW5kbGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdW5kbGUgZ2V0U3lzdGVtQnVuZGxlKCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXIuZ2V0U3lzdGVtQnVuZGxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1RpbWVyVGVzdHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9UaW1lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MjRmNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1RpbWVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMgotICovCi1wdWJsaWMgY2xhc3MgVGltZXJUZXN0cyB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IFRpbWVyVGVzdHMgY2xhc3MgdG8gdXNlIHdoZW4gbm90IHVzaW5nIHlvdXIgb3duLiBJdCdzIGEgZ2xvYmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGltZXJUZXN0cyBiYXNpY1Rlc3QgPSBuZXcgVGltZXJUZXN0cygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9QQVJFTlRfSUQgPSAiY3VycmVudCBwYXJlbnQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50UGFyZW50SWQgPSBudWxsOwotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRpbWVyU3RlcCB7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlQgPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IFNUT1AgPSAxOwotCQlzdGF0aWMgZmluYWwgaW50IFNUQVJUX0NVTVVMQVRJVkUgPSAyOwotCQlzdGF0aWMgZmluYWwgaW50IFNUT1BfQ1VNVUxBVElWRSA9IDM7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfQUNDVU1VTEFUSU5HID0gNDsKLQkJc3RhdGljIGZpbmFsIGludCBTVE9QX0FDQ1VNVUxBVElORyA9IDU7Ci0JCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JCXByb3RlY3RlZCBpbnQgdHlwZTsKLQkJcHJvdGVjdGVkIGxvbmcgY3VycmVudFRpbWU7Ci0JCXByb3RlY3RlZCBpbnQgdGhyZWFkSWQ7Ci19Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0T24gPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCBzdGVwczsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydFN0ZXAoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJVGltZXJTdGVwIHN0ZXAgPSBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVEFSVCk7Ci0JCXJldHVybiBzdGVwICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFRpbWVyU3RlcCBjcmVhdGVUaW1lclN0ZXAoU3RyaW5nIGlkLCBpbnQgc3RlcFR5cGUpIHsKLQkJVGltZXJTdGVwIG5ld1N0ZXAgPSBuZXcgVGltZXJTdGVwKCk7Ci0JCW5ld1N0ZXAudGhyZWFkSWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmhhc2hDb2RlKCk7Ci0JCW5ld1N0ZXAuaWQgPSBpZDsKLQkJbmV3U3RlcC50eXBlID0gc3RlcFR5cGU7Ci0JCW5ld1N0ZXAuY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJc3RlcHMuYWRkKG5ld1N0ZXApOwotCi0JCXJldHVybiBuZXdTdGVwOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wU3RlcChTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJVGltZXJTdGVwIHN0ZXAgPSBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVE9QKTsKLQkJcmV0dXJuIHN0ZXAgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRBY2N1bXVsYXRpbmcoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUQVJUX0FDQ1VNVUxBVElORykgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcEFjY3VtdWxhdGluZyhTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RPUF9BQ0NVTVVMQVRJTkcpICE9IG51bGw7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydEN1bXVsYXRpdmVTdGVwKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVEFSVF9DVU1VTEFUSVZFKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wQ3VtdWxhdGl2ZVN0ZXAoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVE9QX0NVTVVMQVRJVkUpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHRlc3RzIHNvIHRoYXQgeW91IGNhbiByZXN0YXJ0IGFuZCBkbyBzb21lIG1vcmUgdGVzdHMuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyVGVzdHMoKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuOwotCQlzdGVwcy5jbGVhcigpOwotCQljdXJyZW50UGFyZW50SWQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFR1cm4gdGhpcyB0ZXN0IG9uLiBJZiBub3QgdHVybmVkIG9uIHRoZW4gYWxsIGNhbGxzIHdpbGwgcXVpY2tseSByZXR1cm4gd2l0aCBubyBlcnJvcnMuIFRoaXMgYWxsb3dzIHRoZSBjb2RlIHRvIHN0YXkgaW4gcGxhY2UgZXZlbiB3aGVuIG5vdAotCSAqIGRlYnVnZ2luZy4KLQkgKiA8cD4KLQkgKiBXaGVuIHR1cm5lZCBvZmYsIGl0IHdpbGwgY2xlYXIgdGhlIHRlc3QuCi0JICogCi0JICogQHBhcmFtIG9uCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHRlc3RTdGF0ZShib29sZWFuIG9uKSB7Ci0JCWlmIChvbiA9PSB0ZXN0T24pCi0JCQlyZXR1cm47Ci0JCWlmIChvbikgewotCQkJdGVzdE9uID0gdHJ1ZTsKLQkJCWlmIChzdGVwcyA9PSBudWxsKQotCQkJCXN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJdGVzdE9uID0gZmFsc2U7Ci0JCQlzdGVwcyA9IG51bGw7Ci0JCX0KLQkJY3VycmVudFBhcmVudElkID0gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uIHsKLQkJcHVibGljIFRpbWVyU3RlcCBjdXJyZW50Q3VtdWxhdGl2ZVN0ZXA7Ci0JCXB1YmxpYyBsb25nIGN1bVRpbWU7Ci0JCXB1YmxpYyBpbnQgY3VtQ291bnQ7Ci0JCXB1YmxpYyBpbnQgY3VtQ291bnROb25aZXJvOwotCQlwdWJsaWMgbG9uZyBtYXhUaW1lOwotCQlwdWJsaWMgbG9uZyBtaW5UaW1lID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCXB1YmxpYyBsb25nIG1pblRpbWVOb25aZXJvID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcmludEl0KCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybjsKLQkJaWYgKHN0ZXBzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU1hcCBzdGVwSW5mb0J5VGhyZWFkSWQgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgaW5kZW50c0J5VGhyZWFkSWQgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgY3VtU3RlcHM7Ci0JCVRpbWVyU3RlcCBwcmV2U3RlcCA9IG51bGw7Ci0JCVRpbWVyU3RlcCBzdGFydFN0ZXA7Ci0JCU51bWJlckZvcm1hdCBwZXJjZW50Rm9ybWF0dGVyID0gTnVtYmVyRm9ybWF0LmdldFBlcmNlbnRJbnN0YW5jZSgpOwotCQlkb3VibGUgdG90YWxUaW1lID0gMDsKLQkJU3RyaW5nQnVmZmVyIHN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKDE1MCk7Ci0JCWlmIChzdGVwcy5zaXplKCkgPiAyKXsKLQkJCXRvdGFsVGltZSA9ICgoVGltZXJTdGVwKXN0ZXBzLmdldChzdGVwcy5zaXplKCktMSkpLmN1cnJlbnRUaW1lIC0gKChUaW1lclN0ZXApc3RlcHMuZ2V0KDApKS5jdXJyZW50VGltZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0ZXBzLnNpemUoKTsgaSsrKSB7Ci0JCQlUaW1lclN0ZXAgc3RlcCA9IChUaW1lclN0ZXApIHN0ZXBzLmdldChpKTsKLQkJCUludGVnZXIgdGhyZWFkSWQgPSBuZXcgSW50ZWdlcihzdGVwLnRocmVhZElkKTsKLQkJCXN3aXRjaCAoc3RlcC50eXBlKSB7Ci0JCQkJY2FzZSBUaW1lclN0ZXAuU1RBUlQ6Ci0JCQkJY2FzZSBUaW1lclN0ZXAuU1RPUDoKLQkJCQkJSW50ZWdlciB0aHJlYWRJbmRlbnQgPSAoSW50ZWdlcikgaW5kZW50c0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaW50IGluZGVudCA9IDA7Ci0JCQkJCWlmIChzdGVwLnR5cGUgPT0gVGltZXJTdGVwLlNUQVJUKSB7Ci0JCQkJCQlpZiAodGhyZWFkSW5kZW50ICE9IG51bGwpCi0JCQkJCQkJaW5kZW50ID0gdGhyZWFkSW5kZW50LmludFZhbHVlKCkgKyAxOwotCQkJCQkJaW5kZW50c0J5VGhyZWFkSWQucHV0KHRocmVhZElkLCBuZXcgSW50ZWdlcihpbmRlbnQpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh0aHJlYWRJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCQlpbmRlbnQgPSB0aHJlYWRJbmRlbnQuaW50VmFsdWUoKTsKLQkJCQkJCWlmIChpbmRlbnQgPiAwKQotCQkJCQkJCWluZGVudHNCeVRocmVhZElkLnB1dCh0aHJlYWRJZCwgbmV3IEludGVnZXIoaW5kZW50IC0gMSkpOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaW5kZW50c0J5VGhyZWFkSWQucmVtb3ZlKHRocmVhZElkKTsKLQkJCQkJCQlpbmRlbnQgPSAwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXN0cmIuc2V0TGVuZ3RoKDApOwotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmN1cnJlbnRUaW1lKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgewotCQkJCQkJc3RyYi5hcHBlbmQoIiAgICAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzd2l0Y2ggKHN0ZXAudHlwZSkgewotCQkJCQkJY2FzZSBUaW1lclN0ZXAuU1RBUlQ6Ci0JCQkJCQkJc3RyYi5hcHBlbmQoIlN0YXJ0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQotCQkJCQkJY2FzZSBUaW1lclN0ZXAuU1RPUDoKLQkJCQkJCQlzdHJiLmFwcGVuZCgiU3RvcCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQk7Ci0JCQkJCXN0cmIuYXBwZW5kKCIgXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmlkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlwiICAgaWQoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC50aHJlYWRJZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTWFwIHN0YXJ0U3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaWYgKHN0YXJ0U3RlcHMgPT0gbnVsbCkKLQkJCQkJCXN0ZXBJbmZvQnlUaHJlYWRJZC5wdXQodGhyZWFkSWQsIHN0YXJ0U3RlcHMgPSBuZXcgSGFzaE1hcCgpKTsKLQkJCQkJaWYgKHN0ZXAudHlwZSA9PSBUaW1lclN0ZXAuU1RBUlQpIHsKLQkJCQkJCS8vIFN0b3JlIHRoZSBzdGFydCBzdGVwIGZvciBsYXRlciBsb29rdXAgd2hlbiBjYWx1bGF0aW5nIHRoZSB0b3RhbCB0aW1lCi0JCQkJCQlzdGFydFN0ZXBzLnB1dChzdGVwLmlkLCBzdGVwKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFRoaXMgaXMgdGhlIHN0b3AgdGltZSBmb3IgYSBzdGVwLiBXZSBuZWVkIHRvIGZpbmQKLQkJCQkJCS8vIHRoZSBjb3JyZXNwb25kaW5nIHN0YXJ0IHRpbWUgYW5kIGNhbGN1bGF0ZSB0aGUgdG90YWwgdGltZS4KLQkJCQkJCU9iamVjdCBpdGVtID0gc3RhcnRTdGVwcy5yZW1vdmUoc3RlcC5pZCk7Ci0JCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRpbWVyU3RlcCkgewotCQkJCQkJCXN0YXJ0U3RlcCA9IChUaW1lclN0ZXApIGl0ZW07Ci0JCQkJCQkJaWYgKHN0YXJ0U3RlcCAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBhZGRjaGFycyA9IDEwMCAtIHN0cmIubGVuZ3RoKCk7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYWRkY2hhcnM7IGorKykgewotCQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvbmcgZGVsdGEgPSBzdGVwLmN1cnJlbnRUaW1lIC0gc3RhcnRTdGVwLmN1cnJlbnRUaW1lOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgIFRvdGFsID0gIiArIGRlbHRhICsgIiBtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJaWYgKHRvdGFsVGltZSA+IDApCi0JCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgIiArIHBlcmNlbnRGb3JtYXR0ZXIuZm9ybWF0KGRlbHRhL3RvdGFsVGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfSBlbHNlCi0JCQkJCQkJc3RyYi5hcHBlbmQoIiAgICAtLS0+IENvdWxkbid0IGZpbmQgU3RhcnRpbmcgcG9pbnQgZm9yIFwiIiArIHN0ZXAuaWQgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJaWYgKGkgPiAwICYmIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpID4gMCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gIiArIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpICsgIiBtcyAtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcHJldlN0ZXAgPSBzdGVwOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyYik7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBUaW1lclN0ZXAuU1RBUlRfQUNDVU1VTEFUSU5HOgotCQkJCQljdW1TdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoY3VtU3RlcHMgPT0gbnVsbCkKLQkJCQkJCXN0ZXBJbmZvQnlUaHJlYWRJZC5wdXQodGhyZWFkSWQsIGN1bVN0ZXBzID0gbmV3IEhhc2hNYXAoKSk7Ci0JCQkJCWN1bVN0ZXBzLnB1dChzdGVwLmlkLCBuZXcgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKCkpOwotCQkJCQl0aHJlYWRJbmRlbnQgPSAoSW50ZWdlcikgaW5kZW50c0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaW5kZW50ID0gMDsKLQkJCQkJaWYgKHRocmVhZEluZGVudCAhPSBudWxsKQotCQkJCQkJaW5kZW50ID0gdGhyZWFkSW5kZW50LmludFZhbHVlKCk7Ci0JCQkJCXN0cmIuc2V0TGVuZ3RoKDApOwotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmN1cnJlbnRUaW1lKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgewotCQkJCQkJc3RyYi5hcHBlbmQoIiAgICAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzdHJiLmFwcGVuZCgiU3RhcnQgQWNjdW11bGF0aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoIiBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuaWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiXCIgICBpZCgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLnRocmVhZElkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaSA+IDAgJiYgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgPiAwKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLSAiICsgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgKyAiIG1zIC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlwcmV2U3RlcCA9IHN0ZXA7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJiKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIFRpbWVyU3RlcC5TVEFSVF9DVU1VTEFUSVZFOgotCQkJCQljdW1TdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoY3VtU3RlcHMgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IGluZm8gPSBjdW1TdGVwcy5nZXQoc3RlcC5pZCk7Ci0JCQkJCQlpZiAoaW5mbyBpbnN0YW5jZW9mIEN1bXVsYXRpdmVJbmZvcm1hdGlvbikKLQkJCQkJCQkoKEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgaW5mbykuY3VycmVudEN1bXVsYXRpdmVTdGVwID0gc3RlcDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBUaW1lclN0ZXAuU1RPUF9DVU1VTEFUSVZFOgotCQkJCQljdW1TdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoY3VtU3RlcHMgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IGluZm8gPSBjdW1TdGVwcy5nZXQoc3RlcC5pZCk7Ci0JCQkJCQlpZiAoaW5mbyBpbnN0YW5jZW9mIEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgewotCQkJCQkJCUN1bXVsYXRpdmVJbmZvcm1hdGlvbiBjdW1JbmZvID0gKEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgaW5mbzsKLQkJCQkJCQlpZiAoY3VtSW5mby5jdXJyZW50Q3VtdWxhdGl2ZVN0ZXAgIT0gbnVsbCkgewotCQkJCQkJCQljdW1JbmZvLmN1bUNvdW50Kys7Ci0JCQkJCQkJCWxvbmcgZGVsdGEgPSBzdGVwLmN1cnJlbnRUaW1lIC0gY3VtSW5mby5jdXJyZW50Q3VtdWxhdGl2ZVN0ZXAuY3VycmVudFRpbWU7Ci0JCQkJCQkJCWN1bUluZm8uY3VtVGltZSArPSBkZWx0YTsKLQkJCQkJCQkJaWYgKGN1bUluZm8ubWF4VGltZSA8IGRlbHRhKQotCQkJCQkJCQkJY3VtSW5mby5tYXhUaW1lID0gZGVsdGE7Ci0JCQkJCQkJCWlmIChkZWx0YSA8IGN1bUluZm8ubWluVGltZSkKLQkJCQkJCQkJCWN1bUluZm8ubWluVGltZSA9IGRlbHRhOwotCQkJCQkJCQlpZiAoZGVsdGEgIT0gMCkgewotCQkJCQkJCQkJY3VtSW5mby5jdW1Db3VudE5vblplcm8rKzsKLQkJCQkJCQkJCWlmIChkZWx0YSA8IGN1bUluZm8ubWluVGltZU5vblplcm8pCi0JCQkJCQkJCQkJY3VtSW5mby5taW5UaW1lTm9uWmVybyA9IGRlbHRhOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIFRpbWVyU3RlcC5TVE9QX0FDQ1VNVUxBVElORzoKLQkJCQkJdGhyZWFkSW5kZW50ID0gKEludGVnZXIpIGluZGVudHNCeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWluZGVudCA9IDA7Ci0JCQkJCWlmICh0aHJlYWRJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCWluZGVudCA9IHRocmVhZEluZGVudC5pbnRWYWx1ZSgpOwotCQkJCQlzdHJiLnNldExlbmd0aCgwKTsKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC5jdXJyZW50VGltZSk7Ci0JCQkJCXN0cmIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKLQkJCQkJCXN0cmIuYXBwZW5kKCIgICAgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc3RyYi5hcHBlbmQoIlN0b3AgIEFjY3VtdWxhdGluZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKCIgXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmlkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlwiICAgaWQoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC50aHJlYWRJZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY3VtU3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaWYgKGN1bVN0ZXBzICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBpbmZvID0gY3VtU3RlcHMuZ2V0KHN0ZXAuaWQpOwotCQkJCQkJaWYgKGluZm8gaW5zdGFuY2VvZiBDdW11bGF0aXZlSW5mb3JtYXRpb24pIHsKLQkJCQkJCQlDdW11bGF0aXZlSW5mb3JtYXRpb24gY3VtSW5mbyA9IChDdW11bGF0aXZlSW5mb3JtYXRpb24pIGluZm87Ci0JCQkJCQkJaWYgKGN1bUluZm8uY3VycmVudEN1bXVsYXRpdmVTdGVwICE9IG51bGwpIHsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIGN1bXVsYXRpdmUgdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLmN1bVRpbWUpOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgY3VtdWxhdGl2ZSBjb3VudD0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLmN1bUNvdW50KTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIG1heCB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8ubWF4VGltZSk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBtaW4gdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLm1pblRpbWUpOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgYXZnIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoKChkb3VibGUpIGN1bUluZm8uY3VtVGltZSkvY3VtSW5mby5jdW1Db3VudCk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBOb25aZXJvIHRpbWVzOiBjdW11bGF0aXZlIH4wIGNvdW50PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8uY3VtQ291bnROb25aZXJvKTsKLQkJCQkJCQkJaWYgKGN1bUluZm8uY3VtQ291bnROb25aZXJvICE9IDApIHsKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBtaW4gfjAgdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5taW5UaW1lTm9uWmVybyk7Ci0JCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgYXZnIH4wIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCgoZG91YmxlKSBjdW1JbmZvLmN1bVRpbWUpIC8gY3VtSW5mby5jdW1Db3VudE5vblplcm8pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChpID4gMCAmJiAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSA+IDApCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tICIgKyAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSArICIgbXMgLS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXByZXZTdGVwID0gc3RlcDsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0cmIpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2NkNjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFVJQ29udGV4dERldGVybWluYXRpb24uamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS42ICQkICAkJERhdGU6IDIwMDkvMDcvMzAgMjI6MTE6MjMgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci0KLS8qKgotICogU3RhdGljIHV0aWxpdHkgY2xhc3MgZm9yIFVJQ29udGV4dCBkZXRlcm1pbmF0aW9uLgotICogCi0gKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSAoQGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbikKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRExFU1NfQ09OVEVYVF9MSVRFUkFMID0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5IRUFETEVTU19DT05URVhUX0xJVEVSQUw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX0xJVEVSQUwgPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uLlVJX0NPTlRFWFRfTElURVJBTDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURMRVNTX0NPTlRFWFQgPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uLkhFQURMRVNTX0NPTlRFWFQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSV9DT05URVhUID0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5VSV9DT05URVhUOwotCi0JcHJpdmF0ZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uKCl7fQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIGNsYXNzIGJhc2VkIG9uIHRoZSBVSSBvciBIZWFkbGVzcyBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuIG5ldyBjbGFzcyBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGtleS4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBrZXkgaXMgaW52YWxpZCAoZS5nLiBubyBleHRlbnNpb24gaXMgZm91bmQgZm9yIHRoZSBrZXkpCi0JICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgKEBsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoKSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVJbnN0YW5jZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb250ZXh0IC0tIGRldGVybWluZXMgdGhlIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnQgY29udGV4dAotCSAqIEBzZWUgI0hFQURMRVNTX0NPTlRFWFQKLQkgKiBAc2VlICNVSV9DT05URVhUCi0JICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgKEBsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24uZ2V0Q3VycmVudENvbnRleHQoKSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRDdXJyZW50Q29udGV4dCgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24uZ2V0Q3VycmVudENvbnRleHQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJVGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QxYjIzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBVSVRlc3Rlci4gVGhlICJjbGFzc25hbWUiIGF0dHJpYnV0ZSBvbiB0aGUgInVpVGVzdGVyIiBleHRlbnNpb24gcG9pbnQgc2hvdWxkIGltcGxlbWVudCB0aGlzIGNsYXNzLgotICoKLSAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSVRlc3RlcikKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVJVGVzdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlUZXN0ZXIgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHRCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGZmNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEVNRldvcmtiZW5jaENvbnRleHRCYXNlLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBDb250ZXh0QmFzZSBmb3IgRU1GV29ya2JlbmNoLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBhcyBuZWVkZWQgZm9yIGFkZGl0aW9uYWwgb3Igb3ZlcnJpZGUgZnVuY3Rpb24uIEl0IHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgewotCi0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgUHJvamVjdFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMSIpKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9qZWN0ID0gYVByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBvZiB0aGUgY29udGV4dCBiYXNlLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKQotCQkJcmVzb3VyY2VTZXQucmVsZWFzZSgpOwotCQlyZXNvdXJjZVNldCA9IG51bGw7Ci0JCXByb2plY3QgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCB0aGlzIGNvbnRleHQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEByZXR1cm4gcHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHNldCAoY3JlYXRpbmcgaWYgbmVlZGVkKSBmb3IgY29udGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJlc291cmNlIHNldAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBQcm9qZWN0UmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVNldCA9IGNyZWF0ZVJlc291cmNlU2V0KCk7Ci0JCQlpbml0aWFsaXplUmVzb3VyY2VTZXQocmVzb3VyY2VTZXQpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBvcHRpbWl6YXRpb247IGFuc3dlciB3aGV0aGVyIGEgcmVzb3VyY2VTZXQgaGFzIGJlZW4gY3JlYXRlZAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSByZXNvdXJjZSBzZXQgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU2V0ICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQljcmVhdGVSZXNvdXJjZVNldFN5bmNocm9uaXplcihhUmVzb3VyY2VTZXQpOwotCQlhUmVzb3VyY2VTZXQuc2V0VVJJQ29udmVydGVyKGNyZWF0ZVVSSUNvbnZlcnRlcihhUmVzb3VyY2VTZXQpKTsKLQkJYVJlc291cmNlU2V0LmFkZChuZXcgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyKCkpOwotCQlKRU1VdGlsUGx1Z2luLmdldERlZmF1bHQoKS5hZGRFeHRlbmRlZFJlc291cmNlSGFuZGxlcnMoYVJlc291cmNlU2V0KTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcmVzb3VyY2Ugc2V0LiBCeSBkZWZhdWx0IGl0IGlzIGEgUHJvamVjdFJlc291cmNlU2V0SW1wbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHByb2plY3QncyBuZXcgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIFVSSUNvbnZlcnRlciBmb3IgdGhlIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogQHJldHVybiBhIHVyaSBjb252ZXJ0ZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBjcmVhdGVVUklDb252ZXJ0ZXIoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gbmV3IFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoZ2V0UHJvamVjdCgpLCBhUmVzb3VyY2VTZXQuZ2V0U3luY2hyb25pemVyKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHJlc291cmNlIHNldCB3b3JrYmVuY2ggc3luY2hyb25pemVyLgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuIGEgcmVzb3VyY2Ugc2V0IHdvcmtiZW5jaCBzeW5jaHJvbml6ZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGNyZWF0ZVJlc291cmNlU2V0U3luY2hyb25pemVyKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVN5bmNocm9uaXplcihhUmVzb3VyY2VTZXQsIGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlkZWxldGVGaWxlKGFSZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRmlsZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCByZXNvdXJjZSAod2l0aCB0aGUgZ2l2ZW4gVVJJKSBmcm9tIHRoZSBwcm9qZWN0IHJlc291cmNlIHNldC4gTG9hZCBpdCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2UgZm9yIHRoZSB1cmksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0ZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9GbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIzMWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0ZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0IGV4dGVuZHMgUHJvamVjdFJlc291cmNlU2V0IHsKLQkKLQkKLQkvKioKLQkgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHJlc29sdmVkIGJ5IHRoZSBVUkkuCi0JICAgKiA8cD4KLQkgICAqIEEgcmVzb3VyY2Ugc2V0IGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5IAotCSAgICogaW4gb3JkZXIgdG8gcmVzb2x2ZSB0aGUgZ2l2ZW4gVVJJIHRvIGEgcmVzb3VyY2UuCi0JICAgKiBGaXJzdCBpdCB1c2VzIGl0J3Mge0BsaW5rICNnZXRVUklDb252ZXJ0ZXIgVVJJIGNvbnZlcnRlcn0gdG8ge0BsaW5rIFVSSUNvbnZlcnRlciNub3JtYWxpemUgbm9ybWFsaXplfSB0aGUgVVJJIAotCSAgICogYW5kIHRoZW4gdG8gY29tcGFyZSBpdCB3aXRoIHRoZSBub3JtYWxpemVkIFVSSSBvZiBlYWNoIHJlc291cmNlOwotCSAgICogaWYgaXQgZmluZHMgYSBtYXRjaCwgCi0JICAgKiB0aGF0IHJlc291cmNlIGJlY29tZXMgdGhlIHJlc3VsdC4KLQkgICAqIEZhaWxpbmcgdGhhdCwKLQkgICAqIGl0IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVsZWdhdGVkR2V0UmVzb3VyY2UgZGVsZWdhdGVzfSAKLQkgICAqIHRvIGFsbG93IHRoZSBVUkkgdG8gYmUgcmVzb2x2ZWQgZWxzZXdoZXJlLgotCSAgICogRm9yIGV4YW1wbGUsIAotCSAgICogdGhlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkjSU5TVEFOQ0UgcGFja2FnZSByZWdpc3RyeX0KLQkgICAqIGlzIHVzZWQgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSNnZXRFUGFja2FnZSByZXNvbHZlfSAKLQkgICAqIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlIG5hbWVzcGFjZSBVUkl9IG9mIGEgcGFja2FnZQotCSAgICogdG8gdGhlIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGF0IHBhY2thZ2UuCi0JICAgKiBTbyB0aGUgaW1wb3J0YW50IHBvaW50IGlzIHRoYXQgYW4gYXJiaXRyYXJ5IGltcGxlbWVudGF0aW9uIG1heSByZXNvbHZlIHRoZSBVUkkgdG8gYW55IHJlc291cmNlLAotCSAgICogbm90IG5lY2Vzc2FyaWx5IHRvIG9uZSBjb250YWluZWQgYnkgdGhpcyBwYXJ0aWN1bGFyIHJlc291cmNlIHNldC4KLQkgICAqIElmIHRoZSBkZWxlZ2F0aW9uIHN0ZXAgZmFpbHMgdG8gcHJvdmlkZSBhIHJlc3VsdCwKLQkgICAqIGFuZCBpZiA8Y29kZT5sb2FkT25EZW1hbmQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LAotCSAgICogYSByZXNvdXJjZSBpcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZENyZWF0ZVJlc291cmNlIGNyZWF0ZWR9IAotCSAgICogYW5kIHRoYXQgcmVzb3VyY2UgYmVjb21lcyB0aGUgcmVzdWx0LgotCSAgICogSWYgPGNvZGU+bG9hZE9uRGVtYW5kPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPgotCSAgICogYW5kIHRoZSByZXN1bHQgcmVzb3VyY2UgaXMgbm90IHtAbGluayBSZXNvdXJjZSNpc0xvYWRlZCBsb2FkZWR9LCAKLQkgICAqIGl0IHdpbGwgYmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZW1hbmRMb2FkIGxvYWRlZH0gYmVmb3JlIGl0IGlzIHJldHVybmVkLgotCSAgICogPC9wPgotCSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRvIHJlc29sdmUuCi0JICAgKiBAcGFyYW0gbG9hZE9uRGVtYW5kIHdoZXRoZXIgdG8gY3JlYXRlIGFuZCBsb2FkIHRoZSByZXNvdXJjZSwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0cy4KLQkgICAqIEBwYXJhbSByZWdpc3RlcmVkRmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIHJlc291cmNlIGlmIG5lZWRlZCAKLQkgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIHJlc29sdmVkIGJ5IHRoZSBVUkksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzbid0IG9uZSBhbmQgaXQncyBub3QgYmVpbmcgZGVtYW5kIGxvYWRlZC4KLQkgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiBhIHJlc291cmNlIGNhbid0IGJlIGRlbWFuZCBjcmVhdGVkLgotCSAgICogQHRocm93cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBkZW1hbmQgbG9hZC4KLQkgICAqIEBzaW5jZSAyLjEKLQkgICAqLwotCQotCVJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kLCBGYWN0b3J5IHJlZ2lzdGVyZWRGYWN0b3J5KTsKLQkKLQkvKioKLQkgICAqIENyZWF0ZXMgYSBuZXcgcmVzb3VyY2UsIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLCBhbmQgcmV0dXJucyBpdC4KLQkgICAqIDxwPgotCSAgICogSXQgZGVsZWdhdGVzIHRvIHRoZSByZXNvdXJjZSBmYWN0b3J5IHtAbGluayAjZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnl9IAotCSAgICogdG8gZGV0ZXJtaW5lIHRoZSB7QGxpbmsgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSNnZXRGYWN0b3J5IGNvcnJlY3R9IGZhY3RvcnksCi0JICAgKiBhbmQgdGhlbiBpdCB1c2VzIHRoYXQgZmFjdG9yeSB0byB7QGxpbmsgUmVzb3VyY2UuRmFjdG9yeSNjcmVhdGVSZXNvdXJjZSBjcmVhdGV9IHRoZSByZXNvdXJjZQotCSAgICogYW5kIGFkZCBpdCB0byB0aGUge0BsaW5rICNnZXRSZXNvdXJjZXMgY29udGVudHN9LgotCSAgICogSWYgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBmYWN0b3J5LCA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkOwotCSAgICogd2hlbiBydW5uaW5nIHdpdGhpbiBFY2xpcHNlLAotCSAgICogYSBkZWZhdWx0IFhNSSBmYWN0b3J5IHdpbGwgYmUgcmVnaXN0ZXJlZCwKLQkgICAqIGFuZCB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAgICogPC9wPgotCSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSByZXNvdXJjZSB0byBjcmVhdGUuCi0JICAgKiBAcGFyYW0gcmVzb3VyY2VGYWN0b3J5IAotCSAgICogQHJldHVybiBhIG5ldyByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZmFjdG9yeSBpcyByZWdpc3RlcmVkLgotCSAgICovCi0JCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjVkN2ZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0lFTUZDb250ZXh0Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLS8qKgotICogRU1GIENvbnRleHQgQ29udHJpYnV0b3IgaW50ZXJmYWNlLiBJbXBsaW1lbnRlcnMgYXJlIGNhbGxlZCB0byBjb250cmlidXRlIHRvIHRoZSBjb250ZXh0LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlI2NyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IpCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRU1GQ29udGV4dENvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIFRoaXMgaXMgeW91ciBvcHBvcnR1bml0eSB0byBhZGQgYSBwcmltYXJ5IEVNRk5hdHVyZS4gVHlwaWNhbGx5IHlvdSB3b3VsZCBhZGQgdG8gdGhlIFdvcmtiZW5jaENvbnRleHQgaGVsZCBieSA8Y29kZT5hTmF0dXJlPC9jb2RlPiBpbiBvcmRlciB0bwotCSAqIGNoYW5nZSB0aGUgY29udGFpbmVyIGZvciB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyIG9yIGFkZCBhZGFwdGVyIGZhY3RvcmllcyB0byB0aGUgUmVzb3VyY2VTZXQgb3IgYW55dGhpbmcgZWxzZSB0aGF0IGlzIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgcHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHlvdXIgb3Bwb3J0dW5pdHkgdG8gYWRkIGEgc2Vjb25kYXJ5IEVNRk5hdHVyZS4gVHlwaWNhbGx5IHlvdSB3b3VsZCBhZGQgdG8gdGhlIFdvcmtiZW5jaENvbnRleHQgaGVsZCBieSA8Y29kZT5hTmF0dXJlPC9jb2RlPiBpbiBvcmRlcgotCSAqIHRvIGNoYW5nZSB0aGUgY29udGFpbmVyIGZvciB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyIG9yIGFkZCBhZGFwdGVyIGZhY3RvcmllcyB0byB0aGUgUmVzb3VyY2VTZXQgb3IgYW55dGhpbmcgZWxzZSB0aGF0IGlzIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgc2Vjb25kYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBhTmF0dXJlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0lTeW5jaHJvbml6ZXJFeHRlbmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MGRkMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IElTeW5jaHJvbml6ZXJFeHRlbmRlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci0KLS8qKgotICogSW1wbGltZW50ZXJzIGFsbG93cyBjbGllbnRzLCBlZyB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZOYXR1cmVDb250cmlidXRvcn0sIHRvIGV4dGVuZCB0aGUgYmVoYXZpb3Igb2YgdGhlCi0gKiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyI2FkZEV4dGVuZGVyKElTeW5jaHJvbml6ZXJFeHRlbmRlcikKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTeW5jaHJvbml6ZXJFeHRlbmRlciB7Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCBwcm9qZWN0IGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgcHJvamVjdENoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBwcm9qZWN0Q2xvc2VkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5NzY5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFByb2plY3RSZXNvdXJjZVNldC5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjUgJCQgICQkRGF0ZTogMjAwNy8wOC8zMCAwMjozNzowNSAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBBIFJlc291cmNlU2V0IGZvciBhbiBlbnRpcmUgcHJvamVjdC4gSXQgYWxsb3dzIHNoYXJpbmcgb2YgcmVzb3VyY2VzIGZyb20gbXVsdGlwbGUgZWRpdG9ycy92aWV3ZXJzIGZvciBhIHByb2plY3QuCi0gKiA8cD4KLSAqIEFuIGFkZGl0aW9uYWwgTm90aWZpY2F0aW9uIHR5cGUgaXMgc2VudCBvdXQgYnkgUHJvamVjdFJlc291cmNlU2V0J3Mgb2YgcHJvamVjdCByZXNvdXJjZSBzZXQgYWJvdXQgdG8gYmUgcmVsZWFzZWQuIEEgcmVsZWFzZSBpcwotICogY2FsbGVkIHdoZW4gcHJvamVjdHMgYXJlIGFib3V0IHRvIGJlIGNsb3NlZC4gVGhleSByZWxlYXNlIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGFuZCB1bmxvYWQgdGhlbS4gVGhpcyBub3RpZmljYXRpb24gY2FuIGJlIHVzZWQgCi0gKiB0byBrbm93IHRoYXQgdGhpcyBpcyBhYm91dCB0byBoYXBwZW4gYW5kIHRvIGRvIHNvbWV0aGluZyBiZWZvcmUgdGhlIHJlc291cmNlcyBiZWNvbWUgaW52YWxpZC4gSXQgd2lsbCBiZSBzZW50IG91dCBqdXN0IGJlZm9yZSB0aGUKLSAqIHJlc291cmNlIHNldCB3aWxsIGJlIHJlbGVhc2VkLiAKLSAqIAotICogQHNlZSBQcm9qZWN0UmVzb3VyY2VTZXQjU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRQotICogQHNlZSBQcm9qZWN0UmVzb3VyY2VTZXQjUFJPSkVDVFJFU09VUkNFU0VUX0FCT1VUX1RPX1JFTEVBU0VfSUQgCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3RSZXNvdXJjZVNldCBleHRlbmRzIFJlc291cmNlU2V0IHsKLQotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdHlwZSBpbiBub3RpZmljYXRpb25zIGZyb20gdGhlIFByb2plY3RSZXNvdXJjZVNldCBmb3IKLQkgKiBzcGVjaWFsIG5vdGlmaWNhdGlvbnMsIGFuZCBub3QgdGhlIHN0YW5kYXJkIG9uZXMgZnJvbSBSZXNvdXJjZVNldC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiNnZXRFdmVudFR5cGUoKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXN0YXRpYyBpbnQgU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRSA9IE5vdGlmaWNhdGlvbi5FVkVOVF9UWVBFX0NPVU5UKzQ7Ci0JCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIEZlYXR1cmUgSUQgZm9yIHJlc291cmNlIHNldCBhYm91dCB0byBiZSByZWxlYXNlZC4KLQkgKiBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiNnZXRGZWF0dXJlSUQoamF2YS5sYW5nLkNsYXNzKX0gdG8KLQkgKiBnZXQgdGhpcyBpZC4gVGhlIGdldEZlYXR1cmUoKSBvbiBub3RpZmljYXRpb24gd2lsbCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlzdGF0aWMgaW50IFBST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEID0gMTAwMDsKLQotCS8qKgotCSAqIENhbGwgd2hlbiB0aGUgUmVzb3VyY2VTZXQgaXMgbm8gbG9uZ2VyIHRvIGJlIHVzZWQuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCByZWxlYXNlKCk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIDxjb2RlPnJlc291cmNlSGFuZGxlcjwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiByZXNvdXJjZUhhbmRsZXJzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUhhbmRsZXIKLQkgKiAgICAgICAgICAgIElSZXNvdXJjZUhhbmRsZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IHdhcyBhZGRlZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlib29sZWFuIGFkZChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgPGNvZGU+cmVzb3VyY2VIYW5kbGVyPC9jb2RlPiB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3Qgb2YgcmVzb3VyY2VIYW5kbGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VIYW5kbGVyCi0JICogICAgICAgICAgICBJUmVzb3VyY2VIYW5kbGVyCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBhZGRGaXJzdChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgPGNvZGU+cmVzb3VyY2VIYW5kbGVyPC9jb2RlPiBmcm9tIHRoZSBsaXN0IG9mIHJlc291cmNlSGFuZGxlcnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlSGFuZGxlcgotCSAqICAgICAgICAgICAgSVJlc291cmNlSGFuZGxlcgotCSAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgcmVtb3ZlZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlib29sZWFuIHJlbW92ZShSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2VTZXQgc3luY2hyb25pemVyIHRoYXQgd2lsbCBzeW5jaHJvbml6ZSB0aGUgUmVzb3VyY2VTZXQgd2l0aCBjaGFuZ2VzIGZyb20gdGhlIFdvcmtiZW5jaC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgZ2V0U3luY2hyb25pemVyKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFJlc291cmNlU2V0IHN5bmNocm9uaXplciB0aGF0IHdpbGwgc3luY2hyb25pemUgdGhlIFJlc291cmNlU2V0IHdpdGggY2hhbmdlcyBmcm9tIHRoZSBXb3JrYmVuY2guCi0JICogCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKiBAcmV0dXJuIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBzZXRTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcik7Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgY2xpZW50cyB3aGVuZXZlciB0aGUgc3RydWN0dXJlIG9mIHRoZSBwcm9qZWN0IGNoYW5nZXMgc3VjaCB0aGF0IGFueSBjYWNoZWQgVVJJcyB3aWxsIGJlIGludmFsaWQuIEZvciBleGFtcGxlLCBpZiB0aGUKLQkgKiBzb3VyY2UgZm9sZGVycyB3aXRoaW4gdGhlIFVSSUNvbnZlcnRlciBjaGFuZ2UuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCByZXNldE5vcm1hbGl6ZWRVUklDYWNoZSgpOwotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTJlODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUHJvamVjdFV0aWxpdGllcy5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjYgJCQgICQkRGF0ZTogMjAwOC8wMy8wNSAxOTo0MzoxOCAkJCAKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogRU1GIFdvcmtiZW5jaCBQcm9qZWN0IFV0aWxpdGllcy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLQotcHVibGljIGNsYXNzIFByb2plY3RVdGlsaXRpZXMgewotCi0JLyoqCi0JICogUHJvamVjdCBjb250cm9sIGZpbGUgbmFtZSBpbiBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERPVF9QUk9KRUNUID0gIi5wcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2xhc3NwYXRoIGNvbnRyb2wgZmlsZSBuYW1lIGluIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9UX0NMQVNTUEFUSCA9ICIuY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFByb2plY3RVdGlsaXRpZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYXR1cmUgaWQgdG8gdGhlIHByb2plY3QgYWhlYWQgb2YgYWxsIG90aGVyIG5hdHVyZSBpZHMuCi0JICogCi0JICogQHBhcmFtIHByb2oKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1swXSA9IG5hdHVyZUlkOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmF0dXJlIGlkIGFmdGVyIGFsbCBvZiB0aGUgb3RoZXIgbmF0dXJlIGlkcyBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2oKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0TGFzdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXSA9IG5hdHVyZUlkOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgbmF0dXJlIGlkIGZyb20gdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCWludCBzaXplID0gcHJldk5hdHVyZXMubGVuZ3RoOwotCQlpbnQgbmV3c2l6ZSA9IDA7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlib29sZWFuIG1hdGNoZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwcmV2TmF0dXJlc1tpXS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJbWF0Y2hmb3VuZCA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UKLQkJCQluZXdOYXR1cmVzW25ld3NpemUrK10gPSBwcmV2TmF0dXJlc1tpXTsKLQkJfQotCQlpZiAoIW1hdGNoZm91bmQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpFTVV0aWxQbHVnaW4uSUQsIDAsCi0JCQkJCSJUaGUgbmF0dXJlIGlkICIgKyBuYXR1cmVJZCArICIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWVsc2UgewotCQkJU3RyaW5nW10gdGVtcCA9IG5ld05hdHVyZXM7Ci0JCQluZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tuZXdzaXplXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgbmV3TmF0dXJlcywgMCwgbmV3c2l6ZSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbGlzdCBvZiBwcm9qZWN0cyB0byBlbmQgb2YgdGhlICJyZWZlcmVuY2VkIHByb2plY3RzIiBsaXN0IGZyb20gdGhlIHByb2plY3QncyBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB0b0JlQWRkZWRQcm9qZWN0c0xpc3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgTGlzdCB0b0JlQWRkZWRQcm9qZWN0c0xpc3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0KLQkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKHByb2plY3RzW2ldKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9CZUFkZGVkUHJvamVjdHNMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKHRvQmVBZGRlZFByb2plY3RzTGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJSVByb2plY3RbXSByZWZQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0c0xpc3Quc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWZQcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgKHByb2plY3RzTGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJZGVzY3JpcHRpb24uc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZlByb2plY3RzKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzaW5nbGUgcHJvamVjdCB0byB0aGUgZW5kIG9mIHRoZSAicmVmZXJlbmNlZCBwcm9qZWN0cyIgbGlzdCBmcm9tIHRoZSBwcm9qZWN0J3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcHJvamVjdFRvQmVBZGRlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWZlcmVuY2VQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9CZUFkZGVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQotCQlBcnJheUxpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXByb2plY3RzTGlzdC5hZGQocHJvamVjdHNbaV0pOwotCQl9Ci0KLQkJcHJvamVjdHNMaXN0LmFkZChwcm9qZWN0VG9CZUFkZGVkKTsKLQotCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZlByb2plY3RzW2ldID0gKElQcm9qZWN0KSAocHJvamVjdHNMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSBhIGFuIGltbWVkaWF0ZSBidWlsZCBvZiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9yY2VBdXRvQnVpbGQoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBwcm9ncmVzc01vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvL1JldmlzaXQ6IE5lZWQgdG8gdXNlIGEgTG9nZ2VyCi0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaWYgYXV0byBidWlsZCBpcyB0dXJuZWQgb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdXRvIGJ1aWxkIGlzIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q3VycmVudEF1dG9CdWlsZFNldHRpbmcoKSB7Ci0KLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3ZCA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQlyZXR1cm4gd2QuaXNBdXRvQnVpbGRpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgbWF5IGJlIGFuIDxjb2RlPklQcm9qZWN0LCBJUmVzb3VyY2UsIElBZGFwdGFibGUgKHRvIGFuIElQcm9qZWN0KSwgRU9iamVjdCAoZ2V0cyBJUHJvamVjdCBpZiBvYmplY3QgaXMgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQ8L2NvZGU+LgotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiByZXR1cm5zIHByb2plY3QuIElmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHJldHVybnMgcHJvamVjdCBvbmx5IGlmIHByb2plY3QgaGFzIHRoaXMgbmF0dXJlIGlkLgotCSAqIEByZXR1cm4gcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBvYmplY3QsIFN0cmluZyBuYXR1cmVJZCkgewotCQlJUHJvamVjdCByZXN1bHQgPSBnZXRQcm9qZWN0KG9iamVjdCk7Ci0JCWlmIChuYXR1cmVJZCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5pc0FjY2Vzc2libGUoKSAmJiBuYXR1cmVJZCAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlpZiAocmVzdWx0Lmhhc05hdHVyZShuYXR1cmVJZCkpCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBtYXkgYmUgYW4gPGNvZGU+SVByb2plY3QsIElSZXNvdXJjZSwgSUFkYXB0YWJsZSAodG8gYW4gSVByb2plY3QpLCBFT2JqZWN0IChnZXRzIElQcm9qZWN0IGlmIG9iamVjdCBpcyBpbiBhIFByb2plY3RSZXNvdXJjZVNldDwvY29kZT4uCi0JICogQHJldHVybiBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IG9iamVjdCkgewotCQlJUHJvamVjdCByZXN1bHQgPSBudWxsOwotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJlc3VsdCA9IChJUHJvamVjdCkgb2JqZWN0OwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQlyZXN1bHQgPSAoKElSZXNvdXJjZSkgb2JqZWN0KS5nZXRQcm9qZWN0KCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXN1bHQgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgb2JqZWN0KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJlc3VsdCA9IGdldFByb2plY3QoKEVPYmplY3QpIG9iamVjdCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBFT2JqZWN0LiAoSWYgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQsIHRoZW4gdGhlIHByb2plY3QgZnJvbSB0aGF0IHJlc291cmNlIHNldCkuCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiBAcmV0dXJuIHByb2plY3QgaWYgYXNzb2NpYXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlpZiAoYVJlZk9iamVjdCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGFSZWZPYmplY3QuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdChyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOwotCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKLQkJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFJlc291cmNlLiAoSWYgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQsIHRoZW4gdGhlIHByb2plY3QgZnJvbSB0aGF0IHJlc291cmNlIHNldCkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBwcm9qZWN0IGlmIGFzc29jaWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZVNldCBzZXQgPSByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgPT0gbnVsbCkgewotCQkJVVJJIHVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJCQotCQlpZiAoc2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQotCQkJcmV0dXJuICgoUHJvamVjdFJlc291cmNlU2V0KSBzZXQpLmdldFByb2plY3QoKTsKLQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IHNldCA9PSBudWxsID8gbnVsbCA6IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlciBpbnN0YW5jZW9mIFdvcmtiZW5jaFVSSUNvbnZlcnRlciAmJiAoKFdvcmtiZW5jaFVSSUNvbnZlcnRlcikgY29udmVydGVyKS5nZXRPdXRwdXRDb250YWluZXIoKSAhPSBudWxsKQotCQkJcmV0dXJuICgoV29ya2JlbmNoVVJJQ29udmVydGVyKSBjb252ZXJ0ZXIpLmdldE91dHB1dENvbnRhaW5lcigpLmdldFByb2plY3QoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBsaXN0IG9mIHByb2plY3RzIGZyb20gdGhlIGxpc3Qgb2YgInJlZmVyZW5jZWQgcHJvamVjdHMiIGluIHRoZSBwcm9qZWN0J3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdG9CZVJlbW92ZWRQcm9qZWN0TGlzdAotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgTGlzdCB0b0JlUmVtb3ZlZFByb2plY3RMaXN0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0KLQkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKHByb2plY3RzW2ldKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9CZVJlbW92ZWRQcm9qZWN0TGlzdC5zaXplKCk7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LnJlbW92ZSh0b0JlUmVtb3ZlZFByb2plY3RMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZlByb2plY3RzW2ldID0gKElQcm9qZWN0KSAocHJvamVjdHNMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHByb2plY3QgZnJvbSB0aGUgbGlzdCBvZiAicmVmZXJlbmNlZCBwcm9qZWN0cyIgaW4gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB0b0JlUmVtb3ZlZFByb2plY3QKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZVByb2plY3RzKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0IHRvQmVSZW1vdmVkUHJvamVjdCkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGRlc2NyaXB0aW9uLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCi0JCUFycmF5TGlzdCBwcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LmFkZCgocHJvamVjdHNbaV0pKTsKLQkJfQotCi0JCXByb2plY3RzTGlzdC5yZW1vdmUodG9CZVJlbW92ZWRQcm9qZWN0KTsKLQotCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZlByb2plY3RzW2ldID0gKElQcm9qZWN0KSAocHJvamVjdHNMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUdXJuIGF1dG8tYnVpbGRpbmcgb2ZmLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0dXJuQXV0b0J1aWxkT2ZmKCkgewotCQl0cnkgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCXdkLnNldEF1dG9CdWlsZGluZyhmYWxzZSk7Ci0JCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24od2QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUdXJuIGF1dG8tYnVpbGRpbmcgb24uCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHR1cm5BdXRvQnVpbGRPbigpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdkID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQl3ZC5zZXRBdXRvQnVpbGRpbmcodHJ1ZSk7Ci0JCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24od2QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGF1dG8tYnVpbGRpbmcgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGFCb29sZWFuCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byB0dXJuIGF1dG8tYnVpbGRpbmcgb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHR1cm5BdXRvQnVpbGRPbihib29sZWFuIGFCb29sZWFuKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3ZCA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJd2Quc2V0QXV0b0J1aWxkaW5nKGFCb29sZWFuKTsKLQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3ZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGJ1aWxkZXIgdG8gdGhlIGJ1aWxkIHNwZWMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBidWlsZGVySUQKLQkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgYnVpbGRlci4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgUHJvamVjdCB0byBhZGQgdG8uCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBidWlsZGVyIGlkIHdhcyBhY3R1YWxseSBhZGRlZCAoaXQgbWF5IGhhdmUgYWxyZWFkeSBleGlzdGVkKQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb0J1aWxkU3BlYyhTdHJpbmcgYnVpbGRlcklELCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhZGRUb0J1aWxkU3BlY0JlZm9yZShidWlsZGVySUQsIG51bGwsIHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBidWlsZGVyIHRvIHRoZSBidWlsZCBzcGVjIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCwgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIGJ1aWxkZXIuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkZXJJRAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBidWlsZGVyLgotCSAqIEBwYXJhbSBzdWNjZXNzb3JJRAotCSAqICAgICAgICAgICAgVGhlIGlkIHRvIHB1dCB0aGUgYnVpbGRlciBiZWZvcmUuCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBidWlsZGVyIGlkIHdhcyBhY3R1YWxseSBhZGRlZCAoaXQgbWF5IGhhdmUgYWxyZWFkeSBleGlzdGVkKQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb0J1aWxkU3BlY0JlZm9yZShTdHJpbmcgYnVpbGRlcklELCBTdHJpbmcgc3VjY2Vzc29ySUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVySUQpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZm91bmQpIHsKLQkJCWJvb2xlYW4gc3VjY2Vzc29yRm91bmQgPSBmYWxzZTsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBkZXNjcmlwdGlvbi5uZXdDb21tYW5kKCk7Ci0JCQljb21tYW5kLnNldEJ1aWxkZXJOYW1lKGJ1aWxkZXJJRCk7Ci0JCQlJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kW2NvbW1hbmRzLmxlbmd0aCArIDFdOwotCQkJZm9yIChpbnQgaiA9IDAsIGluZGV4ID0gMDsgaiA8IGNvbW1hbmRzLmxlbmd0aDsgaisrLCBpbmRleCsrKSB7Ci0JCQkJaWYgKHN1Y2Nlc3NvcklEICE9IG51bGwgJiYgY29tbWFuZHNbal0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoc3VjY2Vzc29ySUQpKSB7Ci0JCQkJCXN1Y2Nlc3NvckZvdW5kID0gdHJ1ZTsKLQkJCQkJbmV3Q29tbWFuZHNbaW5kZXgrK10gPSBjb21tYW5kOwotCQkJCX0KLQkJCQluZXdDb21tYW5kc1tpbmRleF0gPSBjb21tYW5kc1tqXTsKLQkJCX0KLQkJCWlmICghc3VjY2Vzc29yRm91bmQpCi0JCQkJbmV3Q29tbWFuZHNbbmV3Q29tbWFuZHMubGVuZ3RoIC0gMV0gPSBjb21tYW5kOwotCQkJZGVzY3JpcHRpb24uc2V0QnVpbGRTcGVjKG5ld0NvbW1hbmRzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQl9Ci0JCXJldHVybiAhZm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBidWlsZGVyIGZyb20gdGhlIGJ1aWxkIHNwZWMuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkZXJJRAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBidWlsZGVyLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBQcm9qZWN0IHRvIHJlbW92ZSBmcm9tLgotCSAqIEByZXR1cm4gYm9vbGVhbiBpZiB0aGUgYnVpbGRlciBpZCB3YXMgZm91bmQgYW5kIHJlbW92ZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRnJvbUJ1aWxkU3BlYyhTdHJpbmcgYnVpbGRlcklELCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlcklEKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmQpIHsKLQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoIC0gMV07Ci0JCQlpbnQgbmV3Q291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgewotCQkJCWlmICghKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKGJ1aWxkZXJJRCkpKSB7Ci0JCQkJCS8vQWRkIHRoZSBleGlzdG5nIHRvIHRoZSBuZXcgYXJyYXkKLQkJCQkJbmV3Q29tbWFuZHNbbmV3Q291bnRdID0gY29tbWFuZHNbaV07Ci0JCQkJCW5ld0NvdW50Kys7Ci0JCQkJfQotCQkJfQotCi0JCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0KLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgdGhlIGNvbnRhaW5lciBpcyBub3QgcmVhZC1vbmx5LgotCSAqIDxwPgotCSAqIEZvciBMaW51eCwgYSBSZXNvdXJjZSBjYW5ub3QgYmUgY3JlYXRlZCBpbiBhIFJlYWRPbmx5IGZvbGRlci4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgbmV3IGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgd29ya3NwYWNlIHJlc291cmNlIHRvIG1ha2UgcmVhZC93cml0ZQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVDb250YWluZXJOb3RSZWFkT25seShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgIXJlc291cmNlLmV4aXN0cygpKSB7IC8vaXQgbXVzdCBiZSBuZXcKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQlSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0ciA9IGNvbnRhaW5lci5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLQkJCXdoaWxlIChhdHRyICE9IG51bGwgJiYgIWF0dHIuaXNSZWFkT25seSgpKSB7Ci0JCQkJY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOwotCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJYXR0ciA9IGNvbnRhaW5lci5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBhdHRyICE9IG51bGwpCi0JCQkJYXR0ci5zZXRSZWFkT25seShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcHJvamVjdHMgZnJvbSBwcmltYXJ5IG5hdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmF0dXJlSUQKLQkgKiBAcmV0dXJuIEFsbCBwcm9qZWN0cyB0aGF0IGhhdmUgdGhlIGdpdmVuIG5hdHVyZSBpZCBhcyB0aGUgZmlyc3QgbmF0dXJlIGlkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRQcm9qZWN0c0ZvclByaW1hcnlOYXR1cmUoU3RyaW5nIG5hdHVyZUlEKSB7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHNXaXRoTmF0dXJlID0gbmV3IElQcm9qZWN0W10ge307Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0QWxsUHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlzUHJvamVjdFByaW1hcnlOYXR1cmUocHJvamVjdHNbaV0sIG5hdHVyZUlEKSkKLQkJCQlyZXN1bHQuYWRkKHByb2plY3RzW2ldKTsKLQkJfQotCQlyZXR1cm4gKElQcm9qZWN0W10pIHJlc3VsdC50b0FycmF5KHByb2plY3RzV2l0aE5hdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICogCi0JICogQHJldHVybiBhbGwgd29ya3NwYWNlIHByb2plY3RzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFByb2plY3RzKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgbmF0dXJlIGlkIHRoZSBwcmltYXJ5IG5hdHVyZSBpZCBmb3IgdGhlIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBuYXR1cmVJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlyc3QgbmF0dXJlIGlkIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0UHJpbWFyeU5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlSUQpIHsKLQkJU3RyaW5nW10gbmF0dXJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluYXR1cmVzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldE5hdHVyZUlkcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJfQotCQlyZXR1cm4gKG5hdHVyZXMgIT0gbnVsbCAmJiBuYXR1cmVzLmxlbmd0aCA+IDAgJiYgbmF0dXJlc1swXS5lcXVhbHMobmF0dXJlSUQpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIGNyZWF0ZVBhdGgoSVByb2plY3QgcCwgU3RyaW5nIGRlZmF1bHRTb3VyY2VOYW1lKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChwLmdldE5hbWUoKSk7Ci0JCXBhdGggPSBwYXRoLmFwcGVuZChkZWZhdWx0U291cmNlTmFtZSk7Ci0JCXBhdGggPSBwYXRoLm1ha2VBYnNvbHV0ZSgpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBleGlzdGluZyBmaWxlcyB3aGljaCB3aWxsIGJlIG1vZGlmaWVkIGlmIHRoZSBjbGFzc3BhdGggY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHByb2VqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBsaXN0IG9mIGFmZmVjdGVkIGZpbGVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRGaWxlc0FmZmVjdGVkQnlDbGFzc3BhdGhDaGFuZ2UoSVByb2plY3QgcCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCWFkZEZpbGVJZkV4aXN0cyhwLCByZXN1bHQsIERPVF9DTEFTU1BBVEgpOwotCQlhZGRGaWxlSWZFeGlzdHMocCwgcmVzdWx0LCBET1RfUFJPSkVDVCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZEZpbGVJZkV4aXN0cyhJUHJvamVjdCBwLCBMaXN0IGFMaXN0LCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkJSUZpbGUgYUZpbGUgPSBwLmdldEZpbGUoZmlsZW5hbWUpOwotCQlpZiAoYUZpbGUgIT0gbnVsbCAmJiBhRmlsZS5leGlzdHMoKSkKLQkJCWFMaXN0LmFkZChhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3RyaXAgb2ZmIGEgbGVhZGluZyAiLyIgZnJvbSBlYWNoIHByb2plY3QgbmFtZSBpbiB0aGUgYXJyYXksIGlmIGl0IGhhcyBvbmUuCi0JICogCi0JICogQHBhcmFtIHByb2plY05hbWVzCi0JICogQHJldHVybiBhcnJheSBvZiBwcm9qZWN0IG5hbWVzIHdpdGggYWxsIGxlYWRpbmcgJy8nIHJlbW92ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9qZWN0TmFtZXNXaXRob3V0Rm9yd2FyZFNsYXNoKFN0cmluZ1tdIHByb2plY05hbWVzKSB7Ci0JCVN0cmluZ1tdIHByb2pOYW1lcyA9IG5ldyBTdHJpbmdbcHJvamVjTmFtZXMubGVuZ3RoXTsKLQkJTGlzdCB0ZW1wID0gamF2YS51dGlsLkFycmF5cy5hc0xpc3QocHJvamVjTmFtZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXAuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgKHRlbXAuZ2V0KGkpKTsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcHJvak5hbWVzW2ldID0gbmFtZS5zdWJzdHJpbmcoMSwgbmFtZS5sZW5ndGgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXByb2pOYW1lc1tpXSA9IG5hbWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2pOYW1lczsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBjcmVhdGVGaWxlVVJMKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwYXRoLnRvRmlsZSgpLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGZpcnN0IG5ld09iamVjdCB0aGF0IGlzIG5vdCBpbiB0aGUgb2xkT2JqZWN0cyBhcnJheSAodXNpbmcgIj09IikuCi0JICogCi0JICogQHBhcmFtIG9sZE9iamVjdHMKLQkgKiBAcGFyYW0gbmV3T2JqZWN0cwotCSAqIEByZXR1cm4gZmlyc3QgbmV3T2JqZWN0IG5vdCBmb3VuZCBpbiBvbGRPYmplY3RzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbGwgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KE9iamVjdFtdIG9sZE9iamVjdHMsIE9iamVjdFtdIG5ld09iamVjdHMpIHsKLQkJaWYgKG9sZE9iamVjdHMgIT0gbnVsbCAmJiBuZXdPYmplY3RzICE9IG51bGwgJiYgb2xkT2JqZWN0cy5sZW5ndGggPCBuZXdPYmplY3RzLmxlbmd0aCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCU9iamVjdCBvYmplY3QgPSBuZXdPYmplY3RzW2ldOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkT2JqZWN0cy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAob2xkT2JqZWN0c1tqXSA9PSBvYmplY3QpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZm91bmQpCi0JCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9sZE9iamVjdHMgPT0gbnVsbCAmJiBuZXdPYmplY3RzICE9IG51bGwgJiYgbmV3T2JqZWN0cy5sZW5ndGggPT0gMSkKLQkJCXJldHVybiBuZXdPYmplY3RzWzBdOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0IG9mIGFsbCBmaWxlcyBpbiB0aGUgcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzIGlzIHRvIHVzZSB7QGxpbmsgSVJlc291cmNlI2FjY2VwdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3IsIGludCl9Ci0JICogCi0JICogQHBhcmFtIDEuMC4wCi0JICogQHJldHVybiBsaXN0IG9mIGZpbGVzIGluIHRoZSBwcm9qZWN0Ci0JICogCi0JICogQHNlZSBJUmVzb3VyY2UjYWNjZXB0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvciwgaW50KQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9qZWN0RmlsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBjb2xsZWN0RmlsZXMocHJvamVjdC5tZW1iZXJzKCksIHJlc3VsdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBjb2xsZWN0RmlsZXMoSVJlc291cmNlW10gbWVtYmVycywgTGlzdCByZXN1bHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcmVjdXJzaXZlbHkgY29sbGVjdCBmaWxlcyBmb3IgdGhlIGdpdmVuIG1lbWJlcnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gbWVtYmVyc1tpXTsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJY29sbGVjdEZpbGVzKCgoSUZvbGRlcikgcmVzKS5tZW1iZXJzKCksIHJlc3VsdCk7Ci0JCQl9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJcmVzdWx0LmFkZChyZXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEByZXR1cm4gYSBJUHJvamVjdCBnaXZlbiB0aGUgcHJvamVjdE5hbWUKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBidWlsZGVyIG5hbWUgaXMgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gYnVpbGRlck5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGJ1aWxkZXIgbmFtZSBpcyBhdHRhY2hlZCB0byB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgYnVpbGRlck5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlDb21tYW5kW10gYnVpbGRlcnMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0QnVpbGRTcGVjKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbW1hbmQgYnVpbGRlciA9IGJ1aWxkZXJzW2ldOwotCQkJCWlmIChidWlsZGVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1aWxkZXIuZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlck5hbWUpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3MDc4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUmVzb3VyY2VIYW5kbGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogSW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBwcm92aWRlIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgb24gcmVzb3VyY2Ugc2V0LiBTdWNoIGFzIGxvb2tpbmcgb3IgY3JlYXRpbmcgaW4gb3RoZXIgcmVzb3VyY2Ugc2V0cyBmb3IgYQotICogcmVzb3VyY2Ugb3IgYW4gRU9iamVjdC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCNhZGQoUmVzb3VyY2VIYW5kbGVyKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VIYW5kbGVyIHsKLQotCS8qKgotCSAqIEVhY2ggUmVzb3VyY2VIYW5kbGVyIGZvciBhIFdvcmtiZW5jaENvbnRleHQgKHdoaWNoIGhvbGRzIGEgUHJvamVjdFJlc291cmNlU2V0KSB3aWxsIGdldCBhbiBvcG9ydHVuaXR5IHRvIGdldCB0aGUgUmVzb3VyY2UgZ2l2ZW4gdGhlIHVyaVN0cmluZwotCSAqIHByaW9yIHRvIHRoZSBvcmlnaW5hdGluZ1Jlc291cmNlU2V0IGdldHRpbmcgaXQgaW4gdGhlIG5vcm1hbCBtYW5uZXIuCi0JICogCi0JICogSWYgdGhpcyBoYW5kbGVyIGxvYWRlZCBhIFJlc291cmNlIGluIGl0cyBjcmVhdGUoUmVzb3VyY2VTZXQsIHVyaVN0cmluZykgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYWJsZSB0byByZXR1cm4gaXQgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luYXRpbmdSZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIHJlc291cmNlIGlmIGZvdW5kIG9yIDxjb2RlPm51bGxsL2NvZGU+IGlmIHRoaXMgaGFuZGxlciBkaWRuJ3QgZmluZCBpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlSZXNvdXJjZSBnZXRSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKTsKLQotCS8qKgotCSAqIEdldCB0aGUgRU9iamVjdCBmb3IgdGhlIGdpdmVuIFVSSSwgaWYgaXQgY2FuLiBMb2FkIHRoZSByZXNvdXJjZSBpZiBsb2FkT25EZW1hbmQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB1cmkgb2YgRU9iamVjdCBiZWluZyByZXF1ZXN0ZWQKLQkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiByZXNvdXJjZSBzaG91bGQgYmUgbG9hZGVkCi0JICogQHJldHVybiBlb2JqZWN0IGlmIGZvdW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdC4KLQkgKi8KLQlFT2JqZWN0IGdldEVPYmplY3RGYWlsZWQoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSByZXNvdXJjZSBwb2ludGVkIHRvIGJlIHRoZSBVUkkgaWYgdGhpcyBoYW5kbGVyIHdpbGwgaGFuZGxlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hdGluZ1Jlc291cmNlU2V0Ci0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2UgaWYgY3JlYXRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaGFuZGxlciBkb2Vzbid0IGhhbmRsZSB0aGlzIHR5cGUuCi0JICovCi0JUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhY2RlMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjcgJCQgICQkRGF0ZTogMjAwOS8xMi8yMSAxOTozMDo0MCAkJCAKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIFN5bmNocm9uaXplciBvbiB0aGUgd29ya2JlbmNoLiBJdCBsaXN0ZW5zIGZvciB0aGUgcHJvamVjdCB0byBzZWUgaWYgaXQgaXMgY2xvc2VkIG9yIGRlbGV0ZWQuIElmIGl0IGRvZXMgaXQgbm90aWZpZXMgdGhpcyBvdXQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCS8qKiBFeHRlbmRlcnMgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIGFmdGVyIGEgcHJlIGJ1aWxkIHJlc291cmNlIGNoYW5nZSAqLwotCXByb3RlY3RlZCBTZXQgZXh0ZW5kZXJzOwotCi0JLyoqIFRoZSBkZWx0YSBmb3IgdGhpcyBwcm9qZWN0IHRoYXQgd2lsbCBiZSBicm9hZGNhc3QgdG8gdGhlIGV4dGVuZGVycyAqLwotCXByb3RlY3RlZCBJUmVzb3VyY2VEZWx0YSBjdXJyZW50UHJvamVjdERlbHRhOwotCi0JcHJpdmF0ZSBpbnQgY3VycmVudEV2ZW50VHlwZSA9IC0xOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgdGFraW5nIGEgcmVzb3VyY2Ugc2V0IGFuZCBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXNvdXJjZVNldCA9IGFSZXNvdXJjZVNldDsKLQkJcHJvamVjdCA9IGFQcm9qZWN0OwotCQlpZiAoYVJlc291cmNlU2V0ICE9IG51bGwgJiYgYVJlc291cmNlU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQotCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIGFSZXNvdXJjZVNldCkuc2V0U3luY2hyb25pemVyKHRoaXMpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGZvciB0aGlzIHN5bmNocm9uaXplcgotCSAqIAotCSAqIEByZXR1cm4gcHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQljdXJyZW50RXZlbnRUeXBlID0gZXZlbnQuZ2V0VHlwZSgpOwotCQljdXJyZW50UHJvamVjdERlbHRhID0gbnVsbDsKLQkJaWYgKChjdXJyZW50RXZlbnRUeXBlID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8fCBjdXJyZW50RXZlbnRUeXBlID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpCi0JCQkJJiYgZXZlbnQuZ2V0UmVzb3VyY2UoKS5lcXVhbHMoZ2V0UHJvamVjdCgpKSkgewotCQkJbm90aWZ5RXh0ZW5kZXJzT2ZDbG9zZSgpOwotCQkJcmVsZWFzZSgpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5RXh0ZW5kZXJzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChjdXJyZW50RXZlbnRUeXBlICE9IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIHx8IGV4dGVuZGVycyA9PSBudWxsIHx8IGN1cnJlbnRQcm9qZWN0RGVsdGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGV4dGVuZGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJU3luY2hyb25pemVyRXh0ZW5kZXIgZXh0ZW5kZXIgPSAoSVN5bmNocm9uaXplckV4dGVuZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlleHRlbmRlci5wcm9qZWN0Q2hhbmdlZChjdXJyZW50UHJvamVjdERlbHRhKTsJCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5RXh0ZW5kZXJzT2ZDbG9zZSgpIHsKLQkJaWYgKGV4dGVuZGVycyAhPSBudWxsICYmICFleHRlbmRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXh0ZW5kZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlJU3luY2hyb25pemVyRXh0ZW5kZXIgZXh0ZW5kZXIgPSAoSVN5bmNocm9uaXplckV4dGVuZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZXh0ZW5kZXIucHJvamVjdENsb3NlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywKLQkJCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhlIHN5bmNocm9uaXplci4gQ2FsbGVkIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGlzIGdvaW5nIGF3YXkgc28gd2UgbmVlZCB0byBjbGVhbnVwIG91cnNlbGYgYW5kIHRoZSBSZXNvdXJjZVNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoSkVNVXRpbFBsdWdpbi5pc0FjdGl2YXRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkKLQkJCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5yZWxlYXNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLnJlbW92ZUNhY2hlZFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gZXh0ZW5kZXIgdG8gYmUgbm90aWZpZWQgb2YgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbmRlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRFeHRlbmRlcihJU3luY2hyb25pemVyRXh0ZW5kZXIgZXh0ZW5kZXIpIHsKLQkJaWYgKGV4dGVuZGVycyA9PSBudWxsKQotCQkJZXh0ZW5kZXJzID0gbmV3IEhhc2hTZXQoMyk7Ci0JCWV4dGVuZGVycy5hZGQoZXh0ZW5kZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBleHRlbmRlciBmcm9tIG5vdGlmaWNhdGlvbiBvZiBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGV4dGVuZGVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRXh0ZW5kZXIoSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyKSB7Ci0JCWlmIChleHRlbmRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZXh0ZW5kZXJzLnJlbW92ZShleHRlbmRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnKCcgKyAoKGdldFByb2plY3QoKSAhPSBudWxsKSA/IGdldFByb2plY3QoKS5nZXROYW1lKCkgOiAibnVsbCIpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVsbCBTeW5jaHJvbml6ZXIgdGhhdCBhIGZpbGUgaXMgYWJvdXQgdG8gYmUgc2F2ZWQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gd3JpdGluZyB0byBhbiBJRmlsZSBmcm9tIGFuIEVNRiByZXNvdXJjZS4KLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGRvZXMgbm90aGluZywgYnV0IHN1YmNsYXNzZXMgY2FuIGRvIHNvbWV0aGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogICAgICAgICAgICBmaWxlIGFib3V0IHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHByZVNhdmUoSUZpbGUgYUZpbGUpIHsKLQkJLy9EZWZhdWx0IGlzIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzJmNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotCi0vKioKLSAqIEJ5dGVBcnJheSBPdXRwdXRTdHJlYW0gZm9yIHRoZSBXb3JrYmVuY2guIEl0IHdvcmtzIHdpdGggdGhlIHN5bmNocm9uaXplciB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcn10bwotICogbm90aWZ5IG9mIGEgc2F2ZS4gSXQgYWxzbyBjaGFuZ2VzIGFsbCBvZiB0aGUgbGluZSBzZXBhcmF0b3JzIHRvIHRoZSBjdXJyZW50IHN5c3RlbSBsaW5lIHNlcGFyYXRvciwgaS5lLiBpZiB0aGVyZSBhcmUgc29tZSAnXHInIGFuZCB3ZSBhcmUgb24KLSAqIFdpbmRvd3MoUikgdGhlbiB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvICdcblxyJyksIGlmIHRoZSBzZXR0aW5nIGZvciB0aGUgc3RyZWFtIGlzIHRvIGRvIGVvbCBjb252ZXJzaW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwuUGxhdGZvcm1SZXNvdXJjZU91dHB1dFN0cmVhbSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkNvbnZlcnRFT0wgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBJRmlsZQotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oSUZpbGUgYUZpbGUpIHsKLQkJdGhpcyhhRmlsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBJRmlsZSBhbmQgYSBzeW5jaHJvbml6ZXIuIFRoaXMgd2F5IHN5bmNocm9uaXplciB3aWxsIGtub3cgd2hlbiBmaWxlIGlzIGFib3V0IHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShJRmlsZSBhRmlsZSwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgewotCQlzdXBlcihhRmlsZSwgZmFsc2UsIHRydWUsIG51bGwpOwotCQlzeW5jaHJvbml6ZXIgPSBhU3luY2hyb25pemVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQotCQkJc3luY2hyb25pemVyLnByZVNhdmUoZmlsZSk7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsLlBsYXRmb3JtUmVzb3VyY2VPdXRwdXRTdHJlYW0jZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQotCQkJc3luY2hyb25pemVyLnByZVNhdmUoZmlsZSk7Ci0JCXN1cGVyLmZsdXNoKCk7Ci0JfQotCi0JLyoKLQkgKiBDb252ZXJ0IHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzLgotCSAqLwotCXByaXZhdGUgaW50IGNvbnZlcnRFT0woYnl0ZVtdIGRhdGEpIHsKLQkJLy8gQWxnb3JpdGhtOgotCQkvLyBSZW1vdmUgYWxsICdccicgY2hhcnMKLQkJLy8gUmVwbGFjZSBhbGwgJ1xuJyBjaGFycyB3aXRoIGxpbmUgc2VwZXJhdG9yIGNoYXJzCi0KLQkJU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJYnl0ZVtdIEVPTEJ5dGVzID0gRU9MLmdldEJ5dGVzKCk7Ci0KLQkJaW50IG91dCA9IDA7Ci0KLQkJZm9yIChpbnQgaW4gPSAwOyBpbiA8IGRhdGEubGVuZ3RoOyBpbisrKSB7Ci0JCQlpZiAoZGF0YVtpbl0gPT0gJ1xyJykgewotCQkJCS8vIGRvbid0IG91dHB1dCAoaWUsIHRocm93IHRoZSBjaGFyIGF3YXkpCi0JCQl9IGVsc2UgaWYgKGRhdGFbaW5dID09ICdcbicpIHsKLQkJCQkvLyBUaGUgY29kZSBkb2VzIG5vdCBjdXJyZW50bHkgaGFuZGxlIGV4cGFuZGluZyB0aGUgYXJyYXkKLQkJCQlpZiAoKGluIC0gb3V0ICsgMSkgPCBFT0xCeXRlcy5sZW5ndGgpCi0JCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOiBFeHBhbmRpbmcgRU9MIGNoYXJzIG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEVPTEJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWRhdGFbb3V0KytdID0gRU9MQnl0ZXNbaV07Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBKdXN0IGNvcHkgdGhlIGRhdGEKLQkJCQlkYXRhW291dCsrXSA9IGRhdGFbaW5dOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG91dDsKLQl9Ci0KLQkvKioKLQkgKiBJcyBFT0wgY29udmVyc2lvbiB0dXJuZWQgb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBFT0wgY29udmVyc2lvbiBpcyB0dXJuZWQgb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb252ZXJ0RU9MQ2hhcnMoKSB7Ci0JCXJldHVybiBmQ29udmVydEVPTDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIEVPTCBjb252ZXJzaW9uIGZsYWcuCi0JICogCi0JICogQHBhcmFtIHNldAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgRU9MIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gY3VycmVudCBsaW5lIHNlcGFyYXRvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0RU9MQ2hhcnMoYm9vbGVhbiBzZXQpIHsKLQkJZkNvbnZlcnRFT0wgPSBzZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN0b0J5dGVBcnJheSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBieXRlW10gdG9CeXRlQXJyYXkoKSB7Ci0JCWJ5dGVbXSBjb250ZW50cyA9IHN1cGVyLnRvQnl0ZUFycmF5KCk7Ci0JCWlmIChpc0NvbnZlcnRFT0xDaGFycygpKQotCQkJY29udmVydEVPTChjb250ZW50cyk7Ci0JCXJldHVybiBjb250ZW50czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyNjIzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjYgJCQgICQkRGF0ZTogMjAwOC8wMy8xMiAxNDoyMTozOSAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBXb3JrYmVuY2ggcmVzb3VyY2UgaGVscGVyCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlIHsKLQotCS8qKgotCSAqIEV2ZXJ5dGhpbmcgaXMgc3RhdGljLCBkb24ndCBrbm93IHdoeSB0aGVyZSBpcyBhbiBpbnN0YW5jZSBoZXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlIElOU1RBTkNFID0gbmV3IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIgd29ya3NwYWNlVVJJTG9hZGVyID0gbmV3IFdvcmtzcGFjZVJlc291cmNlSGFuZGxlcigpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc29sdmVDb250YWluZWRQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUxpc3QgY29udGFpbmVkID0gcmVmT2JqZWN0LmVDb250ZW50cygpOwotCQlFT2JqZWN0IG1vZk9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZWQuc2l6ZSgpOyBpKyspIHsKLQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSBjb250YWluZWQuZ2V0KGkpOwotCQkJcmVzb2x2ZVByb3hpZXMobW9mT2JqZWN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZXNvbHZlTm9uQ29udGFpbmVkUHJveGllcyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlMaXN0IHJlZmVyZW5jZXMgPSByZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIHJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKCFyZWZlcmVuY2UuaXNDb250YWlubWVudCgpKSB7Ci0JCQkJaWYgKHJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IHZhbHVlID0gKExpc3QpIHJlZk9iamVjdC5lR2V0KHJlZmVyZW5jZSk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmFsdWUuc2l6ZSgpOyBqKyspCi0JCQkJCQl2YWx1ZS5nZXQoaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIHByb3hpZXMgd2l0aCA8Y29kZT5yZXNvdXJjZTwvY29kZT4gdG8gYmUgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVQcm94aWVzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlMaXN0IHRvcExldmVscyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCQlFT2JqZWN0IG1vZk9iamVjdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9wTGV2ZWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIHRvcExldmVscy5nZXQoaSk7Ci0JCQkJcmVzb2x2ZVByb3hpZXMobW9mT2JqZWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgcHJveGllcyB0aGF0IGFyZSBjb250YWluZWQgYnkgdGhlIDxjb2RlPnJlc291cmNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgcHJveGllcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2F0aGVyUHJveGllcyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdG9wTGV2ZWxzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJaW50IHNpemUgPSB0b3BMZXZlbHMuc2l6ZSgpOwotCQlFT2JqZWN0IG1vZk9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSB0b3BMZXZlbHMuZ2V0KGkpOwotCQkJZ2F0aGVyUHJveGllcygoSW50ZXJuYWxFT2JqZWN0KSBtb2ZPYmplY3QsIGxpc3QpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnYXRoZXJQcm94aWVzKEludGVybmFsRU9iamVjdCByZWZPYmplY3QsIExpc3QgcHJveGllcykgewotCQlpZiAocmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3QgY29udGFpbnMgPSByZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQlpZiAoY29udGFpbnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjb250YWlucy5zaXplKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGNvbnRhaW5zLmdldChpKTsKLQkJCQlnYXRoZXJQcm94aWVzKHJlZk9iamVjdCwgc2YsIHByb3hpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdhdGhlclByb3hpZXMoSW50ZXJuYWxFT2JqZWN0IHJlZk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIHNmLCBMaXN0IHByb3hpZXMpIHsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJSW50ZXJuYWxFT2JqZWN0IHByb3h5ID0gbnVsbDsKLQkJaWYgKHNmLmlzTWFueSgpIHx8IHJlZk9iamVjdC5lSXNTZXQoc2YpKSB7Ci0JCQl2YWx1ZSA9IHJlZk9iamVjdC5lR2V0KHNmLCBmYWxzZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWlmIChzZi5pc01hbnkoKSkgewotCQkJCQlJdGVyYXRvciBqID0gKChJbnRlcm5hbEVMaXN0KSB2YWx1ZSkuYmFzaWNJdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoai5oYXNOZXh0KCkpIHsKLQkJCQkJCXByb3h5ID0gKEludGVybmFsRU9iamVjdCkgai5uZXh0KCk7Ci0JCQkJCQlpZiAocHJveHkuZUlzUHJveHkoKSkKLQkJCQkJCQlwcm94aWVzLmFkZChwcm94eSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCgoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZSkuZUlzUHJveHkoKSkKLQkJCQkJcHJveGllcy5hZGQodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc29sdmVQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCWlmIChyZWZPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzb2x2ZU5vbkNvbnRhaW5lZFByb3hpZXMocmVmT2JqZWN0KTsKLQkJCXJlc29sdmVDb250YWluZWRQcm94aWVzKHJlZk9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc3RpbmcgY29udGV4dCBiYXNlIG9uIDxjb2RlPmFQcm9qZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IGJhc2UgZm9yIHRoZSBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBnZXRFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5JTlNUQU5DRS5nZXRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByZXNvdXJjZSBmcm9tIHRoZSBVUkkuIFRoZSBVUkkgbXVzdCBjb250YWluIHRoZSBwcm9qZWN0IG5hbWUsIGVpdGhlciBhcyB0aGUgZmlyc3Qgc2VnbWVudCwgb3IgaWYgaW4gcGxhdGZvcm0gcmVzb3VyY2UgdXJsIHByb3RvY29sLgotCSAqIHtAbGluayAjZ2V0UmVzb3VyY2VTZXQoVVJJKX0KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBhIG5ldyByZXNvdXJjZSBmb3IgdGhlIHVyaSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYSBwcm9qZWN0IHVyaQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldCh1cmkpOwotCQlpZiAoc2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBhIGNhY2hlZCBSZXNvdXJjZSBmb3IgdGhlIGdpdmVuIFVSSSwgaWYgbm9uZSBpcyBmb3VuZCwgY3JlYXRlIGEgbmV3IFJlc291cmNlIGZvciB3aXRoIHRoZSBVUkkgYWdhaW5zdCB0aGUgcHJvcGVyIFJlc291cmNlU2V0LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgVGhlIFVSSSBNVVNUIGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4uIiB0eXBlIFVSSSBvciBpdAotCSAqIG11c3QgYmUgb2YgdHlwZSAicHJvamVjdC1uYW1lLy4uLiIuIFRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gcmVzb3VyY2VzIHRoYXQgYXJlIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlcy4KLQkgKiBBbnkgb3RoZXIgdHlwZSBvZiBVUkkgd2lsbCBjYXVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byBiZSByZXR1cm5lZC4KLQkgKiBAcmV0dXJuIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIHByb2plY3QgdXJpLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZSh1cmksIGdldFJlc291cmNlU2V0KHVyaSkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIElGaWxlIGZvciB0aGUgVVJJLiBUaGUgVVJJIG11c3QgYmUgYSB3b3JrYmVuY2ggcHJvamVjdCBzdHlsZSBVUkkuIAotCSAqIEBwYXJhbSB1cmkgVGhlIFVSSSBNVVNUIGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4uIiB0eXBlIFVSSSBvciBpdAotCSAqIG11c3QgYmUgb2YgdHlwZSAicHJvamVjdC1uYW1lLy4uLiIuIFRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gcmVzb3VyY2VzIHRoYXQgYXJlIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlcy4KLQkgKiBBbnkgb3RoZXIgdHlwZSBvZiBVUkkgd2lsbCBjYXVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byBiZSByZXR1cm5lZC4KLQkgKiBAcmV0dXJuIHRoZSBJRmlsZSBpZiB0aGUgVVJJIGlzIGEgcHJvamVjdCBmb3JtLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYSBwcm9qZWN0IGZvcm0sIE9SIHRoZSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QuIFRoZSBJRmlsZSByZXR1cm5lZCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGV4aXN0LiBVc2Uge0BsaW5rIElGaWxlI2V4aXN0cygpfSB0byB0ZXN0IHRoYXQuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRJRmlsZShVUkkgdXJpKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHVyaSk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGg7Ci0JCQlpZiAoaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKLQkJCQkvLyBOZWVkIHRvIGdldCB0aGUgcGF0aCBhbmQgcmVtb3ZlIHRoZSBmaXJzdCB0d28gc2VnbWVudHMgKC9yZXNvdXJjZS9wcm9qZWN0IG5hbWUvKS4KLQkJCQlwYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gTmVlZCB0byBnZXQgdGhlIHBhdGggYW5kIHJlbW92ZSB0aGUgZmlyc3Qgc2VnbWVudCAoL3Byb2plY3QgbmFtZS8pLgotCQkJCXBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJfQotCQkJcmV0dXJuIHByb2plY3QuZ2V0RmlsZShwYXRoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYSBjYWNoZWQgUmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBVUkksIGlmIG5vbmUgaXMgZm91bmQsIGNyZWF0ZSBhIG5ldyBSZXNvdXJjZSBmb3Igd2l0aCB0aGUgVVJJIGFnYWluc3QgdGhlIGdpdmVuIFJlc291cmNlU2V0LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgCi0JICogQHBhcmFtIHNldAotCSAqIEByZXR1cm4gcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgc2V0IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmVzID0gc2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCQlyZXR1cm4gcmVzOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBvciBleGlzdGluZyBjb250ZXh0IGJhc2Ugb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LiBBbGxvdyB0aGUgPGNvZGU+Y29udHJpYnV0b3I8L2NvZGU+IHRvIGNvbnRyaWJ1dGUgdG8gdGhlIG5ldyBvciBleGlzdGluZwotCSAqIG5hdHVyZSBwcmlvciB0byByZXR1cm5pbmcuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIGNvbnRyaWJ1dG9yCi0JICogQHJldHVybiB0aGUgY29udGV4dCBiYXNlIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJcmV0dXJuIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZUVNRkNvbnRleHQoYVByb2plY3QsIGNvbnRyaWJ1dG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIHRoZSBwYXNzZWQgVVJJIGhhdmUgdGhlIGZvcm0gcGxhdGZvcm06L3Jlc291cmNlLy4uLiA/Ci0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgYSBwbGF0Zm9ybSByZXNvdXJjZSBwcm90b2NvbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybVJlc291cmNlVVJJKFVSSSB1cmkpIHsKLQkJcmV0dXJuIEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUFJPVE9DT0wuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5lcXVhbHModXJpLnNlZ21lbnQoMCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXBpIG1heSBiZSB1c2VkIHRvIGNhY2hlIGEgUmVzb3VyY2UgaWYgaXQgaGFzIGEgVVJJIHRoYXQgaXMgV29ya3NwYWNlIHJlbGF0aXZlLiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBjYWNoZWQuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgd2FzIHN1Y2Nlc3NmdWwgdG8gY2FjaGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhY2hlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2VTZXQoYVJlc291cmNlLmdldFVSSSgpKTsKLQkJCWlmIChzZXQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc2V0LmdldFJlc291cmNlcygpLmFkZChhUmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFwaSBpcyB1c2VkIGlmIHlvdSBjcmVhdGUgYSBuZXcgTU9GIHJlc291cmNlIGFuZCB5b3Ugd2FudCB0byBhZGQgaXQgdG8gdGhlIGNvcnJlY3QgUmVzb3VyY2VTZXQuIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWQgdGhlIElQcm9qZWN0Ci0JICogdGhhdCB5b3Ugd2FudCBhUmVzb3VyY2UgdG8gYmUgY2FjaGVkIHdpdGhpbiBhcyB3ZWxsIGFzIHRoZSBJUGF0aCB3aGljaCBpcyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IFJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiBAcGFyYW0gZnVsbFBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlc291cmNlIHdhcyBjYWNoZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhY2hlUmVzb3VyY2UoSVByb2plY3QgYVByb2plY3QsIFJlc291cmNlIGFSZXNvdXJjZSwgSVBhdGggZnVsbFBhdGgpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwgfHwgYVJlc291cmNlID09IG51bGwgfHwgIWFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldChhUHJvamVjdCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJVVJJIGNvbnZlcnRlZCA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUoYVJlc291cmNlLmdldFVSSSgpKTsKLQkJCWlmIChjb252ZXJ0ZWQgIT0gYVJlc291cmNlLmdldFVSSSgpKQotCQkJCWFSZXNvdXJjZS5zZXRVUkkoY29udmVydGVkKTsKLQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGF0aCBvZiB0aGUgcHJvamVjdCByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIG9yIHJlbGF0aXZlIHRvIHRoZSBsaXN0IG9mIGNvbnRhaW5lcnMgaW4gdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiBAcmV0dXJuIHBhdGgKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3R1YWxQcm9qZWN0UmVsYXRpdmVVUkkoSVJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlID09IG51bGwgfHwgIWFSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gYVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IGdldFBhdGhJblByb2plY3QocHJvamVjdCwgYVJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQlyZXR1cm4gcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBJUGF0aCB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvYWQgYSBSZXNvdXJjZSB1c2luZyB0aGUgPGNvZGU+ZnVsbFBhdGg8L2NvZGU+LiBUaGlzIHdpbGwgYmUgYSBwcm9qZWN0IHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gZnVsbFBhdGgKLQkgKiBAcmV0dXJuIHBhdGgKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFBhdGhJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSVBhdGggZnVsbFBhdGgpIHsKLQkJTGlzdCBjb250YWluZXJzID0gZ2V0UHJvamVjdFVSSUNvbnZlcnRlckNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCWlmICghY29udGFpbmVycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZ2V0UGF0aEZyb21Db250YWluZXJzKGNvbnRhaW5lcnMsIGZ1bGxQYXRoKTsKLQkJcmV0dXJuIGZ1bGxQYXRoOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRQcm9qZWN0VVJJQ29udmVydGVyQ29udGFpbmVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIG5hdHVyZSA9IGNyZWF0ZUVNRkNvbnRleHQocHJvamVjdCwgbnVsbCk7Ci0JCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJV29ya2JlbmNoVVJJQ29udmVydGVyIGNvbnYgPSAoV29ya2JlbmNoVVJJQ29udmVydGVyKSBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ICE9IG51bGwpCi0JCQkJcmV0dXJuIGNvbnYuZ2V0SW5wdXRDb250YWluZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBwYXRoIGlzIGNvbnRhaW5lZCB3aXRoaW4gb25lIG9mIHRoZSBsaXN0ZWQgY29udGFpbmVycywgdGhlbiByZXR1cm4gdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVycwotCSAqIEBwYXJhbSBmdWxsUGF0aAotCSAqIEByZXR1cm4gcGF0aCByZWxhdGl2ZSB0byBhIGNvbnRhaW5lciwgb3IgdW5jaGFuZ2VkIHBhdGggaWYgbm90IGluIGEgY29udGFpbmVyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGF0aEZyb21Db250YWluZXJzKExpc3QgY29udGFpbmVycywgSVBhdGggZnVsbFBhdGgpIHsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotCQlJUGF0aCByZXN1bHQ7Ci0JCWludCBzaXplID0gY29udGFpbmVycy5zaXplKCk7Ci0JCWludCBtYXRjaGluZyA9IC0xOwotCQlJUGF0aCBjb250YWluZXJQYXRoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29udGFpbmVyID0gKElDb250YWluZXIpIGNvbnRhaW5lcnMuZ2V0KGkpOwotCQkJY29udGFpbmVyUGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotCQkJbWF0Y2hpbmcgPSBmdWxsUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoY29udGFpbmVyUGF0aCk7Ci0JCQlpZiAobWF0Y2hpbmcgPiAwICYmIG1hdGNoaW5nID09IGNvbnRhaW5lclBhdGguc2VnbWVudENvdW50KCkpIHsKLQkJCQlyZXN1bHQgPSBmdWxsUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKG1hdGNoaW5nKTsKLQkJCQlyZXN1bHQgPSByZXN1bHQubWFrZVJlbGF0aXZlKCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZnVsbFBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIDxjb2RlPnVyaTwvY29kZT4gaGFzIGl0cyBjb250YWluZXIgc2VnbWVudHMgdmlzaWJsZSBmcm9tIHRoZSBpbnB1dCBjb250YWluZXJzIGZvciB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXJpIGlzIHZpc2libGUgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udGFpbmVyU3RydWN0dXJlKElQcm9qZWN0IHByb2plY3QsIFVSSSB1cmkpIHsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiB1cmkgIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVyaS50b1N0cmluZygpKTsKLQkJCUxpc3QgY29udGFpbmVycyA9IGdldFByb2plY3RVUklDb252ZXJ0ZXJDb250YWluZXJzKHByb2plY3QpOwotCQkJaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7Ci0JCQlJUGF0aCBjb250YWluZXJQYXRoID0gc2VnbWVudENvdW50ID4gMSA/IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpIDogbnVsbDsKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVycy5zaXplKCk7IGkrKykgewotCQkJCWNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBjb250YWluZXJzLmdldChpKTsKLQkJCQlpZiAoIWNvbnRhaW5lci5pc0FjY2Vzc2libGUoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHNlZ21lbnRDb3VudCA9PSAxKSB7Ci0JCQkJCWlmIChjb250YWluZXIgPT0gcHJvamVjdCkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29udGFpbmVyUGF0aCAhPSBudWxsKSB7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gY29udGFpbmVyLmdldEZvbGRlcihjb250YWluZXJQYXRoKTsKLQkJCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIGZvbGRlci5pc0FjY2Vzc2libGUoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBmb3IgdGhlIHVyaS4gVGhlIFVSSSBNVVNUIGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4uIiB0eXBlIFVSSSBvciBpdAotCSAqIG11c3QgYmUgb2YgdHlwZSAicHJvamVjdC1uYW1lLy4uLiIuIFRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gcmVzb3VyY2VzIHRoYXQgYXJlIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlcy4KLQkgKiBBbnkgb3RoZXIgdHlwZSBvZiBVUkkgd2lsbCBjYXVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byBiZSByZXR1cm5lZC4gSXQgd2lsbCBiZSBsb2FkZWQgaWYgbm90IGFscmVhZHkgbG9hZGVkLiBJZiBpdCBpcyBub3QgdG8KLQkgKiBiZSBsb2FkZWQgaWYgbm90IGxvYWRlZCB1c2Uge0BsaW5rICNnZXRSZXNvdXJjZShVUkksIGJvb2xlYW4pfSBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSB1cmkgbXVzdCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uIiBmb3JtIG9yIGl0IG11c3QgYmUgInByb2plY3QtbmFtZS8uLi4iLiBBbnkgb3RoZXIgZm9ybSB3aWxsIGJlIGludmFsaWQuCi0JICogQHJldHVybiByZXNvdXJjZSBpZiB1cmkgaXMgZm9yIGEgdmFsaWQgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvamVjdCBub3QgZm91bmQgb3Igbm90IGEgdmFsaWQgcHJvamVjdCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFdyYXBwZWRFeGNlcHRpb24gaWYgdmFsaWQgcHJvamVjdCBmb3JtYXQgVVJJIGJ1dCBmaWxlIG5vdCBmb3VuZCBvciBzb21lIG90aGVyIGVycm9yIG9uIGxvYWQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2UgZm9yIHRoZSBwYXNzZWQgSUZpbGUgd2l0aG91dCBmb3JjaW5nIGEgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoYUZpbGUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlIGZvciB0aGUgcGFzc2VkIElGaWxlLCBmb3JjaW5nIGEgbG9hZCBpZiA8Y29kZT5sb2FkT25EZW1hbmQ8L2NvZGU+IHNheXMgc28uCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHBhcmFtIGxvYWRPbkRlbWFuZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBmb3JjZSBhIGxvYWQgb2YgcmVzb3VyY2UgaWYgbm90IGxvYWRlZC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBhRmlsZSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJaWYgKGFGaWxlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgbG9hZE9uRGVtYW5kKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZSBmb3IgdGhlIHBhc3NlZCBJRmlsZSB3aXRob3V0IGEgbG9hZCBpZiBub3QgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGxvYWQoSUZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKGFGaWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIGZvciB0aGUgdXJpLiBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0Ci0JICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgotCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSB1cmkgbXVzdCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uIiBmb3JtIG9yIGl0IG11c3QgYmUgInByb2plY3QtbmFtZS8uLi4iLiBBbnkgb3RoZXIgZm9ybSB3aWxsIGJlIGludmFsaWQuCi0JICogQHBhcmFtIGxvYWRPbkRlbWFuZCA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIGNhdXNlIHJlc291cmNlIHRvIGJlIGxvYWRlZCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuCi0JICogQHJldHVybiByZXNvdXJjZSBpZiB1cmkgaXMgZm9yIGEgdmFsaWQgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2plY3Qgbm90IGZvdW5kLCBvciBub3QgYSB2YWxpZCBwcm9qZWN0IHJlc291cmNlIHVyaS4KLQkgKiAKLQkgKiBAdGhyb3dzIFdyYXBwZWRFeGNlcHRpb24gaWYgdmFsaWQgcHJvamVjdCBmb3JtYXQgVVJJIGJ1dCBmaWxlIG5vdCBmb3VuZCBvciBzb21lIG90aGVyIGVycm9yIG9uIGxvYWQgaWYgbG9hZE9uRGVtYW5kIGlzIHRydWUuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldCh1cmkpOwotCQlpZiAoc2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2V0LmdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUmVzb3VyY2VTZXQgZm9yIHRoZSBwYXNzZWQgVVJJLiBUaGUgVVJJIHNob3VsZCBiZSBpbiB0aGUgZm9ybWF0IHBsYXRmb3JtOi9yZXNvdXJjZS97cHJvamVjdCBuYW1lfS8uLi4gb3Ige3Byb2plY3QgbmFtZX0vLi4uIGZvciB0aGlzCi0JICogYXBpIHRvIHdvcmsuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgb2YgY29ycmVjdCBmb3JtIG9yIHByb2plY3QgZG9lc24ndCBoYXZlIGEgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoVVJJIHVyaSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCh1cmkpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQocHJvamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEdldCB0aGUgcHJvamVjdCBmb3IgdGhlIHVyaSBpZiB0aGUgdXJpIGlzIGEgdmFsaWQgd29ya2JlbmNoIHByb2plY3QgZm9ybWF0IHVyaS4gbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChVUkkgdXJpKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZTsKLQkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKQotCQkJcHJvamVjdE5hbWUgPSB1cmkuc2VnbWVudCgxKTsKLQkJZWxzZSBpZiAodXJpLnNjaGVtZSgpID09IG51bGwpIHsKLQkJCXByb2plY3ROYW1lID0gbmV3IFBhdGgodXJpLnBhdGgoKSkuc2VnbWVudCgwKTsgLy9hc3N1bWUgcHJvamVjdCBuYW1lIGlzIGZpcnN0IGluIHRoZSBVUkkKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFVSSS5kZWNvZGUocHJvamVjdE5hbWUpKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2VTZXQgZm9yIHRoZSBwYXNzZWQgSVByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHJlc291cmNlIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoSVByb2plY3QgcHJvamVjdCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBuYXQgPSBjcmVhdGVFTUZDb250ZXh0KHByb2plY3QsIG51bGwpOwotCQlpZiAobmF0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmF0LmdldFJlc291cmNlU2V0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd29ya3NwYWNlLiAoanVzdCB1c2Uge0BsaW5rIFJlc291cmNlc1BsdWdpbiNnZXRXb3Jrc3BhY2UoKX0pLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gc2V0Ci0JICogQHJldHVybiBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHJlc291cmNlIHNldCBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJaWYgKHNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkgewotCQkJCVByb2plY3RSZXNvdXJjZVNldCBwc2V0ID0gKFByb2plY3RSZXNvdXJjZVNldCkgc2V0OwotCQkJCXJldHVybiBwc2V0LmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkVVJJTWFwcGluZyhTdHJpbmcgaHJlZikgewotCQlpZiAoaHJlZiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZSA9IGhyZWY7Ci0JCQlpbnQgaW5kZXggPSBocmVmLmluZGV4T2YoJyMnKTsKLQkJCWlmIChpbmRleCA+IC0xKQotCQkJCWZpbGUgPSBocmVmLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQlyZXR1cm4gVVJJQ29udmVydGVyLlVSSV9NQVAuZ2V0KGZpbGUpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2YgdGhlIHJlc291cmNlcyBmcm9tIHRoZSByZXNvdXJjZSBzZXQgYW5kIHRoZW4gdW5sb2FkIHRoZW0uIFVubG9hZCBmb3JjZXMgYWxsIG9mIHRoZSBvYmplY3RzIHRvIGJlY29tZSBwcm94aWVzIHNvIG5leHQgcmVzb2x2ZSB3aWxsCi0JICogcmVsb2FkIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHBhcmFtIGFTZXQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQW5kVW5sb2FkQWxsKExpc3QgcmVzb3VyY2VzLCBSZXNvdXJjZVNldCBhU2V0KSB7Ci0JCWlmIChhU2V0ID09IG51bGwgfHwgcmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJYVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwocmVzb3VyY2VzKTsKLQkJUmVzb3VyY2UgcmVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVzLnVubG9hZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVHVybiBvYmplY3QgaW50byBhIHByb3h5LgotCSAqIAotCSAqIEBwYXJhbSBhbk9iamVjdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb2JqZWN0IHdhcyBhYmxlIHRvIGJlY29tZSBhIHByb3h5LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBiZWNvbWVQcm94eShFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmIChhbk9iamVjdCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBhbk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCQkJKChJbnRlcm5hbEVPYmplY3QpIGFuT2JqZWN0KS5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KHJlcy5nZXRVUklGcmFnbWVudChhbk9iamVjdCkpKTsKLQkJCQkvL2FuT2JqZWN0LmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBXcmFwcGVkRXhjZXB0aW9uIGlzIGFjdHVhbGx5IGEgUmVzb3VyY2UgTm90IEZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVkRXgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIGV4Y2VwdGlvbiB3cmFwcGVycyBhIHJlc291cmNlIG5vdCBmb3VuZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXNvdXJjZU5vdEZvdW5kKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCUV4Y2VwdGlvbiBleGNlcCA9IHdyYXBwZWRFeC5leGNlcHRpb24oKTsKLQkJd2hpbGUgKGV4Y2VwIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJZXhjZXAgPSAoKFdyYXBwZWRFeGNlcHRpb24pIGV4Y2VwKS5leGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gcHJpbUlzUmVzb3VyY2VOb3RGb3VuZChleGNlcCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcmltSXNSZXNvdXJjZU5vdEZvdW5kKFRocm93YWJsZSBleGNlcCkgewotCQlpZiAoZXhjZXAgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZXhjZXApLmdldFN0YXR1cygpOwotCQkJcmV0dXJuIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCAmJiBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLmVxdWFscyhzdGF0dXMuZ2V0UGx1Z2luKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgV3JhcHBlZEV4Y2VwdGlvbiBpcyBhY3R1YWxseSBhIFJlc291cmNlIE5vdCBGb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlZEV4Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyBleGNlcHRpb24gd3JhcHBlcnMgYSByZXNvdXJjZSBub3QgZm91bmQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVzb3VyY2VOb3RGb3VuZChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCXJldHVybiBwcmltSXNSZXNvdXJjZU5vdEZvdW5kKHdyYXBwZWRFeC5nZXRDYXVzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBVUkkgcmVwcmVzZW5hdGlvbiBvZiB0aGUgcGxhdGZvcm1VUkkgd2l0aG91dCB0aGUgbGVhZGluZyAicGxhdGZvcm06L3Jlc291cmNlLyIgaWYgcHJlc2VudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGxhdGZvcm1VUkkKLQkgKiBAcmV0dXJuIHVyaQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIGdldE5vblBsYXRmb3JtVVJJKFVSSSBwbGF0Zm9ybVVSSSkgewotCQlpZiAoaXNQbGF0Zm9ybVJlc291cmNlVVJJKHBsYXRmb3JtVVJJKSkgewotCQkJU3RyaW5nIHVyaVN0cmluZyA9IHByaW1HZXROb25QbGF0Zm9ybVVSSVN0cmluZyhwbGF0Zm9ybVVSSSk7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBwbGF0Zm9ybVVSSTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW5hdGlvbiBvZiB0aGUgcGxhdGZvcm1VUkkgd2l0aG91dCB0aGUgbGVhZGluZyAicGxhdGZvcm06L3Jlc291cmNlLyIgaWYgcHJlc2VudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGxhdGZvcm1VUkkKLQkgKiBAcmV0dXJuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9uUGxhdGZvcm1VUklTdHJpbmcoVVJJIHBsYXRmb3JtVVJJKSB7Ci0JCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkocGxhdGZvcm1VUkkpKSB7IHJldHVybiBwcmltR2V0Tm9uUGxhdGZvcm1VUklTdHJpbmcocGxhdGZvcm1VUkkpOyB9Ci0JCXJldHVybiBwbGF0Zm9ybVVSSS50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogUmVtb3ZlICJwbGF0Zm9ybTovcmVzb3VyY2UvIiBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcGxhdGZvcm1VUkkgYW5kIHJldHVybiB0aGUgcmVtYWluaW5nIFN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJpbUdldE5vblBsYXRmb3JtVVJJU3RyaW5nKFVSSSBwbGF0Zm9ybVVSSSkgewotCQlTdHJpbmcgdXJpU3RyaW5nID0gcGxhdGZvcm1VUkkudG9TdHJpbmcoKTsKLQkJLy8icGxhdGZvcm06L3Jlc291cmNlLyIgaXMgMTkgY2hhcmFjdGVycy4KLQkJcmV0dXJuIHVyaVN0cmluZy5zdWJzdHJpbmcoMTksIHVyaVN0cmluZy5sZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyB0aGUgcGFzc2VkIFVSSSBoYXZlIHRoZSBmb3JtIHBsYXRmb3JtOi9wbHVnaW4vLi4uID8KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB1cmkgaXMgcGxhdGZvcm0gcGx1Z2luIHByb3RvY29sLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoVVJJIHVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUFJPVE9DT0wuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QTFVHSU4uZXF1YWxzKHVyaS5zZWdtZW50KDApKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hVUklDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTU2ODUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci0KLS8qKgotICogSW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBXb3JrYmVuY2hVUkkgY29udmVydGVycy4gV29ya2JlbmNoIFVSSSBjb252ZXJ0ZXJzIGhhbmRsZSByZWZlcmVuY2VzIHRvIGZpbGVzIGluIHRoZSBwcm9qZWN0J3MgY29udGFpbmVycy4KLSAqIFRoaXMgY29udmVydGVyIGlzIG9ubHkgbmVjZXNzYXJ5IHRvIHJlc29sdmUgb2xkIGFtYmlndW91cyB3b3JrYmVuY2ggVVJJcy4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBleHRlbmRzIFVSSUNvbnZlcnRlciB7Ci0KLQkvKioKLQkgKiBBZGQgaW5wdXQgY29udGFpbmVyIHRvIHRvIHRoZSBjb252ZXJ0ZXIuCi0JICogCi0JICogQHBhcmFtIGFDb250YWluZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIGFkZElucHV0Q29udGFpbmVyKElDb250YWluZXIgYUNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBBZGQgbGlzdCBvZiBjb250YWluZXJzIHRvIHRoZSBjb252ZXJ0ZXIuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcnMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2YgPGNvZGU+SUNvbnRhaW5lcjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIGFkZElucHV0Q29udGFpbmVycyhMaXN0IGNvbnRhaW5lcnMpOwotCi0JLyoqCi0JICogR2V0IHRoZSBmaWxlIHJlbGF0aXZlIHRvIGEgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIGZpbGUgcmVsYXRpdmUgdG8gYSBjb250YWluZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlGaWxlIGdldEZpbGUoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBHZXQgZmlyc3QgaW5wdXQgY29udGFpbmVyCi0JICogCi0JICogQHJldHVybiBmaXJzdCBpbnB1dCBjb250YWluZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUNvbnRhaW5lciBnZXRJbnB1dENvbnRhaW5lcigpOwotCi0JLyoqCi0JICogR2V0IGFsbCBpbnB1dCBjb250YWluZXJzLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIGlucHV0IGNvbnRhaW5lcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JTGlzdCBnZXRJbnB1dENvbnRhaW5lcnMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgb3V0cHV0IGNvbnRhaW5lciBpZiBzZXQuCi0JICogCi0JICogQHJldHVybiBvdXRwdXQgY29udGFpbmVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUNvbnRhaW5lciBnZXRPdXRwdXRDb250YWluZXIoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgb3V0cHV0IGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBzZXRPdXRwdXRDb250YWluZXIoSUNvbnRhaW5lciBjb250YWluZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIElGaWxlIGZvcgotCSAqIAotCSAqIEBhUGF0aC4gSWYgd2UgaGF2ZSBhIHBhcmVudCBhbmQgd2UgZG8gbm90IGNvbnRhaW4gdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIGFQYXRoLCBmb3J3YXJkIHRvIHRoZSBwYXJlbnQgdG8gcmV0cmlldmUgdGhlIGZpbGUuCi0JICogQHBhcmFtIGFQYXRoCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUlGaWxlIGdldE91dHB1dEZpbGUoSVBhdGggYVBhdGgpOwotCi0JLyoqCi0JICogR2V0IG91dHB1dCBmaWxlIHdpdGggbWFwcGluZyBhcHBsaWVkLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUZpbGUgZ2V0T3V0cHV0RmlsZVdpdGhNYXBwaW5nQXBwbGllZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJlbW92ZSBpbnB1dCBjb250YWluZXIgZnJvbSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBhQ29udGFpbmVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZW1vdmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCWJvb2xlYW4gcmVtb3ZlSW5wdXRDb250YWluZXIoSUNvbnRhaW5lciBhQ29udGFpbmVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHdlIGNhbiByZXRyaWV2ZSB0aGUgcmVzb3VyY2UgdXNlZCB0byBvcGVuIGFuIGlucHV0IHN0cmVhbSBvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGVOYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaWxlbmFtZSBpcyB2YWxpZCBmb3IgZmlsZSBzdHJlYW0gYWNjZXNzLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqICAKLQkgKi8KLQlib29sZWFuIGNhbkdldFVuZGVybHlpbmdSZXNvdXJjZShTdHJpbmcgYUZpbGVOYW1lKTsKLQotCS8qKgotCSAqIElzIGZvcmNlIHNhdmUgcmVsYXRpdmUgZmxhZyB0dXJuZWQgb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmb3JjZSBzYXZlIHJlbGF0aXZlIGlzIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlib29sZWFuIGlzRm9yY2VTYXZlUmVsYXRpdmUoKTsKLQotCS8qKgotCSAqIFNldCB0byB0cnVlIGlmIHlvdSBkbyBub3Qgd2FudCBhbnkgcGF0aCBtYW5pcHVsYXRpb24gd2hlbiBjcmVhdGluZyB0aGUgb3V0cHV0IHN0cmVhbS4uCi0JICogCi0JICogQHBhcmFtIGZvcmNlU2F2ZVJlbGF0aXZlCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBmb3JjZSBzYXZlcyBhcyByZWxhdGl2ZS4KLQkgKi8KLQl2b2lkIHNldEZvcmNlU2F2ZVJlbGF0aXZlKGJvb2xlYW4gZm9yY2VTYXZlUmVsYXRpdmUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY1NTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNiAkJCAgJCREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjQ1ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgaW50ZXJmYWNlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsIGltcGxlbWVudHMgV29ya2JlbmNoVVJJQ29udmVydGVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIElXb3Jrc3BhY2VSb290IFdPUktTUEFDRV9ST09UID0gVVJJQ29udmVydGVySW1wbC53b3Jrc3BhY2VSb290OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXT1JLU1BBQ0VfUk9PVF9MT0NBVElPTiA9IFdPUktTUEFDRV9ST09ULmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBJTlZBTElEX1BBVEggPSBuZXcgUGF0aCgiISEhIX4hISEhIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWxlIElOVkFMSURfRklMRSA9IFdPUktTUEFDRV9ST09ULmdldEZpbGUoSU5WQUxJRF9QQVRILmFwcGVuZChJTlZBTElEX1BBVEgpKTsKLQotCS8vVXNlZCB0byBhdm9pZCB0cnlpbmcgdG8gZml4dXAgdGhlIFVSSSB3aGVuIGdldHRpbmcgdGhlCi0JLy9PdXRwdXRTdHJlYW0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZVNhdmVSZWxhdGl2ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIExpc3QgaW5wdXRDb250YWluZXJzOwotCi0JcHJvdGVjdGVkIElDb250YWluZXIgb3V0cHV0Q29udGFpbmVyOwotCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIHJlc291cmNlU2V0U3luY2hyb25pemVyOwotCQotCS8qCi0JICogS0xVREdFOiBXZSBuZWVkIHRvIGtub3cgdGhlIG1ldGEgZGF0YSBhcmVhLiBUaGlzIGlzIHNvIHRoYXQgYW55IHVyaSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkKLQkgKiBpcyBjb25zaWRlcmVkIGEgZmlsZSB1cmkgYW5kIE5PVCBhIHdvcmtzcGFjZSB1cmkuIFRoZSBtZXRhZGF0YSBpcyB3aGVyZSBwbHVnaW4ncyBzdG9yZSB0aGVpciB3b3JraW5nIGRhdGEuCi0JICogSXQgaXMgbm90IHBhcnQgb2YgdGhlIHdvcmtzcGFjZSByb290LgotCSAqICAKLQkgKiBUaGVyZSBpcyBubyByZXF1ZXN0IGZvciBzaW1wbHkgdGhlIG1ldGFkYXRhIGFyZWEuIFRoZSBsb2cgZmlsZSBpcyBpbiB0aGUgbWV0YWRhdGEgZGlyZWN0b3J5LiBTbyB3ZSB3aWxsCi0JICogZ2V0IHRoZSBsb2cgZmlsZSBsb2NhdGlvbiBhbmQganVzdCByZW1vdmUgdGhlIGxvZyBmaWxlIG5hbWUuIFRoYXQgc2hvdWxkIGxlYXZlIHVzIHdpdGggdGhlIG1ldGFkYXRhIGRpcmVjdG9yeQotCSAqIG9ubHkuIElmIEVjbGlwc2UgZXZlciBkZWNpZGVzIHRvIG1vdmUgaXQgZnJvbSBoZXJlLCB0aGlzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuIEJ1dCBpdCBoYXNuJ3QgbW92ZWQgaW4gdGhyZWUgCi0JICogdmVyc2lvbnMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTUVUQURBVEFfTE9DQVRJT04gPSBQbGF0Zm9ybS5nZXRMb2dGaWxlTG9jYXRpb24oKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQotCS8qKgotCSAqIERlZmF1bHQgY29udmVydGVyIGNvbnN0cnVjdG9yLCBubyBjb250YWluZXJzLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGFuIGlucHV0IGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lcikgewotCQl0aGlzKGFuSW5wdXRDb250YWluZXIsIChSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcikgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gaW5wdXQgY29udGFpbmVyIGFuZCBhIHN5bmNocm9uemllci4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbnRhaW5lcgotCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhQ29udGFpbmVyLCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKSB7Ci0JCXRoaXMoYUNvbnRhaW5lciwgbnVsbCwgYVN5bmNocm9uaXplcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gaW5wdXQgY29udGFpbmVyIGFuZCBhbiBvdXRwdXQgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCi0JICogQHBhcmFtIGFuT3V0cHV0Q29udGFpbmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyLCBJQ29udGFpbmVyIGFuT3V0cHV0Q29udGFpbmVyKSB7Ci0JCXRoaXMoYW5JbnB1dENvbnRhaW5lciwgYW5PdXRwdXRDb250YWluZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGFuIGlucHV0IGNvbnRhaW5lciwgb3V0cHV0IGNvbnRhaW5lciwgYW5kIGEgc3luY2hyb25pemVyLgotCSAqIAotCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCi0JICogQHBhcmFtIGFuT3V0cHV0Q29udGFpbmVyCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIsIElDb250YWluZXIgYW5PdXRwdXRDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJYWRkSW5wdXRDb250YWluZXIoYW5JbnB1dENvbnRhaW5lcik7Ci0JCXNldE91dHB1dENvbnRhaW5lcihhbk91dHB1dENvbnRhaW5lcik7Ci0JCXJlc291cmNlU2V0U3luY2hyb25pemVyID0gYVN5bmNocm9uaXplcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2FkZElucHV0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5wdXRDb250YWluZXIoSUNvbnRhaW5lciBhQ29udGFpbmVyKSB7Ci0JCWlmIChhQ29udGFpbmVyICE9IG51bGwgJiYgIWdldElucHV0Q29udGFpbmVycygpLmNvbnRhaW5zKGFDb250YWluZXIpKQotCQkJZ2V0SW5wdXRDb250YWluZXJzKCkuYWRkKGFDb250YWluZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjYWRkSW5wdXRDb250YWluZXJzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZElucHV0Q29udGFpbmVycyhMaXN0IGNvbnRhaW5lcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlhZGRJbnB1dENvbnRhaW5lcigoSUNvbnRhaW5lcikgY29udGFpbmVycy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNyZW1vdmVJbnB1dENvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUlucHV0Q29udGFpbmVyKElDb250YWluZXIgYUNvbnRhaW5lcikgewotCQlyZXR1cm4gZ2V0SW5wdXRDb250YWluZXJzKCkucmVtb3ZlKGFDb250YWluZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0SW5wdXRDb250YWluZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnB1dENvbnRhaW5lcnMoKSB7Ci0JCWlmIChpbnB1dENvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCWlucHV0Q29udGFpbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGlucHV0Q29udGFpbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldElucHV0Q29udGFpbmVyKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRJbnB1dENvbnRhaW5lcigpIHsKLQkJaWYgKCFnZXRJbnB1dENvbnRhaW5lcnMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gKElDb250YWluZXIpIGdldElucHV0Q29udGFpbmVycygpLmdldCgwKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRPdXRwdXRDb250YWluZXIoKQotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldE91dHB1dENvbnRhaW5lcigpIHsKLQkJaWYgKG91dHB1dENvbnRhaW5lciA9PSBudWxsKQotCQkJb3V0cHV0Q29udGFpbmVyID0gZ2V0SW5wdXRDb250YWluZXIoKTsKLQkJcmV0dXJuIG91dHB1dENvbnRhaW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI3NldE91dHB1dENvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dHB1dENvbnRhaW5lcihJQ29udGFpbmVyIG5ld091dHB1dENvbnRhaW5lcikgewotCQlvdXRwdXRDb250YWluZXIgPSBuZXdPdXRwdXRDb250YWluZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRPdXRwdXRGaWxlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0T3V0cHV0RmlsZShJUGF0aCBhUGF0aCkgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKGdldE91dHB1dENvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCWlmIChmb3JjZVNhdmVSZWxhdGl2ZSkKLQkJCQlyZXR1cm4gcHJpbUdldE91dHB1dEZpbGUoYVBhdGgpOwotCQkJZmlsZSA9IGdldE91dHB1dEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKGFQYXRoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJcmV0dXJuIGZpbGU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHByaW1HZXRPdXRwdXRGaWxlKGFQYXRoKTsKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgcHJpbUdldE91dHB1dEZpbGUoSVBhdGggYVBhdGgpIHsKLQkJcmV0dXJuIHByaW1HZXRGaWxlKGdldE91dHB1dENvbnRhaW5lcigpLCBhUGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWxlIGdldE91dHB1dEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKElQYXRoIGFQYXRoKSB7Ci0JCUlDb250YWluZXIgb3V0ID0gZ2V0T3V0cHV0Q29udGFpbmVyKCk7Ci0JCXJldHVybiBnZXRGaWxlRm9yUGF0aFdpdGhDb250YWluZXJTZWdtZW50cyhhUGF0aCwgb3V0LCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKElQYXRoIGFQYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lciwgYm9vbGVhbiB0ZXN0RXhpc3RzKSB7Ci0JCUlQYXRoIGNvbnRhaW5lclBhdGggPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKHRlc3RFeGlzdHMpIHsKLQkJCWNvbnRhaW5lclBhdGggPSBjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJaWYgKCFjb250YWluZXJQYXRoLmlzRW1wdHkoKSkgewotCQkJCWZpbGUgPSBnZXRGaWxlRm9yTWF0Y2hpbmdQYXRoKGFQYXRoLCBjb250YWluZXJQYXRoLCBjb250YWluZXIpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLQkJCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCX0KLQkJY29udGFpbmVyUGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotCQlmaWxlID0gZ2V0RmlsZUZvck1hdGNoaW5nUGF0aChhUGF0aCwgY29udGFpbmVyUGF0aCwgY29udGFpbmVyKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGVGb3JNYXRjaGluZ1BhdGgoSVBhdGggY29udGFpbmVyUGF0aCwgSVBhdGggc291cmNlUGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJaW50IG1hdGNoZXMgPSAwOwotCQltYXRjaGVzID0gY29udGFpbmVyUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoc291cmNlUGF0aCk7Ci0JCWlmIChtYXRjaGVzID4gMCAmJiBtYXRjaGVzID09IHNvdXJjZVBhdGguc2VnbWVudENvdW50KCkpIHsKLQkJCUlQYXRoIGxvYWRQYXRoID0gY29udGFpbmVyUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKG1hdGNoZXMpOwotCQkJcmV0dXJuIHByaW1HZXRGaWxlKGNvbnRhaW5lciwgbG9hZFBhdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0RmlsZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldEZpbGUobmV3IFBhdGgodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICogQHNlZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0RmlsZShTdHJpbmcpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoSVBhdGggcGF0aCkgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKGdldElucHV0Q29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJcGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBnZXRJbnB1dENvbnRhaW5lcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlDb250YWluZXIgY29uID0gKElDb250YWluZXIpIGl0Lm5leHQoKTsKLQkJCQlmaWxlID0gZ2V0SW5wdXRGaWxlKGNvbiwgcGF0aCk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIElOVkFMSURfRklMRTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IG91dHB1dCBmaWxlIGZyb20gc3RyaW5nIHBhdGguCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2VlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRPdXRwdXRGaWxlKElQYXRoKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRPdXRwdXRGaWxlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldE91dHB1dEZpbGUobmV3IFBhdGgodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBpbnB1dCBmaWxlIGZyb20gdGhlIGNvbnRhaW5lciBhbmQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGaWxlIGdldElucHV0RmlsZShJQ29udGFpbmVyIGNvbiwgSVBhdGggcGF0aCkgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKFdPUktTUEFDRV9ST09ULmVxdWFscyhjb24pICYmIHBhdGguc2VnbWVudENvdW50KCkgPCAyKQotCQkJcGF0aCA9IElOVkFMSURfUEFUSC5hcHBlbmQocGF0aCk7Ci0JCWZpbGUgPSBwcmltR2V0RmlsZShjb24sIHBhdGgpOwotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJZmlsZSA9IGdldEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKHBhdGgsIGNvbiwgdHJ1ZSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZSBwcmltR2V0RmlsZShJQ29udGFpbmVyIGNvbnRhaW5lciwgSVBhdGggcGF0aCkgewotCQl0cnkgewotCQkJcmV0dXJuIGNvbnRhaW5lci5nZXRGaWxlKHBhdGgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2NhbkdldFVuZGVybHlpbmdSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkdldFVuZGVybHlpbmdSZXNvdXJjZShTdHJpbmcgYUZpbGVOYW1lKSB7Ci0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKGFGaWxlTmFtZSk7Ci0JCXJldHVybiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2lzRm9yY2VTYXZlUmVsYXRpdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9yY2VTYXZlUmVsYXRpdmUoKSB7Ci0JCXJldHVybiBmb3JjZVNhdmVSZWxhdGl2ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI3NldEZvcmNlU2F2ZVJlbGF0aXZlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yY2VTYXZlUmVsYXRpdmUoYm9vbGVhbiBmb3JjZVNhdmVSZWxhdGl2ZSkgewotCQl0aGlzLmZvcmNlU2F2ZVJlbGF0aXZlID0gZm9yY2VTYXZlUmVsYXRpdmU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqL3B1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJVVJJIHJlc3VsdCA9IHVyaTsKLQkJU3RyaW5nIGZyYWdtZW50ID0gbnVsbDsKLQkJaWYgKHVyaS5oYXNGcmFnbWVudCgpKSB7Ci0JCQlmcmFnbWVudCA9IHVyaS5mcmFnbWVudCgpOwotCQkJcmVzdWx0ID0gdXJpLnRyaW1GcmFnbWVudCgpOwotCQl9Ci0JCXJlc3VsdCA9IGdldEludGVybmFsVVJJTWFwKCkuZ2V0VVJJKHJlc3VsdCk7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHJlc3VsdCkpCi0JCQlyZXR1cm4gYXBwZW5kRnJhZ21lbnQocmVzdWx0LCBmcmFnbWVudCk7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVBsdWdpblJlc291cmNlVVJJKHJlc3VsdCkpIHsKLQkJCVVSSSBub3JtYWxpemVkID0gbm9ybWFsaXplUGx1Z2luVVJJKHJlc3VsdCwgZnJhZ21lbnQpOwotCQkJcmV0dXJuIChub3JtYWxpemVkICE9IG51bGwpID8gbm9ybWFsaXplZCA6IHVyaTsKLQkJfQotCQlTdHJpbmcgcHJvdG9jb2wgPSByZXN1bHQuc2NoZW1lKCk7Ci0JCVVSSSBmaWxlU2VhcmNoVVJJID0gbnVsbDsKLQkJaWYgKHByb3RvY29sID09IG51bGwpIHsKLQkJCWZpbGVTZWFyY2hVUkkgPSBub3JtYWxpemVFbXB0eVByb3RvY29sKHJlc3VsdCwgZnJhZ21lbnQpOwotCQkJaWYgKGZpbGVTZWFyY2hVUkkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmlsZVNlYXJjaFVSSTsKLQkJfSBlbHNlIGlmIChGSUxFX1BST1RPQ09MLmVxdWFscyhwcm90b2NvbCkpIHsKLQkJCWZpbGVTZWFyY2hVUkkgPSBub3JtYWxpemVGaWxlUHJvdG9jb2wocmVzdWx0LCBmcmFnbWVudCk7Ci0JCQlpZiAoZmlsZVNlYXJjaFVSSSAhPSBudWxsKQotCQkJCXJldHVybiBmaWxlU2VhcmNoVVJJOwotCQl9IGVsc2UgaWYgKEpFTVV0aWxQbHVnaW4uV09SS1NQQUNFX1BST1RPQ09MLmVxdWFscyhwcm90b2NvbCkpCi0JCQlyZXR1cm4gbm9ybWFsaXplV29ya3NwYWNlUHJvdG9jb2wocmVzdWx0LCBmcmFnbWVudCk7Ci0JCXJldHVybiBzdXBlci5ub3JtYWxpemUodXJpKTsKLQl9Ci0KLQkvKgotCSAqIFJlc29sdmVzIGEgcGx1Z2luIGZvcm1hdCBpbnRvIHRoZSBhY3R1YWwuCi0JICovCi0JcHJvdGVjdGVkIFVSSSBub3JtYWxpemVQbHVnaW5VUkkoVVJJIHVyaSwgU3RyaW5nIGZyYWdtZW50KSB7Ci0JCWlmICh1cmkuc2VnbWVudENvdW50KCkgPCAyKQotCQkJcmV0dXJuIHVyaTsgLy8gSW52YWxpZCwganVzdCBsZXQgaXQgZ28gb24uCi0JCS8vIFNlZSBpZiBhbHJlYWR5IG5vcm1hbGl6ZWQuCi0JCWludCB1X3Njb3JlTmR4ID0gdXJpLnNlZ21lbnQoMSkubGFzdEluZGV4T2YoJ18nKTsKLQkJaWYgKHVfc2NvcmVOZHggIT0gLTEpIHsKLQkJCS8vIE5vdCBub3JtYWxpemVkLiBSZW1vdmUgdGhlIHZlcnNpb24gdG8gbWFrZSBpdCBub3JtYWxpemVkLgotCQkJU3RyaW5nW10gc2VnbWVudHMgPSB1cmkuc2VnbWVudHMoKTsKLQkJCXNlZ21lbnRzWzFdID0gc2VnbWVudHNbMV0uc3Vic3RyaW5nKDAsIHVfc2NvcmVOZHgpOwotCQkJcmV0dXJuIFVSSS5jcmVhdGVIaWVyYXJjaGljYWxVUkkodXJpLnNjaGVtZSgpLCB1cmkuYXV0aG9yaXR5KCksIHVyaS5kZXZpY2UoKSwgc2VnbWVudHMsIHVyaS5xdWVyeSgpLCBmcmFnbWVudCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZVdvcmtzcGFjZVByb3RvY29sKFVSSSBhV29ya3NwYWNlVVJJLCBTdHJpbmcgZnJhZ21lbnQpIHsKLQkJVVJJIHJlc3VsdDsKLQkJU3RyaW5nIHVyaVN0cmluZyA9IGFXb3Jrc3BhY2VVUkkudG9TdHJpbmcoKTsKLQkJdXJpU3RyaW5nID0gdXJpU3RyaW5nLnN1YnN0cmluZyhKRU1VdGlsUGx1Z2luLldPUktTUEFDRV9QUk9UT0NPTC5sZW5ndGgoKSArIDEpOwotCQlyZXN1bHQgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmlTdHJpbmcpOwotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGFwcGVuZEZyYWdtZW50KGFXb3Jrc3BhY2VVUkksIGZyYWdtZW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFVSSSBub3JtYWxpemVFbXB0eVByb3RvY29sKFVSSSBhRmlsZVVyaSwgU3RyaW5nIGZyYWdtZW50KSB7Ci0JCS8vTWFrZSB0aGUgcmVsYXRpdmUgcGF0aCBhYnNvbHV0ZSBhbmQgcmV0dXJuIGEgcGxhdGZvcm0gVVJJLgotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYUZpbGVVcmkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBub3JtYWxpemVUb1dvcmtzcGFjZVVSSShwYXRoLCBmcmFnbWVudCk7Ci0JfQotCQotCXByaXZhdGUgVVJJIG5vcm1hbGl6ZVRvV29ya3NwYWNlVVJJKElQYXRoIHBhdGgsIFN0cmluZyBmcmFnbWVudCkgewotCQlVUkkgcmVzdWx0ID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUocGF0aCk7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQlmaWxlID0gZ2V0T3V0cHV0RmlsZShwYXRoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJcmVzdWx0ID0gYXBwZW5kRnJhZ21lbnQocmVzdWx0LCBmcmFnbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFVSSSBub3JtYWxpemVGaWxlUHJvdG9jb2woVVJJIGFGaWxlVXJpLCBTdHJpbmcgZnJhZ21lbnQpIHsKLQkJVVJJIHJlc3VsdCA9IG51bGw7Ci0JCS8vTWFrZSB0aGUgcmVsYXRpdmUgcGF0aCBhYnNvbHV0ZSBhbmQgcmV0dXJuIGEgcGxhdGZvcm0gVVJJLgotCQlTdHJpbmcgZGV2aWNlUGF0aCA9IGFGaWxlVXJpLmRldmljZVBhdGgoKTsKLQkJLy9UZXN0IGZvciB3b3Jrc3BhY2UgbG9jYXRpb24uCi0JCWlmICghZGV2aWNlUGF0aC5zdGFydHNXaXRoKE1FVEFEQVRBX0xPQ0FUSU9OKSAmJgotCQkJZGV2aWNlUGF0aC5zdGFydHNXaXRoKFdPUktTUEFDRV9ST09UX0xPQ0FUSU9OKSAmJiBkZXZpY2VQYXRoLmxlbmd0aCgpID4gV09SS1NQQUNFX1JPT1RfTE9DQVRJT04ubGVuZ3RoKCkpIHsKLQkJCS8vdGVzdCBmb3Igd29ya3NwYWNlIGxvY2F0aW9uCi0JCQlyZXN1bHQgPSBub3JtYWxpemVUb1dvcmtzcGFjZVVSSShuZXcgUGF0aChkZXZpY2VQYXRoLnN1YnN0cmluZyhXT1JLU1BBQ0VfUk9PVF9MT0NBVElPTi5sZW5ndGgoKSkpLCBmcmFnbWVudCk7Ci0JCX0gZWxzZSBpZiAoYUZpbGVVcmkuaXNSZWxhdGl2ZSgpKSB7Ci0JCQlyZXN1bHQgPSBub3JtYWxpemVUb1dvcmtzcGFjZVVSSShuZXcgUGF0aChhRmlsZVVyaS50b1N0cmluZygpKSwgZnJhZ21lbnQpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gYUZpbGVVcmk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFVSSSBhcHBlbmRGcmFnbWVudChVUkkgcmVzdWx0LCBTdHJpbmcgZnJhZ21lbnQpIHsKLQkJaWYgKGZyYWdtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0LmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKLQkJZWxzZQotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldE91dHB1dEZpbGVXaXRoTWFwcGluZ0FwcGxpZWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0T3V0cHV0RmlsZVdpdGhNYXBwaW5nQXBwbGllZChTdHJpbmcgdXJpKSB7Ci0JCVVSSSBjb252ZXJ0ZWQgPSBnZXRJbnRlcm5hbFVSSU1hcCgpLmdldFVSSShVUkkuY3JlYXRlVVJJKHVyaSkpOwotCQlyZXR1cm4gZ2V0T3V0cHV0RmlsZShuZXcgUGF0aChjb252ZXJ0ZWQudG9TdHJpbmcoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbCNjcmVhdGVQbGF0Zm9ybVJlc291cmNlT3V0cHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBjcmVhdGVQbGF0Zm9ybVJlc291cmNlT3V0cHV0U3RyZWFtKFN0cmluZyBwbGF0Zm9ybVJlc291cmNlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IFdPUktTUEFDRV9ST09ULmdldEZpbGUobmV3IFBhdGgocGxhdGZvcm1SZXNvdXJjZVBhdGgpKTsKLQkJUHJvamVjdFV0aWxpdGllcy5lbnN1cmVDb250YWluZXJOb3RSZWFkT25seShmaWxlKTsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oZmlsZSwgcmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIpOwotCX0KLQotCXByb3RlY3RlZCBVUkkgZ2V0Q29udGFpbmVyUmVsYXRpdmVVUkkoSUZpbGUgYUZpbGUpIHsKLQkJSVBhdGggcGF0aCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRQYXRoRnJvbUNvbnRhaW5lcnMoaW5wdXRDb250YWluZXJzLCBhRmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKHBhdGgudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbCNjcmVhdGVQbGF0Zm9ybVJlc291cmNlSW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gY3JlYXRlUGxhdGZvcm1SZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyBwbGF0Zm9ybVJlc291cmNlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IFdPUktTUEFDRV9ST09ULmdldEZpbGUobmV3IFBhdGgocGxhdGZvcm1SZXNvdXJjZVBhdGgpKTsKLQkJdHJ5IHsKLQkJCWlmICghZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfT05FKSkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGUgaW9maWxlID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvRmlsZSgpOwotCQkJCQlpZiAoaW9maWxlLmV4aXN0cygpIHx8IGZpbGUuZXhpc3RzKCkpCi0JCQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCWlmIChjZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgIT0gSVJlc291cmNlU3RhdHVzLldPUktTUEFDRV9MT0NLRUQpCi0JCQkJCQl0aHJvdyBjZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBDSEFOR0VEIGZyb20gPG5vLWFyZ3M+IHRvIDx0cnVlPiBbOTQwMTVdCi0JCQlyZXR1cm4gZmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjI4OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogRU1GTmF0dXJlLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNCAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxQYXJzZXJQb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxQYXJzZXJQb29sSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogVGhlIGJhc2UgRU1GTmF0dXJlLgotICogPHA+Ci0gKiBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cywgYnV0IHRoZXJlIGFyZSBkZWZhdWx0IHN1YmNsYXNzZXMgYXZhaWxhYmxlLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVNRk5hdHVyZSBpbXBsZW1lbnRzIElQcm9qZWN0TmF0dXJlLCBJRU1GQ29udGV4dENvbnRyaWJ1dG9yIHsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGVtZkNvbnRleHQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDb25maWd1cmVkID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBYTUxQYXJzZXJQb29sIFNIQVJFRF9QQVJTRVJfUE9PTCA9IG5ldyBYTUxQYXJzZXJQb29sSW1wbCgpOwkKLQotCXB1YmxpYyBFTUZOYXR1cmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYXR1cmUgaWQgdG8gdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2oKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlQcm9qZWN0VXRpbGl0aWVzLmFkZE5hdHVyZVRvUHJvamVjdChwcm9qLCBuYXR1cmVJZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgcHJvamVjdCB3aXRoIHRoaXMgbmF0dXJlLiBUaGlzIGlzIGNhbGxlZCBieSA8Y29kZT5JUHJvamVjdC5hZGROYXR1cmU8L2NvZGU+IGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLiBUaGUKLQkgKiBuYXR1cmUgZXh0ZW5zaW9uIGlkIGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIG5hdHVyZXMgb24gdGhlIHByb2plY3QgYnkgPGNvZGU+SVByb2plY3QuYWRkTmF0dXJlPC9jb2RlPiwgYW5kIG5lZWQgbm90IGJlIGFkZGVkIGhlcmUuCi0JICogCi0JICogPHA+Ci0JICogQWxsIHN1YnR5cGVzIG11c3QgY2FsbCBzdXBlci4gVGhlIGJldHRlciB3YXkgZm9yIHN1YnR5cGVzIGlzIHRvIG92ZXJyaWRlIHByaW1Db25maWd1cmUgaW5zdGVhZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlKCkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFoYXNDb25maWd1cmVkKSB7Ci0JCQloYXNDb25maWd1cmVkID0gdHJ1ZTsKLQkJCXByaW1Db25maWd1cmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBmcm9tIGNvbmZpZ3VyZSB0aGUgZmlyc3QgdGltZSBjb25maWd1cmUgaXMgY2FsbGVkIG9uIHRoZSBuYXR1cmUuIERlZmF1bHQgaXMgZG8gbm90aGluZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYW5kIGFkZCBpbiB0aGVpciBvd24KLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltQ29uZmlndXJlKCkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBFTUYgY29udGV4dCBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRW1mQ29udGV4dCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmNyZWF0ZUVNRkNvbnRleHQoZ2V0UHJvamVjdCgpLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmb2xkZXIgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgYmFzZWQgb24gYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJRm9sZGVyIGNyZWF0ZUZvbGRlcihTdHJpbmcgYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nICE9IG51bGwgJiYgYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGNyZWF0ZUZvbGRlcihuZXcgUGF0aChhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZykpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmb2xkZXIgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgYmFzZWQgb24gYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0UmVsYXRpdmVQYXRoCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJRm9sZGVyIGNyZWF0ZUZvbGRlcihJUGF0aCBhUHJvamVjdFJlbGF0aXZlUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYVByb2plY3RSZWxhdGl2ZVBhdGggIT0gbnVsbCAmJiAhYVByb2plY3RSZWxhdGl2ZVBhdGguaXNFbXB0eSgpKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIoZ2V0UHJvamVjdFBhdGgoKS5hcHBlbmQoYVByb2plY3RSZWxhdGl2ZVBhdGgpKTsKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJUHJvamVjdFV0aWxpdGllcy5lbnN1cmVDb250YWluZXJOb3RSZWFkT25seShmb2xkZXIpOwotCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZm9sZGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhpcyBuYXR1cmUgZnJvbSB0aGUgcHJvamVjdCwgcGVyZm9ybWluZyBhbnkgcmVxdWlyZWQgZGVjb25maWd1cmF0aW9uLiBUaGlzIGlzIGNhbGxlZCBieSA8Y29kZT5JUHJvamVjdC5yZW1vdmVOYXR1cmU8L2NvZGU+IGFuZAotCSAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuIFRoZSBuYXR1cmUgaWQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIG5hdHVyZXMgb24gdGhlIHByb2plY3QgYnkKLQkgKiA8Y29kZT5JUHJvamVjdC5yZW1vdmVOYXR1cmU8L2NvZGU+LCBhbmQgbmVlZCBub3QgYmUgcmVtb3ZlZCBoZXJlLgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29uZmlndXJlKCkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJZW1mQ29udGV4dCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIElGaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzIGluIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGVOYW1lCi0JICogICAgICAgICAgICBmaWxlbmFtZSBjYW4gYmUgcmVsYXRpdmUgdG8gb25lIG9mIHRoZSBpbnB1dCBmaWxlIHBhdGhzIGZvciB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlsZW5hbWUgZXhpc3RzIGluIHRoaXMgcHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpbGVFeGlzdHMoU3RyaW5nIGFGaWxlTmFtZSkgewotCQlpZiAoYUZpbGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGFGaWxlTmFtZSk7Ci0JCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZXhpc3RzKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRXb3JrYmVuY2hVUklDb252ZXJ0ZXIoKS5jYW5HZXRVbmRlcmx5aW5nUmVzb3VyY2UoYUZpbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIHNldCBmb3IgdGhlIHByb2plY3QKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gZ2V0RW1mQ29udGV4dEJhc2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEVNRiByb290IGZvbGRlciBmb3IgdGhlIHByb2plY3QuIERlZmF1bHRzIHRvIHRoZSBwcm9qZWN0LiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEVNRiByb290IGZvbGRlciBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElDb250YWluZXIgZ2V0RU1GUm9vdCgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBvcHRpbWl6YXRpb25zOyBhbnN3ZXJzIHdoZXRoZXIgYSBtb2YgY29udGV4dCBmb3IgdGhpcyBuYXR1cmUgaGFzIGV4aXN0cyB5ZXQKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgaGFzUmVzb3VyY2VTZXQoKTsKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb250ZXh0KCkgewotCQlyZXR1cm4gaGFzUmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGVyZSBhIHJlc291cmNlIHNldCB5ZXQgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYSByZXNvdXJjZSBzZXQgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlU2V0KCkgewotCQlyZXR1cm4gZW1mQ29udGV4dCAhPSBudWxsICYmIGVtZkNvbnRleHQuaGFzUmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBMYXp5IGluaXRpYWxpemVyOyBmb3IgbWlncmF0aW9uIG9mIGV4aXN0aW5nIHdvcmtzcGFjZXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbnRleHQgYmFzZSBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldEVtZkNvbnRleHRCYXNlKCkgewotCQlpZiAoZW1mQ29udGV4dCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWNyZWF0ZUVtZkNvbnRleHQoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbWZDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSUZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpZiBpdCBpcyBpbiB0aGlzIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFGaWxlTmFtZQotCSAqICAgICAgICAgICAgZmlsZW5hbWUgY2FuIGJlIHJlbGF0aXZlIHRvIG9uZSBvZiB0aGUgaW5wdXQgZmlsZSBwYXRocyBmb3IgdGhlIFdvcmtiZW5jaFVSSUNvbnZlcnRlci4KLQkgKiBAcmV0dXJuIGZpbGUgaXQgaXQgaXMgaW4gdGhpcyBwcm9qZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2Vzbid0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyBhRmlsZU5hbWUpIHsKLQkJcmV0dXJuIGdldFdvcmtiZW5jaFVSSUNvbnZlcnRlcigpLmdldEZpbGUoYUZpbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hdHVyZSdzIElELgotCSAqIAotCSAqIEByZXR1cm4gbmF0dXJlIGlkCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYXR1cmVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRCBvZiB0aGUgcGx1Z2luIHRoYXQgdGhpcyBuYXR1cmUgaXMgY29udGFpbmVkIHdpdGhpbi4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQbHVnaW5JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0byB3aGljaCB0aGlzIHByb2plY3QgbmF0dXJlIGFwcGxpZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvamVjdCBoYW5kbGUKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxsIHBhdGggb2YgdGhlIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBmdWxsIHByb2plY3QgcGF0aCAocmVsYXRpdmUgdG8gd29ya3NwYWNlKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQcm9qZWN0UGF0aCgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2VydmVyIHByb3BlcnR5IG9mIHRoZSBwcm9qZWN0IGZyb20gdGhlIHN1cHBsaWVkIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZGVwcmVjYXRlZCB3ZSBjYW5ub250IHVzZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYmVjYXVzZSB0aGV5IGFyZSBub3Qgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0U2VydmVyVmFsdWUoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCVF1YWxpZmllZE5hbWUgd2hvbGVOYW1lID0gcXVhbGlmaWVkS2V5KGtleSk7Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldFBlcnNpc3RlbnRQcm9wZXJ0eSh3aG9sZU5hbWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy9JZiB3ZSBjYW4ndCBmaW5kIGl0IGFzc3VtZSBpdCBpcyBudWxsCi0JCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgZm9yIHRoaXMgcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBVUklDb252ZXJ0ZXIgb24gdGhlIFJlc291cmNlU2V0IGlzIHRoZSBvbmUgdGhhdCB3YXMgY3JlYXRlZCBmb3IgdGhlIFJlc291cmNlU2V0IG9uIGJlaGFsZiBvZiB0aGlzIG5hdHVyZSBydW50aW1lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBnZXRXb3JrYmVuY2hVUklDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiAoV29ya2JlbmNoVVJJQ29udmVydGVyKSBnZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCX0KLQotCXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UmVzb3VyY2UoVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRYbWlSZXNvdXJjZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgZm9yIHRoaXMgdXJpLiBJdCB3aWxsIHVzZSB0aGUgcmVzb3VyY2Ugc2V0IG9mIHRoZSBwcm9qZWN0IHRvIGZpbmQgaXQuIEl0IHdpbGwgbG9hZCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVzb3VyY2UgaXMgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoIVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1Jlc291cmNlTm90Rm91bmQoZXgpKQotCQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRSZXNvdXJjZVNldCgpCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFhtaVJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHN1cmUgdGhhdCBhbGwgZGVwZW5kZW50IGNvbXBvbmVudHMgYXJlIGluaXRpYWxpemVkIGJlZm9yZSBjcmVhdGluZyB0aGUgUmVzb3VyY2VTZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlcGVuZGVudENvbXBvbmVudHMoKSB7Ci0JCS8vY29tLmlibS5ldG9vbHMuamF2YS5pbml0LkphdmFJbml0LmluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlUmVzb3VyY2UoVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlWG1pUmVzb3VyY2UoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlUmVzb3VyY2UoVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlWG1pUmVzb3VyY2UoU3RyaW5nIHVyaSwgRUxpc3QgYW5FeHRlbnQpIHsKLQkJUmVzb3VyY2UgcmVzID0gbWFrZVhtaVJlc291cmNlKHVyaSk7Ci0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZEFsbChhbkV4dGVudCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSByZXNvdXJjZSBmb3IgdGhpcyB1cmkuIEl0IHdpbGwgdXNlIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIHByb2plY3QgdG8gY3JlYXRlIGl0LgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIHJlc291cmNlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgUXVhbGlmZWRWYWx1ZSBmb3Iga2V5IGZvciBzdG9yYWdlIGluIHRoZSByZXBvc2l0b3J5LiBUaGUga2V5IGlzIHF1YWxpZmVkIHdpdGggdGhlIHBhY2thZ2UgbmFtZSB0byBhdm9pZCBjb2xsaXNpb24uIEByZXR1cm4KLQkgKiBRdWFsaWZlZE5hbWUgQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBRdWFsaWZpZWROYW1lIHF1YWxpZmllZEtleShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZShnZXRQbHVnaW5JRCgpLCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIHRoZSBnaXZlbiBuYXR1cmUgaWQgYXMgYW4gRU1GTmF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBuYXR1cmVJRAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck5hdHVyZUlEKFN0cmluZyBuYXR1cmVJRCkgewotCQlFTUZOYXR1cmVSZWdpc3RyeS5zaW5nbGV0b24oKS5SRUdJU1RFUkVEX05BVFVSRV9JRFMuYWRkKG5hdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgbmF0dXJlIGFwcGxpZXMuIFVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgcHJvamVjdCBuYXR1cmUgcnVudGltZS4gVGhpcyBpcyBjYWxsZWQgYnkKLQkgKiA8Y29kZT5JUHJvamVjdC5hZGROYXR1cmU8L2NvZGU+IGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0byB3aGljaCB0aGlzIG5hdHVyZSBhcHBsaWVzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0JCXByb2plY3QgPSBuZXdQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2VydmVyIHByb3BlcnR5IG9mIHRoZSBwcm9qZWN0IGZyb20gdGhlIHN1cHBsaWVkIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQGRlcHJlY2F0ZWQgd2UgY2Fubm9udCB1c2UgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIGJlY2F1c2UgdGhleSBhcmUgbm90IHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb2plY3RTZXJ2ZXJWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVF1YWxpZmllZE5hbWUgd2hvbGVOYW1lID0gcXVhbGlmaWVkS2V5KGtleSk7Ci0JCQkJZ2V0UHJvamVjdCgpLnNldFBlcnNpc3RlbnRQcm9wZXJ0eSh3aG9sZU5hbWUsIHZhbHVlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJLy9JZiB3ZSBjYW4ndCBmaW5kIGl0IGFzc3VtZSBpdCBpcyBudWxsCi0JCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNodXRkb3duIHRoZSBFTUYgbmF0dXJlCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChnZXRSZXNvdXJjZVNldCgpICE9IG51bGwpCi0JCQkoKFByb2plY3RSZXNvdXJjZVNldCkgZ2V0UmVzb3VyY2VTZXQoKSkucmVsZWFzZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgRU1GTmF0dXJlcyBiYXNlZCBvbiB0aGUgbmF0dXJlcyB0aGF0IGhhdmUgYmVlbiBjb25maWd1cmVkIGZvciB0aGlzIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBMaXN0IG9mIEVNRk5hdHVyZXMKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gbGlzdCBvZiBuYXR1cmVzIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0LgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZWdpc3RlcmVkUnVudGltZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCUVNRk5hdHVyZSBuYXR1cmUgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVN0cmluZyBuYXR1cmVJRDsKLQkJCUl0ZXJhdG9yIGl0ID0gRU1GTmF0dXJlUmVnaXN0cnkuc2luZ2xldG9uKCkuUkVHSVNURVJFRF9OQVRVUkVfSURTLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJbmF0dXJlSUQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbmF0dXJlID0gKEVNRk5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUobmF0dXJlSUQpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlpZiAobmF0dXJlICE9IG51bGwpIHsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJCQkJcmVzdWx0LmFkZChuYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgbmF0dXJlIGlkcyBiYXNlZCBvbiB0aGUgbmF0dXJlcyB0aGF0IGhhdmUgYmVlbiBjb25maWd1cmVkIGZvciB0aGlzIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBsaXN0IG9mIGNvbmZpZ3VyZWQgbmF0dXJlIGlkcy4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZWdpc3RlcmVkUnVudGltZUlEcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIG5hdHVyZUlEID0gbnVsbDsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IEVNRk5hdHVyZVJlZ2lzdHJ5LnNpbmdsZXRvbigpLlJFR0lTVEVSRURfTkFUVVJFX0lEUy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5hdHVyZUlEID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShuYXR1cmVJRCkpIHsKLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQkJCQkJcmVzdWx0LmFkZChuYXR1cmVJRCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaWYgdGhlIHByb2plY3QgaGFzIHRoZSBnaXZlbiBuYXR1cmUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHByb2plY3QgaGFzIGdpdmVuIG5hdHVyZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmVJZCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKG5hdHVyZUlkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaWYgdGhlIHByb2plY3QgaGFzIGFueSBvbmUgb2YgdGhlIHBvc3NpYmxlIGdpdmVuIG5hdHVyZSBpZHMuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcG9zc2libGVOYXR1cmVJZHMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgcG9zc2libGUgbmF0dXJlcyBpZCBpcyBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUnVudGltZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBwb3NzaWJsZU5hdHVyZUlkcykgewotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc3NpYmxlTmF0dXJlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGhhc1J1bnRpbWUocHJvamVjdCwgcG9zc2libGVOYXR1cmVJZHNbaV0pKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0Fic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhNTQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0Fic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5Lio7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbHVnaW4gZXJyb3IgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCi0gKiBCYXNlIGxvZyByZW5kZXJlciB0aGF0IGxvZ3MgdG8gdGhlIHdvcmtiZW5jaC4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyIGltcGxlbWVudHMgSUxvZ1JlbmRlcmVyMiB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlRyYWNlTW9kZSA9IGZhbHNlOyAvLyB3aWxsIHdlIGFjdHVhbGx5IHB1bmNoIHRyYWNlIG1lc3NhZ2VkIG9yIG5vdAotCi0JcHJpdmF0ZSBib29sZWFuIGZTZXR0aW5nVHJhY2UgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBCdW5kbGUgZk15QnVuZGxlID0gbnVsbDsKLQotCXByb3RlY3RlZCBMb2dnZXIgZk15TG9nZ2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBJTG9nIGZXb3JrQmVuY2hMb2dnZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0ZXIgdGFraW5nIGEgbG9nZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlcihMb2dnZXIgbG9nZ2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNeUxvZ2dlciA9IGxvZ2dlcjsKLQkJZlRyYWNlTW9kZSA9IGZNeUxvZ2dlci5nZXRUcmFjZU1vZGUoKTsKLQotCQlTdHJpbmcgcGx1Z2luSUQgPSBmTXlMb2dnZXIuZ2V0UGx1Z2luSUQoKTsKLQkJZk15QnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQkJaWYgKGZNeUJ1bmRsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgUGx1Z2luIElEIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmV29ya0JlbmNoTG9nZ2VyID0gUGxhdGZvcm0uZ2V0TG9nKGZNeUJ1bmRsZSk7Ci0JCXNldFRyYWNlTW9kZShmTXlMb2dnZXIuZ2V0VHJhY2VNb2RlKCkgfHwgaXNEZWJ1Z2dpbmcoZk15QnVuZGxlKSk7Ci0JCWZNeUxvZ2dlci5zZXRSZW5kZXJlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgdXNlZCB0byBjb21lIGZyb20gdGhlIFBsdWdpbiBpbnN0YW5jZS4gQnV0IGluIG5ldyBPU0dpLCB0aGVyZSBpcyBub3QgbmVjZXNzYXJpbHkgYSBQbHVnaW4gaW5zdGFuY2UuIFNvIHVzZSB0aGUgc2FtZSBsb2dpYyB0aGV5IHVzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoQnVuZGxlIGJ1bmRsZSkgewotCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyBrZXkgPSBzeW1ib2xpY05hbWUgKyAiL2RlYnVnIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oa2V5KTsKLQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gZmFsc2UgOiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIGNvbnNvbGUgbG9nIGZvciBlY2xpcHNlIHR1cm5lZCBvbiB0byBzeXNvdXQuIElmIHRydWUsIHRoZW4gd2Ugc2hvdWxkbid0IGxvZyB0byBjb25zb2xlIGFueXRoaW5nIGFscmVhZHkgbG9nZ2VkIGJlY2F1c2UgRWNsaXBzZSB3b3VsZCBvZgotCSAqIGxvZ2dlZCBpdCBmb3IgdXMuIFRoaXMgY29tZXMgZnJvbSB0aGUgLURlY2xpcHNlLmNvbnNvbGVMb2c9InRydWUiIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHdoZW4gc3RhcnRpbmcgZWNsaXBzZSBmcm9tIFBERS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29uc29sZUxvZ09uOwotCXN0YXRpYyB7Ci0JCVN0cmluZyBjb25zb2xvZ1Byb3BlcnR5TmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBBY2Nlc3NpbmcgYW4gaW50ZXJuYWwgZmllbGQsIHNvIHVzaW5nIHJlZmxlY3Rpb24uIFRoaXMgd2F5IGlmIGNoYW5nZXMgaW4gZnV0dXJlIHdlIHdvbid0IGNyYXNoLgotCQkJQ2xhc3MgZWNsaXBzZVN0YXJ0ZXIgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5FY2xpcHNlU3RhcnRlciIpOwkvLyROT04tTkxTLTEkCi0JCQlGaWVsZCBjb25zb2xlbG9nID0gZWNsaXBzZVN0YXJ0ZXIuZ2V0RGVjbGFyZWRGaWVsZCgiUFJPUF9DT05TT0xFX0xPRyIpOwkvLyROT04tTkxTLTEkCi0JCQljb25zb2xvZ1Byb3BlcnR5TmFtZSA9IChTdHJpbmcpIGNvbnNvbGVsb2cuZ2V0KG51bGwpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQl9Ci0JCWNvbnNvbGVMb2dPbiA9IGNvbnNvbG9nUHJvcGVydHlOYW1lICE9IG51bGwgJiYgInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoY29uc29sb2dQcm9wZXJ0eU5hbWUpKSA7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyI3NldFRyYWNlTW9kZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYWNlTW9kZShib29sZWFuIGZsYWcpIHsKLQkJaWYgKGZTZXR0aW5nVHJhY2UpCi0JCQlyZXR1cm47IC8vIERvIG5vdCBhbGxvdyBjeWNsZXMKLQotCQlmU2V0dGluZ1RyYWNlID0gdHJ1ZTsKLQkJZlRyYWNlTW9kZSA9IGZsYWc7Ci0JCWZNeUxvZ2dlci5zZXRUcmFjZU1vZGUoZmxhZyk7Ci0JCWZTZXR0aW5nVHJhY2UgPSBmYWxzZTsKLQl9Ci0KLQkvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGZvciBoaXN0b3JpY2FsIHJlbmRlcmVycyBpbiBjYXNlIHRoaXMgaGFzIGJlZW4gc3ViY2xhc3NlZCBvdXRzaWRlCi0JLy8gb2YgdXRpbC4KLQotCS8qKgotCSAqIExvZyBhIHN0cmluZyB0byB0aGUgdHJhY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmFtCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgbG9nKFN0cmluZyBwYXJhbSk7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IG9uZSB0aGF0IGxvZyBhIHN0cmluZyB0byB0aGUgdHJhY2UgZ2l2ZW4gYSBsZXZlbC4gRGVmYXVsdCBzaW1wbHkgcGFzc2VzIGl0IHRvIGxvZyhTdHJpbmcpIHNvIHRoYXQgd2UgZG9uJ3QgYnJlYWsgb2xkIHN1YmNsYXNzZXMuCi0JICogPHA+Ci0JICogSWYgbG9nZ2VkVG9Xb3JrYmVuY2ggaXMgdHJ1ZSwgdGhlbiBpdCBzaG91bGRuJ3QgYmUgbG9nZ2VkIHRvIGNvbnNvbGUgaWYgY29uc29sZUxvZ09uIGlzIHRydWUgYmVjYXVzZSB3b3JrYmVuY2ggYWxyZWFkeSBsb2dnZWQgdG8gY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZywgTGV2ZWwgbCwgYm9vbGVhbiBsb2dnZWRUb1dvcmtiZW5jaCkgewotCQlsb2cobXNnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSkgewotCi0JCVN0cmluZyB0YXJnZXQgPSBsb2dXb3JrQmVuY2gobXNnLCB0eXBlKTsKLQkJaWYgKGZUcmFjZU1vZGUgfHwgdGFyZ2V0LmVxdWFscyhOT0xPR19ERVNDUklQVElPTikpCi0JCQlyZXR1cm4gbG9nKG1zZyk7Ci0JCWVsc2UKLQkJCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRvIHdvcmtiZW5jaCwgYSBzdHJpbmcgb2YgdGhlIGdpdmVuIGxldmVsIDxjb2RlPklMb2dSZW5kZXJlci5MT0dfPC9jb2RlPi4gbGV2ZWxzLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gZGVzY3JpcHRpb24gb2YgdGhlIGxvZydzIGRlc3RpbmF0aW9uIGUuZy4sIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+Ci0JICogCi0JICogQHNlZSBJTG9nUmVuZGVyZXIjTE9HX0VSUk9SIGFuZCBhbGwgb2YgdGhlIG90aGVyIGxvZyB0eXBlcy4KLQkgKiBAc2VlIElMb2dSZW5kZXJlciNDT05TT0xFX0RFU0NSSVBUSU9OCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dXb3JrQmVuY2goU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKLQotCQl0cnkgewotCQkJaW50IEVyckNvZGU7Ci0JCQlpZiAoZldvcmtCZW5jaExvZ2dlciAhPSBudWxsKSB7Ci0JCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJCWNhc2UgKElMb2dSZW5kZXJlci5MT0dfRVJST1IpOgotCQkJCQkJRXJyQ29kZSA9IElTdGF0dXMuRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSUxvZ1JlbmRlcmVyLkxPR19XQVJOSU5HKToKLQkJCQkJCUVyckNvZGUgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSUxvZ1JlbmRlcmVyLkxPR19JTkZPKToKLQkJCQkJCUVyckNvZGUgPSBJU3RhdHVzLklORk87Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSUxvZ1JlbmRlcmVyLkxPR19UUkFDRSk6Ci0JCQkJCQlFcnJDb2RlID0gSVN0YXR1cy5PSzsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgTG9nIFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhFcnJDb2RlLCBmTXlCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssIG1zZywgbnVsbCk7Ci0JCQkJZldvcmtCZW5jaExvZ2dlci5sb2coc3RhdHVzKTsKLQkJCQlyZXR1cm4gV09SS0JFTkNIX0RFU0NSSVBUSU9OOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCQl9IGNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCQl9Ci0JfQotCi0JLy8gRGVmYXVsdCBpbXBsZW50YXRpb24gb2YgdGhlIElMb2dSZW5kZXJlcjIgaW50ZXJmYWNlLgotCXByb3RlY3RlZCBib29sZWFuIGlzTG9nZ2luZyhMZXZlbCBsZXZlbCkgewotCQlyZXR1cm4gZlRyYWNlTW9kZSB8fCBmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobGV2ZWwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFNUQVRVU19MRVZFTDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExldmVsW10gU1RBVFVTX0xFVkVMX0xPT0tVUDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExldmVsW10gTEVWRUxfU1RBVFVTOwotCi0Jc3RhdGljIHsKLQkJLy8gU3RhdHVzIGxldmVscyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGxvZyBsZXZlbHMsIGZyb20gZmluZXN0IHRvIG5vbmUsIHNhbWUgaW5kZXhlcyBhcyBmcm9tIFNUQVRVU19MRVZFTF9MT09LVVAuCi0JCVNUQVRVU19MRVZFTF9MT09LVVAgPSBuZXcgTGV2ZWxbXSB7IExldmVsLklORk8sIExldmVsLldBUk5JTkcsIExldmVsLlNFVkVSRX07Ci0JCVNUQVRVU19MRVZFTCA9IG5ldyBpbnRbXSB7IElTdGF0dXMuSU5GTywgSVN0YXR1cy5XQVJOSU5HLCBJU3RhdHVzLkVSUk9SfTsKLQotCQkvLyBMZXZlbHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBJU3RhdHVzIGxldmVscy4KLQkJaW50IG1heElEID0gTWF0aC5tYXgoSVN0YXR1cy5PSywgTWF0aC5tYXgoSVN0YXR1cy5JTkZPLCBNYXRoLm1heChJU3RhdHVzLldBUk5JTkcsIElTdGF0dXMuRVJST1IpKSk7Ci0JCUxFVkVMX1NUQVRVUyA9IG5ldyBMZXZlbFttYXhJRCArIDFdOwotCQlMRVZFTF9TVEFUVVNbSVN0YXR1cy5PS10gPSBMZXZlbC5GSU5FOwotCQlMRVZFTF9TVEFUVVNbSVN0YXR1cy5JTkZPXSA9IExldmVsLklORk87Ci0JCUxFVkVMX1NUQVRVU1tJU3RhdHVzLldBUk5JTkddID0gTGV2ZWwuV0FSTklORzsKLQkJTEVWRUxfU1RBVFVTW0lTdGF0dXMuRVJST1JdID0gTGV2ZWwuU0VWRVJFOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSBMZXZlbCBmb3IgdGhlIHN0YXR1cyBjb2RlIGZyb20gdGhlIGdpdmVuIElTdGF0dXMuCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqIEByZXR1cm4gdGhlIEphdmEgTGV2ZWwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgTGV2ZWwgZ2V0TG9nTGV2ZWwoSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIExFVkVMX1NUQVRVU1tzdGF0dXMuZ2V0U2V2ZXJpdHkoKV07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJU3RhdHVzIHN0YXR1cyBjb2RlIGZvciB0aGUgZ2l2ZW4gSmF2YSBMZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIHRoZSBJU3RhdHVzIHN0YXR1cyBjb2RlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U3RhdHVzU2V2ZXJpdHkoTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTVEFUVVNfTEVWRUxfTE9PS1VQLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoU1RBVFVTX0xFVkVMX0xPT0tVUFtpXSA9PSBsb2dMZXZlbCkKLQkJCQlyZXR1cm4gU1RBVFVTX0xFVkVMW2ldOwotCQl9Ci0JCXJldHVybiBJU3RhdHVzLk9LOyAvLyBEZWZhdWx0IHRvIG9rLgotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3RyaW5nIHRvIHRoZSB3b3JrYmVuY2ggZm9yIHRoZSBnaXZlbiBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2cncyBkZXN0aW5hdGlvbiBlLmcuLCA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9nV29ya2JlbmNoKFN0cmluZyBtc2csIExldmVsIGxldmVsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBOT0xPR19ERVNDUklQVElPTjsKLQkJLy8gVGVzdCBhZ2FpbiBiZWNhdXNlIHdlIGNvdWxkIGJlIGhlcmUgc2ltcGx5IGR1ZSB0byB0cmFjZSBtb2RlLCBpbiB3aGljaCBjYXNlIHdlCi0JCS8vIGRvbid0IHdhbnQgdG8gd29ya2JlbmNoIGxvZyBpdC4KLQkJaWYgKGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsZXZlbCkpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhmTXlCdW5kbGUpLmxvZyhuZXcgU3RhdHVzKGdldFN0YXR1c1NldmVyaXR5KGxldmVsKSwgZk15QnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtc2csIG51bGwpKTsKLQkJCXJlc3VsdCA9IFdPUktCRU5DSF9ERVNDUklQVElPTjsKLQkJCWlmIChmVHJhY2VNb2RlKQotCQkJCWxvZyhtc2csIGxldmVsLCB0cnVlKTsKLQkJfSBlbHNlIGlmIChmVHJhY2VNb2RlKQotCQkJbG9nKG1zZywgbGV2ZWwsIGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdGF0dXNNc2coSVN0YXR1cyBzLCBMZXZlbCBsKSB7Ci0JCWlmIChzLmdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQlyZXR1cm4gZk15TG9nZ2VyLmdldEdlbmVyaWNNc2cocy50b1N0cmluZygpICsgZk15TG9nZ2VyLmZMaW5lU2VwZXJhdG9yICsgZk15TG9nZ2VyLmV4Y2VwdGlvblRvU3RyaW5nKHMuZ2V0RXhjZXB0aW9uKCkpLCBsKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKHMudG9TdHJpbmcoKSwgbCk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBJU3RhdHVzIHRvIHRoZSB3b3JrYmVuY2ggYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBvZiB0aGUgbG9nJ3MgZGVzdGluYXRpb24gZS5nLiwgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvZ1dvcmtiZW5jaChJU3RhdHVzIHMsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBnZXRMb2dMZXZlbChzKTsKLQkJU3RyaW5nIHJlc3VsdCA9IE5PTE9HX0RFU0NSSVBUSU9OOwotCQkvLyBUZXN0IGFnYWluIGJlY2F1c2Ugd2UgY291bGQgYmUgaGVyZSBzaW1wbHkgZHVlIHRvIHRyYWNlIG1vZGUsIGluIHdoaWNoIGNhc2Ugd2UKLQkJLy8gZG9uJ3Qgd2FudCB0byB3b3JrYmVuY2ggbG9nIGl0LgotCQlpZiAoZk15TG9nZ2VyLmlzTG9nZ2luZ0xldmVsKGxldmVsKSkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKGZNeUJ1bmRsZSkubG9nKHMpOwotCQkJcmVzdWx0ID0gV09SS0JFTkNIX0RFU0NSSVBUSU9OOwotCQkJaWYgKGZUcmFjZU1vZGUpCi0JCQkJbG9nKGdldFN0YXR1c01zZyhzLCBsZXZlbCksIGxldmVsLCB0cnVlKTsKLQkJfSBlbHNlIGlmIChmVHJhY2VNb2RlKQotCQkJbG9nKGdldFN0YXR1c01zZyhzLCBsZXZlbCksIGxldmVsLCBmYWxzZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRvIHRoZSB3b3JrYmVuY2ggdGhlIFRocm93YWJsZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogCi0JICogQHBhcmFtIHQKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2cncyBkZXN0aW5hdGlvbiBlLmcuLCA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9nV29ya2JlbmNoKFRocm93YWJsZSB0LCBMZXZlbCBsZXZlbCkgewotCQlTdHJpbmcgcmVzdWx0ID0gTk9MT0dfREVTQ1JJUFRJT047Ci0JCS8vIFRlc3QgYWdhaW4gYmVjYXVzZSB3ZSBjb3VsZCBiZSBoZXJlIHNpbXBseSBkdWUgdG8gdHJhY2UgbW9kZSwgaW4gd2hpY2ggY2FzZSB3ZQotCQkvLyBkb24ndCB3YW50IHRvIHdvcmtiZW5jaCBsb2cgaXQuCi0JCWlmIChmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobGV2ZWwpKSB7Ci0JCQlQbGF0Zm9ybS5nZXRMb2coZk15QnVuZGxlKS5sb2cobmV3IFN0YXR1cyhnZXRTdGF0dXNTZXZlcml0eShsZXZlbCksIGZNeUJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIkV4Y2VwdGlvbiB0aHJvd24uIiwgdCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBXT1JLQkVOQ0hfREVTQ1JJUFRJT047Ci0JCQlpZiAoZlRyYWNlTW9kZSkKLQkJCQlsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coZk15TG9nZ2VyLmV4Y2VwdGlvblRvU3RyaW5nKHQpLCBsZXZlbCksIGxldmVsLCB0cnVlKTsKLQkJfSBlbHNlIGlmIChmVHJhY2VNb2RlKQotCQkJbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKGZNeUxvZ2dlci5leGNlcHRpb25Ub1N0cmluZyh0KSwgbGV2ZWwpLCBsZXZlbCwgZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGJ5dGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJvb2xlYW4gYiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGIpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGJ5dGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGIpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGNoYXIsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGNoYXIgYywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGMpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGRvdWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihkKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhmbG9hdCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGYpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGludCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coaW50IGksIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihpKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhsb25nLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihsKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhPYmplY3QgbywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJU3RhdHVzKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaCgoSVN0YXR1cykgbywgbGV2ZWwpOwotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YobyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coc2hvcnQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKHNob3J0IHMsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihzKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhqYXZhLmxhbmcuVGhyb3dhYmxlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhUaHJvd2FibGUgdCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaCgoKENvcmVFeGNlcHRpb24pIHQpLmdldFN0YXR1cygpLCBsZXZlbCk7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5TRVZFUkU7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKSB7Ci0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKHQsIGxldmVsKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9Db25zb2xlTG9nUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQ29uc29sZUxvZ1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGNhYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9Db25zb2xlTG9nUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFBsdWdpbiBlcnJvciBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKLSAqIExvZyByZW5kZXJlciB0byB0aGUgY29uc29sZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zb2xlTG9nUmVuZGVyZXIgZXh0ZW5kcyBBYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIHRha2luZyBhIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIENvbnNvbGVMb2dSZW5kZXJlcihMb2dnZXIgbG9nZ2VyKSB7Ci0JCXN1cGVyKGxvZ2dlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnKSB7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCXJldHVybiBJTG9nUmVuZGVyZXIuQ09OU09MRV9ERVNDUklQVElPTjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnLCBMZXZlbCBsLCBib29sZWFuIGxvZ2dlZFRvV29ya2JlbmNoKSB7Ci0JCWlmICghbG9nZ2VkVG9Xb3JrYmVuY2ggfHwgIWNvbnNvbGVMb2dPbikgewotCQkJaWYgKGwgPT0gTGV2ZWwuU0VWRVJFKQotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDJmYWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFBsdWdpbiBlcnJvciBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKLSAqIExvZ2dlciB0aGF0IGFsc28gbG9ncyB0byBhIHRyYWNlIGZpbGUgaW4gdGhlIHBsdWdpbidzIG1ldGFkYXRhIGFyZWEuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIgZXh0ZW5kcyBBYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyIHsKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIHRyYWNlIGZpbGUgaW4gdGhlIG1ldGFkYXRhIGFyZWEuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGx1Z2luVHJhY2VGaWxlTmFtZSA9ICIvLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZUcmFjZUZpbGUgPSBudWxsOwotCi0JcHJpdmF0ZSBQcmludFdyaXRlciB0cmFjZUZpbGUgPSBudWxsOwotCi0JLyoqCi0JICogRGVmYXVsdFVJTG9nUmVuZGVyZXIgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihMb2dnZXIgbG9nZ2VyKSB7Ci0JCXN1cGVyKGxvZ2dlcik7Ci0KLQkJZlRyYWNlRmlsZSA9IFBsYXRmb3JtLmdldFN0YXRlTG9jYXRpb24oZk15QnVuZGxlKS50b1N0cmluZygpICsgUGx1Z2luVHJhY2VGaWxlTmFtZTsKLQkJKG5ldyBGaWxlKGZUcmFjZUZpbGUpKS5kZWxldGUoKTsgLy8gU3RhcnQgZnJvbSBmcmVzaCAuLi4gZG8gbm90IHdhbnQgdG8gbGVhayBvbiBkaXNrIHNwYWNlCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvc2VUcmFjZUZpbGUoKSB7Ci0JCWlmICh0cmFjZUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCXRyYWNlRmlsZS5mbHVzaCgpOwotCQkJdHJhY2VGaWxlLmNsb3NlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cmFjZUZpbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnKSB7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0KLQkJb3BlblRyYWNlRmlsZSgpOwotCQlpZiAodHJhY2VGaWxlICE9IG51bGwpIHsKLQkJCXRyYWNlRmlsZS5wcmludGxuKG1zZyk7Ci0JCQljbG9zZVRyYWNlRmlsZSgpOwotCQl9Ci0JCXJldHVybiBmVHJhY2VGaWxlOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2csIExldmVsIGwsIGJvb2xlYW4gbG9nZ2VkVG9Xb3JrYmVuY2gpIHsKLQkJaWYgKCFsb2dnZWRUb1dvcmtiZW5jaCB8fCAhY29uc29sZUxvZ09uKSB7Ci0JCQlpZiAobCA9PSBMZXZlbC5TRVZFUkUpCi0JCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQllbHNlCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQotCQlvcGVuVHJhY2VGaWxlKCk7Ci0JCWlmICh0cmFjZUZpbGUgIT0gbnVsbCkgewotCQkJdHJhY2VGaWxlLnByaW50bG4obXNnKTsKLQkJCWNsb3NlVHJhY2VGaWxlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlblRyYWNlRmlsZSgpIHsKLQkJdHJ5IHsKLQkJCXRyYWNlRmlsZSA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmVHJhY2VGaWxlLCB0cnVlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoZXJlIHdhcyBhIHByb2JsZW0gb3BlbmluZyB0aGUgbG9nIGZpbGUgc28gbG9nIHRvIHRoZSBjb25zb2xlCi0JCQl0cmFjZUZpbGUgPSBudWxsOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvRWNsaXBzZUxvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9FY2xpcHNlTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjU2Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9FY2xpcHNlTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotIAotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbHVnaW4gZXJyb3IgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCi0gKiBHZXQgYW4gRWNsaXBzZSBsb2dnZXIuIFRoaXMgZ2V0cyBhIGxvZ2dlciB0aGF0IGtub3dzIGl0IGlzIGZvciBhIHBsdWdpbi4gCi0gKiAKLSAqIEZvciBlYWNoIHBsdWdpbiwgdGhlIGZvbGxvd2luZyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSAub3B0aW9uIGZpbGU6Ci0gKiAJCXtwbHVnaW4taWR9L2RlYnVnL2xvZ1RyYWNlCi0gKiAJCQlUaGUgdmFsdWVzIHZhbGlkIGZvciB0aGlzIGFyZSAidHJ1ZSIsICJmYWxzZSIsIG9yICJkZWZhdWx0Ii4gSWYgdHJ1ZSB0aGVuIGxvZ2dlcnMgd2lsbCBiZSBzZXQgaW50bwotICogCQkJdHJhY2UgbW9kZS4gVGhpcyBtZWFucyBldmVyeXRoaW5nIGxvZ2dlZCAoZXZlbiB0aG9zZSB0aGF0IGFyZSBmaWx0ZXJlZCBvdXQgZHVlIHRvIG5vdCBtZWV0aW5nIGxvZyBsZXZlbCkKLSAqIAkJCXdpbGwgYmUgdHJhY2VkIG91dC4gSWYgdGhlIHZhbHVlIGlzICJ0cnVlIiB0aGV5IHdpbGwgYmUgdHJhY2VkIHRvIHRoZSBzeXN0ZW0gY29uc29sZS4gIAotICogCQkJSWYgaXQgaXMgImRlZmF1bHQiIG9yIG5vdCBzZXQgYXQgYWxsLCB0aGVuIGl0IHdpbGwgYmUgdGhlIHZhbHVlIGluIHRoZSAib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nVHJhY2UiIC5vcHRpb25zIHNldHRpbmcuCi0gKiAJCQlJZiBub3Qgc2V0IHRoZXJlLCB0aGVuIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLSAqIAotICogCQl7cGx1Z2luLWlkfS9kZWJ1Zy9sb2dUcmFjZUZpbGUKLSAqIAkJCVRoZSB2YWx1ZXMgdmFsaWQgZm9yIHRoaXMgYXJlICJ0cnVlIiwgImZhbHNlIiwgb3IgImRlZmF1bHQiLiBJZiB0cnVlIHRoZW4gbG9nZ2VycyB3aWxsIHRyYWNlIHRvIAotICogCQkJdGhlIHN5c3RlbSBjb25zb2xlIEFORCB0byB0aGUgIi5sb2ciIGZpbGUgaW4gdGhlIHBsdWdpbnMgd29yayBhcmVhIGluIHRoZSBtZXRhZGF0YSBzZWN0aW9uIG9mIHRoZSB3b3Jrc3BhY2UuCi0gKiAJCQlJZiAiZmFsc2UiIHRoZW4gbm90IHRyYWNlZCB0byBhIHRyYWNlIGZpbGUuIAotICogCQkJSWYgaXQgaXMgImRlZmF1bHQiIG9yIG5vdCBzZXQgYXQgYWxsLCB0aGVuIGl0IHdpbGwgYmUgdGhlIHZhbHVlIGluIHRoZSAib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nVHJhY2VGaWxlIiAub3B0aW9ucyBzZXR0aW5nLgotICogCQkJSWYgbm90IHNldCB0aGVyZSwgdGhlbiBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0gKiAKLSAqIAkJe3BsdWdpbi1pZH0uZGVidWcvbG9nTGV2ZWwKLSAqIAkJCVRoZSB2YWx1ZXMgdmFsaWQgZm9yIHRoaXMgYXJlIHRoZSBuYW1lcyBmcm9tIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsPC9jb2RlPiwgYW5kICJkZWZhdWx0Ii4gVGhlc2UKLSAqIAkJCWFyZSB0aGUgdHJhY2UgY3V0b2ZmIGxldmVscyB0byB1c2UuIEZvciBpbnN0YW5jZSwgaWYgdGhlIGxldmVsIHdhcyBTRVZFUkUsIHRoZW4gb25seSBsZXZlbCBTRVZFUkUgbXNncwotICogCQkJYXJlIGxvZ2dlZC4gVGhlIHJlc3QgYXJlIHNraXBwZWQuIE9yIGlmIHRoZSBsZXZlbCB3YXMgV0FSTklORywgdGhlbiBvbmx5IGxldmVsIFNFVkVSRSBhbmQgV0FSTklORyBhcmUKLSAqIAkJCWxvZ2dlZC4KLSAqIAkJCUlmIGl0IGlzICJkZWZhdWx0IiBvciBub3Qgc2V0IGF0IGFsbCwgdGhlbiBpdCB3aWxsIGJlIHRoZSB2YWx1ZSBpbiB0aGUgIm9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ0xldmVsIiAub3B0aW9ucyBzZXR0aW5nLgotICogCQkJSWYgbm90IHNldCB0aGVyZSwgdGhlbiBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgV0FSTklORy4KLSAqIAotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMb2dnZXIgZXh0ZW5kcyBMb2dnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfVFJBQ0VfT1BUSU9OID0gIi9kZWJ1Zy9sb2d0cmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19UUkFDRV9GSUxFX09QVElPTiA9ICIvZGVidWcvbG9ndHJhY2VmaWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0xPR19MRVZFTF9PUFRJT04gPSAiL2RlYnVnL2xvZ2xldmVsIjsgLy8gVGhlIGxvZ2dpbmcgbGV2ZWwgdG8gdXNlIHdoZW4gbm8gSHlhZWRlcy4gKHdoaWNoIHdlIGRvbid0IHN1cHBvcnQgYXQgdGhpcyB0aW1lKS4gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfT1BUSU9OID0gImRlZmF1bHQiOwkvLyBJZiBvcHRpb24gdmFsdWUgaXMgdGhpcywgdGhlbiB0aGUgdmFsdWUgZnJvbSBXVFAgQ29tbW9uIHBsdWdpbiBvcHRpb25zIHdpbGwgYmUgdXNlZCBmb3IgYm90aCBsb2dUcmFjZSBhbmQgbG9nTGV2ZWwuCSAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgbG9nZ2VyIGJhc2VkIHVwb24gdGhlIFBsdWdpbi4gCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRFY2xpcHNlTG9nZ2VyKFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIGdldEVjbGlwc2VMb2dnZXIocGx1Z2luLmdldEJ1bmRsZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbG9nZ2VyIGJhc2VkIHVwb24gdGhlIGJ1bmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldEVjbGlwc2VMb2dnZXIoQnVuZGxlIGJ1bmRsZSkgewotCQlTdHJpbmcgaWQgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCUxvZ2dlciBsb2dnZXIgPSBnZXRMb2dnZXJJZkV4aXN0cyhpZCk7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCkKLQkJCXJldHVybiBsb2dnZXI7Ci0JCQotCQlsb2dnZXIgPSBnZXRMb2dnZXIoaWQpOwkvLyBDcmVhdGUgb25lLCB3ZSB3aWxsIG5vdyBjdXN0b21pemUgaXQuCi0JCQotCQlTdHJpbmcgcGx1Z2luT3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oaWQgKyBERUJVR19UUkFDRV9PUFRJT04pOwotCQlpZiAocGx1Z2luT3B0aW9uID09IG51bGwgfHwgImRlZmF1bHQiLmVxdWFsc0lnbm9yZUNhc2UocGx1Z2luT3B0aW9uKSkgLy8kTk9OLU5MUy0xJAotCQkJcGx1Z2luT3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSkVNVXRpbFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBERUJVR19UUkFDRV9PUFRJT04pOwotCQlib29sZWFuIGxvZ1RyYWNlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UocGx1Z2luT3B0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKGlkICsgREVCVUdfVFJBQ0VfRklMRV9PUFRJT04pOwotCQlpZiAocGx1Z2luT3B0aW9uID09IG51bGwgfHwgImRlZmF1bHQiLmVxdWFsc0lnbm9yZUNhc2UocGx1Z2luT3B0aW9uKSkgLy8kTk9OLU5MUy0xJAotCQkJcGx1Z2luT3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSkVNVXRpbFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBERUJVR19UUkFDRV9GSUxFX09QVElPTik7Ci0JCWJvb2xlYW4gbG9nVHJhY2VGaWxlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UocGx1Z2luT3B0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcGx1Z2luT3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oaWQgKyBERUJVR19MT0dfTEVWRUxfT1BUSU9OKTsKLQkJaWYgKHBsdWdpbk9wdGlvbiA9PSBudWxsIHx8ICJkZWZhdWx0Ii5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbikpIC8vJE5PTi1OTFMtMSQKLQkJCXBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpFTVV0aWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgREVCVUdfTE9HX0xFVkVMX09QVElPTik7Ci0JCQotCQlMZXZlbCBsb2dMZXZlbCA9IExldmVsLldBUk5JTkc7Ci0JCWlmIChwbHVnaW5PcHRpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsb2dMZXZlbCA9IExldmVsLnBhcnNlKHBsdWdpbk9wdGlvbik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCQotCQlpZiAobG9nVHJhY2UpCi0JCQlsb2dnZXIuc2V0VHJhY2VNb2RlKHRydWUpOwotCQlsb2dnZXIuc2V0TGV2ZWwobG9nTGV2ZWwpOwotCQlpZiAoIWxvZ1RyYWNlRmlsZSkKLQkJCWxvZ2dlci5zZXRSZW5kZXJlcihuZXcgQ29uc29sZUxvZ1JlbmRlcmVyKGxvZ2dlcikpOwotCQllbHNlCi0JCQlsb2dnZXIuc2V0UmVuZGVyZXIobmV3IERlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyKGxvZ2dlcikpOwotCQkKLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0lNc2dMb2dnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvSU1zZ0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ1MDI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvSU1zZ0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGx1Z2luIGVycm9yIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAotICogSW50ZXJmYWNlIGZvciBhIG1lc3NhZ2UgbG9nZ2VyLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTXNnTG9nZ2VyIHsKLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL3BsdWdpbi9KRU1VdGlsUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvcGx1Z2luL0pFTVV0aWxQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiOWI4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvcGx1Z2luL0pFTVV0aWxQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBKRU1VdGlsUGx1Z2luLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNSAkJCAgJCREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjQ1ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLldvcmtzcGFjZVJlc291cmNlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBQbHVnaW4gZm9yIEVNRldvcmtiZW5jaCB1dGlscy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKRU1VdGlsUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmplbS51dGlsIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFBsdWdpbiBpZCBvZiB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBJRDsJCi0KLQkvKioKLQkgKiBVSSBDb250ZXh0IGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX0VYVEVOU0lPTl9QT0lOVCA9ICJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVJVGVzdGVyIGVsZW1lbnQgbmFtZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9URVNURVJfRVhURU5TSU9OX1BPSU5UID0gInVpVGVzdGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFByb3RvY29sIGZvciB3b3Jrc3BhY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLU1BBQ0VfUFJPVE9DT0wgPSAid29ya3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJvdG9jb2wgZm9yIHBsYXRmb3JtIHVyaSdzLiBpLmUuICJwbGF0Zm9ybTovLi4uIgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QUk9UT0NPTCA9ICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlc291cmNlIGluZGljYXRpb24gaW4gcGxhdGZvcm0gcHJvdG9jb2wuIEluZGljYXRlcyB1cmwgaXMgZm9yIGEgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZS4gaS5lLiAicGxhdGZvcm06L3Jlc291cmNlL3Byb2plY3RuYW1lLy4uLiIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9SRVNPVVJDRSA9ICJyZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBsdWdpbiBpbmRpY2F0aW9uIGluIHBsYXRmb3JtIHByb3RvY29sLiBJbmRpY2F0ZXMgdXJsIGlzIGZvciBhIGZpbGUvZGlyZWN0b3J5IGluIHRoZSBwbHVnaW5zIGFyZWEuIGkuZS4gInBsYXRmb3JtOi9wbHVnaW4vcGx1Z2luaWQvLi4uIgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyIHNoYXJlZENhY2hlOwotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VTZXQgcGx1Z2luUmVzb3VyY2VTZXQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBHTE9CQUxfTE9BRElOR19QTFVHSU5fTkFNRVM7Ci0KLQlwcml2YXRlIHN0YXRpYyBKRU1VdGlsUGx1Z2luIERFRkFVTFQ7Ci0KLQlwdWJsaWMgSkVNVXRpbFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJREVGQVVMVCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB3b3Jrc3BhY2UuIEp1c3QgdXNlIFJlc291cmNlUGx1Z2luLmdldFdvcmtzcGFjZSgpIGluc3RlYWQuCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwbHVnaW4gaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBwbHVnaW4gaW5zdGFuY2UuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBKRU1VdGlsUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBERUZBVUxUOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNoYXJlZENhY2hlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllcgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllciBnZXRTaGFyZWRDYWNoZSgpIHsKLQkJaWYgKHNoYXJlZENhY2hlID09IG51bGwpCi0JCQlzaGFyZWRDYWNoZSA9IG5ldyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyKCk7Ci0JCXJldHVybiBzaGFyZWRDYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaGFyZWRDYWNoZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNoYXJlZENhY2hlCi0JICogICAgICAgICAgICBUaGUgc2hhcmVkQ2FjaGUgdG8gc2V0Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNoYXJlZENhY2hlKFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIgYVNoYXJlZENhY2hlKSB7Ci0JCXNoYXJlZENhY2hlID0gYVNoYXJlZENhY2hlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVJc29sYXRlZFJlc291cmNlU2V0KElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlSXNvbGF0ZWRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIEFkYXB0ZXIuIFlvdSBjYW4gdXNlIHRoaXMgYXBpIHRvIGxpc3RlbiBmb3IgYW55IHNoYXJlZCByZXNvdXJjZSBiZWluZyBsb2FkZWQgb3IgcmVtb3ZlZCBmcm9tIGFueSBQcm9qZWN0UmVzb3VyY2VTZXQgaW4gdGhlIFdvcmtiZW5jaAotCSAqIGluc3RlYWQgb2YgdHJ5aW5nIHRvIGxpc3RlbiB0byBlYWNoIGluZGl2aWR1YWwgUHJvamVjdFJlc291cmNlU2V0LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFdvcmtzcGFjZUVNRlJlc291cmNlTGlzdGVuZXIoQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwgJiYgIWdldFNoYXJlZENhY2hlKCkuZUFkYXB0ZXJzKCkuY29udGFpbnMoYWRhcHRlcikpCi0JCQlnZXRTaGFyZWRDYWNoZSgpLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBhZGFwdGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogCi0JICogQHNlZSAjYWRkV29ya3NwYWNlRU1GUmVzb3VyY2VMaXN0ZW5lcihBZGFwdGVyKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVXb3Jrc3BhY2VFTUZSZXNvdXJjZUxpc3RlbmVyKEFkYXB0ZXIgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJZ2V0U2hhcmVkQ2FjaGUoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBwbHVnaW4gYWN0aXZlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWN0aXZlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZhdGVkKCkgewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKElEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgV29ya2JlbmNoQ29udGV4dCBpcyBpbnN0YW50aWF0ZWQgb24gYW4gRU1GTmF0dXJlLgotCSAqIDxwPgotCSAqIFRoaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogCi0JICogQHNlZSBwbHVnaW4ueG1sI1Jlc291cmNlSGFuZGxlckV4dGVuc2lvbiBleHRlbnNpb24gcG9pbnQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXh0ZW5kZWRSZXNvdXJjZUhhbmRsZXJzKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJaWYgKGFSZXNvdXJjZVNldCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcGN0ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksICJSZXNvdXJjZUhhbmRsZXJFeHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9uID0gcGN0LmdldEV4dGVuc2lvbnMoKTsKLQkJSUV4dGVuc2lvbiBjb25maWc7Ci0JCWZvciAoaW50IGwgPSAwOyBsIDwgZXh0ZW5zaW9uLmxlbmd0aDsgKytsKSB7Ci0JCQljb25maWcgPSBleHRlbnNpb25bbF07Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjRWxlbXMgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNFbGVtcy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCWhhbmRsZXIgPSAoUmVzb3VyY2VIYW5kbGVyKSBjRWxlbXNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigicnVuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQloYW5kbGVyID0gbnVsbDsKLQkJCQl9Ci0JCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQkJYVJlc291cmNlU2V0LmFkZChoYW5kbGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSAoYW5kIHRoZSBkaXJlY3RvcnkgaWYgZGVsZXRlUm9vdCBpcyB0cnVlKS4KLQkgKiBAcGFyYW0gcm9vdAotCSAqIEBwYXJhbSBkZWxldGVSb290IDxjb2RlPnRydWU8L2NvZGU+IHRvIGRlbGV0ZSB0aGUgcm9vdCBkaXJlY3RvcnkgdG9vLgotCSAqIEBwYXJhbSBtb25pdG9yIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGRlbGV0aW5nIGFueXRoaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVEaXJlY3RvcnlDb250ZW50KEZpbGUgcm9vdCwgYm9vbGVhbiBkZWxldGVSb290LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCQlpZiAocm9vdC5jYW5SZWFkKCkpIHsKLQkJCWlmIChyb290LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlGaWxlW10gZmlsZXMgPSByb290Lmxpc3RGaWxlcygpOwotCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RVdGlsX0RlbGV0ZV8xIiksIG5ldyBPYmplY3RbXSB7cm9vdC5nZXROYW1lKCl9KSwgZmlsZXMubGVuZ3RoKyhkZWxldGVSb290ID8gMSA6IDApKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCQkJCQllcnJvciB8PSBkZWxldGVEaXJlY3RvcnlDb250ZW50KGZpbGVzW2ldLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQllcnJvciB8PSAhZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdChFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9qZWN0VXRpbF9EZWxldGVfMSIpLCBuZXcgT2JqZWN0W10ge3Jvb3QuZ2V0TmFtZSgpfSksIDEpOwkJCQkgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGRlbGV0ZVJvb3QpIHsKLQkJCQllcnJvciB8PSAhcm9vdC5kZWxldGUoKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGVsc2UgewotCQkJZXJyb3IgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGEgY2xlYW4gcmVzb3VyY2UgY2hhbmdlbGlzdGVuZXIuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogQHBhcmFtIGV2ZW50TWFzayBtYXNrIG9mIGV2ZW50IHR5cGVzIHRvIGxpc3RlbiBmb3IgaW4gYWRkaXRpb24gdG8gb25lcyB0aGF0IGFyZSBuZWNlc3NhcnkgZm9yIGNsZWFuLiBVc2UgMCBpZiBubyBhZGRpdGlvbmFsIG9uZXMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihDbGVhblJlc291cmNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIsIGludCBldmVudE1hc2spIHsKLQkJLy8gUFJFX0JVSUxEOiBIYW5kbGUgQ2xlYW4uCi0JCS8vIFRPRE8gVW50aWwgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTk0MiBpcyBmaXhlZCwgd2UgbXVzdCBkbyBQT1NUX0JVSUxELCB0aGF0IHdpbGwgcHJvYmFibHkgYmUgc2VudCBiZWNhdXNlIGEgY2xlYW4gd2lsbCBjYXVzZSBhIGJ1aWxkIHRvIG9jY3VyIHdoaWNoIHNob3VsZCBjYXVzZSBhIGRlbHRhLgotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgZXZlbnRNYXNrIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQSByZXNvdXJjZSBsaXN0ZW5lciB0aGF0IGNhbiBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIGxpc3RlbiBmb3IgQ2xlYW4gcmVxdWVzdHMgYW5kIHByb2Nlc3MgdGhlbS4KLQkgKiA8cD4KLQkgKiBVc2UgPGNvZGU+e0BsaW5rIElSZXNvdXJjZUNoYW5nZUV2ZW50I1BSRV9CVUlMRH08L2NvZGU+IHdoZW4gYWRkaW5nIGFzIGxpc3RlbmVyIHRvIGdldCB0aGUKLQkgKiBjbGVhbiBldmVudHMuCi0JICogPHA+Ci0JICogPGI+Tm90ZTwvYj4gOiBUT0RPIFVudGlsIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDE5NDIgaXMgZml4ZWQsIHlvdSBtdXN0IGRvIFBPU1RfQlVJTEQsIHRoYXQgd2lsbCBwcm9iYWJseSBiZSBzZW50IGJlY2F1c2UgYSBjbGVhbiB3aWxsIGNhdXNlIGEgYnVpbGQgdG8gb2NjdXIgd2hpY2ggc2hvdWxkIGNhdXNlIGEgZGVsdGEuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDbGVhblJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gaGFuZGxlIG1vcmUgZXZlbnRzIHRoYW4ganVzdCBjbGVhbi4KLQkJCWlmIChldmVudC5nZXRCdWlsZEtpbmQoKSA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxEKSB7Ci0JCQkJaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJCWNsZWFuUHJvamVjdCgoSVByb2plY3QpIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJCQllbHNlIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpCi0JCQkJCWNsZWFuQWxsKCk7CQkJCQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENsZWFyIG91dCB0aGUgcHJvamVjdC4KLQkJICogQHBhcmFtIHByb2plY3QKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2xlYW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QpOwotCi0JCS8qKgotCQkgKiBDbGVhbiBhbGwuCi0JCSAqIDxwPgotCQkgKiBCeSBkZWZhdWx0IHRoaXMgd2lsbCBzaW1wbHkgY2FsbCBhIGNsZWFuIHByb2plY3Qgb24gZWFjaCBvcGVuIHByb2plY3QuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFuZCBlaXRoZXIKLQkJICogYWRkIG1vcmUgZnVuY3Rpb24gdG8gY2xlYXIgb3V0IG5vbi1wcm9qZWN0IGRhdGEgYW5kIHRoZW4gY2FsbCBzdXBlci4gT3IgaWYgdGhleSBjYW4gaGFuZGxlIGFsbCBvZiB0aGUgcHJvamVjdHMKLQkJICogaW4gYSBmYXN0ZXIgd2F5LCB0aGVuIGNhbiBjb21wbGV0ZWx5IGhhbmRsZSB0aGlzLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBjbGVhbkFsbCgpIHsKLQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCWNsZWFuUHJvamVjdChwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgcmVzb3VyY2Ugc2V0IGZvciB0aGUgcGx1Z2luICh0aGVyZSBpcyBvbmUgZm9yIHRoZSB3aG9sZSBzeXN0ZW0pLgotCSAqIAotCSAqIEByZXR1cm4gc3lzdGVtLXdpZGUgcmVzb3VyY2Ugc2V0LgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UGx1Z2luUmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChwbHVnaW5SZXNvdXJjZVNldCA9PSBudWxsKQotCQkJcGx1Z2luUmVzb3VyY2VTZXQgPSBuZXcgUHJvamVjdFJlc291cmNlU2V0SW1wbChudWxsKTsKLQkJcmV0dXJuIHBsdWdpblJlc291cmNlU2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3lzdGVtLXdpZGUgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBzZXQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGx1Z2luUmVzb3VyY2VTZXQoUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCXBsdWdpblJlc291cmNlU2V0ID0gc2V0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZ2xvYmFsIGxvYWRpbmcgcGx1Z2luIG5hbWVzLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRHbG9iYWxMb2FkaW5nUGx1Z2luTmFtZXMoKSB7Ci0JCWlmIChHTE9CQUxfTE9BRElOR19QTFVHSU5fTkFNRVMgPT0gbnVsbCkKLQkJCUdMT0JBTF9MT0FESU5HX1BMVUdJTl9OQU1FUyA9IHJlYWRHbG9iYWxMb2FkaW5nUGx1Z2luTmFtZXMoKTsKLQkJcmV0dXJuIEdMT0JBTF9MT0FESU5HX1BMVUdJTl9OQU1FUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIExvZ2dlciBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBsb2dnZXIgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJcmV0dXJuIExvZ2dlci5nZXRMb2dnZXIoSUQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHJlYWRHbG9iYWxMb2FkaW5nUGx1Z2luTmFtZXMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXhQb2ludCA9IHJlZy5nZXRFeHRlbnNpb25Qb2ludChJRCwgImdsb2JhbFBsdWdpblJlc291cmNlTG9hZCIpOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXhQb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tleHRlbnNpb25zLmxlbmd0aF07Ci0JCWlmIChleHRlbnNpb25zLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQluYW1lc1tpXSA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyOWM4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucGVyZm1zci5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvUEVSRk1TUi5SRUFETUUudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9QRVJGTVNSLlJFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODZhMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9QRVJGTVNSLlJFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1UaGlzIGlzIGEgc3R1YiBwbHVnaW4gZm9yIHBlcmZtc3IuIEl0IGlzIGhlcmUganVzdCBzbyB0aGF0IG9yZy5lY2xpcHNlLmplbS51dGlsIGNhbiBjb21waWxlLgotCi1JdCBzaG91bGQgbm90IGJlIGFuIG9wZW4gcHJvamVjdCBkdXJpbmcgbm9ybWFsIHVzYWdlLiBXaGVuZXZlciBhbnkgb2YgdGhlIGZpbGVzIGluIHRoaXMgcHJvamVjdAotYXJlIGNoYW5nZWQsICJwZXJmbXNyLmphcmRlc2MiIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbmV3IGNoYW5nZWQgYXBwcm9wcmlhdGUgamFyLiBEbyB0aGlzIGJ5OgotCi0xKSBTZWxlY3QgcGVyZm1zci5qYXJkZXNjCi0yKSBPbiBwb3B1cCBtZW51IHNlbGVjdCAiQ3JlYXRlIEpBUiIKLTMpIEhpdCAiRmluaXNoIgotNCkgQ29tbWl0IGFsbCBjaGFuZ2VzIHRvIENWUy4KLTUpIEdvIHRvIG9yZy5lY2xpcHNlLmplbS51dGlsIHByb2plY3QsIHNlbGVjdCB0aGUgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIgZm9sZGVyCi0gICBhbmQgc2VsZWN0IFJlcGxhY2UtPkxhdGVzdCBmcm9tIEhFQUQuIFRoaXMgd2lsbCBjYXVzZSB5b3VyIGp1c3QgY29tbWl0dGVkIGNoYW5nZXMKLSAgIGZyb20gc3RlcCA0IHRvIGJlIHB1dCBpbnRvIG9yZy5lY2xpcHNlLmplbS51dGlsIGFuZCB3aWxsIGJlIHBpY2tlZCB1cCBmb3IgdGhhdAotICAgcGx1Z2luIHRvIGNvbXBpbGUgYWdhaW5zdC4KLTYpIEVpdGhlciBjbG9zZSBvciBkZWxldGUgdGhlIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHVmIHByb2plY3QgZnJvbSB0aGUgd29ya3NwYWNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlmMjM4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MzB0aCBNYXJjaCwgMjAwNDwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgRVBMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRVBMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIEVQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgRVBMLjwvcD4KLQotPHA+PGI+VmVyc2lvbjo8L2I+IHYyMDA0MDYyNGEKLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZGI1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAqLmphcgotc291cmNlLnBlcmZtc3IuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphciBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmJhOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXJkZXNjIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcmRlc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OGUyMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcmRlc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGphcmRlc2M+Ci0gICAgPGphciBwYXRoPSJvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphciIvPgotICAgIDxvcHRpb25zIGJ1aWxkSWZOZWVkZWQ9InRydWUiIGNvbXByZXNzPSJ0cnVlIiBkZXNjcmlwdGlvbkxvY2F0aW9uPSIvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXJkZXNjIiBleHBvcnRFcnJvcnM9InRydWUiIGV4cG9ydFdhcm5pbmdzPSJ0cnVlIiBvdmVyd3JpdGU9ImZhbHNlIiBzYXZlRGVzY3JpcHRpb249InRydWUiIHVzZVNvdXJjZUZvbGRlcnM9ImZhbHNlIi8+Ci0gICAgPG1hbmlmZXN0IGdlbmVyYXRlTWFuaWZlc3Q9InRydWUiIG1hbmlmZXN0TG9jYXRpb249Ii9WRVNjcmFwUHJvamVjdC9NQU5JRkVTVC5tZiIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiIHJldXNlTWFuaWZlc3Q9ImZhbHNlIiBzYXZlTWFuaWZlc3Q9ImZhbHNlIiB1c2VzTWFuaWZlc3Q9InRydWUiPgotICAgICAgICA8c2VhbGluZyBzZWFsSmFyPSJmYWxzZSI+Ci0gICAgICAgICAgICA8cGFja2FnZXNUb1NlYWwvPgotICAgICAgICAgICAgPHBhY2thZ2VzVG9VblNlYWwvPgotICAgICAgICA8L3NlYWxpbmc+Ci0gICAgPC9tYW5pZmVzdD4KLSAgICA8c2VsZWN0ZWRFbGVtZW50cyBleHBvcnRDbGFzc0ZpbGVzPSJ0cnVlIiBleHBvcnRKYXZhRmlsZXM9InRydWUiIGV4cG9ydE91dHB1dEZvbGRlcj0iZmFsc2UiPgotICAgICAgICA8amF2YUVsZW1lbnQgaGFuZGxlSWRlbnRpZmllcj0iPW9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYyIvPgotICAgIDwvc2VsZWN0ZWRFbGVtZW50cz4KLTwvamFyZGVzYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzIwZWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGx1Z2luLm5hbWU9UGVyZm9ybWFuY2UgTW9uaXRvcgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjkyNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUiCi0gICBuYW1lPSIlUGx1Z2luLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5QZXJmTXNyQ29yZVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0icGVyZm1zci5qYXIiPjxleHBvcnQgbmFtZT0iKiIvPjwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIAotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL0lQZXJmb3JtYW5jZU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9JUGVyZm9ybWFuY2VNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTkyYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL0lQZXJmb3JtYW5jZU1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZTsKLQotLyoqCi0gKiBUYWtlIHNuYXBzaG90cyBvZiB0aGUgdmFyaW91cyBwZXJmb3JtYW5jZSBjb3VudGVycy4KLSAqICoqKioqKioqKioqKiogVGhpcyBpcyBqdXN0IGEgc3R1YiBvZiB0aGUgcmVhbCBpbnRlcmZhY2UgdG8gZ2V0IG9yZy5lY2xpcHNlLmplbS51dGlsIAotICogICAgICAgICAgICAgICB0byBjb21waWxlLiBJdCBpcyBub3QgdXNhYmxlIGJ5IGl0c2VsZi4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQZXJmb3JtYW5jZU1vbml0b3IKLXsKLQkvKioKLQkgKiBUaGVzZSBjb25zdGFudHMgY29udHJvbCBob3cgbXVjaCBpbmZvcm1hdGlvbiBpcyBnYXRoZXJlZCBmb3IgYSBwYXJ0aWN1bGFyIHNuYXBzaG90LgotCSAqIFRoZXkgYXJlIG9yJ2VkIHRvZ2V0aGVyIGFuZCBwYXNzZWQgaW50byB0aGUgc25hcHNob3QgbWV0aG9kLiAgCi0JICovCi0JaW50ZXJmYWNlIFR5cGVzCi0JewotCQkvKiogCi0JCSAqIDEgLSBXcml0ZSBvdXQgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFRoZXNlCi0JCSAqIGluY2x1ZGUgd29ya2luZyBzZXQsIHBlYWsgd29ya2luZyBzZXQsIGVsYXBzZWQgdGltZSwgdXNlciB0aW1lLCBhbmQgCi0JCSAqIGtlcm5lbCB0aW1lLgotCQkgKi8KLQkJaW50IE9wZXJhdGluZ1N5c3RlbUNvdW50ZXJzCQk9IDE7Ci0JCQotCQkvKioKLQkJICogMiAtIFdyaXRlIG91dCB0aGUgZ2xvYmFsIHBlcmZvcm1hbmNlIGluZm8uIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpa2UgdGhlIHRvdGFsCi0JCSAqIGNvbW1pdHRlZCBtZW1vcnkgZm9yIHRoZSBlbnRpcmUgc3lzdGVtLgotCQkgKiAKLQkJICogVGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSBHZXRQZXJmb3JtYW5jZUluZm8oKSBmdW5jdGlvbiBiZWluZyBhdmFpbGFibGUgaW4KLQkJICogdGhlIFdpbmRvd3MgcHNhcGkuZGxsLiBUaGlzIGlzIGF2YWlsYWJsZSBpbiBYUCBidXQgaXMgdXN1YWxseSBub3QgYXZhaWxhYmxlCi0JCSAqIGluIFdpbi8yMDAwLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHRoZW4gdGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCi0JCSAqLwotCQlpbnQgR2xvYmFsU3lzdGVtQ291bnRlcnMJCT0gMjsKLQkJCi0JCS8qKgotCQkgKiA0IC0gV3JpdGUgb3V0IHRoZSBzaXplIG9mIHRoZSBKYXZhIEhlYXAuCi0JCSAqLwotCQlpbnQgSmF2YUhlYXBTaXplCQkJCT0gNDsKLQotCQkvKioKLQkJICogOCAtIFdyaXRlIG91dCBob3cgbXVjaCBvZiB0aGUgSmF2YSBoZWFwIGlzIGJlaW5nIHVzZWQuIFRoaXMgY2FsbHMgdGhlIAotCQkgKiBnYXJiYWdlIGNvbGxlY3RvciBzbyBpdCBtYXkgc2tldyB0aW1pbmcgcmVzdWx0cy4KLQkJICovCi0JCWludCBKYXZhSGVhcFVzZWQJCQkJPSA4OwotCQkKLQkJLyoqCi0JCSAqIDE2IC0gVGhlIHBsdWdpbiBzdGFydHVwIGFuZCBzaXplIGluZm9ybWF0aW9uLgotCQkgKi8KLQkJaW50IFBsdWdpbkluZm8JCQkJCT0gMTY7Ci0JCQotCQkvKiogMHhmZmZmIC0gRXZlcnl0aGluZy4gKi8KLQkJaW50IEFsbAkJCQkJCQk9IDB4ZmZmZjsJCi0JfQotCQotCS8qKgotCSAqIEFkZCBzb21lIG1vcmUgImV4dHJhIiB2YXJpYXRpb25zLiAKLQkgKiAKLQkgKiBUaGUgdmFyaWF0aW9ucyB0aGF0IGFyZSBpbiBlZmZlY3QgYXJlIG1hZGUgdXAgb2YgdGhlc2UgZXh0cmEgdmFyaWF0aW9ucyBwbHVzIGFueSB2YXJpYXRpb25zCi0JICogdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCB3aXRoIHRoZSBzZXRWYXIoKSBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHZhckxpc3QgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB2YXJpYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgYWRkVmFyQXBwZW5kKFN0cmluZyB2YXJMaXN0KTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRyaXZlciBuYW1lLiAKLQkgKiAKLQkgKiBAcGFyYW0gZHJpdmVyIGEgbGFiZWwgdGhhdCBpZGVudGlmaWVzIHRoZSBkcml2ZXIgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuIElmIGl0IGlzIGEgV1NBRAotCSAqIGRyaXZlciwgdGhpcyB3aWxsIHVzdWFsbHkgYmUgc2V0IGJ5IHRoZSBleHRlbnNpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHJpdmVyKFN0cmluZyBkcml2ZXIpOwotCQotCS8qKgotCSAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGZpbGUsIHRoYXQgaXMgdGhlIHBsYWNlIHdoZXJlCi0JICogdGhlIG1lYXN1cmVtZW50cyBhcmUgc3RvcmVkLgotCSAqIAotCSAqIEBwYXJhbSBsb2dGaWxlIHRoZSBmaWxlIG5hbWUgb2Ygd2hlcmUgdGhlIGxvZyBzaG91bGQgYmUgd3JpdHRlbi4gVXN1YWxseSB0aGlzIGlzIGZ1bGx5IHF1YWxpZmllZAotCSAqIHBhdGggbmFtZS4gRm9yIGV4YW1wbGUgIng6XGxvZ3NcdGltZXIueG1sIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2dGaWxlKFN0cmluZyBsb2dGaWxlKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgdG8gYmUgb24gb3Igb2ZmLiBJZiBpdCBpcyBvZmYgdGhlbiBtb3N0IG9mIHRoZSBvdGhlciAKLQkgKiBvcGVyYXRpb25zIHdpbGwgbm8tb3AuCi0JICogCi0JICogVGhlIGRlZmF1bHQgaXMgZm9yIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIHRvIGJlIG9mZiB1bmxlc3MgaXQncyBzcGVjaWFsIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4gCi0JICogV2hlbiBjYWxsZWQgZnJvbSB0aGUgVUksIHRoZSBVSSBzaG91bGQgY2FsbCB0aGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzT24oYm9vbGVhbiBpc09uKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXN0IGNhc2UgbnVtYmVyIGZvciB0aGlzIG1lYXN1cmVtZW50IHJ1bi4KLQkgKiAgCi0JICogQHBhcmFtIHRlc3RkIHRlc3QgY2FzZSBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdGQoaW50IHRlc3RkKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXN0IGNhc2UgbmFtZS4gSWYgd2lsbCBjYXVzZSBhIG5ldyB0ZXN0IGNhc2UgdG8gYmUgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0TmFtZSBhIHNpbXBsZSAoc2hvcnQpIHRlc3QgY2FzZSBuYW1lLiBJbiB0aGUgY2FzZSBvZiBKVW5pdCB0ZXN0IGNhc2VzLCBpdCB3b3VsZCB1c3VhbGx5IAotCSAqIGJlIHRoZSBKVW5pdCBuYW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlc3ROYW1lKFN0cmluZyB0ZXN0TmFtZSk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB2YXJpYXRpb25zIHRoYXQgYXJlIGluIGVmZmVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFyIGEgY29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiB2YXJpYXRpb24gbnVtYmVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHVwbG9hZCBob3N0Ci0JICogCi0JICogQHBhcmFtIGhvc3QgRE5TIG5hbWUgb2YgdGhlIHVwbG9hZCBob3N0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXBsb2FkSG9zdChTdHJpbmcgaG9zdCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB1cGxvYWQgcG9ydAotCSAqIAotCSAqIEBwYXJhbSBwb3J0IHVwbG9hZCBwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXBsb2FkUG9ydChpbnQgcG9ydCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB1cGxvYWQgdXNlcmlkCi0JICogCi0JICogQHBhcmFtIHVzZXJpZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwbG9hZFVzZXJpZChTdHJpbmcgdXNlcmlkKTsKLQkKLQkvKioKLQkgKiBUYWtlIGEgc25hcHNob3Qgb2Ygc29tZSBkZWZhdWx0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RlcCB0aGlzIGlkZW50aWZpZXMgdGhlIHN0ZXAgdGhhdCB0aGUgc25hcHNob3QgaXMgZm9yCi0JICovCi0Jdm9pZCBzbmFwc2hvdChpbnQgc3RlcCk7Ci0JCi0JLyoqCi0JICogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBzZWxlY3RlZCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHN0ZXAgdGhpcyBpZGVudGlmaWVzIHRoZSBzdGVwIHRoYXQgdGhlIHNuYXBzaG90IGlzIGZvcgotCSAqIAotCSAqIEBwYXJhbSB0eXBlcyBUaGlzIGNvbnRyb2xzIHdoaWNoIG1lYXN1cmVtZW50cyBhcmUgc2VsZWN0ZWQuIEl0IGlzIGFuIG9yJ2QgdG9nZXRoZXIKLQkgKiBsaXN0IG9mIHRoZSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzIGNvbnN0YW50cy4KLQkgKiAKLQkgKiBAc2VlIElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMgCi0JICovCi0Jdm9pZCBzbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKTsKLQkKLQkvKioKLQkgKiBXcml0ZSB0aGUgY29tbWVudCB0byB0aGUgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqLwotCXZvaWQgd3JpdGVDb21tZW50KFN0cmluZyBjb21tZW50KTsKLQkKLQkvKioKLQkgKiBVcGxvYWQgdGhlIHJlc3VsdHMgdG8gdGhlIHNlcnZlci4gVGhpcyBjYXVzZXMgdGhlIGZpbGUgdG8gYmUKLQkgKiBjbG9zZWQsIGFuZCB0aGUgbW9uaXRvciB0byBiZSBwbGFjZWQgaW50byB0aGUgZmluaXNoZWQgc3RhdGUuCi0JICogCi0JICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSB1cGxvYWRob3N0LCB1cGxvYWRwb3J0IGFuZCB1cGxvYWR1c2VyaWQKLQkgKiBoYXZlIGJlZW4gY29uZmlndXJlZCBiZWZvcmUgaGFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gKGl0IGNhbiBiZSBudWxsKQotCSAqIAotCSAqIEByZXR1cm4gc29tZSBzdGF0dXMgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgVXBsb2FkLlN0YXR1cyB1cGxvYWQoU3RyaW5nIGRlc2NyaXB0aW9uKTsKLS8vCQotLy8JLyoqCi0vLwkgKiBVcGxvYWQgdGhlIHJlc3VsdHMgdG8gdGhlIHNlcnZlci4gVGhpcyBjYXVzZXMgdGhlIGZpbGUgdG8gYmUKLS8vCSAqIGNsb3NlZCwgYW5kIHRoZSBtb25pdG9yIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBmaW5pc2hlZCBzdGF0ZS4KLS8vCSAqIAotLy8JICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgbmFtZSB0aGF0IHRoZSBmaWxlIGlzIGJlaW5nIHNlbnQgdG8KLS8vCSAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IG9uIHRoZSBob3N0Ci0vLwkgKiBAcGFyYW0gdXNlcmlkIHRoZSB1c2VyaWQgdGhhdCBpcyBkb2luZyB0aGUgdXBsb2FkCi0vLwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gKGl0IGNhbiBiZSBudWxsKQotLy8JICogCi0vLwkgKiBAcmV0dXJuIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uCi0vLwkgKi8KLS8vCVVwbG9hZC5TdGF0dXMgdXBsb2FkKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHVzZXJpZCwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvUGVyZk1zckNvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9QZXJmTXNyQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTViYTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9QZXJmTXNyQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0gCi0KLS8qKgotICogKioqKioqKioqKioqKiBUaGlzIGlzIGp1c3QgYSBzdHViIG9mIHRoZSByZWFsIGNsYXNzIHRvIGdldCBvcmcuZWNsaXBzZS5qZW0udXRpbCAKLSAqICAgICAgICAgICAgICAgdG8gY29tcGlsZS4gSXQgaXMgbm90IHVzYWJsZSBieSBpdHNlbGYuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyZk1zckNvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCQotCXB1YmxpYyBzdGF0aWMgSVBlcmZvcm1hbmNlTW9uaXRvciBnZXRQZXJmb3JtYW5jZU1vbml0b3IoYm9vbGVhbiBib29sKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1VwbG9hZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1VwbG9hZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZhNjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9VcGxvYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmU7Ci0gCi0KLS8qKgotICogVXBsb2FkLgotICogKioqKioqKioqKioqKiBUaGlzIGlzIGp1c3QgYSBzdHViIG9mIHRoZSByZWFsIGludGVyZmFjZSB0byBnZXQgb3JnLmVjbGlwc2UuamVtLnV0aWwgCi0gKiAgICAgICAgICAgICAgIHRvIGNvbXBpbGUuIEl0IGlzIG5vdCB1c2FibGUgYnkgaXRzZWxmLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVXBsb2FkIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXR1cyB7Ci0JCXB1YmxpYyBib29sZWFuIHN1Y2Nlc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1M2RiNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2NvbW1vbi5tb3ZlL3dlYnRvb2xzLmNvbW1vbi5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjM6MDc6NDUgJAotIwotCi0KLXBsdWdpbk5hbWU9SmF2YSBFTUYgTW9kZWwgVXRpbGl0aWVzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFiZTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08IS0tIEV4dGVuc2lvbiBwb2ludCB0byByZWdpc3RlciBSZXNvdXJjZUhhbmRsZXJzIHRoYXQgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gCi0JbmV3IFdvcmtiZW5jaENvbnRleHRzIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iUmVzb3VyY2VIYW5kbGVyRXh0ZW5zaW9uIiBuYW1lPSJSZXNvdXJjZUhhbmRsZXJFeHRlbnNpb24iLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Imdsb2JhbFBsdWdpblJlc291cmNlTG9hZCIgbmFtZT0iR2xvYmFsIFBsdWdpbiBSZXNvdXJjZSBMb2FkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJuYXR1cmVfcmVnaXN0cmF0aW9uIiBuYW1lPSJFTUYgTmF0dXJlIHJlZ2lzdHJhdGlvbiIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW50ZXJuYWxXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSIgbmFtZT0iSW50ZXJuYWwgV29ya2JlbmNoIENvbnRleHQgRmFjdG9yeSIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiIG5hbWU9IlVJIENvbnRleHQgU2Vuc2l0aXZlIENsYXNzIiBzY2hlbWE9InNjaGVtYS91aUNvbnRleHRTZW5zaXRpdmVDbGFzcy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1aVRlc3RlciIgbmFtZT0iVUkgVGVzdGVyIiBzY2hlbWE9InNjaGVtYS91aVRlc3Rlci5leHNkIi8+ICAgCi0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wcm9wZXJ0eV9maWxlcy9lbWZ3b3JrYmVuY2gucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcHJvcGVydHlfZmlsZXMvZW1md29ya2JlbmNoLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDk0ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wcm9wZXJ0eV9maWxlcy9lbWZ3b3JrYmVuY2gucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8wPUlXQUUwMDAzRSBNZXRob2Qgbm90IHlldCBpbXBsZW1lbnRlZC4KLUVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzE9SVdBRTAwMDVFIFByb2plY3QgY2FuIG5vdCBiZSBudWxsLgotRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMj1JV0FFMDAwNkUgQXR0ZW1wdCB0byBjcmVhdGUgcmVzb3VyY2Ugc2V0IHdpdGggbnVsbCBwcm9qZWN0Ci1FTUZOYXR1cmVSZWdpc3RyeV9FUlJPUl8wPUlXQUUwMDA3RSBEdXBsaWNhdGUgRU1GIG5hdHVyZSByZWdpc3RyYXRpb24gZm9yIGlkOiB7MH0KLUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5X1VJXzA9VGhlIHByb2plY3Qgc2hvdWxkIG5vdCBiZSBudWxsLgotRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlfVUlfMT1UaGUgcHJvamVjdCBcInswfVwiIGlzIG5vdCBhY2Nlc3NpYmxlLgotCi1Qcm9qZWN0VXRpbF9EZWxldGVfMT1EZWxldGluZyBcInswfVwiLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aUNvbnRleHRTZW5zaXRpdmVDbGFzcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjcwZTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuamVtLnV0aWwiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIiBpZD0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiIG5hbWU9IlVJIENvbnRleHQgU2Vuc2l0aXZlIENsYXNzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvbXBvbmVudHMgYXJlIG9mdGVuIGRlc2lnbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgJnF1b3Q7SGVhZGxlc3MmcXVvdDsgb3Igbm9uLWdyYXBoaWNhbCBwb3J0aW9ucyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlIChHVUkpIHBvcnRpb25zLiBTb21ldGltZXMgdGhpcyBpcyBkb25lIHRvIGZvbGxvdyBnb29kIGRlc2lnbiBwcmluY2lwbGVzLCBvdGhlciB0aW1lcyB0aGVyZSBpcyBhIHNwZWNpZmljIHVzZSBjYXNlIGZvciBkb2luZyBzby4gV2hlbiBwbHVnaW5zIGZvbGxvdyB0aGlzIHByYWN0aWNlIGJlY2F1c2UgdGhleSBtdXN0IHZhcnkgdGhlaXIgYmVoYXZpb3IgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBydW5uaW5nIGluIGEgaGVhZGxlc3MgZW52aXJvbm1lbnQgb3IgYSBncmFwaGljYWwgZW52aXJvbm1lbnQsIHRoZXkgb2Z0ZW4gbmVlZCB0byBjaG9vc2UgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgYSBwYXJ0aWN1bGFyIHR5cGUuIFRoZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZWQgYnkgdGhlIEpFTSBjb21wb25lbnQgc29sdmVzIGV4YWN0bHkgdGhpcyBwcm9ibGVtLgotJmx0O3AmZ3Q7ICAgIAotVG8gdXNlIHRoZSBleHRlbnNpb24gcG9pbnQsIHlvdSBtdXN0IHByb3ZpZGUgdHdvIGV4dGVuc2lvbnMgdGhhdCBhcmUgbGlua2VkIGJ5IGEga2V5LiBUaGUga2V5IGlzIGEgdW5pcXVlIFN0cmluZy1iYXNlZCB2YWx1ZSB0aGF0IHlvdSB3aWxsIGxhdGVyIHVzZSB0byBpbnN0YW5pdGF0ZSB5b3VyIGNsYXNzLgotJmx0O3AmZ3Q7Ci1UaGUgZmlyc3QgdXNhZ2Ugb2YgdGhlIGV4dGVuc2lvbiBzcGVjaWZpZXMgeW91ciBrZXksIGFuZCB0aGUgSGVhZGxlc3MgY29udGV4dCwgYW5kIHRoZSBjbGFzcyB0aGF0IHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgZm9yIHRoaXMgKGtleSwgY29udGV4dCkgcGFpci4gVGhpcyBtZWFucyBpbiB0aGUgaGVhZGxlc3MgZW52aXJvbm1lbnQgdGhpcyBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCB3aGVuIHJlcXVlc3RlZC4KLSZsdDtwJmd0OwotVGhlIHNlY29uZCBleHRlbnNpb24gc3BlY2lmaWVzIHRoZSBVSSBjb250ZXh0IGFuZCB0aGUgc2FtZSBrZXksIGJ1dCBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXNpZ25lZCBmb3IgZ3JhcGhpY2FsIGVudmlyb25tZW50cy4gVGhpcyBtZWFucyBpbiB0aGUgVUkgZW52aXJvbm1lbnQgdGhpcyBvdGhlciBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCB3aGVuIHJlcXVlc3RlZC4KLSZsdDtwJmd0OwotVGhlIGFjdHVhbCByZXF1ZXN0IGlzIGRvbmUgaW4geW91ciBjb2RlIHZpYToKLSZsdDtwcmUmZ3Q7Ci1JTXlJbnRlcmZhY2UgaW5zdGFuY2UgPSAoSU15SW50ZXJmYWNlKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCZxdW90O215S2V5JnF1b3Q7KTsKLSZsdDsvcHJlJmd0Owotd2hlcmUgJmx0O2NvZGUmZ3Q7JnF1b3Q7bXlLZXkmcXVvdDsmbHQ7L2NvZGUmZ3Q7IGlzIHRoZSBrZXkgdXNlZCBvbiBib3RoIGV4dGVuc2lvbnMuIEl0IHdpbGwgdGhlbiBjaG9vc2UgZWl0aGVyIHRoZSBVSSBvciB0aGUgSGVhZGxlc3MgZXh0ZW5zaW9uIGRlcGVuZGluZyB1cG9uIHRoZSBjb250ZXh0LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFuIGV4dGVuc2lvbiBwb2ludCB0aGF0IGRlZmluZXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBhbmQgaXRzIGFwcHJvcHJpYXRlIGNvbnRleHQgKFVJIG9yIEhlYWRsZXNzKQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGtleSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgQ29udGV4dCBTZW5zaXRpdmUgc3VwZXIgY2xhc3MvaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGZvciBlaXRoZXIgYSBVSSBvciBIZWFkbGVzcyBjb250ZXh0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRleHQiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE9uZSBvZiAmcXVvdDtVSSZxdW90OyBvciAmcXVvdDtIZWFkbGVzcyZxdW90OyBUaGlzIGlzIGNhc2Utc2Vuc2l0aXZlLiBJdCBtdXN0IG1hdGNoIGV4YWN0bHkgYXMgc2hvd24gaGVyZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlVJIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRsZXNzIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICA2LjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVXNhZ2UgZm9yIHRoZSBVSSBjb250ZXh0OgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICBpZD0mcXVvdDtjb250ZXh0LlNlbnNpdGl2ZS5DbGFzcy53b3JraW5nQ29weU1hbmFnZXImcXVvdDsKLSAgICAgICBuYW1lPSZxdW90O1dvcmtpbmcgQ29weSBNYW5hZ2VyIC0gVUkgQ29udGV4dCBDbGFzcyZxdW90OwotICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmplbS51dGlsLkNvbnRleHRTZW5zaXRpdmVDbGFzcyZxdW90OyZndDsKLSAgICAgJmx0O3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgY29udGV4dD0mcXVvdDtVSSZxdW90OwotICAgICAgIGtleT0mcXVvdDt3b3JraW5nQ29weU1hbmFnZXImcXVvdDsKLSAgICAgICBjbGFzc05hbWU9JnF1b3Q7Y29tLmlibS53dHAuY29tbW9uLnVpLldUUFVJV29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7YnImZ3Q7Ci1Vc2FnZSBmb3IgdGhlIEhlYWRsZXNzIGNvbnRleHQ6Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgIGlkPSZxdW90O2NvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIG5hbWU9JnF1b3Q7V29ya2luZyBDb3B5IE1hbmFnZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzJnF1b3Q7Ci0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwuQ29udGV4dFNlbnNpdGl2ZUNsYXNzJnF1b3Q7Jmd0OwotICAgICAmbHQ7dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgIGNvbnRleHQ9JnF1b3Q7SGVhZGxlc3MmcXVvdDsKLSAgICAgICAgIGtleT0mcXVvdDt3b3JraW5nQ29weU1hbmFnZXImcXVvdDsKLSAgICAgICAgIGNsYXNzTmFtZT0mcXVvdDtjb20uaWJtLnd0cC5jb21tb24udWkuV1RQSGVhZGxlc3NXb3JraW5nQ29weU1hbmFnZXImcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDticiZndDsKLUFuZCBmaW5hbGx5IHRoZSByZXRyaWV2YWwgb2YgdGhlIGNsYXNzIGZvciB0aGUgY3VycmVudCBjb250ZXh0OgotCi0mbHQ7cHJlJmd0OwotSVdvcmtpbmdDb3B5TWFuYWdlciBtYW5hZ2VyID0gKElXb3JraW5nQ29weU1hbmFnZXIpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoJnF1b3Q7d29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7KTsKLSZsdDsvcHJlJmd0OwotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgU2VlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24mbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSBJQk0gMjAwMy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aVRlc3Rlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlUZXN0ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5YWIzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aVRlc3Rlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmplbS51dGlsIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIgaWQ9InVpVGVzdGVyIiBuYW1lPSJVSSBUZXN0ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHRlbGwgSkVNIHRoYXQgaXQgaXMgcnVubmluZyBpbiBhIG5vbi1IRUFETEVTUyBlbnZpcm9ubWVudC4gVHlwaWNhbGx5IFVJIGVudmlyb25tZW50IGlzIG5vbi1IRUFETEVTUy4gVGhlIGRlZmF1bHQgaWYgdGhlcmUgYXJlIG5vIGltcGxlbWVudGVycyBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludCB0aGF0IHJldHVybiB0cnVlIGlzIEhFQURMRVNTLgotJmx0O3AmZ3Q7Ci1BIEhFQURMRVNTIGVudmlyb25tZW50IGlzIHR5cGljYWxseSBhIGJhdGNoIHNpdHVhdGlvbiB3aGVyZSB0aGVyZSBpcyBubyBVSSBhbmQgdGhlIHdvcmtzcGFjZSBpcyB1c2VkIGZvciBvbmUgb3BlcmF0aW9uIGFuZCB0aGVuIHRlcm1pbmF0ZWQuIE1vc3QgaGVhZGxlc3MgdGFza3MgYXJlIGRvbmUgdW5kZXIgb25lIG9wZXJhdGlvbiBhbmQgdGhlIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIG1heSBub3QgaGF2ZSBhIGNoYW5jZSB0byBmbHVzaCBhIGJhZCByZWZsZWN0aW9uIGJlZm9yZSB0aGUgcmVhbCB0eXBlIG5lZWRzIHRvIGJlIGZvdW5kIGFuZCBjYW4gYmUgZm91bmQuIFNvIHdoYXQgd291bGQgaGFwcGVuIGlzIGlmIGEgY2xhc3Mgd2FzIGNyZWF0ZWQgZHVyaW5nIHRoaXMgb25lIG9wZXJhdGlvbiBpdCB3b3VsZCBub3QgYmUgZm91bmQgYmVjYXVzZSB0aGUgbm90aWZpY2F0aW9ucyBoYWQgbm90IHlldCBnb25lIG91dC4gCi0mbHQ7cCZndDsKLUluIGEgVUkgZW52aXJvbm1lbnQgdGhlIG9wZXJhdGlvbnMgYXJlIHR5cGljYWxseSBzaG9ydCBhbmQgZG8gb25seSBhIGZldyB0aGluZ3MgYW5kIHRoZSByZXN1bHRzIGFyZW4mYXBvczt0IG5lZWRlZCB1bnRpbCBhZnRlciB0aGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuIEluIHRoYXQgY2FzZSBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBub3Qga2VlcCBjaGVja2luZyBpZiBhIGNsYXNzIGhhcyBhcHBlYXJlZCBldmVyeXRpbWUgYSByZXF1ZXN0IGlzIG1hZGUsIGluc3RlYWQgaXQgd2lsbCB3YWl0IGZvciB0aGUgbm90aWZpY2F0aW9uIG9mIHRoZSBhZGRlZCBjbGFzcyB0byBhcHBlYXIgYmVmb3JlIHJlc2V0dGluZyB0aGUgZGVmaW5pdGlvbiB0byBhbGxvdyBjaGVja2luZyBhZ2FpbiBsYXRlci4KLSZsdDtwJmd0OwotSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBpbXBsZW1lbnRlciBvZiB0aGlzIGludGVyZmFjZSBpbiB0aGUgYXBwbGljYXRpb24sIHRoZW4gaXQgd2lsbCBnbyB0aHJvdWdoIGVhY2ggb2YgdGhlbSBvbmNlIHVudGlsIG9uZSByZXR1cm5zIHRydWUuIEFzIHNvb24gYXMgb25lIHJldHVybnMgdHJ1ZSBpdCB3aWxsIHN0b3AgYW5kIG1hcmsgdGhlIGFwcGxpY2F0aW9uIGFzIGJlaW5nIG5vbi1IRUFETEVTUy4gVGhpcyB3aWxsIGJlIGRvbmUgb25seSBvbmNlIGZvciB0aGUgYXBwbGljYXRpb24uIEl0IHdpbGwgbm90IGJlIGFnYWluIHVudGlsIHRoZSBuZXh0IHNlc3Npb24gb2YgdGhlIGFwcGxpY2F0aW9uLgotJmx0O3AmZ3Q7Ci1UaGlzIGlzIHR5cGljYWxseSBhbiBpbnRlcm5hbCBleHRlbnNpb24gcG9pbnQgb25seS4gVGhlIEpFTSBVSSBwbHVnaW4gd2lsbCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgUGxhdGZvcm0gVUkgaXMgYWN0aXZlLiBTbyB0aGlzIHdpbGwgbm9ybWFsbHkgbm90IGJlIG5lZWRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBtb3N0IGN1c3RvbWVycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idWlUZXN0ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InVpVGVzdGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgdWlUZXN0ZXIgZGVmaW5pdGlvbiBlbGVtZW50LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIFVJVGVzdGVyIGZvciB0aGlzIGV4dGVuc2lvbi4gSXQgbXVzdCBpbXBsZW1lbnQgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwuVUlUZXN0ZXImbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwuVUlUZXN0ZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGltcGxlbWVudGVyOiAKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwudWlUZXN0ZXImcXVvdDsmZ3Q7Ci0gICZsdDt1aVRlc3RlcgotICAgY2xhc3NOYW1lPSZxdW90O2NvbS5leGFtcGxlLlVJVGVzdGVySW1wbGVtZW50YXRpb24mcXVvdDsvJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlICZsdDtzYW1wJmd0O2NsYXNzTmFtZSZsdDsvc2FtcCZndDsgYXR0cmlidXRlIG11c3QgYmUgYSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlciZsdDsvc2FtcCZndDsgaW50ZXJmYWNlIGZvciB0aGUgdGVzdGVyLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGVyZSBpcyBubyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGlzIGNsYXNzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODZkMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwMjkwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotI0ZyaSBTZXAgMTEgMTk6MjQ6NDcgUERUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2MWJkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLkpzdENvbW1vblVJUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5hc3NlbWJseS53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlZDViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkF1Z3VzdCwgMjAwOTwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE0N2YwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL2ljb25zL2phcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL2ljb25zL2phcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmExZDc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9pY29ucy9qYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiZWM4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyPUVjbGlwc2Uub3JnCi0KLUJ1bmRsZS1OYW1lLjAgPSBDb21tb24gSlNUIFVJIFBsdWctaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDFmYjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KLTxwbHVnaW4+Ci0KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS5yZWZlcmVuY2VXaXphcmRGcmFnbWVudCI+Ci0gICAgICAgPHJlZmVyZW5jZUZyYWdtZW50Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuYXNzZW1ibHkud2l6YXJkLkphclJlZmVyZW5jZVdpemFyZEZyYWdtZW50IgotICAgICAgICAgICAgIGljb249Imljb25zL2phcl9vYmouZ2lmIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmphclJlZmVyZW5jZSIKLSAgICAgICAgICAgICBuYW1lPSJKYXIiPgotICAgICAgIDwvcmVmZXJlbmNlRnJhZ21lbnQ+Ci0gICAgICAgPHJlZmVyZW5jZUZyYWdtZW50Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuYXNzZW1ibHkud2l6YXJkLkV4dGVybmFsSmFyUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQiCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvamFyX29iai5naWYiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuZXh0ZXJuYWxKYXJSZWZlcmVuY2UiCi0gICAgICAgICAgICAgbmFtZT0iRXh0ZXJuYWwgSmFyIj4KLSAgICAgICA8L3JlZmVyZW5jZUZyYWdtZW50PgotICAgICAgIDxyZWZlcmVuY2VGcmFnbWVudAotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLmFzc2VtYmx5LndpemFyZC5WYXJpYWJsZVJlZmVyZW5jZVdpemFyZEZyYWdtZW50IgotICAgICAgICAgICAgIGljb249Imljb25zL2phcl9vYmouZ2lmIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLnZhcmlhYmxlUmVmZXJlbmNlIgotICAgICAgICAgICAgIG5hbWU9IlZhcmlhYmxlIj4KLSAgICAgICA8L3JlZmVyZW5jZUZyYWdtZW50PgotICAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9Kc3RDb21tb25VSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL0pzdENvbW1vblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjllZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL0pzdENvbW1vblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3RDb21tb25VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKc3RDb21tb25VSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpzdENvbW1vblVJUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnN0Q29tbW9uVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTEyMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEphclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVybmFsSmFyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlUmVmZXJlbmNlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVSZWZlcmVuY2VEZXNjcmlwdGlvbjsKLQkKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FICsgIi5tZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL2Fzc2VtYmx5L3dpemFyZC9FeHRlcm5hbEphclJlZmVyZW5jZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL0V4dGVybmFsSmFyUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxNjVkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL0V4dGVybmFsSmFyUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5hc3NlbWJseS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkJ1aWxkUGF0aERpYWxvZ0FjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLklSZWZlcmVuY2VXaXphcmRDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbEphclJlZmVyZW5jZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgSmFyUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQgewotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7Ci0JCUNvbXBvc2l0ZSBjID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgaGFuZGxlKTsKLQkJaGFuZGxlLnNldFRpdGxlKE1lc3NhZ2VzLkV4dGVybmFsSmFyVGl0bGUpOwotCQloYW5kbGUuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuRXh0ZXJuYWxKYXJEZXNjcmlwdGlvbik7Ci0JCXJldHVybiBjOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoKSB7Ci0JCXNlbGVjdGVkID0gQnVpbGRQYXRoRGlhbG9nQWNjZXNzCi0JCQkuY2hvb3NlRXh0ZXJuYWxKQVJFbnRyaWVzKGJyb3dzZS5nZXRTaGVsbCgpKTsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlJPT1RfQ09NUE9ORU5UKTsKLQkJaWYgKHNlbGVjdGVkICE9IG51bGwgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewotCQkJQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0JCQlBcnJheUxpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCS8vIElQYXRoIGZ1bGxQYXRoID0gcHJvamVjdC5nZXRGaWxlKHNlbGVjdGVkW2ldKS5nZXRGdWxsUGF0aCgpOwotCQkJCVN0cmluZyB0eXBlID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUKLQkJCQkJCSsgSVBhdGguU0VQQVJBVE9SOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUgPSBDb21wb25lbnRDb3JlCi0JCQkJCQkuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChyb290Q29tcG9uZW50LmdldFByb2plY3QoKSwKLQkJCQkJCQkJdHlwZSArIHNlbGVjdGVkW2ldLnRvU3RyaW5nKCkpOwotCQkJCWNvbXBMaXN0LmFkZChhcmNoaXZlKTsKLQkJCQlwYXRocy5hZGQoc2VsZWN0ZWRbaV0ubGFzdFNlZ21lbnQoKSk7Ci0JCQl9Ci0JCQlJVmlydHVhbENvbXBvbmVudFtdIGNvbXBvbmVudHMgPSBjb21wTGlzdC50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFtjb21wTGlzdC5zaXplKCldKTsKLQkJCVN0cmluZ1tdIHBhdGhzMiA9IHBhdGhzLnRvQXJyYXkobmV3IFN0cmluZ1twYXRocy5zaXplKCldKTsKLQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkNPTVBPTkVOVCwgY29tcG9uZW50cyk7Ci0JCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5DT01QT05FTlRfUEFUSCwgcGF0aHMyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9hc3NlbWJseS93aXphcmQvSmFyUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9hc3NlbWJseS93aXphcmQvSmFyUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkYjM4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL0phclJlZmVyZW5jZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLmFzc2VtYmx5LndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkJ1aWxkUGF0aERpYWxvZ0FjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSVJlZmVyZW5jZVdpemFyZENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEphclJlZmVyZW5jZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBUcmVlVmlld2VyIHZpZXdlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZTsKLQlwcm90ZWN0ZWQgSVBhdGhbXSBwYXRoczsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSBoYW5kbGU7Ci0JcHJvdGVjdGVkIElQYXRoW10gc2VsZWN0ZWQgPSBuZXcgSVBhdGhbXXt9OwotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJdGhpcy5oYW5kbGUgPSBoYW5kbGU7Ci0JCWhhbmRsZS5zZXRUaXRsZShNZXNzYWdlcy5KYXJUaXRsZSk7Ci0JCWhhbmRsZS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5KYXJEZXNjcmlwdGlvbik7Ci0JCQkJCi0JCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJYy5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihnZXRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCi0JCWJyb3dzZSA9IG5ldyBCdXR0b24oYywgU1dULk5PTkUpOwotCQlicm93c2Uuc2V0VGV4dChNZXNzYWdlcy5Ccm93c2UpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCWJyb3dzZS5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnJvd3NlLCAtNSk7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlidXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlBST0pFQ1QpOwotCQlzZWxlY3RlZCA9IEJ1aWxkUGF0aERpYWxvZ0FjY2Vzcy5jaG9vc2VKQVJFbnRyaWVzKAotCQkJCWJyb3dzZS5nZXRTaGVsbCgpLCAKLQkJCQlwcm9qZWN0LmdldExvY2F0aW9uKCksIG5ldyBJUGF0aFswXSk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudClnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5ST09UX0NPTVBPTkVOVCk7Ci0JCWlmIChzZWxlY3RlZCAhPSBudWxsICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKLQkJCUFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcExpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCQkJQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBJUGF0aCBmdWxsUGF0aCA9IHByb2plY3QuZ2V0RmlsZShzZWxlY3RlZFtpXSkuZ2V0RnVsbFBhdGgoKTsKLQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFCi0JCQkJCQkrIElQYXRoLlNFUEFSQVRPUjsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gQ29tcG9uZW50Q29yZQotCQkJCQkJLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQocm9vdENvbXBvbmVudC5nZXRQcm9qZWN0KCksCi0JCQkJCQkJCXR5cGUgKyBzZWxlY3RlZFtpXS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKTsKLQkJCQljb21wTGlzdC5hZGQoYXJjaGl2ZSk7Ci0JCQkJcGF0aHMuYWRkKHNlbGVjdGVkW2ldLmxhc3RTZWdtZW50KCkpOwotCQkJfQotCQkJSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzID0gY29tcExpc3QudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbY29tcExpc3Quc2l6ZSgpXSk7Ci0JCQlTdHJpbmdbXSBwYXRoczIgPSBwYXRocy50b0FycmF5KG5ldyBTdHJpbmdbcGF0aHMuc2l6ZSgpXSk7Ci0JCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5DT01QT05FTlQsIGNvbXBvbmVudHMpOwotCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuQ09NUE9ORU5UX1BBVEgsIHBhdGhzMik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAobGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZWxlbWVudCA9PSBudWxsID8gIiIgOiBlbGVtZW50LnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIgPSBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIHNlbGVjdGVkID09IG51bGwgPyBuZXcgT2JqZWN0W117fSA6IHNlbGVjdGVkOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL1ZhcmlhYmxlUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9hc3NlbWJseS93aXphcmQvVmFyaWFibGVSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzFlYzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9hc3NlbWJseS93aXphcmQvVmFyaWFibGVSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLmFzc2VtYmx5LndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQnVpbGRQYXRoRGlhbG9nQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSVJlZmVyZW5jZVdpemFyZENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFZhcmlhYmxlUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBKYXJSZWZlcmVuY2VXaXphcmRGcmFnbWVudCB7Ci0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJQ29tcG9zaXRlIGMgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBoYW5kbGUpOwotCQloYW5kbGUuc2V0VGl0bGUoTWVzc2FnZXMuVmFyaWFibGVSZWZlcmVuY2VUaXRsZSk7Ci0JCWhhbmRsZS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5WYXJpYWJsZVJlZmVyZW5jZURlc2NyaXB0aW9uKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZCgpIHsKLQkJc2VsZWN0ZWQgPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlVmFyaWFibGVFbnRyaWVzKAotCQkJCWJyb3dzZS5nZXRTaGVsbCgpLCBuZXcgUGF0aFswXSk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudClnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5ST09UX0NPTVBPTkVOVCk7Ci0JCWlmIChzZWxlY3RlZCAhPSBudWxsICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKLQkJCUFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcExpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCQkJQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlJUGF0aCByZXNvbHZlZFBhdGggPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChzZWxlY3RlZFtpXSk7Ci0JCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHJlc29sdmVkUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCWlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5WQVJBUkNISVZFVFlQRQotCQkJCQkJCSsgSVBhdGguU0VQQVJBVE9SOwotCQkJCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gQ29tcG9uZW50Q29yZQotCQkJCQkJCS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KHJvb3RDb21wb25lbnQuZ2V0UHJvamVjdCgpLAotCQkJCQkJCQkJdHlwZSArIHNlbGVjdGVkW2ldLnRvU3RyaW5nKCkpOwotCQkJCQljb21wTGlzdC5hZGQoYXJjaGl2ZSk7Ci0JCQkJCXBhdGhzLmFkZChyZXNvbHZlZFBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzID0gY29tcExpc3QudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbY29tcExpc3Quc2l6ZSgpXSk7Ci0JCQlTdHJpbmdbXSBwYXRoczIgPSBwYXRocy50b0FycmF5KG5ldyBTdHJpbmdbcGF0aHMuc2l6ZSgpXSk7Ci0JCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5DT01QT05FTlQsIGNvbXBvbmVudHMpOwotCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuQ09NUE9ORU5UX1BBVEgsIHBhdGhzMik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODFmMDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1KYXJUaXRsZT1BZGQgYSBKYXIgUmVmZXJlbmNlCi1KYXJEZXNjcmlwdGlvbj1IZXJlIHlvdSBjYW4gcmVmZXJlbmNlIGEgd29ya3NwYWNlIEphclxuVGhpcyBpcyBub3QgYSBzdWdnZXN0ZWQgdXNlLWNhc2UsIGJ1dCBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4KLUV4dGVybmFsSmFyVGl0bGU9QWRkIGFuIEV4dGVybmFsIEphciBSZWZlcmVuY2UKLUV4dGVybmFsSmFyRGVzY3JpcHRpb249SGVyZSB5b3UgY2FuIHJlZmVyZW5jZSBhIGZpbGVzeXN0ZW0gSmFyXG5UaGlzIGlzIG5vdCBhIHN1Z2dlc3RlZCB1c2UtY2FzZSwgYnV0IGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5LgotQnJvd3NlPUJyb3dzZS4uLgotVmFyaWFibGVSZWZlcmVuY2VUaXRsZT1BZGQgYSBWYXJpYWJsZSBSZWZlcmVuY2UKLVZhcmlhYmxlUmVmZXJlbmNlRGVzY3JpcHRpb249SGVyZSB5b3UgY2FuIHJlZmVyZW5jZSBhIHZhcmlhYmxlIHdoaWNoIG1hcHMgdG8gYSBzaW5nbGUgamFyLlxuVGhpcyBpcyBub3QgYSBzdWdnZXN0ZWQgdXNlLWNhc2UsIGJ1dCBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmMmE1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtc2VhcmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4NjFmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotc3JjLnppcAotQGRvdAotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNWVkMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnNlYXJjaC9wZXJmPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiMTJlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDZkZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotI01vbiBKYW4gMzAgMjM6NDA6NTIgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4Y2ViNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEphbiAzMCAxOTo0NTo0MSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWU2ZTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4sCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzZTkyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy1zZWFyY2gvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5MjM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiAKLSAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIj4KLSAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZjZGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0hIFBsdWctaW4gcHJvcGVydGllcwotcGx1Z2luTmFtZSAgICAgPSBXU1QgQ29tbW9uIENvcmUgUGx1Zy1pbgotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDJhNjIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VhcmNoUGFydGljaXBhbnRzIiBuYW1lPSIlc2VhcmNoUGFydGljaXBhbnRzIiAvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idWlUZXN0ZXIiIG5hbWU9IlVJIFRlc3RlciIgc2NoZW1hPSJzY2hlbWEvdWlUZXN0ZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiIG5hbWU9IlVJIENvbnRleHQgU2Vuc2l0aXZlIENsYXNzIiBzY2hlbWE9InNjaGVtYS91aUNvbnRleHRTZW5zaXRpdmVDbGFzcy5leHNkIi8+Ci08L3BsdWdpbj4KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvc2VhcmNoUGFydGljaXBhbnRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvc2VhcmNoUGFydGljaXBhbnRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2N2M5NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc2NoZW1hL3NlYXJjaFBhcnRpY2lwYW50cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNlYXJjaCIgaWQ9InNlYXJjaFBhcnRpY2lwYW50cyIgbmFtZT0iJXNlYXJjaFBBcnRpY2lwYW50cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4Y2YxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIiBpZD0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiIG5hbWU9IlVJIENvbnRleHQgU2Vuc2l0aXZlIENsYXNzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvbXBvbmVudHMgYXJlIG9mdGVuIGRlc2lnbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgJnF1b3Q7SGVhZGxlc3MmcXVvdDsgb3Igbm9uLWdyYXBoaWNhbCBwb3J0aW9ucyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlIChHVUkpIHBvcnRpb25zLiBTb21ldGltZXMgdGhpcyBpcyBkb25lIHRvIGZvbGxvdyBnb29kIGRlc2lnbiBwcmluY2lwbGVzLCBvdGhlciB0aW1lcyB0aGVyZSBpcyBhIHNwZWNpZmljIHVzZSBjYXNlIGZvciBkb2luZyBzby4gV2hlbiBwbHVnaW5zIGZvbGxvdyB0aGlzIHByYWN0aWNlIGJlY2F1c2UgdGhleSBtdXN0IHZhcnkgdGhlaXIgYmVoYXZpb3IgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBydW5uaW5nIGluIGEgaGVhZGxlc3MgZW52aXJvbm1lbnQgb3IgYSBncmFwaGljYWwgZW52aXJvbm1lbnQsIHRoZXkgb2Z0ZW4gbmVlZCB0byBjaG9vc2UgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgYSBwYXJ0aWN1bGFyIHR5cGUuIFRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVkIGJ5IHRoZSBXU1QgY29tcG9uZW50IHNvbHZlcyBleGFjdGx5IHRoaXMgcHJvYmxlbS4KLSZsdDtwJmd0OyAgICAKLVRvIHVzZSB0aGUgZXh0ZW5zaW9uIHBvaW50LCB5b3UgbXVzdCBwcm92aWRlIHR3byBleHRlbnNpb25zIHRoYXQgYXJlIGxpbmtlZCBieSBhIGtleS4gVGhlIGtleSBpcyBhIHVuaXF1ZSBTdHJpbmctYmFzZWQgdmFsdWUgdGhhdCB5b3Ugd2lsbCBsYXRlciB1c2UgdG8gaW5zdGFuaXRhdGUgeW91ciBjbGFzcy4KLSZsdDtwJmd0OwotVGhlIGZpcnN0IHVzYWdlIG9mIHRoZSBleHRlbnNpb24gc3BlY2lmaWVzIHlvdXIga2V5LCBhbmQgdGhlIEhlYWRsZXNzIGNvbnRleHQsIGFuZCB0aGUgY2xhc3MgdGhhdCBzaG91bGQgYmUgaW5zdGFudGlhdGVkIGZvciB0aGlzIChrZXksIGNvbnRleHQpIHBhaXIuIFRoaXMgbWVhbnMgaW4gdGhlIGhlYWRsZXNzIGVudmlyb25tZW50IHRoaXMgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXF1ZXN0ZWQuCi0mbHQ7cCZndDsKLVRoZSBzZWNvbmQgZXh0ZW5zaW9uIHNwZWNpZmllcyB0aGUgVUkgY29udGV4dCBhbmQgdGhlIHNhbWUga2V5LCBidXQgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGVzaWduZWQgZm9yIGdyYXBoaWNhbCBlbnZpcm9ubWVudHMuIFRoaXMgbWVhbnMgaW4gdGhlIFVJIGVudmlyb25tZW50IHRoaXMgb3RoZXIgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXF1ZXN0ZWQuCi0mbHQ7cCZndDsKLVRoZSBhY3R1YWwgcmVxdWVzdCBpcyBkb25lIGluIHlvdXIgY29kZSB2aWE6Ci0mbHQ7cHJlJmd0OwotSU15SW50ZXJmYWNlIGluc3RhbmNlID0gKElNeUludGVyZmFjZSkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgmcXVvdDtteUtleSZxdW90Oyk7Ci0mbHQ7L3ByZSZndDsKLXdoZXJlICZsdDtjb2RlJmd0OyZxdW90O215S2V5JnF1b3Q7Jmx0Oy9jb2RlJmd0OyBpcyB0aGUga2V5IHVzZWQgb24gYm90aCBleHRlbnNpb25zLiBJdCB3aWxsIHRoZW4gY2hvb3NlIGVpdGhlciB0aGUgVUkgb3IgdGhlIEhlYWRsZXNzIGV4dGVuc2lvbiBkZXBlbmRpbmcgdXBvbiB0aGUgY29udGV4dC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQW4gZXh0ZW5zaW9uIHBvaW50IHRoYXQgZGVmaW5lcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGFuZCBpdHMgYXBwcm9wcmlhdGUgY29udGV4dCAoVUkgb3IgSGVhZGxlc3MpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUga2V5IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDb250ZXh0IFNlbnNpdGl2ZSBzdXBlciBjbGFzcy9pbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gZm9yIGVpdGhlciBhIFVJIG9yIEhlYWRsZXNzIGNvbnRleHQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGV4dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT25lIG9mICZxdW90O1VJJnF1b3Q7IG9yICZxdW90O0hlYWRsZXNzJnF1b3Q7IFRoaXMgaXMgY2FzZS1zZW5zaXRpdmUuIEl0IG11c3QgbWF0Y2ggZXhhY3RseSBhcyBzaG93biBoZXJlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVUkiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZGxlc3MiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgU2VlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24mbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDYuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2FnZSBmb3IgdGhlIFVJIGNvbnRleHQ6Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgIGlkPSZxdW90O2NvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIG5hbWU9JnF1b3Q7V29ya2luZyBDb3B5IE1hbmFnZXIgLSBVSSBDb250ZXh0IENsYXNzJnF1b3Q7Ci0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLkNvbnRleHRTZW5zaXRpdmVDbGFzcyZxdW90OyZndDsKLSAgICAgJmx0O3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgY29udGV4dD0mcXVvdDtVSSZxdW90OwotICAgICAgIGtleT0mcXVvdDt3b3JraW5nQ29weU1hbmFnZXImcXVvdDsKLSAgICAgICBjbGFzc05hbWU9JnF1b3Q7Y29tLmlibS53dHAuY29tbW9uLnVpLldUUFVJV29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7YnImZ3Q7Ci1Vc2FnZSBmb3IgdGhlIEhlYWRsZXNzIGNvbnRleHQ6Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgIGlkPSZxdW90O2NvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIG5hbWU9JnF1b3Q7V29ya2luZyBDb3B5IE1hbmFnZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzJnF1b3Q7Ci0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLkNvbnRleHRTZW5zaXRpdmVDbGFzcyZxdW90OyZndDsKLSAgICAgJmx0O3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICBjb250ZXh0PSZxdW90O0hlYWRsZXNzJnF1b3Q7Ci0gICAgICAgICBrZXk9JnF1b3Q7d29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7Ci0gICAgICAgICBjbGFzc05hbWU9JnF1b3Q7Y29tLmlibS53dHAuY29tbW9uLnVpLldUUEhlYWRsZXNzV29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7YnImZ3Q7Ci1BbmQgZmluYWxseSB0aGUgcmV0cmlldmFsIG9mIHRoZSBjbGFzcyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dDoKLQotJmx0O3ByZSZndDsKLUlXb3JraW5nQ29weU1hbmFnZXIgbWFuYWdlciA9IChJV29ya2luZ0NvcHlNYW5hZ2VyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCZxdW90O3dvcmtpbmdDb3B5TWFuYWdlciZxdW90Oyk7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSBJQk0gMjAwMy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvdWlUZXN0ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NjaGVtYS91aVRlc3Rlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhiYjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NjaGVtYS91aVRlc3Rlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiIGlkPSJ1aVRlc3RlciIgbmFtZT0iVUkgVGVzdGVyIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgdXNlZCB0byB0ZWxsIFdTVCB0aGF0IGl0IGlzIHJ1bm5pbmcgaW4gYSBub24tSEVBRExFU1MgZW52aXJvbm1lbnQuIFR5cGljYWxseSBVSSBlbnZpcm9ubWVudCBpcyBub24tSEVBRExFU1MuIFRoZSBkZWZhdWx0IGlmIHRoZXJlIGFyZSBubyBpbXBsZW1lbnRlcnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgdGhhdCByZXR1cm4gdHJ1ZSBpcyBIRUFETEVTUy4KLSZsdDtwJmd0OwotQSBIRUFETEVTUyBlbnZpcm9ubWVudCBpcyB0eXBpY2FsbHkgYSBiYXRjaCBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gVUkgYW5kIHRoZSB3b3Jrc3BhY2UgaXMgdXNlZCBmb3Igb25lIG9wZXJhdGlvbiBhbmQgdGhlbiB0ZXJtaW5hdGVkLiBNb3N0IGhlYWRsZXNzIHRhc2tzIGFyZSBkb25lIHVuZGVyIG9uZSBvcGVyYXRpb24gYW5kIHRoZSBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciBtYXkgbm90IGhhdmUgYSBjaGFuY2UgdG8gZmx1c2ggYSBiYWQgcmVmbGVjdGlvbiBiZWZvcmUgdGhlIHJlYWwgdHlwZSBuZWVkcyB0byBiZSBmb3VuZCBhbmQgY2FuIGJlIGZvdW5kLiBTbyB3aGF0IHdvdWxkIGhhcHBlbiBpcyBpZiBhIGNsYXNzIHdhcyBjcmVhdGVkIGR1cmluZyB0aGlzIG9uZSBvcGVyYXRpb24gaXQgd291bGQgbm90IGJlIGZvdW5kIGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbnMgaGFkIG5vdCB5ZXQgZ29uZSBvdXQuIAotJmx0O3AmZ3Q7Ci1JbiBhIFVJIGVudmlyb25tZW50IHRoZSBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgc2hvcnQgYW5kIGRvIG9ubHkgYSBmZXcgdGhpbmdzIGFuZCB0aGUgcmVzdWx0cyBhcmVuJmFwb3M7dCBuZWVkZWQgdW50aWwgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiBJbiB0aGF0IGNhc2UgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gbm90IGtlZXAgY2hlY2tpbmcgaWYgYSBjbGFzcyBoYXMgYXBwZWFyZWQgZXZlcnl0aW1lIGEgcmVxdWVzdCBpcyBtYWRlLCBpbnN0ZWFkIGl0IHdpbGwgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYWRkZWQgY2xhc3MgdG8gYXBwZWFyIGJlZm9yZSByZXNldHRpbmcgdGhlIGRlZmluaXRpb24gdG8gYWxsb3cgY2hlY2tpbmcgYWdhaW4gbGF0ZXIuCi0mbHQ7cCZndDsKLUlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgaW1wbGVtZW50ZXIgb2YgdGhpcyBpbnRlcmZhY2UgaW4gdGhlIGFwcGxpY2F0aW9uLCB0aGVuIGl0IHdpbGwgZ28gdGhyb3VnaCBlYWNoIG9mIHRoZW0gb25jZSB1bnRpbCBvbmUgcmV0dXJucyB0cnVlLiBBcyBzb29uIGFzIG9uZSByZXR1cm5zIHRydWUgaXQgd2lsbCBzdG9wIGFuZCBtYXJrIHRoZSBhcHBsaWNhdGlvbiBhcyBiZWluZyBub24tSEVBRExFU1MuIFRoaXMgd2lsbCBiZSBkb25lIG9ubHkgb25jZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBJdCB3aWxsIG5vdCBiZSBhZ2FpbiB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSZsdDtwJmd0OwotVGhpcyBpcyB0eXBpY2FsbHkgYW4gaW50ZXJuYWwgZXh0ZW5zaW9uIHBvaW50IG9ubHkuIFRoZSBXU1QgVUkgcGx1Z2luIHdpbGwgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIFBsYXRmb3JtIFVJIGlzIGFjdGl2ZS4gU28gdGhpcyB3aWxsIG5vcm1hbGx5IG5vdCBiZSBuZWVkZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgbW9zdCBjdXN0b21lcnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1aVRlc3RlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idWlUZXN0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSB1aVRlc3RlciBkZWZpbml0aW9uIGVsZW1lbnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgVUlUZXN0ZXIgZm9yIHRoaXMgZXh0ZW5zaW9uLiBJdCBtdXN0IGltcGxlbWVudCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSVRlc3RlciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSVRlc3RlciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSAmbHQ7c2FtcCZndDtjbGFzc05hbWUmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlUZXN0ZXImbHQ7L3NhbXAmZ3Q7IGludGVyZmFjZSBmb3IgdGhlIHRlc3Rlci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGltcGxlbWVudGVyOiAKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnVpVGVzdGVyJnF1b3Q7Jmd0OwotICAmbHQ7dWlUZXN0ZXIKLSAgIGNsYXNzTmFtZT0mcXVvdDtjb20uZXhhbXBsZS5VSVRlc3RlckltcGxlbWVudGF0aW9uJnF1b3Q7LyZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGVyZSBpcyBubyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGlzIGNsYXNzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL0lTZWFyY2hPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvSVNlYXJjaE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzMDVlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvSVNlYXJjaE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgbWFwIG9mIHNlYXJjaCBvcHRpb25zIHBhc3NlZAotICogdG8KLSAqIHtAbGluayBTZWFyY2hFbmdpbmUjc2VhcmNoKG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuLCBTZWFyY2hSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGUsIGphdmEudXRpbC5NYXAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICogU2VhcmNoRW5naW5lLnNlYXJjaCgpfS4KLSAqIDxwPgotICogTm90ZSB0aGF0IG5vdCBhbGwgc2VhcmNoIHBhcnRpY2lwYW50cyB3aWxsIHByb3ZpZGUgc3BlY2lhbGl6ZWQgYmVoYXZpb3IgYmFzZWQgb24KLSAqIHVzZSBvZiB0aGVzZSBzZWFyY2ggb3B0aW9ucy4KLSAqIDxwPgotICogQWxzbyBub3RlIHRoYXQgaW5kaXZpZHVhbCBzZWFyY2ggcGFydGljaXBhbnRzIG1heSBzdXBwb3J0IGFkZGl0aW9uYWwgb3B0aW9ucyBub3QKLSAqIGxpc3RlZCBoZXJlLiBUaGVzZSBzZWFyY2ggb3B0aW9ucyBzaG91bGQgYmUgZm9ybWVkIHNvIHRoYXQgYSBzZWFyY2ggcGFydGljaXBhbnQgY2FuCi0gKiBzYWZlbHkgaWdub3JlIGFueSB0aGF0IGl0IGRvZXMgbm90IHVuZGVyc3RhbmQuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMgewotCi0JLyoqCi0JICogU2VhcmNoIG9wdGlvbiBzcGVjaWZ5aW5nIGEgdHJhZGUtb2ZmIGNob2ljZSBiZXR3ZWVuIHNlYXJjaCBwZXJmb3JtYW5jZSBhbmQKLQkgKiBjb21wbGV0ZW5lc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfT1BUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guUFJJT1JJVFkiOyAvLyROT05fTkxTXzEkCi0JLyoqCi0JICogQ2hvaWNlIGZvciB0aGUge0BsaW5rICNQUklPUklUWV9PUFRJT059IHNlYXJjaCBvcHRpb24gdGhhdCBlbXBoYXNpemVzCi0JICogcGVyZm9ybWFuY2UgYXQgdGhlIHBvc3NpYmxlIGV4cGVuc2Ugb2YgYWNjdXJhY3kuIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgZm9yCi0JICogYWxsIHNlYXJjaCBjYWxscyBtYWRlIG9uIHRoZSB1c2VyIGludGVyZmFjZSB0aHJlYWQuIEluIHNvbWUgY2FzZXMsIHNlYXJjaAotCSAqIHJlc3VsdHMgbWF5IG5vdCBiZSBjb21wbGV0ZSBiZWNhdXNlIG9mIGluYWNjdXJhY2llcyBjYXVzZWQgYnkgdGltaW5nIHdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVkFMVUVfVElNRUxJTkVTUyA9ICJGQVNUX1NFQVJDSCI7IC8vJE5PTl9OTFNfMSQKLQkvKioKLQkgKiBDaG9pY2UgZm9yIHRoZSB7QGxpbmsgI1BSSU9SSVRZX09QVElPTn0gc2VhcmNoIG9wdGlvbiB0aGF0IGVtcGhhc2l6ZXMKLQkgKiBhY2N1cmFjeSBhdCB0aGUgcG9zc2libGUgZXhwZW5zZSBvZiB0aW1lbGluZXNzLiBUaGlzIHZhbHVlIHNob3VsZCBuZXZlciBiZSB1c2VkCi0JICogZm9yIHNlYXJjaCBjYWxscyBtYWRlIG9uIHRoZSB1c2VyIGludGVyZmFjZSB0aHJlYWQsIGJlY2F1c2Ugc29tZSBzZWFyY2gKLQkgKiBwYXJ0aWNpcGFudHMgbWF5IGNob29zZSB0byB1c2UgdGltZS1jb25zdW1pbmcgYmFja2dyb3VuZCBwcm9jZXNzaW5nIHRvIHJldHVybiBhCi0JICogY29tcGxldGUgc2V0IG9mIG1hdGNoZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVkFMVUVfQ09NUExFVEVORVNTID0gIkNPTVBMRVRFX1NFQVJDSCI7IC8vJE5PTl9OTFNfMSQKLQkvKioKLQkgKiBEZWZhdWx0IGNob2ljZSBmb3IgdGhlIHtAbGluayAjUFJJT1JJVFlfT1BUSU9OfSBzZWFyY2ggb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX1ZBTFVFX0RFRkFVTFQgPSBQUklPUklUWV9WQUxVRV9USU1FTElORVNTOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZWQxMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLlNlYXJjaERvY3VtZW50U2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0vKioKLSAqIFRoZSB7QGxpbmsgU2VhcmNoRW5naW5lfSBjbGFzcyBwcm92aWRlcyBhIGdlbmVyaWMgd2F5IG9mIHNlYXJjaGluZyBmb3IgaW5mb3JtYXRpb24KLSAqIHdpdGhvdXQgdGhlIG5lZWQgb2Yga25vd2luZyBob3cgb3Igd2hlcmUgdGhhdCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQuIFRoZSByZXN1bHRzCi0gKiByZXR1cm5lZCBieSBhIHNlYXJjaCBjb3VsZCBiZSBzY2F0dGVyZWQgaW4gYSBudW1iZXIgb2YgZmlsZXMgb3Igc3RvcmVkIGluIGFuIGluZGV4LgotICogRXhhbXBsZXMgb2YgdGhlIGluZm9ybWF0aW9uIHlvdSBjYW4gc2VhcmNoIGZvciBpbmNsdWRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZAotICogcmVmZXJlbmNlcywgcmVmZXJlbmNlcyBiZXR3ZWVuIGZpbGVzLCBhbmQgdXNlIG9mIHF1YWxpZmllcnMuCi0gKiA8cD4KLSAqIFRoZSBzZWFyY2ggY2FuIGJlIGxpbWl0ZWQgdG8gYSBzcGVjaWZpZWQgc2VhcmNoIHNjb3BlLCBvciB0aGUgZW50aXJlIHdvcmtzcGFjZSBjYW4KLSAqIGJlIHNlYXJjaGVkLiBTZWFyY2ggbWF0Y2hlcyBhcmUgcmV0dXJuZWQgdG8gdGhlIHNwZWNpZmllZCB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaEVuZ2luZSBpbXBsZW1lbnRzIElTZWFyY2hPcHRpb25zCi17Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgbWF0Y2hlcyBvZiBhIGdpdmVuIHNlYXJjaCBwYXR0ZXJuIHVzaW5nIGEgc3BlY2lmaWVkIHNldCBvZiBzZWFyY2gKLQkgKiBwYXJ0aWNpcGFudHMgYW5kIHNlYXJjaCBzY29wZS4gU2VhcmNoIHBhdHRlcm5zIGNhbiBiZSBjcmVhdGVkIHVzaW5nIGZhY3RvcnkKLQkgKiBtZXRob2RzIGFuZCBlbmNhcHN1bGF0ZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHNlYXJjaGVkIGZvcgotCSAqIChmb3IgZXhhbXBsZSwgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgYSBzcGVjaWZpZWQgdHlwZSwgaW4gYSBjYXNlIHNlbnNpdGl2ZQotCSAqIG1hbm5lcikuCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gcmVxdWVzdG9yCi0JICogICAgICAgICAgICBDYWxsYmFjayBvYmplY3QgdG8gbm90aWZ5IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaCAoZWFjaCBtYXRjaAotCSAqICAgICAgICAgICAgaXMgcmVwb3J0ZWQgdG8ge0BsaW5rIFNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9KQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudHMKLQkgKiAgICAgICAgICAgIFRoZSBzZWFyY2ggcGFydGljaXBhbnRzIHRoYXQgd2lsbCBjb25kdWN0IHRoZSBzZWFyY2gKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIHNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgc3BlY2lmeSA8Y29kZT5udWxsPC9jb2RlPiB0byBzZWFyY2ggdGhlIGVudGlyZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgT3B0aW9uYWwgbWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgT3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCB3b3JrIGNvbXBsZXRlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgaWYgdGhlIHNlYXJjaCBmYWlscwotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsCi0JCQlTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cywgU2VhcmNoU2NvcGUgc2NvcGUsIE1hcCBzZWFyY2hPcHRpb25zLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQotCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0KLQkJLyogaW5pdGlhbGl6ZSBwcm9ncmVzcyBtb25pdG9yICovCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nLCAxMDApOwotCi0gICAgICAgIFNlYXJjaERvY3VtZW50U2V0IHNldCA9IG5ldyBTZWFyY2hEb2N1bWVudFNldEltcGwoKTsKLQkJdHJ5Ci0JCXsKLQkJCS8vIHJlcXVlc3Rvci5iZWdpblJlcG9ydGluZygpOwotICAgICAgICAgICAgU2VhcmNoU2NvcGVbXSBzY29wZUFycmF5ID0gbmV3IFNlYXJjaFNjb3BlW3BhcnRpY2lwYW50cy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBwYXJ0aWNpcGFudHMgPT0gbnVsbCA/IDAgOiBwYXJ0aWNpcGFudHMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQkJewotCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCi0JCQkJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudHNbaV07Ci0JCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBudWxsCi0JCQkJCQk6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCk7Ci0JCQkJaWYgKHN1Yk1vbml0b3IgIT0gbnVsbCkKLQkJCQkJc3ViTW9uaXRvci5iZWdpblRhc2soIiIsIDEwMDApOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5Ci0JCQkJewotCQkJCQlpZiAoc3ViTW9uaXRvciAhPSBudWxsKQotCQkJCQkJc3ViTW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoCi0JCQkJCQkJCU1lc3NhZ2VzLmVuZ2luZV9zZWFyY2hpbmdfbG9jYXRpbmdEb2N1bWVudHMsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXQotCQkJCQkJCQl7IHBhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCkgfSkpOwotCQkJCQlwYXJ0aWNpcGFudC5iZWdpblNlYXJjaGluZyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQkJCQkJLy8gcmVxdWVzdG9yLmVudGVyUGFydGljaXBhbnQocGFydGljaXBhbnQpOwotCQkJCQkvLyBwYXJ0aWNpcGFudCBjcmVhdGVzIGl0J3Mgb3duIHNlYXJjaCBzY29wZSAKLQkJCQkJU2VhcmNoU2NvcGUgbmV3U2NvcGUgPQotCQkJCQkJcGFydGljaXBhbnQuc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMocGF0dGVybiwgc2NvcGUsIHNlYXJjaE9wdGlvbnMsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBzY29wZUFycmF5W2ldID0gbmV3U2NvcGU7Ci0JCQkJCS8vIHBhcnRpY2lwYW50IGNyZWF0ZXMgc2VhcmNoIGRvY3VtZW50cyBiYXNlZCBvbiBpdCdzIHNlYXJjaCBzY29wZQotCQkJCQlwYXJ0aWNpcGFudC5jcmVhdGVTZWFyY2hEb2N1bWVudHMoc2V0LCBwYXR0ZXJuLCBuZXdTY29wZSwgc2VhcmNoT3B0aW9ucywgc3ViTW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbCA9IHBhcnRpY2lwYW50cyA9PSBudWxsID8gMCA6IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkgPCBsOyBpKyspCi0gICAgICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudHNbaV07Ci0gICAgICAgICAgICAgICAgU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKTsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc3ViTW9uaXRvciAhPSBudWxsICYmIHN1Yk1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbG9jYXRlIGluZGV4IG1hdGNoZXMgaWYgYW55IChub3RlIHRoYXQgYWxsIHNlYXJjaCBtYXRjaGVzCi0gICAgICAgICAgICAgICAgLy8gY291bGQgaGF2ZSBiZWVuIGlzc3VlZCBkdXJpbmcgaW5kZXggcXVlcnlpbmcpCi0gICAgICAgICAgICAgICAgaWYgKHN1Yk1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc3ViTW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCkgfSkpOwotICAgICAgICAgICAgICAgIC8vIGEgc2VhcmNoIGRvY3VtZW50IHNldCBzaG91bGQgY29udGFpbiBlbm91Z2ggaW5mbyB0byByZWR1Y2UgdGhlIHNlYXJjaCBzY29wZSBldmVuIGZ1cnRoZXIgCi0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGZpbmRpbmcgcHJlY2l6ZSBsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGUgc2NvcGUgY291bGQgYmUgbnVsbCBpZiB0aGUgcGFydGNpcGFudCBiYXJmZWQgYW5kIGV4ZXB0aW9uIGluIHRoZSBmaXJzdCBsb29wIAotICAgICAgICAgICAgICAgIGlmIChzY29wZUFycmF5W2ldICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5sb2NhdGVNYXRjaGVzKHNldCwgcGF0dGVybiwgc2NvcGVBcnJheVtpXSwgcmVxdWVzdG9yLCBzZWFyY2hPcHRpb25zLCBzdWJNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdG9yLmV4aXRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCk7Ci0gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5kb25lU2VhcmNoaW5nKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAKLSAgICAgICAgICAgIH0gICAgCi0JCX0gZmluYWxseQotCQl7Ci0gICAgICAgICAgICBzZXQuZGlzcG9zZSgpOwotCQkJLy8gcmVxdWVzdG9yLmVuZFJlcG9ydGluZygpOwotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBtYXRjaGVzIG9mIGEgZ2l2ZW4gc2VhcmNoIHBhdHRlcm4uIFNlYXJjaCBwYXR0ZXJucyBjYW4gYmUgY3JlYXRlZAotCSAqIHVzaW5nIGZhY3RvcnkgbWV0aG9kcyBhbmQgZW5jYXBzdWxhdGUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0byBiZQotCSAqIHNlYXJjaGVkIGZvciAoZm9yIGV4YW1wbGUsIGVsZW1lbnQgZGVjbGFyYXRpb25zIG9mIGEgc3BlY2lmaWVkIHR5cGUsIGluIGEgY2FzZQotCSAqIHNlbnNpdGl2ZSBtYW5uZXIpLgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHJlcXVlc3RvcgotCSAqICAgICAgICAgICAgQ2FsbGJhY2sgb2JqZWN0IHRvIG5vdGlmeSB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBzZWFyY2ggKGVhY2ggbWF0Y2gKLQkgKiAgICAgICAgICAgIGlzIHJlcG9ydGVkIHRvIHtAbGluayBTZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2gpfSkKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIHNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgc3BlY2lmeSA8Y29kZT5udWxsPC9jb2RlPiB0byBzZWFyY2ggdGhlIGVudGlyZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgT3B0aW9uYWwgbWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgT3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCB3b3JrIGNvbXBsZXRlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgaWYgdGhlIHNlYXJjaCBmYWlscwotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsCi0JCQlTZWFyY2hTY29wZSBzY29wZSwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9Ci0JCQlnZXRBcHBsaWNhYmxlUGFydGljaXBhbnRzKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicGFydGljaXBhbnRzID0gIiArIHBhcnRpY2lwYW50cy5sZW5ndGgpOwotCQlzZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudHMsIHNjb3BlLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBRdWVyaWVzIHRoZSBzZXQgb2YgcGFydGljaXBhbnRzIHRoYXQgc3VwcG9ydCBzZWFyY2hlcyBkZXNjcmliZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIHNlYXJjaCBwYXR0ZXJuIGFuZCBvcHRpb25zLgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIG1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHJldHVybiBBcnJheSBvZiBhcHBsaWNhYmxlIHNlYXJjaCBwYXJ0aWNpcGFudHMKLQkgKi8KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnRbXSBnZXRBcHBsaWNhYmxlUGFydGljaXBhbnRzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwKLQkJCU1hcCBzZWFyY2hPcHRpb25zKQotCXsKLQkJcmV0dXJuIFNlYXJjaFBsdWdpbi5nZXREZWZhdWx0KCkubG9hZFNlYXJjaFBhcnRpY2lwYW50cyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hNYXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTY5ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBBIHNlYXJjaCBtYXRjaCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBzZWFyY2ggcXVlcnkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAc2VlIFNlYXJjaEVuZ2luZSNzZWFyY2gob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm4sIFNlYXJjaFBhcnRpY2lwYW50W10sIElTZWFyY2hTY29wZSwKLSAqICAgICAgU2VhcmNoUmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaE1hdGNoIGltcGxlbWVudHMgSUFkYXB0YWJsZQotewotCi0JLyoqCi0JICogT3B0aW9uYWwgcmVzb3VyY2Ugb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlJRmlsZSBmaWxlOyAvLyByZXNvdXJjZSB3aGVyZSBtYXRjaCBpcyBmb3VuZAotCi0JLyoqCi0JICogVGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCi0JICovCi0JaW50IG9mZnNldDsKLQotCS8qKgotCSAqIFRoZSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKi8KLQlpbnQgbGVuZ3RoOwotCi0JLyoqCi0JICogT3B0aW9uYWwgZWxlbWVudCB0aGF0IGVuY2xvc2VzIG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXRjaAotCSAqLwotCU9iamVjdCBvYmplY3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBtYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdGhhdCBlbmNsb3NlcyBvciBjb3JyZXNwb25kcyB0byB0aGUgbWF0Y2gsIG9yCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gcGFydGljaXBhbnQKLQkgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoZSBtYXRjaAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFNlYXJjaE1hdGNoKE9iamVjdCBlbGVtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJRmlsZSByZXNvdXJjZSkKLQl7Ci0JCXRoaXMub2JqZWN0ID0gZWxlbWVudDsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpbGUgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0JewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlKElGaWxlIGZpbGUpCi0JewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQl7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpCi0JewotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvLyBpc3N1ZSAoY3MvZWIpIGhvbGRpbmcgb2JqZWN0cyBpcyBhIGJpdCBvZGQsIHNpbmNlIGl0IGltcGxpZXMgdGhlIG9iamVjdCdzCi0JLy8gbGlmZSBzcGFuCi0JLy8gaXMgdGhlIHNhbWUgYXMgdGhlIFNlYXJjaE1hdGNoLiBXaGF0IGhhcHBlbnMgd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZD8KLQkvLyBkb2VzIHRoZSBTZWFyY2hNYXRjaCBnZXQgZGVsZXRlZD8gQXJlbid0IGNvb3JkaW5hdGVzIGdvb2QgZW5vdWdoPwotCS8vIGF0IHRoZSB2ZXJ5IGxlYXN0IHdlIHNob3VsZCBkb2N1bWVudCB0aGF0IHVzaW5nIHRoaXMgZmllbGQgaGFzIHNvbWUKLQkvLyBjb25zZXF1ZW5jZXMKLQkvKioKLQkgKiAoZWIpIHNlZSBjb21tZW50cyBmb3Ige0BsaW5rICNzZXRPYmplY3QoT2JqZWN0KX0KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpCi0JewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIE9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBzb21lIHBhcnQgb2YgdGhlIG1vZGVsIHRoYXQgcmVwcmVzZW50Ci0JICogICAgICAgICAgICB0aGUgY29udGVudCB0aGF0IHdhcyBzZWFyY2hlZC4gSXQgbWF5IHJlcXVpcmUgdG8gY2FsY3VsYXRlCi0JICogICAgICAgICAgICBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBtYXkgYmUgcmVxdWlyZWQgYnkgdGhlIHRvb2xzCi0JICogICAgICAgICAgICB0aHJvdWdoIHtAbGluayAjZ2V0T2JqZWN0KCkpIChlLmcuIFhNTCBub2RlIG5hbWVzcGFjZSwKLQkgKiAgICAgICAgICAgIG5lc3Nlc2FyeSB0byBvYnRhaW4gdGhlIHByZWZpeCBmb3IgdGhlIHJlZmFjdG9yaW5nIHRvb2wpLgotCSAqICAgICAgICAgICAgPHA+Ci0JICogICAgICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZGFuZ2VyIGhlcmUgb2YgcHJldmVudGluZyB0aGUgb2JqZWN0IGZyb20KLQkgKiAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdGlvbiBiZWNhdXNlIGluc3RhbmNlcyBvZiB0aGUgc2VhcmNoIG1hdGNoZXMKLQkgKiAgICAgICAgICAgIHN1cHBvc2VkIHRvIGJlIHNob3J0IGxpdmVkLiB7QGxpbmsgU2VhcmNoTWF0Y2h9IGlzIHVzdWFsbHkKLQkgKiAgICAgICAgICAgIGNvbGxlY3RlZCBieSB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yfSB3aGljaCBpdHNlbGYgaXMgbGl2ZWQgZm9yCi0JICogICAgICAgICAgICB0aGUgdGltZSBvZiB0aGUgc2VhcmNoIGFuZCB0aGVuIGRpc2NhcmRlZCBvciByZS1pbml0aWFsaXplZC4KLQkgKiAgICAgICAgICAgIFVzdWFsbHkgdGhlIHRvb2wgdGhhdCByZXF1ZXN0ZWQgYSBzZWFyY2ggZXh0cmFjdHMgdGhlCi0JICogICAgICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb2xsZWN0ZWQge0BsaW5rIFNlYXJjaE1hdGNofSBhbmQgYWZ0ZXIKLQkgKiAgICAgICAgICAgIHRoYXQge0BsaW5rIFNlYXJjaE1hdGNofSBjb3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCwgcmVsZWFzaW5nCi0JICogICAgICAgICAgICBvYmplY3QgdGhhdCB0aGV5IGhvbGQgdG8uCi0JICogICAgICAgICAgICA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBvYmplY3QpCi0JewotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpCi0JewotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KQotCXsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpCi0JewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7IAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWEwNDQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0vKioKLSAqIDxwPgotICogQSBzZWFyY2ggcGFydGljaXBhbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBleHRlbnNpb24gdG8gYSBnZW5lcmljIHNlYXJjaAotICogbWVjaGFuaXNtLCBwZXJtaXR0aW5nIGNvbWJpbmVkIHNlYXJjaCBhY3Rpb25zIHdoaWNoIHdpbGwgaW52b2x2ZSBhbGwgcmVxdWlyZWQKLSAqIHBhcnRpY2lwYW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogV2hlbiB0aGVyZSBpcyBhIG5lZWQgdG8gc2VhcmNoIGEgZG9jdW1lbnQgdGhhdCBoYXMgc29tZSBtaXhlZCBjb250ZW50LCB0aGVuCi0gKiB1c2luZyBhIG9uZSBwYXJ0aWNpcGFudCB3aWxsIG5vdCBiZSBlbm91Z2guIEUuZy4gZm9yIHRoZSBzZWFyY2hpbmcgb2YgdGhlIEpTUAotICogY29udGVudCwgYSBKU1AgcGFydGljaXBhbnQgbmVlZHMgdG8gY3JlYXRlIHtAbGluayBTZWFyY2hEb2N1bWVudH0gdGhhdAotICogY29udGFpbiBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgYW5kIHRoZW4gcGFzcyBpdCB0byB0aGUgZGVmYXVsdCBKYXZhIHNlYXJjaAotICogcGFydGljaXBhbnQgb2YgdGhlIEphdmEgU2VhcmNoIEVuZ2luZS4gVGhlIHNhbWUgd2l0aCBYTUw6IHdoZW4gdGhlcmUgaXMgYW4KLSAqIFhNTCBjb250ZW50IHRoYXQgZGVmYXVsdCBzZWFyY2ggcGFydGljaXBhbnQgY291bGQgbm90IHByb2Nlc3MsIGJ1dCBpdCBpcwotICogcmVxdWlyZWQgdG8gYmUgc2VhcmNoIG9uLCBhIG5ldyBzZWFyY2ggcGFydGljaXBhbnQgbmVlZHMgdG8gYmUgZGVmaW5lZC4gVGhhdAotICogc2VhcmNoIHBhcnRpY2lwYW50IHdvdWxkIGtub3cgaG93IGNyZWF0ZSBzZWFyY2ggZG9jdW1lbnQgZnJvbSB0aGUgY29udGVudCBhbmQKLSAqIHRoZW4gaXQgY2FuIGNhbGwgZGVmYXVsdCBYTUwgc2VhcmNoIHBhcnRpY2lwYW50LgotICogPC9wPgotICogPHA+Ci0gKiBQYXNzaW5nIGl0cyBvd24ge0BsaW5rIFNlYXJjaFJlcXVlc3Rvcn0gdGhpcyBwYXJ0aWNpcGFudCBjYW4gdGhlbiBtYXAgdGhlCi0gKiBtYXRjaCBwb3NpdGlvbnMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGVudHMsIGNyZWF0ZSBpdHMgb3duIG1hdGNoZXMgYW5kCi0gKiByZXBvcnQgdGhlbSB0byB0aGUgb3JpZ2luYWwgcmVxdWVzdG9yLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUGFydGljaXBhbnQgaW1wbGVtZW50cyBJU2VhcmNoT3B0aW9ucyAKLXsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1BlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBwYXJ0aWNpcGFudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VhcmNoUGFydGljaXBhbnQoKQotCXsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxiYWNrIG1ldGhvZCBhbGxvd2luZyBhIHNlYXJjaCBwYXJ0aWNpcGFudCB0byBpbmRpY2F0ZSB3aGV0aGVyIGl0IHN1cHBvcnRzCi0JICogdGhlIHNwZWNpZmllZCBzZWFyY2ggcGF0dGVybiBhbmQgb3B0aW9ucy4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcGFydGljaXBhbnQgd2lsbCBwYXJ0aWNpcGF0ZSBpbgotCSAqIGZpbmRpbmcgbWF0Y2hlcyBmb3IgdGhlIHNlYXJjaCBkZWZpbmVkIGJ5IHRoZSBzZWFyY2ggcGF0dGVybi4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgKiBzZWFyY2ggcGF0dGVybiBhbmQgb3B0aW9ucyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb2YgdGhlCi0JICogc2VhcmNoIHBhcnRpY2lwYW50OgotCSAqIDxvbD4KLQkgKiA8bGk+e0BsaW5rICNiZWdpblNlYXJjaGluZyhTZWFyY2hQYXR0ZXJuLCBNYXApfQotCSAqIDxsaT57QGxpbmsgI3NlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4sIFNlYXJjaFNjb3BlLCBNYXAsIElQcm9ncmVzc01vbml0b3IpfQotCSAqIDxsaT57QGxpbmsgI2NyZWF0ZVNlYXJjaERvY3VtZW50cyhTZWFyY2hEb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiwgU2VhcmNoU2NvcGUsIE1hcCwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogPGxpPntAbGluayAjbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiwgU2VhcmNoU2NvcGUsIFNlYXJjaFJlcXVlc3RvciwgTWFwLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiA8bGk+e0BsaW5rICNkb25lU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4sIE1hcCl9Ci0JICogPC9vbD4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgbm9uZSBvZiB0aGUgYWJvdmUgbWV0aG9kcyB3aWxsIGJlCi0JICogY2FsbGVkLCBhbmQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCBjb250cmlidXRlcyBubyBtYXRjaGVzIGZvciB0aGUgc2VhcmNoCi0JICogcmVxdXJlc3QuCi0JICogPHA+Ci0JICogQSBzZWFyY2ggcGFydGljaXBhbnQgc2hvdWxkIG9ubHkgcGFydGljaXBhdGUgaW4gYSBzZWFyY2ggd2hlbiBpbiB1bmRlcnN0YW5kcwotCSAqIHRoZSBzZWFyY2ggcGF0dGVybi4gVW5yZWNvZ25pemVkIHNlYXJjaCBvcHRpb25zLCBob3dldmVyLCBjYW4gYmUgaWdub3JlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LiBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyBtdXN0Ci0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGFydGljaXBhdGUgaW4gYW55IHNlYXJjaGVzLgotCSAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucyBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB3aWxsIHBhcnRpY2lwYXRlIGluIHRoZQotCSAqICAgICAgICAgc2VhcmNoIHJlcXVlc3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQkgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBcHBsaWNhYmxlKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhpcyBwYXJ0aWNpcGFudCdzIGhlbHAgaXMgbmVlZGVkIGluIGEgc2VhcmNoLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkbwotCSAqIHNvbWV0aGluZyB3aGVuIHRoZSBwYXJ0aWNpcGFudCBpcyBuZWVkZWQgaW4gYSBzZWFyY2guCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucyBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhpcyBwYXJ0aWNpcGFudCdzIGhlbHAgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgcmUtaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gZG8KLQkgKiBzb21ldGhpbmcgd2hlbiB0aGUgcGFydGljaXBhbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpbiBhIHNlYXJjaC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgTWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb3B0aW9ucyBhcmUgc3BlY2lmaWVkOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb25lU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBkaXNwbGF5YWJsZSBuYW1lIG9mIHRoaXMgc2VhcmNoIHBhcnRpY2lwYW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkaXNwbGF5IGEKLQkgKiBtZWFuaW5nZnVsbCBuYW1lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5YWJsZSBuYW1lIG9mIHRoaXMgc2VhcmNoIHBhcnRpY2lwYW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gIlNlYXJjaCBwYXJ0aWNpcGFudCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2VhcmNoIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gcGF0aC4gVGhlIGdpdmVuIGRvY3VtZW50IHBhdGggaXMKLQkgKiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGRvY3VtZW50LiBNb3N0IG9mIHRoZSB0aW1lIGl0IGlzIGEKLQkgKiB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCwgYnV0IGl0IGNhbiBhbHNvIGJlIGEgZmlsZSBzeXN0ZW0gcGF0aCwgb3IgYSBwYXRoCi0JICogaW5zaWRlIGEgemlwIGZpbGUuCi0JICogPHA+Ci0JICogSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kIGNhbiBlaXRoZXIgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZWlyIG93bgotCSAqIHN1YmNsYXNzIG9mIHtAbGluayBTZWFyY2hEb2N1bWVudH0gb3IgcmV0dXJuIGFuIGV4aXN0aW5nIGluc3RhbmNlIG9mIHN1Y2gKLQkgKiBhIHN1YmNsYXNzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBhIHNlYXJjaCBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKTsKLQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIG1hdGNoZXMgaW4gdGhlIGdpdmVuIGRvY3VtZW50cy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZAotCSAqIGJ5IHRoZSBvdGhlciBzZWFyY2ggcGFydGljaXBhbnQgb3Igc2VhcmNoIGNsaWVudCBvbmNlIGl0IGhhcwotCSAqIHByZS1wcm9jZXNzZWQgZG9jdW1lbnRzIGFuZCBkZWxlZ2F0aW5nIHNlYXJjaCB0byB0aGlzIHNlYXJjaCBwYXJ0aWNpcGFudC4KLQkgKiBAcGFyYW0gZG9jdW1lbnRTZXQKLQkgKiAgICAgICAgICAgIFRoZSBkb2N1bWVudHMgdG8gbG9jYXRlIG1hdGNoZXMgaW4KLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gdG8gc2VhcmNoIGZvcgotCSAqIEBwYXJhbSBzY29wZQotCSAqICAgICAgICAgICAgU2VhcmNoIHNjb3BlIHRvIGxpbWl0IHRoZSBzb3VyY2Ugb2Ygc2VhcmNoIGNhbmRpZGF0ZXM7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIHdvcmtzcGFjZSBpcyB0byBiZQotCSAqICAgICAgICAgICAgc2VhcmNoZWQKLQkgKiBAcGFyYW0gcmVxdWVzdG9yCi0JICogICAgICAgICAgICBDYWxsYmFjayBvYmplY3QgdG8gbm90aWZ5IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaCAoZWFjaCBtYXRjaAotCSAqICAgICAgICAgICAgaXMgcmVwb3J0ZWQgdG8ge0BsaW5rIFNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9KQotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgbm8gcHJvZ3Jlc3MgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgIElmIHRoZSByZXF1ZXN0b3IgaGFkIHByb2JsZW0gYWNjZXB0aW5nIG9uZSBvZiB0aGUgbWF0Y2hlcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRTZXQgZG9jdW1lbnRTZXQsCi0JCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLAotCQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIHBhdHRlcm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwb3B1bGF0ZVNlYXJjaERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LAotCQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgZG9jdW1lbnQgbG9jYXRpb25zIHRvIGNvbnNpZGVyIHdoZW4gcGVyZm9ybWluZwotCSAqIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnkgaW4gdGhlIGdpdmVuIHNjb3BlLiBUaGUgc2VhcmNoIGVuZ2luZSBjYWxscyB0aGlzCi0JICogbWV0aG9kIGJlZm9yZSBsb2NhdGluZyBtYXRjaGVzLgotCSAqIDxwPgotCSAqIEFuIGRvY3VtZW50IGxvY2F0aW9uIHJlcHJlc2VudHMgYSBwYXRoIHdvcmtzcGFjZSB0byB0aGUgZmlsZSB3aXRoIHRoZQotCSAqIGNvbnRlbnQgdGhhdCBoYXMgcG90ZW50aWFsIG1hdGNoZXMKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQ2xpZW50cyBhcmUgbm90IGV4cGVjdGVkIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHNjb3BlCi0JICogICAgICAgICAgICBTZWFyY2ggc2NvcGUgdG8gbGltaXQgdGhlIHNvdXJjZSBvZiBzZWFyY2ggY2FuZGlkYXRlczsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgd29ya3NwYWNlIGlzIHRvIGJlCi0JICogICAgICAgICAgICBzZWFyY2hlZAotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgbm8gcHJvZ3Jlc3MgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGRvY3VtZW50IHBhdGhzIHRvIGNvbnNpZGVyCi0JICovCi0JcHVibGljIFNlYXJjaFNjb3BlIHNlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwKLQkJCVNlYXJjaFNjb3BlIHNjb3BlLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsJCi0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VhcmNoIHNjb3BlOgotCSAqIDxvbD4KLQkgKiA8bGk+e0BsaW5rICNjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcpfQotCSAqIDxsaT57QGxpbmsgI3BvcHVsYXRlU2VhcmNoRG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQsIFNlYXJjaFBhdHRlcm4pfQotCSAqIDwvb2w+Ci0JICogQHBhcmFtIGRvY3VtZW50U2V0Ci0JICogICAgICAgICAgICBUaGUgZG9jdW1lbnRzIHRvIGxvY2F0ZSBtYXRjaGVzIGluCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIFNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSB3b3Jrc3BhY2UgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHNlYXJjaGVkCi0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIE1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9wdGlvbnMgYXJlIHNwZWNpZmllZDsKLQkgKiAgICAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgd29yayBjb21wbGV0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiBubyBwcm9ncmVzcyBuZWVkcyB0byBiZSByZXBvcnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVNlYXJjaERvY3VtZW50cyhTZWFyY2hEb2N1bWVudFNldCBkb2N1bWVudFNldCwKLQkJCVNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoU2NvcGUgc2NvcGUsIE1hcCBzZWFyY2hPcHRpb25zLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgIlRoZSBTZWFyY2hQYXJ0aXBhbnRzIGlkIGhhcyBub3QgYmVlbiBpbml0YWxpemVkIik7Ci0JCUlGaWxlW10gZmlsZXMgPSBzY29wZS5lbmNsb3NpbmdGaWxlcygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJewotCQkJU3RyaW5nIGxvY2F0aW9uID0gZmlsZXNbaV0uZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudFNldC5nZXRTZWFyY2hEb2N1bWVudChsb2NhdGlvbiwgaWQpOwotCQkJaWYoZG9jdW1lbnQgPT0gbnVsbCAmJiBpZCAhPSBudWxsKXsKLQkJCQlkb2N1bWVudFNldC5wdXRTZWFyY2hEb2N1bWVudChpZCwgZG9jdW1lbnQgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChsb2NhdGlvbikpOwotCQkJfQotCQkJcG9wdWxhdGVTZWFyY2hEb2N1bWVudChkb2N1bWVudCwgcGF0dGVybik7IAotCQkJCi0JCX0KLQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOGMzMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5TZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWwuU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJU2VhcmNoT3B0aW9ucwotewotCS8vdGhlIElEIGZvciB0aGlzIHBsdWdpbiAoYWRkZWQgYXV0b21hdGljYWxseSBieSBsb2dnaW5nIHF1aWNrZml4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVSSBDb250ZXh0IGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX0VYVEVOU0lPTl9QT0lOVCA9ICJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBVSVRlc3RlciBlbGVtZW50IG5hbWUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0VYVEVOU0lPTl9QT0lOVCA9ICJ1aVRlc3RlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSBzZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5OwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZWFyY2hQbHVnaW4oKQotCXsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZWFyY2hQbHVnaW4gZ2V0RGVmYXVsdCgpCi0JewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSBnZXRTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5KCkKLQl7Ci0JCWlmIChzZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5ID09IG51bGwpCi0JCXsKLQkJCXNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkgPSBuZXcgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSgpOwotCQkJbmV3IFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnlSZWFkZXIoc2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSkKLQkJCQkJLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBzZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5OwotCX0KLQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KFN0cmluZyBpZCkKLQl7Ci0JCXJldHVybiBnZXRTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5KCkuZ2V0U2VhcmNoUGFydGljaXBhbnQoaWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lzdGVyZWQgc2VhcmNoIHBhcnRpY2lwYW50cyB0aGF0IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBzZWFyY2gKLQkgKiBwYXR0ZXJuIGFuZCBvcHRpb25zLCBsb2FkaW5nIGFuZCBjcmVhdGluZyB0aGUgc2VhcmNoIHBhcnRpY2lwYW50cyBpZiBuZWNlc3NhcnkuCi0JICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gcmVwcmVzZW50aW5nIGEgc2VhcmNoIHJlcXVlc3QKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucyBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEByZXR1cm4gQXJyYXkgb2Ygc2VhcmNoIHBhcnRpY2lwYW50cyB0aGF0IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBzZWFyY2ggcmVxdWVzdCAKLQkgKi8KLQlTZWFyY2hQYXJ0aWNpcGFudFtdIGxvYWRTZWFyY2hQYXJ0aWNpcGFudHMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBNYXAgc2VhcmNoT3B0aW9ucykKLQl7Ci0JCXJldHVybiBnZXRTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5KCkuZ2V0UGFydGljaXBhbnRzKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNldmVyaXR5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggZXhjZXB0aW9uLmdldFN0YXR1cygpICk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MGI1ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb2xsZWN0cyB0aGUgcmVzdWx0cyBmcm9tIGEgc2VhcmNoIGVuZ2luZSBxdWVyeS4gQ2xpZW50cyBpbXBsZW1lbnQgYSBzdWJjbGFzcwotICogdG8gcGFzcyB0byA8Y29kZT5TZWFyY2hFbmdpbmUuc2VhcmNoPC9jb2RlPiBhbmQgaW1wbGVtZW50IHRoZQotICoge0BsaW5rICNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9IG1ldGhvZC4KLSAqIDxwPgotICogVGhlIHN1YmNsYXNzZXMgb2YgdGhlIFNlYXJjaFJlcXVlc3RvciBjb3VsZCBjb2xsZWN0ZWQgc2VhcmNoIG1hdGNoZXMsIGZpbHRlciwKLSAqIHNvcnQgYW5kIGdyb3VwIHRoZW0uIEl0J3MgdXAgdG8gdGhlIGNsaWVudCB0byBwYXNzIHRoZSByZXF1aXJlZCBleHRlbnNpb24gb2YKLSAqIHRoZSBTZWFyY2hSZXF1ZXN0b3IgdG8gdGhlIHNlYXJjaCBlbmdpbmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAc2VlIFNlYXJjaEVuZ2luZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUmVxdWVzdG9yCi17Ci0KLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiBzZWFyY2ggbWF0Y2guCi0JICogCi0JICogQHBhcmFtIG1hdGNoCi0JICogICAgICAgICAgICB0aGUgZm91bmQgbWF0Y2gKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0NvbXBvbmVudERlY2xhcmF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MzkzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSBleHRlbmRzIEVudHJ5Ci17Ci0JUXVhbGlmaWVkTmFtZSBtZXRhTmFtZTsKLSAgICBRdWFsaWZpZWROYW1lIG5hbWU7Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoUXVhbGlmaWVkTmFtZSBuYW1lKQotCXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLSAgcHVibGljIFF1YWxpZmllZE5hbWUgZ2V0TWV0YU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG1ldGFOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWV0YU5hbWUoUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSkKLSAgewotICAgIHRoaXMubWV0YU5hbWUgPSBtZXRhTmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0NvbXBvbmVudFJlZmVyZW5jZUVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50UmVmZXJlbmNlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzMmYyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50UmVmZXJlbmNlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFJlZmVyZW5jZUVudHJ5IGV4dGVuZHMgRW50cnkKLXsKLQlRdWFsaWZpZWROYW1lIG5hbWU7Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoUXVhbGlmaWVkTmFtZSBuYW1lKQotCXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QxMGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIEVudHJ5Ci17Ci0gIFN0cmluZyBrZXk7Ci0gIFN0cmluZyBjYXRlZ29yeTsKLQotCXB1YmxpYyBFbnRyeSgpCi17Ci0Jc3VwZXIoKTsKLQkKLX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKQotCXsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKQotCXsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpCi0JewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0JewotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9GaWxlUmVmZXJlbmNlRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9GaWxlUmVmZXJlbmNlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4OTUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvRmlsZVJlZmVyZW5jZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudDsKLQotLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVSZWZlcmVuY2VFbnRyeSBleHRlbmRzIEVudHJ5Ci17Ci0JU3RyaW5nIHJlbGF0aXZlRmlsZVBhdGg7Ci0gICAgU3RyaW5nIHJlc29sdmVkVVJJOwotCVN0cmluZyBwdWJsaWNJZGVudGlmaWVyOwotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZGVudGlmaWVyKCkKLQl7Ci0JCXJldHVybiBwdWJsaWNJZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkZW50aWZpZXIoU3RyaW5nIHB1YmxpY0lkZW50aWZpZXIpCi0JewotCQl0aGlzLnB1YmxpY0lkZW50aWZpZXIgPSBwdWJsaWNJZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVGaWxlUGF0aCgpCi0JewotCQlyZXR1cm4gcmVsYXRpdmVGaWxlUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZUZpbGVQYXRoKFN0cmluZyByZWxhdGl2ZUZpbGVQYXRoKQotCXsKLQkJdGhpcy5yZWxhdGl2ZUZpbGVQYXRoID0gcmVsYXRpdmVGaWxlUGF0aDsKLQl9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvbHZlZFVSSSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb2x2ZWRVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZFVSSShTdHJpbmcgcmVzb2x2ZWRVUkkpCi0gIHsKLSAgICB0aGlzLnJlc29sdmVkVVJJID0gcmVzb2x2ZWRVUkk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9TZWFyY2hEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmZjYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotCi0vKioKLSAqIEEgc2VhcmNoIGRvY3VtZW50IGVuY2Fwc3VsYXRlcyBhIGNvbnRlbnQgdG8gYmUgc2VhcmNoZWQgaW4uIEEgc2VhcmNoCi0gKiBwYXJ0aWNpcGFudCBjcmVhdGVzIGEgc2VhcmNoIGRvY3VtZW50IGJhc2VkIG9uIHRoZSBmaWxlIGxvY2F0aW9ucyB0byBsb2NhdGUKLSAqIG1hdGNoZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogaXNzdWUgKGNzL2ViKSBkb2VzIGEgc2VhcmNoIHBhcnRpY2lwYW50IGFsd2F5cyBjcmVhdGUgYSBTZWFyY2hEb2N1bWVudD8KLSAqIAotICogPHA+Ci0gKiBTZWFyY2hQYXJ0aWNpcGFudCBvciBzZWFyY2ggY2xpZW50IGNyZWF0ZSBzZWFyY2ggZG9jdW1lbnRzIGZvciB0aGUgc2VhcmNoCi0gKiBwYXNzIHdoZXJlIHByZWNpc2UgbG9jYXRpb25zIG9mIHRoZSBtYXRjaGVzIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSBjYWxsaW5nCi0gKiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbiNsb2NhdGVNYXRjaGVzfQotICogPC9wPgotICogPHA+Ci0gKiBTZWFyY2hQYXJ0aWNpcGFudCBrbm93cyBob3cgdG8gY3JlYXRlIHNlYXJjaCBkb2N1bWVudCB0aGF0IGl0IGNhbiBwcm9jZXNzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgaW50ZW50IG9mIHRoZSBzZXBhcmF0aW9uIG9mIHRoZSB7QGxpbmsgU2VhcmNoRG9jdW1lbnR9IGZyb20gdGhlCi0gKiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnR9IGlzIHRvIGVuYWJsZSB0aGUgb3RoZXIgc2VhcmNoIHBhcnRpY2lwYW50cyB0bwotICogcHJvY2VzcyBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQuIEZvciBleGFtcGxlLCBpZiBYTUwgZG9jdW1lbnQgaGFzIGEgZnJhZ21lbnQKLSAqIHRoYXQgaXQgY2FuIG5vdCBwcm9jZXNzLCBlLmcuIEphdmEsIHRoZW4gWE1MIHBhcnRpY2lwYW50IHdvdWxkIGNyZWF0ZQotICogU2VhcmNoRG9jdW1lbnQgZm9yIHRoYXQgZnJhZ21lbnQgd2hpY2ggY29udGFpbnMgSmF2YSBjb21waWxhdGlvbiB1bml0LCBhbmQKLSAqIHBhc3MgaXQgdG8gdGhlIEphdmEgc2VhcmNoIHBhcnRpY2lwYW50LiBQYXNzaW5nIGl0cyBvd24KLSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3Rvcn0gdGhpcyBwYXJ0aWNpcGFudCBjYW4gdGhlbiBtYXAgdGhlIG1hdGNoIHBvc2l0aW9ucwotICogYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGVudHMsIGNyZWF0ZSBpdHMgb3duIG1hdGNoZXMgYW5kIHJlcG9ydCB0aGVtIHRvIHRoZQotICogb3JpZ2luYWwgcmVxdWVzdG9yLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBTZWFyY2hQYXJ0aWNpcGFudAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoRG9jdW1lbnQKLXsKLQotCXByaXZhdGUgU3RyaW5nIGRvY3VtZW50UGF0aDsKLQlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50OyAKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIGRvY3VtZW50LiBUaGUgZ2l2ZW4gZG9jdW1lbnQgcGF0aCBpcyBhIHN0cmluZyB0aGF0Ci0JICogdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnQuIE1vc3Qgb2YgdGhlIHRpbWUgaXQgaXMgYQotCSAqIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLCBidXQgaXQgY2FuIGFsc28gYmUgYSBmaWxlIHN5c3RlbSBwYXRoLCBvciBhIHBhdGgKLQkgKiBpbnNpZGUgYSB6aXAgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgZG9jdW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgU2VhcmNoRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpCi0JewotCQl0aGlzLmRvY3VtZW50UGF0aCA9IGRvY3VtZW50UGF0aDsKLQkJdGhpcy5wYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBFbnRyeVtdIGdldEVudHJpZXMoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcga2V5LCBpbnQgbWF0Y2hSdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIG9mIHRoaXMgZG9jdW1lbnQuIE1vZGVsIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBhY3R1YWwKLQkgKiByZXNvdXJjZSBhdCBjb3JyZXNwb25kaW5nIGRvY3VtZW50IHBhdGggZHVlIHRvIHByZXByb2Nlc3NpbmcuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCBvZiB0aGlzIGRvY3VtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRNb2RlbCgpOwotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGZpbmFsIFNlYXJjaFBhcnRpY2lwYW50IGdldFBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudDsKLQl9Ci0JCi0JCi0vLwkgdGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbgotLy8JIHRoYXQgaGFzIGJlZW4gcHJvZHVjZWQgYnkgYSBzZWFyY2ggcGFydGljaXBhbnQKLS8vCSB0eXBpY2FsbHkgYWZ0ZXIgYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZAotLy8JIGFuIEVudHJ5IGlzIHR5cGljYWxseSBjb3Vyc2UgZ3JhaW5lZCBpbmZvIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSBTZWFyY2hQYXJ0aWNpcGFudHMKLS8vCSBmaXJzdCBzdGVwIC4uLiBhbmQgaXMgdXNlZCB0byBjb21wdXRlIG1vcmUgYWNjdXJhdGUgU2VhcmNoTWF0Y2hlcyBkdXJpbmcgYSBTZWFyY2hQYXJ0aWNpcGFudHMgMm5kIHN0ZXAKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYXRoKCkKLQl7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50UGF0aDsKLQl9IAotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dEVudHJ5KEVudHJ5IGVudHJ5KTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7ICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50U2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmYjM0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50OwotCi0vKioKLSAqIFRoZSBjbGFzcyBpcyB1c2VkIHRvIG1hbmFnZSBhIHNldCBvZiBzZWFyY2ggZG9jdW1lbnRzCi0gKiB0aGF0IGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCBieSB2YXJpb3VzIHBhcnRpY2lwYW50cwotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaERvY3VtZW50U2V0Ci17Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBnZXRTZWFyY2hEb2N1bWVudChTdHJpbmcgcmVzb3VyY2VQYXRoLCBTdHJpbmcgcGFydGljaXBhbnRJZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudFtdIGdldFNlYXJjaERvY3VtZW50cyhTdHJpbmcgcGFydGljaXBhbnRJZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dFNlYXJjaERvY3VtZW50KFN0cmluZyBwYXJ0aWNpcGFudElkLCBTZWFyY2hEb2N1bWVudCBkb2N1bWVudCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBfdGVtcEdldFNlYXJjaERvY3VtZXRuKFN0cmluZyByZXNvdXJjZVBhdGgpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQxZTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vLyBpc3N1ZSAoY3MpIGlzIHRoaXMgYSBVSSBpc3N1ZT8gIHdoZXJlIGRvZXMgdGhlIGZyYW1ld29yayBuZWVkIHRvIGV4cG9zZSBzdGluZ3M/Ci1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmdpbmVfc2VhcmNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5naW5lX3NlYXJjaGluZ19sb2NhdGluZ0RvY3VtZW50czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuZ2luZV9zZWFyY2hpbmdfbWF0Y2hpbmc7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkKLQl7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXN0YXRpYwotCXsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hEb2N1bWVudFNldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hEb2N1bWVudFNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmNmMzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoRG9jdW1lbnRTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50U2V0OwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoRG9jdW1lbnRTZXRJbXBsIGV4dGVuZHMgU2VhcmNoRG9jdW1lbnRTZXQKLXsKLSAgICBwdWJsaWMgTWFwIGRvY3VtZW50UGF0aE1hcCA9IG5ldyBIYXNoTWFwKCk7IC8vcGF0aCAtLT4gZG9jdW1ldG4KLQlNYXAgZG9jdW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOyAgLy8gcGFydGljaXBhbnRJZCAtID4gbGlzdCAoZG9jdW1lbnQpCi0JCi0JcHVibGljIFNlYXJjaERvY3VtZW50U2V0SW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgU2VhcmNoRG9jdW1lbnQgX3RlbXBHZXRTZWFyY2hEb2N1bWV0bihTdHJpbmcgcmVzb3VyY2VQYXRoKQotICAgIHsgICAgICAKLSAgICAgICByZXR1cm4gKFNlYXJjaERvY3VtZW50KWRvY3VtZW50UGF0aE1hcC5nZXQocmVzb3VyY2VQYXRoKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGdldFNlYXJjaERvY3VtZW50KFN0cmluZyByZXNvdXJjZVBhdGgsIFN0cmluZyBwYXJ0aWNpcGFudElkKQotCXsKLQkJaWYocmVzb3VyY2VQYXRoID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU2VhcmNoRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBnZXRTZWFyY2hEb2N1bWVudHMocGFydGljaXBhbnRJZCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1tpXTsKLQkJCWlmKHJlc291cmNlUGF0aC5lcXVhbHMoZG9jdW1lbnQuZ2V0UGF0aCgpKSl7Ci0JCQkJcmV0dXJuIGRvY3VtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTZWFyY2hEb2N1bWVudFtdIGdldFNlYXJjaERvY3VtZW50cyhTdHJpbmcgcGFydGljaXBhbnRJZCkKLQl7Ci0JCQotCQlPYmplY3Qgb2JqZWN0ID0gZG9jdW1lbnRNYXAuZ2V0KHBhcnRpY2lwYW50SWQpOwotCQlMaXN0IGRvY3VtZW50TGlzdCA9IG51bGw7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpewotCQkJZG9jdW1lbnRMaXN0ID0gKExpc3Qpb2JqZWN0OwotCQl9Ci0JCWVsc2V7Ci0JCQlkb2N1bWVudE1hcC5wdXQocGFydGljaXBhbnRJZCwgZG9jdW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpKTsKLQkJfQotCQlyZXR1cm4gKFNlYXJjaERvY3VtZW50W10pIGRvY3VtZW50TGlzdC50b0FycmF5KG5ldyBTZWFyY2hEb2N1bWVudFtkb2N1bWVudExpc3Quc2l6ZSgpXSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHB1dFNlYXJjaERvY3VtZW50KFN0cmluZyBwYXJ0aWNpcGFudElkLCBTZWFyY2hEb2N1bWVudCBkb2N1bWVudCkKLQl7Ci0JCU9iamVjdCBvYmplY3QgPSBkb2N1bWVudE1hcC5nZXQocGFydGljaXBhbnRJZCk7Ci0JCUxpc3QgZG9jdW1lbnRMaXN0ID0gbnVsbDsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTGlzdCl7Ci0JCQlkb2N1bWVudExpc3QgPSAoTGlzdClvYmplY3Q7Ci0JCX0KLQkJZWxzZXsKLQkJCWRvY3VtZW50TWFwLnB1dChwYXJ0aWNpcGFudElkLCBkb2N1bWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCkpOwotCQl9Ci0JCWRvY3VtZW50TGlzdC5hZGQoZG9jdW1lbnQpOwotICAgICAgICBkb2N1bWVudFBhdGhNYXAucHV0KGRvY3VtZW50LmdldFBhdGgoKSwgZG9jdW1lbnQpOwotCX0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZG9jdW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICB7ICAKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSAoKExpc3QpbykuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbzIgPSBqLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvMiBpbnN0YW5jZW9mIFNlYXJjaERvY3VtZW50KQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICBTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2N1bWVudCA9IChTZWFyY2hEb2N1bWVudClvMjsKLSAgICAgICAgICAgICAgIHNlYXJjaERvY3VtZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9ICAgICAgIAotICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM5ZTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uVGFnTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsgCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yCi17Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmRWxlbWVudDsKLQotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQ7Ci0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkKLQl7Ci0JCWlmIChwYXJ0aWNpcGFudCA9PSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlwYXJ0aWNpcGFudCA9IChTZWFyY2hQYXJ0aWNpcGFudCkgZkVsZW1lbnQKLQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJ0aWNpcGFudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBmRWxlbWVudAotCQkJCS5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJQXNzZXJ0LmlzVHJ1ZShlbGVtZW50cy5sZW5ndGggPT0gMSk7Ci0JCUV4cHJlc3Npb24gZXhwID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShlbGVtZW50c1swXSk7Ci0JCXJldHVybiBjb252ZXJ0KGV4cC5ldmFsdWF0ZShjb250ZXh0KSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnZlcnQoRXZhbHVhdGlvblJlc3VsdCBldmFsKQotCXsKLQkJaWYgKGV2YWwgPT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgTm8gcmVwbGFjZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCkKLQl7Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkU3VwcG9ydGVkQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkKLQl7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudElkKCl7Ci0JCXJldHVybiBmRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2OWU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkKLXsKLQotCXByb3RlY3RlZCBNYXAgaWRNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBtYXBzIHNlYXJjaFBhcnRpY2lwYW50IGlkIHRvIGEKLQkJCQkJCQkJCQkJLy8gc2VhcmNoUGFydGljaXBhbnQgZGVzY3JpcHRvcgotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRTZWFyY2hQYXJ0aWNpcGFudChTdHJpbmcgaWQsCi0JCQlTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3Igc2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKQotCXsKLQkJaWRNYXAucHV0KGlkLCBzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTZWFyY2hQYXJ0aWNpcGFudElkcygpCi0JewotCQlTZXQgaWRzID0gaWRNYXAua2V5U2V0KCk7Ci0JCXJldHVybiAoU3RyaW5nW10pIGlkcy50b0FycmF5KG5ldyBTdHJpbmdbaWRzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlYXJjaFBhcnRpY2lwYW50cygpCi0JewotCQlyZXR1cm4gaWRNYXAudmFsdWVzKCk7Ci0JfQotCi0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnQgZ2V0U2VhcmNoUGFydGljaXBhbnQoU3RyaW5nIGlkKQotCXsKLQkJU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yIHNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChpZCAhPSBudWxsKQotCQl7Ci0JCQlzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IgPSAoU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKSBpZE1hcAotCQkJCQkuZ2V0KGlkKTsKLQkJfQotCQlyZXR1cm4gc2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yICE9IG51bGwgPyBzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IKLQkJCQkuZ2V0U2VhcmNoUGFydGljaXBhbnQoKQotCQkJCTogbnVsbDsKLQotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudFtdIGdldFBhcnRpY2lwYW50cyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE1hcCBzZWFyY2hPcHRpb25zKQotCXsKLQotCQlFdmFsdWF0aW9uQ29udGV4dCBldmFsQ29udGV4dCA9IGNyZWF0ZUV2YWx1YXRpb25Db250ZXh0KHBhdHRlcm4pOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VhcmNoUGFydGljaXBhbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCXRyeQotCQkJewotCQkJCWlmIChkZXNjcmlwdG9yLm1hdGNoZXMoZXZhbENvbnRleHQpKQotCQkJCXsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCVNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gZGVzY3JpcHRvcgotCQkJCQkJCQkuZ2V0U2VhcmNoUGFydGljaXBhbnQoKTsKLQkJCQkJCWlmICghU2VhcmNoUGFydGljaXBhbnQuY2xhc3MuaXNJbnN0YW5jZShwYXJ0aWNpcGFudCkpCi0JCQkJCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigpOwotCQkJCQkJaWYgKHBhcnRpY2lwYW50LmlzQXBwbGljYWJsZShwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKSkKLQkJCQkJCXsKLQkJCQkJCQlyZXN1bHQuYWRkKHBhcnRpY2lwYW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gKFNlYXJjaFBhcnRpY2lwYW50W10pIHJlc3VsdAotCQkJCS50b0FycmF5KG5ldyBTZWFyY2hQYXJ0aWNpcGFudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZhbHVhdGlvbkNvbnRleHQgY3JlYXRlRXZhbHVhdGlvbkNvbnRleHQoCi0JCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlFdmFsdWF0aW9uQ29udGV4dCByZXN1bHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgcGF0dGVybik7Ci0JCXJlc3VsdC5hZGRWYXJpYWJsZSgicGF0dGVybiIsIHBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1N2NlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlcgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJzZWFyY2hQYXJ0aWNpcGFudHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJzZWFyY2hQYXJ0aWNpcGFudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQ7Ci0KLQlwcm90ZWN0ZWQgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSByZWdpc3RyeTsKLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyKFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLQl7Ci0JCVN0cmluZyBidW5kbGVpZCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoYnVuZGxlaWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKQotCQl7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotCQl7Ci0JCQlTdHJpbmcgY29udHJpYnV0b3JDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9yQ2xhc3MgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCVNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvcigKLQkJCQkJCQllbGVtZW50KTsKLQkJCQkJcmVnaXN0cnkucHV0U2VhcmNoUGFydGljaXBhbnQoaWQsIGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTAxYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgU2VhcmNoIG1lc3NhZ2VzLgotCi1lbmdpbmVfc2VhcmNoaW5nID0gU2VhcmNoaW5nLi4uCi1lbmdpbmVfc2VhcmNoaW5nX2xvY2F0aW5nRG9jdW1lbnRzID0gezB9OiBsb2NhdGUgc2VhcmNoIGRvY3VtZW50cy4uLgotZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZyA9IHswfTogbG9jYXRlIG1hdGNoZXMuLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjNmZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuOwotCi0vKioKLSAqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBleHRlbmRzIENvbXBvbmVudFNlYXJjaFBhdHRlcm4KLXsKLQotCXB1YmxpYyBDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBuYW1lLAotCQkJUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSwgaW50IG1hdGNoUnVsZSkKLQl7Ci0JCXN1cGVyKG51bGwsIG5hbWUsIG1ldGFOYW1lLCBtYXRjaFJ1bGUpOwotCi0JfQotCi0JcHVibGljIENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIG5hbWUsCi0JCQlRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotCXsKLQkJc3VwZXIobnVsbCwgbmFtZSwgbWV0YU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjFlMTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIENvbXBvbmVudFNlYXJjaFBhdHRlcm4KLXsKLQotCXB1YmxpYyBDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLAotCQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUsIGludCBtYXRjaFJ1bGUpCi0JewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLAotCQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpCi0JewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MWExMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9Db21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIGdlbmVyaWMgY29tcG9uZW50IHBhdHRlcm4uIFVzdWFsbHkgdGhlcmUgYXJlIHR3byB0eXBlcyBvZgotICogY29tcG9uZW50IHNlYXJjaCBwYXR0ZXJuczogcGF0dGVybiBmb3IgY29tcG9uZW50IGRlY2xhcmF0aW9uIGFuZCBmb3IKLSAqIGNvbXBvbmVudCBkZWZpbml0aW9uLgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50U2VhcmNoUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4KLXsKLQotCVF1YWxpZmllZE5hbWUgbmFtZTsKLQotCVF1YWxpZmllZE5hbWUgbWV0YU5hbWU7Ci0KLQlJRmlsZSBmaWxlOyAvLyAob3B0aW9uYWwpIGxvY2F0aW9uIHdoZXJlIGNvbXBvbmVudCBpcyBkZWZpbmVkCi0KLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwKLQkJCVF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJc3VwZXIobWF0Y2hSdWxlKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJbmFtZSA9IGVsZW1lbnRRTmFtZTsKLQkJbWV0YU5hbWUgPSB0eXBlUU5hbWU7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwKLQkJCVF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKQotCXsKLQotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQluYW1lID0gZWxlbWVudFFOYW1lOwotCQltZXRhTmFtZSA9IHR5cGVRTmFtZTsKLQotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLQl7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldE1ldGFOYW1lKCkKLQl7Ci0JCXJldHVybiBtZXRhTmFtZTsKLQl9Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vRmlsZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0ZpbGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzExNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vRmlsZVJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuCi17Ci0KLQlJRmlsZSBmaWxlOwotCi0JcHVibGljIEZpbGVSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUpCi0JewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBGaWxlUmVmZXJlbmNlUGF0dGVybihJRmlsZSBmaWxlLCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJc3VwZXIobWF0Y2hSdWxlKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1F1YWxpZmllZE5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1F1YWxpZmllZE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3YWIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9RdWFsaWZpZWROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybjsKLQotLyoqCi0gKiBUaGlzIGRhdGEgY2xhc3MgcmVwcmVzZW50cyBhIHF1YWxpZmllZCBuYW1lLCBjb25zaXN0aW5nIG9mIGEgbG9jYWwgbmFtZSBhbmQgYQotICogcXVhbGlmaWVyCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLS8vIGlzc3VlIChjcykgc2hvdWxkIHRoaXMgZ28gaW4gdGhlICdtYXRjaGluZycgcGFja2FnZSAoQlRXLi4uIHJlbmFtZQotLy8gbWF0Y2hpbmctPnBhdHRlcm4pCi1wdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZQotewotCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOU19ERUxJTV8xID0gInsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfREVMSU1fMiA9ICJ9IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgQ3JlYXRlcyBhIHF1YWxpZmllZCBuYW1lIGZyb20gYSBuYW1lc3BhY2UgYW5kIGxvY2FsIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWVzcGFjZQotCSAqIEBwYXJhbSBsb2NhbE5hbWUKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQotCQlzdXBlcigpOwotCi0JCXRoaXMucXVhbGlmaWVyID0gbmFtZXNwYWNlOwotCQlpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXRoaXMucXVhbGlmaWVyID0gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5xdWFsaWZpZXIgIT0gbnVsbCAmJiB0aGlzLnF1YWxpZmllci5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQl0aGlzLnF1YWxpZmllciA9IG51bGw7Ci0JCX0KLQotCQl0aGlzLm5hbWUgPSBsb2NhbE5hbWU7Ci0JCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJdGhpcy5uYW1lID0gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIGNvbXBvbmVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgbmFtZXNwYWNlOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLQl7Ci0JCXJldHVybiB0aGlzLnF1YWxpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCBuYW1lIGNvbXBvbmVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgbG9jYWwgbmFtZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBzcGVjaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpCi0JewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLQl7Ci0JCWJvb2xlYW4gaXNFcXVhbCA9IGZhbHNlOwotCQlpZiAodGhpcyA9PSBvYmopCi0JCXsKLQkJICBpc0VxdWFsID0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsJCi0JCSAgaWYgKG9iaiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0JCSAgewotCQkJUXVhbGlmaWVkTmFtZSB0aGF0ID0gKFF1YWxpZmllZE5hbWUpIG9iajsKLQkJICAgIGlzRXF1YWwgPSBpc01hdGNoKHRoaXMuZ2V0TmFtZXNwYWNlKCksIHRoYXQuZ2V0TmFtZXNwYWNlKCkpICYmCi0JCSAgICAgICAgICAgICAgaXNNYXRjaCh0aGlzLmdldExvY2FsTmFtZSgpLCB0aGF0LmdldExvY2FsTmFtZSgpKTsJCi0JCSAgfSAgCi0JCX0KLQkJcmV0dXJuIGlzRXF1YWw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2goU3RyaW5nIGEsIFN0cmluZyBiKQotCXsKLQkgIHJldHVybiBhICE9IG51bGwgPyBhLmVxdWFscyhiKSA6IGEgPT0gYjsKLQl9CQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkKLQl7Ci0JCWludCBoYXNoID0gMDsKLQkJaWYgKHRoaXMucXVhbGlmaWVyICE9IG51bGwpCi0JCXsKLQkJCWhhc2ggKz0gdGhpcy5xdWFsaWZpZXIuaGFzaENvZGUoKTsKLQkJfQotCQlpZiAodGhpcy5uYW1lICE9IG51bGwpCi0JCXsKLQkJCWhhc2ggKz0gdGhpcy5uYW1lLmhhc2hDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVhbGlmaWVkIG5hbWUsIG9mIHRoZSBmb3JtOgotCSAqIHtuYW1lc3BhY2V9bG9jYWxuYW1lLiBJZiBubyBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCB0aGUgc3RyaW5nIGhhcyB0aGUKLQkgKiBmb3JtOiB7fWxvY2FsbmFtZS4gTm90ZSB0aGF0IHRoZSBzdHJpbmcgZm9ybWF0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0KLQkJcmV0dXJuIGFwcGVuZFN0cmluZ3MobmV3IFN0cmluZ1tdCi0JCXsgTlNfREVMSU1fMSwgLy8gewotCQkJCXRoaXMucXVhbGlmaWVyLCBOU19ERUxJTV8yLCAvLyB9Ci0JCQkJdGhpcy5uYW1lIH0pOwotCi0JfQotCi0JLyoqCi0JICogRmFjdG9yeS1saWtlIG1ldGhvZCB0byBjcmVhdGUgYSBRTmFtZSBvYmplY3QgZnJvbSB0aGUgc3RyaW5nIGZvcm0gb2YgYQotCSAqIFFOYW1lLiBUaGUgc3RyaW5nIG11c3QgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKLQkgKiBRTmFtZS50b1N0cmluZygpLgotCSAqIAotCSAqIEBwYXJhbSBxbmFtZVN0cmluZyAtCi0JICogICAgICAgICAgICBTdHJpbmcgZm9ybSBvZiBhIFFOYW1lCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCBRTmFtZSBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIE1pc3NpbmcgbmFtZXNwYWNlIGRlbGltaXRlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFF1YWxpZmllZE5hbWUgdmFsdWVPZihTdHJpbmcgcW5hbWVTdHJpbmcpCi0JCQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JewotCi0JCVN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gbnVsbDsKLQkJaWYgKHFuYW1lU3RyaW5nID09IG51bGwgfHwgcW5hbWVTdHJpbmcubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJLy8gQm90aCBuYW1lc3BhY2UgYW5kIGxvY2FsIG5hbWUgYXJlIG51bGwuCi0JCX0gZWxzZSBpZiAocW5hbWVTdHJpbmcuc3RhcnRzV2l0aChOU19ERUxJTV8xKSkKLQkJewotCQkJLy8gVGhlIFFOYW1lIGhhcyB0aGUgbm90YXRpb24gc3BlY2lmeWluZyBhIG5hbWVzcGFjZS4KLQkJCWludCBpbmRleCA9IHFuYW1lU3RyaW5nLmluZGV4T2YoTlNfREVMSU1fMik7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJLy8gVGhlIGVuZCBkZWxpbWl0ZXIgZm9yIHRoZSBuYW1lc3BhY2Ugd2FzIG5vdCBmb3VuZC4gVGhlIFFOYW1lCi0JCQkJLy8gc3RyaW5nCi0JCQkJLy8gaXMgbWFsZm9ybWVkLgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkicW5hbWVTdHJpbmcgPSAiICsgcW5hbWVTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lc3BhY2UgPSBxbmFtZVN0cmluZy5zdWJzdHJpbmcoMSwgaW5kZXgpOwotCQkJbG9jYWxOYW1lID0gcW5hbWVTdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCX0gZWxzZQotCQl7Ci0JCQkvLyBBc3N1bWUgbm8gbmFtZXNwYWNlIGlzIHNwZWNpZmllZCBhbmQgdGhlIHN0cmluZyBpcyBhIGxvY2FsIG5hbWUuCi0JCQlsb2NhbE5hbWUgPSBxbmFtZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBzdHJpbmcgYnkgYXBwZW5kaW5nIHRvZ2V0aGVyIGFuIGFycmF5IG9mIHN0cmluZ3MsCi0JICogc2tpcHBpbmcgbnVsbCBzdHJpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmdzIC0KLQkgKiAgICAgICAgICAgIFN0cmluZ3MgdG8gYmUgYXBwZW5kZWQgdG9nZXRoZXIKLQkgKiBAcmV0dXJuIFJlc3VsdGluZyBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRTdHJpbmdzKFN0cmluZ1tdIHN0cmluZ3MpCi0JewotCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RyaW5ncyAhPSBudWxsKQotCQl7Ci0JCQlTdHJpbmdCdWZmZXIgdG9rZW5CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgbWF4Q291bnQgPSBzdHJpbmdzLmxlbmd0aDsKLQkJCVN0cmluZyBzdHJpbmc7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heENvdW50OyBpKyspCi0JCQl7Ci0JCQkJc3RyaW5nID0gc3RyaW5nc1tpXTsKLQkJCQlpZiAoc3RyaW5nICE9IG51bGwgJiYgc3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCQl7Ci0JCQkJCXRva2VuQnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQkJCX0vLyBpZgotCQkJfS8vIGZvcgotCQkJcmVzdWx0ID0gdG9rZW5CdWZmZXIudG9TdHJpbmcoKTsKLQkJfS8vIGlmCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ly8gYXBwZW5kU3RyaW5ncygpCi0KLX0vLyBjbGFzcyBRTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vU2VhcmNoUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vU2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBhYWY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1NlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQSBzZWFyY2ggZGVmaW5lcyBob3cgc2VhcmNoIHJlc3VsdHMgYXJlIGZvdW5kLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaFBhdHRlcm4gaW1wbGVtZW50cyBJQWRhcHRhYmxlCi17Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc2VhcmNoIHJlc3VsdCBvbmx5IGlmIGNhc2VzCi0JICogYXJlIHRoZSBzYW1lLiBDYW4gYmUgY29tYmluZWQgdG8gcHJldmlvdXMgcnVsZXMsIGUuZy4KLQkgKiB7QGxpbmsgI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfQ0FTRV9TRU5TSVRJVkUgPSA4OwotCi0JLy8gUnVsZXMgZm9yIHBhdHRlcm4gbWF0Y2hpbmc6IChleGFjdCwgcHJlZml4LCBwYXR0ZXJuKSBbIHwgY2FzZSBzZW5zaXRpdmVdCi0JLyoqCi0JICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIG1hdGNoZXMgZXhhY3RseSB0aGUgc2VhcmNoIHJlc3VsdCwgdGhhdAotCSAqIGlzLCB0aGUgc291cmNlIG9mIHRoZSBzZWFyY2ggcmVzdWx0IGVxdWFscyB0aGUgc2VhcmNoIHBhdHRlcm4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9FWEFDVF9NQVRDSCA9IDA7Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gY29udGFpbnMgb25lIG9yIG1vcmUgd2lsZCBjYXJkcyAoJyonKQotCSAqIHdoZXJlIGEgd2lsZC1jYXJkIGNhbiByZXBsYWNlIDAgb3IgbW9yZSBjaGFyYWN0ZXJzIGluIHRoZSBzZWFyY2ggcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfUEFUVEVSTl9NQVRDSCA9IDI7Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gaXMgYSBwcmVmaXggb2YgdGhlIHNlYXJjaCByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9QUkVGSVhfTUFUQ0ggPSAxOwotCi0JLyoqCi0JICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIGNvbnRhaW5zIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfUkVHRVhQX01BVENIID0gNDsKLQotCXByaXZhdGUgaW50IG1hdGNoUnVsZTsKLQotCXB1YmxpYyBTZWFyY2hQYXR0ZXJuKCkKLQl7Ci0JCXRoaXMubWF0Y2hSdWxlID0gUl9FWEFDVF9NQVRDSCB8IFJfQ0FTRV9TRU5TSVRJVkU7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhdHRlcm4oaW50IG1hdGNoUnVsZSkKLQl7Ci0JCXRoaXMubWF0Y2hSdWxlID0gbWF0Y2hSdWxlOwotCi0JfQotCi0JcHVibGljIGZpbmFsIGludCBnZXRNYXRjaFJ1bGUoKQotCXsKLQkJcmV0dXJuIHRoaXMubWF0Y2hSdWxlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotCXsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Db250ZW50VHlwZVNlYXJjaFNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvQ29udGVudFR5cGVTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdhZjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Db250ZW50VHlwZVNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotCi0vKioKLSAqIFNjb3BlIHRoYXQgaGFzIGZpbHRlcmVycyBmaWxlcyBiYXNlZCBvbiBjb250ZW50IHR5cGVzLiBJdCBjYW4gbGltaXQgb3RoZXIKLSAqIHNjb3BlcyB3aXRoIHRoZSBnaXZlbiBmaWxlIGNvbnRlbnQgdHlwZXMuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZVNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQlwcml2YXRlIExpc3QgdmFsaWRDb250ZW50SWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIENvbnRlbnRUeXBlU2VhcmNoU2NvcGUoU2VhcmNoU2NvcGUgc2NvcGUsIFN0cmluZ1tdIHZhbGlkQ29udGVudFR5cGVzKQotCXsKLQkJaWYgKHZhbGlkQ29udGVudFR5cGVzICE9IG51bGwpCi0JCXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJdGhpcy52YWxpZENvbnRlbnRJZHMuYWRkKHZhbGlkQ29udGVudFR5cGVzW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAoc2NvcGUuZW5jbG9zaW5nRmlsZXMoKSAhPSBudWxsKQotCQl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNjb3BlLmVuY2xvc2luZ0ZpbGVzKCkubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgc2NvcGUuZW5jbG9zaW5nRmlsZXMoKVtpXTsKLQkJCQlhY2NlcHRGaWxlKGZpbGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGaWxlKElGaWxlIGZpbGUpCi0JewotCi0JCWlmIChmaWxlID09IG51bGwpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCXsKLQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCS8vIFRPRE8gdXNlIElDb250ZW50VHlwZS5pc0tpbmRPZgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsaWRDb250ZW50SWRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspCi0JCQkJCQl7Ci0JCQkJCQkJU3RyaW5nIGNvbnRlbnRJZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQkJCQkJSUNvbnRlbnRUeXBlIHN1cHBvcnRlZENvbnRlbnRUeXBlID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRJZCk7Ci0JCQkJCQkJaWYgKHN1cHBvcnRlZENvbnRlbnRUeXBlICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoY29udGVudFR5cGUuaXNLaW5kT2Yoc3VwcG9ydGVkQ29udGVudFR5cGUpKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQkJCQlwcm9qZWN0cy5hZGQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJewotCQkJCS8vIGlnbm9yZSB0aGUgZmlsZQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Qcm9qZWN0U2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Qcm9qZWN0U2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhY2U3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvUHJvamVjdFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2NvcGUgdGhhdCBlY2xvc2VzIHdvcmtzcGFjZSBwYXRoIGFuZCBlY2xvc2luZyBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHdvcmtzcGFjZVBhdGggLQotCSAqICAgICAgICAgICAgcGF0aCB0byB0aGUgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZSwgZS5nLgotCSAqICAgICAgICAgICAgL015UHJvamVjdC9NeUZpbGUueG1sCi0JICovCi0JcHVibGljIFByb2plY3RTZWFyY2hTY29wZShJUGF0aCB3b3Jrc3BhY2VQYXRoKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSh3b3Jrc3BhY2VQYXRoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSVBhdGggd29ya3NwYWNlUGF0aCkKLQl7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkuZmluZE1lbWJlcih3b3Jrc3BhY2VQYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCXsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQl0cmF2ZXJzZUNvbnRhaW5lcihwcm9qZWN0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlYXJjaFNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkM2VmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogQSA8Y29kZT5TZWFyY2hTY29wZTwvY29kZT4gZGVmaW5lcyB3aGVyZSBzZWFyY2ggcmVzdWx0IHNob3VsZCBiZSBmb3VuZCBieSBhCi0gKiA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+IChlLmcuIHByb2plY3QsIHdvcmtzcGFjZSkuCi0gKiAKLSAqIENsaWVudHMgbXVzdCBwYXNzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdG8gdGhlIDxjb2RlPnNlYXJjaCguLi4pPC9jb2RlPgotICogbWV0aG9kcy4gU3VjaCBhbiBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZhY3RvcnkgbWV0aG9kcwotICogb24gPGNvZGU+U2VhcmNoU2NvcGU8L2NvZGU+OiA8Y29kZT5uZXdTZWFyY2hTY29wZShJUmVzb3VyY2VbXSk8L2NvZGU+LAotICogPGNvZGU+bmV3V29ya3NwYWNlU2NvcGUoKTwvY29kZT4KLSAqIAotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgc2VhcmNoIHNjb3BlIGhhcyBubyBmaWx0ZXIsIGFuZCBhdCBjcmVhdGlvbgotICogZG9lcyBub3QgY29udGFpbiBhbnkgZmlsZXMsIEl0IGNvdWxkIGFjY2VwdCBhbnkgd29ya3NwYWNlIGZpbGUuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWFyY2hTY29wZQotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmtzcGFjZSBmaWxlcyB0aGF0IGJlbG9uZyBpbiB0aGlzIHNlYXJjaCBzY29wZS4KLQkgKiAoc2VlIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLAotCSAqIC9NeVByb2plY3QvTXlGaWxlLnR4dAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGJlbG9uZyB0byB0aGlzIHNjb3BlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRmlsZVtdIGVuY2xvc2luZ0ZpbGVzKCk7Ci0KLQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNGM2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICoKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hTY29wZUltcGwgZXh0ZW5kcyBTZWFyY2hTY29wZQotewotCi0JcHJvdGVjdGVkIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgSGFzaFNldCBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgU2VhcmNoU2NvcGVJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJlc291cmNlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGJlbG9uZ3MgdG8gdGhpcyBzY29wZS4KLQkgKiBSZXNvdXJjZSBwYXRoIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBzY29wZSwgaWYgc2NvcGUgY29uZGl0aW9ucyBhcmUgbWV0LgotCSAqIGlmIHtAbGluayBJU2VhcmNoU2NvcGUuZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aCl9IHJldHVybnMgZmFsc2UgYW5kCi0JICogdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYW5kIHJldHVybnMgdHJ1ZSwgbmV4dCBjYWxsIHRvCi0JICoge0BsaW5rIElTZWFyY2hTY29wZS5lY2xpcHNlcyhTdHJpbmcgcmVzb3VyY2VQYXRoKX0gc2hvdWxkIHJldHVybiB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIC0KLQkgKiAgICAgICAgICAgIHdvcmtzcGFjZSBmaWxlCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBlbmNsb3NlZCBieSB0aGlzIHNjb3BlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmlsZShJRmlsZSBmaWxlKQotCXsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbGVzLmFkZChmaWxlKTsKLQkJcHJvamVjdHMuYWRkKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVzb3VyY2UgYXQgdGhlIGdpdmVuIHBhdGggaXMgZW5jbG9zZWQgYnkgdGhpcyBzY29wZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHdvcmtzcGFjZSByZWxhdGl2ZSByZXNvdXJjZSBwYXRoCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBlbmNsb3NlZCBieSB0aGlzIHNjb3BlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aCkKLQl7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkuZmluZE1lbWJlcihyZXNvdXJjZVBhdGgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChmaWxlcy5jb250YWlucyhyZXNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmtzcGFjZSBmaWxlcyB0aGF0IGJlbG9uZyBpbiB0aGlzIHNlYXJjaCBzY29wZS4KLQkgKiAoc2VlIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLAotCSAqIC9NeVByb2plY3QvTXlGaWxlLnR4dAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGJlbG9uZyB0byB0aGlzIHNjb3BlLgotCSAqLwotCXB1YmxpYyBJRmlsZVtdIGVuY2xvc2luZ0ZpbGVzKCkKLQl7Ci0JCWlmIChmaWxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJRmlsZVswXTsKLQkJcmV0dXJuIChJRmlsZVtdKSBmaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmaWxlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRocyB0byB0aGUgZW5jbG9zaW5nIHByb2plY3RzIGZvciB0aGlzIHNlYXJjaCBzY29wZS4gKHNlZQotCSAqIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLCAvTXlQcm9qZWN0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBwYXRocyB0byB0aGUgZW5jbG9zaW5nIHByb2plY3RzLgotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdFtdIGVuY2xvc2luZ1Byb2plY3RzKCkKLQl7Ci0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBwcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZUNvbnRhaW5lcihJQ29udGFpbmVyIGNvbnRhaW5lcikKLQl7Ci0KLQkJSVJlc291cmNlVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKQotCQl7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpCi0JCQl7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJYWNjZXB0RmlsZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJdHJ5Ci0JCXsKLQkJCWNvbnRhaW5lci5hY2NlcHQodmlzaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gaWdub3JlIHJlc291cmNlCi0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWxlY3Rpb25TZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlbGVjdGlvblNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmNkM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlbGVjdGlvblNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25TZWFyY2hTY29wZSBleHRlbmRzIFNlYXJjaFNjb3BlSW1wbAotewotCi0JcHJvdGVjdGVkIElSZXNvdXJjZVtdIHJlc291cmNlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY29wZSB0aGF0IGVjbG9zZXMgd29ya3NwYWNlIHBhdGggYW5kIGVjbG9zaW5nIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCAtCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLCBlLmcuCi0JICogICAgICAgICAgICAvTXlQcm9qZWN0L015RmlsZS54bWwKLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uU2VhcmNoU2NvcGUoSVJlc291cmNlW10gcmVzb3VyY2VzKQotCXsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0JCWluaXRpYWxpemUoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKQotCXsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcmVzb3VyY2VzLmxlbmd0aDsgaW5kZXgrKykKLQkJewotCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2luZGV4XTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJewotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikKLQkJCQl7Ci0JCQkJCXRyYXZlcnNlQ29udGFpbmVyKChJRm9sZGVyKSByZXNvdXJjZSk7Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJewotCQkJCQlhY2NlcHRGaWxlKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3JraW5nU2V0U2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3JraW5nU2V0U2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMWExOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvV29ya2luZ1NldFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gd3JhcCB0aGUgY29udGVudCBvZiBhbiBJV29ya2luZ1NldC4KLSAqIFdlIGNhbid0IHVzZSBJV29ya2luZ1NldCBkaXJlY3RseSBiZWNhdXNlIGl0J3MgcGFydCBvZiBhbiBlY2xpcHNlLnVpCi0gKiBjb21wb25lbnQuIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QgYXMgYSBzdXJyb2dhdGUuCi0gKiA8YnI+Ci0gKiBVc2FnZTogV2UgZ2V0IHRoZSBhcnJheSBJQWRhcHRhYmxlW10gb2YgdGhlIElXb3JraW5nU2V0IG9iamVjdCBhbmQgdXNlIHRoaXMKLSAqIGFycmF5IGFzIGFyZ3VtZW50IGZvciBhbGwgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGluY2x1ZGluZyB0aGUgY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JraW5nU2V0U2VhcmNoU2NvcGUgZXh0ZW5kcyBTZWFyY2hTY29wZUltcGx7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBzY29wZSB3aGVuIG5vIHJlc291cmNlcyBpcyBnaXZlbi4KLQkgKi8KLQlwdWJsaWMgV29ya2luZ1NldFNlYXJjaFNjb3BlKCl7Ci0JCXN1cGVyKCk7Ci0JfQotICAKLQkvKioKLQkgKiBJbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggYW4gSVdvcmtpbmdTZXQKLQkgKiA8YnI+Ci0JICogRm9yIGV4YW1wbGU6Ci0JICogPHByZT4KLQkgKiBJV29ya2luZ1NldCBvbmVXb3JraW5nU2V0OwotCSAqIC4uLgotCSAqIElBZGFwdGFibGVbXSBlbGVtZW50cyA9IG9uZVdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLQkgKiBXb3JraW5nU2V0U2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgV29ya2luZ1NldFNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgV29ya2luZ1NldFNlYXJjaFNjb3BlKElBZGFwdGFibGVbXSBlbGVtZW50cykKLQl7Ci0JCXN1cGVyKCk7Ci0JCWFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KGVsZW1lbnRzKTsKLQl9Ci0JCi0JLyoqCi0JICogSW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIGFuIElXb3JraW5nU2V0Ci0JICogPGJyPgotCSAqIEZvciBleGFtcGxlOgotCSAqIDxwcmU+Ci0JICogV29ya2luZ1NldFNlYXJjaFNjb3BlIHNjb3BlID0gLi47IAotCSAqIC4uLgotCSAqIElXb3JraW5nU2V0IGFub3RoZXJXb3JraW5nU2V0OyAKLQkgKiBJQWRhcHRhYmxlW10gZWxlbWVudHMgPSBhbm90aGVyV29ya2luZ1NldC5nZXRFbGVtZW50cygpOwotCSAqIHNjb3BlLmFkZEFXb3JraW5nU2V0VG9TY29wZShlbGVtZW50cyk7Ci0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQVdvcmtpbmdTZXRUb1Njb3BlKElBZGFwdGFibGVbXSBlbGVtZW50cyl7Ci0JCWFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KElBZGFwdGFibGVbXSBlbGVtZW50cyl7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudHNbal0uZ2V0QWRhcHRlcihJQ29udGFpbmVyLmNsYXNzKTsKLQkJCWlmICggY29udGFpbmVyICE9IG51bGwgKXsKLQkJCQl0cmF2ZXJzZUNvbnRhaW5lcihjb250YWluZXIpOwotCQkJfQotCQkJZWxzZXsKLQkJCQlJRmlsZSBhRmlsZSA9IChJRmlsZSkgZWxlbWVudHNbal0uZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQkJaWYgKCBhRmlsZSAhPSBudWxsKQotCQkJCQlhY2NlcHRGaWxlKGFGaWxlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3Jrc3BhY2VTZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtzcGFjZVNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMWMyMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtzcGFjZVNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZVNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQlwcm90ZWN0ZWQgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY29wZSB0aGF0IGVjbG9zZXMgd29ya3NwYWNlIHBhdGggYW5kIGVjbG9zaW5nIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCAtCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLCBlLmcuCi0JICogICAgICAgICAgICAvTXlQcm9qZWN0L015RmlsZS54bWwKLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlU2VhcmNoU2NvcGUoKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpCi0JewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJdHJhdmVyc2VDb250YWluZXIocm9vdCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC91dGlsL0NvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC91dGlsL0NvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyN2Y5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvdXRpbC9Db2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogQ29sbGVjdHMgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkgYSA8Y29kZT5JU2VhcmNoRW5naW5lPC9jb2RlPi4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotLy8gaXNzdWUgc2hvdWxkIHlvdSBtb3ZlIHRoaXMgdG8gYSB1dGlsIHBhY2thZ2U/IHdoYXQgZG9lcyBqZHQgZG8/Ci1wdWJsaWMgY2xhc3MgQ29sbGVjdGluZ1NlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvcgotewotCXByaXZhdGUgQXJyYXlMaXN0IGZGb3VuZDsKLQotCXB1YmxpYyBDb2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yKCkKLQl7Ci0JCWZGb3VuZCA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiB7QGxpbmsgU2VhcmNoTWF0Y2h9ZXMgKG5vdCBzb3J0ZWQpCi0JICovCi0JcHVibGljIExpc3QvKiA8U2VhcmNoTWF0Y2g+ICovZ2V0UmVzdWx0cygpCi0JewotCQlyZXR1cm4gZkZvdW5kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5wcm92aXNpb25hbC5TZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2gob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zZWFyY2guaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VhcmNoTWF0Y2gpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmRm91bmQuYWRkKG1hdGNoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmM2UyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBDbGFzcyB0byByZWFkIGEgcmVnaXN0cnkuIEl0IGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBzcGVjaWZpYyBmdW5jdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVNX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qZW0udXRpbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgcGx1Z2luSWQ7Ci0KLQlTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZDsKLQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZSBzeXN0ZW1CdW5kbGU7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHBsdWdpbiBpZCBvZiBhIGNvbmZpZ3VhdGlvbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb25FbGVtZW50Ci0JICogQHJldHVybiBwbHVnaW4gaWQgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IG51bGw7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0KLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkKLQkJCQlwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVnaXN0cnlSZWFkZXIgdGFraW5nIGEgcmVnaXN0cnksIHBsdWdpbiBpZCwgYW5kIGV4dGVuc2lvbiBwb2ludCBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiBAcGFyYW0gcGx1Z2luSUQKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2UgUmVnaXN0cnlSZWFkZXIocGx1Z2luLCBleHRlbnNpb25Qb2ludCkgaW5zdGVhZC4gVGhlIHJlZ2lzdHJ5IHBhc3NlZCBpbiBpcyBpZ25vcmVkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcihJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBwbHVnaW5JRCwgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRoaXMocGx1Z2luSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVnaXN0cnlSZWFkZXIgdGFraW5nIHRoZSBwbHVnaW4gaWQgYW5kIGV4dGVuc2lvbiBwb2ludCBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luSUQKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnlSZWFkZXIoU3RyaW5nIHBsdWdpbklELCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklEOwotCQlleHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiByZWNvZ25pemVkID0gdGhpcy5yZWFkRWxlbWVudChlbGVtZW50KTsKLQkJaWYgKCFyZWNvZ25pemVkKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiRXJyb3IgcHJvY2Vzc2luZyBleHRlbnNpb246ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBMb2dzIHRoZSBlcnJvciBpbiB0aGUgZGVza3RvcCBsb2cgdXNpbmcgdGhlIHByb3ZpZGVkIHRleHQgYW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJU2VhcmNoUGx1Z2luLmxvZ0Vycm9yKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlJlcXVpcmVkIGF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZU5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZWFkIGVsZW1lbnQgYXR0cmlidXRlcy4gSWYgdGhpcyBlbGVtZW50IGhhcyBzdWJlbGVtZW50cywgdGhlIHJlYWRlciB3aWxsIHJlY3Vyc2l2ZWx5IGN5Y2xlIHRocm91Z2ggdGhlbSBhbmQgY2FsbCB0aGlzCi0JICogbWV0aG9kIHNvIGRvbid0IGRvIGl0IGhlcmUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogUmVhZCB0aGUgZXh0ZW5zaW9uIHBvaW50IGFuZCBwYXJzZSBpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkKLQkJewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnRlcm5hbFJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQkvLyB0aGUgZm9sbG93aW5nIGNvZGUgaXMgdG8gaGFuZGxlIHRoZSBjb250cmlidXRpb25zIHRvIHRoZSBkZXByZWNhdGVkIG9yZy5lY2xpcHNlLmplbS51dGlsIGV4dGVuc2lvbnMKLQkJaWYgKCFKRU1fUExVR0lOX0lELmVxdWFscyhwbHVnaW5JZCkpCi0JCXsKLQkJCXBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChKRU1fUExVR0lOX0lELCBleHRlbnNpb25Qb2ludElkKTsKLQkJCWlmIChwb2ludCAhPSBudWxsKQotCQkJewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnRlcm5hbFJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0byBzZWUgaWYgaXQgaXMgdmFsaWQgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4gQSB2YWxpZCByZWFzb24gbm90IHRvIHdvdWxkIGJlIHRoYXQgdGhlIHdvcmtzcGFjZSBpcwotCSAqIHNodXR0aW5nIGRvbncuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIHZhbGlkIHBvaW50IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoUGxhdGZvcm0uaXNSdW5uaW5nKCkgJiYgZ2V0U3lzdGVtQnVuZGxlKCkuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuU1RPUFBJTkcpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3lzdGVtIGJ1bmRsZQotCSAqIAotCSAqIEByZXR1cm4gc3lzdGVtIGJ1bmRsZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1bmRsZSBnZXRTeXN0ZW1CdW5kbGUoKSB7Ci0JCWlmIChzeXN0ZW1CdW5kbGUgPT0gbnVsbCkKLQkJCXN5c3RlbUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uub3NnaSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzeXN0ZW1CdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvdXRpbC9VSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljMGJiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQbHVnaW47Ci0KLQotLyoqCi0gKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3IgVUlDb250ZXh0IGRldGVybWluYXRpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDEwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURMRVNTX0NPTlRFWFRfTElURVJBTCA9ICJIZWFkbGVzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfTElURVJBTCA9ICJVSSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURMRVNTX0NPTlRFWFQgPSAxMDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSV9DT05URVhUID0gMTAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNhY2hlZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGN1cnJlbnRDb250ZXh0ID0gVU5LTk9XTjsKLQotCS8qKgotCSAqIERvIG5vdCB1c2UtIHRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBzaG91bGQgYmUgYWNjZXNzZWQgdmlhIGl0cyBzdGF0aWMgbWV0aG9kcyBvbmx5LgotCSAqLwotCXByb3RlY3RlZCBVSUNvbnRleHREZXRlcm1pbmF0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiBjbGFzcyBiYXNlZCBvbiB0aGUgVUkgb3IgSGVhZGxlc3MgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiBuZXcgY2xhc3MgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBrZXkuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUga2V5IGlzIGludmFsaWQgKGUuZy4gbm8gZXh0ZW5zaW9uIGlzIGZvdW5kIGZvciB0aGUga2V5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUluc3RhbmNlKFN0cmluZyBrZXkpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjYWNoZWRFeHRlbnNpb25zID09IG51bGwpCi0JCQlpbml0RXh0ZW5zaW9ucygpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29udGV4dFNlbnNpdGl2ZUNsYXNzID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgY2FjaGVkRXh0ZW5zaW9ucy5nZXQoa2V5KTsKLQkJdHJ5IHsKLQkJCWlmIChjb250ZXh0U2Vuc2l0aXZlQ2xhc3MgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlci5VSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NMQVNTTkFNRV9BVFRSKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTZWFyY2hQbHVnaW4ubG9nRXJyb3IoIlByb2JsZW0gbG9hZGluZyBleHRlbnNpb24gbm90IGZvdW5kIGZvciBrZXkgXCIiICsga2V5ICsgIlwiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVNlYXJjaFBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlTZWFyY2hQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbiBub3QgZm91bmQgZm9yIGtleSBcIiIgKyBrZXkgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udGV4dCAtLSBkZXRlcm1pbmVzIHRoZSB2YWx1ZSBpZiBuZWNlc3NhcnkuCi0JICogCi0JICogQHJldHVybiBjdXJyZW50IGNvbnRleHQKLQkgKiBAc2VlICNIRUFETEVTU19DT05URVhUCi0JICogQHNlZSAjVUlfQ09OVEVYVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEN1cnJlbnRDb250ZXh0KCkgewotCQlpZiAoY3VycmVudENvbnRleHQgPT0gVU5LTk9XTikgewotCQkJY3VycmVudENvbnRleHQgPSBIRUFETEVTU19DT05URVhUOwotCQkJbmV3IFVJVGVzdGVyUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudENvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiBJbnZva2VzIHRoZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIgdG8gY2FjaGUgYWxsIG9mIHRoZSBleHRlbnNpb25zLCBpZiBuZWNlc3NhcnkuCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChjYWNoZWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCWNhY2hlZEV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbmV3IFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gb25lIG9mIFVJX0NPTlRFWFQgb3IgSEVBRExFU1NfQ09OVEVYVC4gRGVmYXVsdHMgdG8gSEVBRExFU1Mgb24gaW52YWxpZCBpbnB1dAotCSAqIAotCSAqIEBwYXJhbSBsaXRlcmFsIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgY29udmVydExpdGVyYWwoU3RyaW5nIGxpdGVyYWwpIHsKLQkJcmV0dXJuIChVSV9DT05URVhUX0xJVEVSQUwuZXF1YWxzKGxpdGVyYWwpKSA/IFVJX0NPTlRFWFQgOiBIRUFETEVTU19DT05URVhUOwotCX0KLQotCS8qCi0JICogUmVhZHMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBVSSBDb250ZXh0LXNlbnNpdGl2ZSBjbGFzcyBleHRlbnNpb25zIGFuZCBpbml0aWFsaXplcyB0aGUgY2FjaGUgb2YgdGhlIFVJQ29udGV4dERldGVybWluYXRpb24gb2JqZWN0LgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0VMRU1FTlQgPSAidWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19LRVlfQVRUUiA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DTEFTU05BTUVfQVRUUiA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DT05URVhUX0FUVFIgPSAiY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgVUlDb250ZXh0RGV0ZXJtaW5hdGlvblJlZ2lzdHJ5UmVhZGVyKCkgewotCQkJc3VwZXIoU2VhcmNoUGx1Z2luLlBMVUdJTl9JRCwgU2VhcmNoUGx1Z2luLlVJX0NPTlRFWFRfRVhURU5TSU9OX1BPSU5UKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0VMRU1FTlQpKSB7Ci0KLQkJCQlTdHJpbmcga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19LRVlfQVRUUik7Ci0JCQkJU3RyaW5nIGNvbnRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NPTlRFWFRfQVRUUik7Ci0KLQkJCQlpZiAoIWNhY2hlZEV4dGVuc2lvbnMuY29udGFpbnNLZXkoa2V5KSB8fCBnZXRDdXJyZW50Q29udGV4dCgpID09IGNvbnZlcnRMaXRlcmFsKGNvbnRleHQpKQotCQkJCQljYWNoZWRFeHRlbnNpb25zLnB1dChrZXksIGVsZW1lbnQpOwotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZWFkcyB0aGUgdWlUZXN0ZXIgZXh0ZW5zaW9uIGFuZCBpbnN0YW50aWF0ZSB0aGUgYW55IG9mIHRoZSBVSVRlc3RlciBjbGFzc2VzIGl0IGZpbmRzLgotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQgaWYgbXVsdGlwbGUgVUlUZXN0ZXJzIGFyZSByZWdpc3RlcmVkLCBhbnkgb2YgdGhlbSBjYW4gdHJpcCB0aGUgY3VycmVudENvbnRleHQgaW50byB0aGUgVUlfQ09OVEVYVAotCSAqIHN0YXRlLgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFVJVGVzdGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0VMRU1FTlQgPSAidWlUZXN0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0NMQVNTTkFNRV9BVFRSID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgVUlUZXN0ZXJSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKFNlYXJjaFBsdWdpbi5QTFVHSU5fSUQsIFNlYXJjaFBsdWdpbi5VSV9URVNURVJfRVhURU5TSU9OX1BPSU5UKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFVJX1RFU1RFUl9FTEVNRU5UKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gRG9uJ3QgYm90aGVyIHJ1bm5pbmcgdGVzdGVyIGl0IGlmIHdlIGFscmVhZHkgcHJvY2Vzc2VkIG9uZSBleHRlbnNpb24gdGhhdCByZXR1cm5lZCB0cnVlLgotCQkJCQlpZiAoY3VycmVudENvbnRleHQgIT0gVUlfQ09OVEVYVCAmJiBjYW5DcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQpKSB7Ci0JCQkJCQlVSVRlc3RlciB0ZXN0ZXIgPSAoVUlUZXN0ZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihVSV9URVNURVJfQ0xBU1NOQU1FX0FUVFIpOwotCQkJCQkJaWYgKHRlc3Rlci5pc0N1cnJlbnRDb250ZXh0VUkoKSkKLQkJCQkJCQljdXJyZW50Q29udGV4dCA9IFVJX0NPTlRFWFQ7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJCQlTZWFyY2hQbHVnaW4ubG9nV2FybmluZygiVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiBpcyBwcm9jZWVkaW5nIGluIEhFQURMRVNTIG1vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCQlzdXBlci5yZWFkUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLmplbS51dGlsIiwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gcmVjb2duaXplZCA9IHRoaXMucmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCWlmICghcmVjb2duaXplZCkgewotCQkJCQlsb2dFcnJvcihlbGVtZW50c1tpXSwgIkVycm9yIHByb2Nlc3NpbmcgZXh0ZW5zaW9uOiAiICsgZWxlbWVudHNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvdXRpbC9VSVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvdXRpbC9VSVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhlZDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3V0aWwvVUlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWw7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBVSVRlc3Rlci4gVGhlICJjbGFzc25hbWUiIGF0dHJpYnV0ZSBvbiB0aGUgInVpVGVzdGVyIiBleHRlbnNpb24gcG9pbnQgc2hvdWxkIGltcGxlbWVudCB0aGlzIGNsYXNzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBVSVRlc3RlciB7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBhbiBVSSBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gVUkgY29udGV4dC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnRDb250ZXh0VUkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyYTc4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3dHBlbWYvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id29ya2JlbmNoLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ1OGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1ydW50aW1lCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZl8xLjAuMC56aXAKLXNyYy56aXAKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjVmMGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk2YzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotI1dlZCBKdW4gMjQgMTA6MTM6MTYgRURUIDIwMDkKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZVVuY2hlY2tlZEV4Y2VwdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGRlODRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMSwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM3Y2ZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHd0cGVtZi8sXAotICAgICAgICAgICB3b3JrYmVuY2gvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzBkMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzgzZDA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QYWNrYWdlVVJJTWFwPVBhY2thZ2VVUklNYXAKLXBsdWdpbk5hbWU9RU1GIFV0aWxpdGllcwotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYzEzYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icGFja2FnZVVSSU1hcCIgbmFtZT0iJVBhY2thZ2VVUklNYXAiIHNjaGVtYT0ic2NoZW1hL3BhY2thZ2VVUklNYXAuZXhzZCIvPgotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0cmFuc2xhdG9yRXh0ZW5zaW9uIiBuYW1lPSJ0cmFuc2xhdG9yRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QiLz4KLQotPCEtLSBOZWVkIHRvIHJlZ2lzdGVyIHRoZSBFY29yZSBzcGVjaWZpYyBwYWNrYWdlIG1hcHBpbmdzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLnBhY2thZ2VVUklNYXAiPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgICAgICAgICAgcHJlZml4PSJlY29yZSI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9NYXBwaW5nIgotICAgICAgICAgICAgcHJlZml4PSJtYXBwaW5nIj4KLSAgICAgIDwvbWFwPgotPCEtLSBUcmljayB0byBnZXQgTWFwcGluZy54bWkgZm9yIE1PRjUgc2VyaWFsaXphdGlvbiAtLT4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9NYXBwaW5nIgotICAgICAgICAgICAgcHJlZml4PSJNYXBwaW5nIj4KLSAgICAgIDwvbWFwPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyIKLSAgICAgICAgICAgIGtleT0icmVuZGVyZXJGYWN0b3J5IgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5Ij4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwNzYwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuZW1mIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vd3RwZW1mIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vd3RwZW1mIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjlkOTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3BhY2thZ2VVUklNYXAuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiIGlkPSJwYWNrYWdlVVJJTWFwIiBuYW1lPSIlUGFja2FnZVVSSU1hcCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIHBhY2thZ2UgbWFwcGluZ3MuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hcCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtYXAiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhOTY2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIiBpZD0idHJhbnNsYXRvckV4dGVuc2lvbiIgbmFtZT0idHJhbnNsYXRvckV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGlzIHVzZWQgdG8gY29udHJpYnV0ZSBjaGlsZCB0cmFuc2xhdG9ycyB0byB0aGUgZGVmYXVsdCB0cmFuc2xhdG9ycyBpbiBFTUYyRE9NQWRhcHRlckltcGwuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRyYW5zbGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idHJhbnNsYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBjaGlsZCB0cmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNjkxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci0KLQotCi0vKioKLSAqIFRoZSBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIgaXMgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgbG9hZGluZwotICogb2YgRU1GIHJlc291cmNlcy4gVGhpcyBpcyB0aGUgRWNsaXBzZSB2ZXJzaW9uIG9mIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciwKLSAqIGFuZCB1c2VzIHRoZSBFY2xpcHNlIElMb2NrIHRlY2hub2xvZ3kgdG8gYWNxdWlyZSBhIHNlbWFwaG9yZSB1bnRpbCB0aGUKLSAqIFJlc291cmNlIGlzIGxvYWRlZC4gdGhlIHdhaXRGb3JSZXNvdXJjZVRvTG9hZCgpIG1ldGhvZCB3aWxsIHBhdXNlIHVudGlsCi0gKiBlaXRoZXIgKGEpIHRoZSBSZXNvdXJjZSBoYXMgbG9hZGVkLCB0aGUgQWRhcHRlciBpcyBub3RpZmllZCwgYW5kIHRoZQotICogc2VtYXBob3JlIGlzIHJlbGVhc2VkIG9yIChiKSB0aGUgREVMQVkgdGltZW91dCBpcyBleGNlZWRlZCwgd2hpY2ggcHJldmVudHMKLSAqIGZ1bGwgZGVhZGxvY2suCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyIGV4dGVuZHMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIHsKLQotCXByaXZhdGUgZmluYWwgSUxvY2sgbG9hZGluZ0xvY2s7Ci0KLQkvKioKLQkgKiBUaGUgZGVsYXkgaXMgZGVmYXVsdCB0byA1IG1pbnV0ZXMuIFRoaXMgaXMgdGhlIHVwd2FyZCB0aHJlc2hob2xkLiBUaGUKLQkgKiBsb2NrIHdpbGwgd2FpdCB1cCB0byBERUxBWSBtaWxsaXNlY29uZHMgdG8gYWNxdWlyZSB0aGUgbG9jaywgYW5kIGJhaWwKLQkgKiBpZiBub3QuIEl0IGRvZXMgbm90IG1lYW4gdGhhdCBpdCB3aWxsIHdhaXQgREVMQVkgbWlsbGlzZWNvbmRzIGFsd2F5cy4KLQkgKiBJbiBnZW5lcmFsLCB0aGUgd2FpdCBzaG91bGQgYmUgYWxtb3N0IGluc3RhbnRhbmVvdXMgLS0ganVzdCBhcyBsb25nIGFzCi0JICogZG9jdW1lbnQgbG9hZGluZyByZW1haW5zIHNwZWVkeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMzAwMDAwOwotCi0JcHVibGljIFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlcigpIHsKLQkJbG9hZGluZ0xvY2sgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQkJaWYgKGxvYWRpbmdMb2NrICE9IG51bGwpCi0JCQlsb2FkaW5nTG9jay5hY3F1aXJlKCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI3dhaXRGb3JSZXNvdXJjZVRvTG9hZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd2FpdEZvclJlc291cmNlVG9Mb2FkKCkgewotCi0JCWlmIChsb2FkaW5nTG9jayA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJvb2xlYW4gbG9ja0FjcXVpcmVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCkKLQkJCQlpZiAoIShsb2NrQWNxdWlyZWQgPSBsb2FkaW5nTG9jay5hY3F1aXJlKERFTEFZKSkpCi0JCQkJCWxvZ1dhcm5pbmcoKTsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBqdXN0IGNvbnRpbnVlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobG9ja0FjcXVpcmVkKQotCQkJCWxvYWRpbmdMb2NrLnJlbGVhc2UoKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nV2FybmluZygpIHsKLQkJTm90aWZpZXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIFJlc291cmNlKSkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRhcmdldDsKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJbV0FSTklOR10gQ291bGQgbm90IGFjcXVpcmUgU2VtYXBob3JlIExvY2sgZm9yIFJlc291cmNlOiBcIiIgKyByZXNvdXJjZS5nZXRVUkkoKSArICJcIiBpbiAiICsgZ2V0Q2xhc3MoKSk7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0JCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSAhPSBudWxsKSB7Ci0JCQkvLyBsaXN0ZW4gZm9yIHRoZSByZW1vdmUgb2YgdGhlIGxvYWRpbmcgYWRhcHRlcgotCQkJaWYgKGlzU2V0TG9hZGVkUmVzb3VyY2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSkgewotCQkJCWlmIChsb2FkaW5nTG9jayAhPSBudWxsKQotCQkJCQlsb2FkaW5nTG9jay5yZWxlYXNlKCk7Ci0JCQkJcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI2ZvcmNlUmVsZWFzZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZm9yY2VSZWxlYXNlKCkgewotCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCAmJiBsb2FkaW5nTG9jay5nZXREZXB0aCgpID4gMCkKLQkJCWxvYWRpbmdMb2NrLnJlbGVhc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxYjNiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkgewotCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS53dHAuaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBjcmVhdGVSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSB7IAotICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9FY29yZVV0aWxpdGllc1BsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTk0MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLlJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVjb3JlVXRpbGl0aWVzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL3RoZSBJRCBmb3IgdGhpcyBwbHVnaW4gKGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9nZ2luZyBxdWlja2ZpeCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNMQVRPUl9FWFRFTlNUSU9OX1BPSU5UID0gInRyYW5zbGF0b3JFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBFY29yZVV0aWxpdGllc1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0SGFuZGxlcihQbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5JTlNUQU5DRSk7Ci0JCVBhY2thZ2VVUklNYXBSZWFkZXIgcmVhZGVyID0gbmV3IFBhY2thZ2VVUklNYXBSZWFkZXIoKTsKLQkJcmVhZGVyLnByb2Nlc3NFeHRlbnNpb25zKCk7Ci0JCS8vdXNlIGEgc3luY2hyb25pemVkIGxvYWRpbmcgYWRhcHRlciBmYWN0b3J5Ci0JCVJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UgPSBuZXcgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNldmVyaXR5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggZXhjZXB0aW9uLmdldFN0YXR1cygpICk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGFja2FnZVVSSU1hcFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BhY2thZ2VVUklNYXBSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjMzliMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGFja2FnZVVSSU1hcFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeTsKLQotLyoqCi0gKiBUaGlzIHJlYWRlciB3aWxsIHJlYWQgdGhlIHBhY2thZ2VVUklNYXAgZXh0ZW5zaW9uIHBvaW50IGFuZCBwb3B1bGF0ZSB0aGUKLSAqIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LgotICogCi0gKiBUaGUgcGFja2FnZVVSSU1hcCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0gKiAKLSAqIDxtYXAgcHJlZml4PSJzb21lUGFja2FnZVByZWZpeCIgdXJpPSJzb21lUGFja2FnZVVSSSIvPgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZVVSSU1hcFJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9BVFRfTkFNRSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9BVFRfTkFNRSA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gInBhY2thZ2VVUklNYXAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFBhY2thZ2VVUklNYXBSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KEVjb3JlVXRpbGl0aWVzUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbCB0aGlzIG1ldGhvZCB0byByZWFkIGFuZCBwcm9jZXNzIGFsbCBvZiB0aGUgcGFja2FnZVVSSU1hcCBleHRlbnNpb25zLiAqCi0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc0V4dGVuc2lvbnMoKSB7Ci0JCUNvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IHJlZyA9IENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvblBvaW50KCkuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0JCQlwcm9jZXNzRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0sIHJlZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uLCBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSByZWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlncyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKQotCQkJcHJvY2Vzc0NvbmZpZ3VyYXRpb24oY29uZmlnc1tpXSwgcmVnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29uZmlndXJhdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkgcmVnKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQUkVGSVhfQVRUX05BTUUpOwotCQlTdHJpbmcgdXJpID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVVJJX0FUVF9OQU1FKTsKLQkJcmVnLnJlZ2lzdGVyUHJlZml4VG9QYWNrYWdlVVJJKHByZWZpeCwgdXJpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ5ZGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgZXh0ZW5kcyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgewotCi0Jc3RhdGljIGZpbmFsIFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIElOU1RBTkNFID0gbmV3IFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRfUE9JTlRfTkFNRSA9ICJyZW5kZXJlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLkVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciNnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSB7Ci0JCVJlbmRlcmVyRmFjdG9yeSBhRmFjdG9yeSA9IChSZW5kZXJlckZhY3RvcnkpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoRVhUX1BPSU5UX05BTUUpOwotCQlyZXR1cm4gYUZhY3RvcnkgPT0gbnVsbCA/IHN1cGVyLmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSA6IGFGYWN0b3J5OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQWJzdHJhY3RSZW5kZXJlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmODNiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckltcGwgaW1wbGVtZW50cyBSZW5kZXJlciB7Ci0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBpbnQgdmVyc2lvbklkOwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW5nID0gdHJ1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBYnN0cmFjdFJlbmRlcmVySW1wbC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZW5kZXJlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3NldFJlc291cmNlKFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShUcmFuc2xhdG9yUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJlc291cmNlID0gYVJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNnZXRSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklkKCkgewotCQlyZXR1cm4gdGhpcy52ZXJzaW9uSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklkKGludCB2ZXJzaW9uSWQpIHsKLQkJdGhpcy52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKLQkJcmV0dXJuIHZhbGlkYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgewotCQl2YWxpZGF0aW5nID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjYWNjZXNzRm9yUmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjYWNjZXNzRm9yV3JpdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNpc01vZGlmaWVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2lzU2hhcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNpc1NoYXJlZEZvcldyaXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3ByZURlbGV0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVVbmxvYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVVubG9hZCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcmVsZWFzZUZyb21SZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3JlbGVhc2VGcm9tV3JpdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3NldEJhdGNoTW9kZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VTdHJlYW1zRm9ySU8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQmF0Y2hNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmRlYmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0F0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyIGV4dGVuZHMgVHJhbnNsYXRvckZpbHRlciB7Ci0KLQlwdWJsaWMgQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcigpIHsKLQkJc3VwZXIobnVsbCwgLTEpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKFRyYW5zbGF0b3IgdHJhbnMsIGludCB2ZXJzaW9uKSB7Ci0JCXN1cGVyKHRyYW5zLCB2ZXJzaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IHNjYW5OZXh0VHJhbnNsYXRvcihUcmFuc2xhdG9yW10gY2hpbGRyZW4sIGludCBzdGFydCkgewotCQlpbnQgZm91bmQgPSBzdGFydCArIDE7Ci0JCWZvciAoOyBmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aDsgKytmb3VuZCkgewotCQkJaWYgKGNoaWxkcmVuW2ZvdW5kXS5pc0RPTUF0dHJpYnV0ZSgpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWZvdW5kID0gKGZvdW5kIDwgY2hpbGRyZW4ubGVuZ3RoKSA/IGZvdW5kIDogLTE7Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YWViY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0KLS8qKgotICogQ2FjaGVFdmVudE5vZGVzIChDRU5Pcykgc3RvcmUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gU0FYIEV2ZW50cy4gVGhpcyBpbmZvcm1hdGlvbiBjYW4gdGhlbiBiZQotICogdXNlZCBvbmNlIGFsbCBuZWNlc3NhcnkgU0FYIEV2ZW50cyBoYXZlIGJlZW4gZ2VuZXJhdGVkIHRvIGNyZWF0ZSBhbmQvb3Igc2V0IHZhbHVlcyBvbiBFTUYgbW9kZWwKLSAqIG9iamVjdHMuCi0gKiAKLSAqIENhY2hlRXZlbnROb2RlcyAoQ0VOT3MpIGhhdmUgYSBzaW1wbGUgbGlmZWN5Y2xlOiBpbml0aWFsaXplLCBjb2xsZWN0IGRhdGEsIGNvbW1pdCwgZGlzY2FyZC4gV2hlbgotICogaW5pdGlhbGl6ZWQsIENFTk9zIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2xhdG9yIGZvciBhIGdpdmVuIFhNTCBlbGVtZW50IG5hbWUsCi0gKiBhbmQgYWxzbyBjcmVhdGUvc2V0IGFueSBuZWNlc3NhcnkgRU1GIG1vZGVsIHZhbHVlcy4gRGF0YSBpcyBjb2xsZWN0ZWQgYXMgU0FYIGNoYXJhY3RlcigpIGV2ZW50cwotICogYXJlIGdlbmVyYXRlZC4gT24gdGhlIFNBWCBlbmRFbGVtZW50IGV2ZW50LCB0aGUgQ0VOTyBpcyBjb21taXR0ZWQoKSwgd2hpY2ggaXMgd2hlcmUgaXQgd2lsbAotICogY29tcGxldGUgaXRzIHByb2Nlc3NpbmcgdG8gY3JlYXRlIEVNRiBtb2RlbCBmZWF0dXJlcy4gSW4gdGhvc2UgY2FzZXMgd2hlcmUgaXQgY2Fubm90IGNvbXBsZXRlIGl0cwotICogcHJvY2Vzc2luZywgaXQgd2lsbCBkZWZlciBpdHMgcHJvY2Vzc2luZyB0byB0aGUgdXBkYXRlRU1GKCkgbWV0aG9kIG9mIGl0cyBwYXJlbnQuIERlZmVyZWQKLSAqIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBFTUYgZmVhdHVyZXMgdGhhdCByZXF1aXJlIHJlYWQgYWhlYWQgY3VlcyBmcm9tIHRoZSBYTUwuIENFTk9zCi0gKiB3aWxsIGFkZCB0aGVtc2VsdmVzIHRvIHRoZWlyIHBhcmVudHMgYXMgY2hpbGRyZW4gaW4gYSB0cmVlIGRhdGEgc3RydWN0dXJlLiBXaGVuIGFuIENFTk8KLSAqIGRldGVybWluZXMgaXQgaXMgdGhlIGdvbGRlbiBwaWVjZSBvZiBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpbnN0YW50aWF0ZSBpdHMgcGFyZW50IGZlYXR1cmUsIGl0Ci0gKiB3aWxsIHRyaWdnZXIgaXRzIHBhcmVudCBDRU5PIHRvIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGNhY2hlZCBDRU5PIHRyZWUuIEFzIG1lbnRpb25lZCwgdGhlCi0gKiBidWlsZGluZyBvZiBhIENFTk8gdHJlZSB3aWxsIG9ubHkgb2NjdXIgZm9yIG5vZGVzIHdpdGggcmVhZCBhaGVhZCBjdWVzLgotICogCi0gKiBkaXNjYXJkKCkgaXMgaW52b2tlZCBieSBpbml0KCkgdG8gZW5zdXJlIHRoYXQgbm8ganVuayBzdGF0ZSBpcyBsZWZ0IGZyb20gYSBwcmV2aW91cyB1c2Ugb2YgdGhlCi0gKiBDRU5PLiBjb21taXQoKSB3aWxsIGNhbGwgZGlzY2FyZCBhcyBuZWVkZWQuIEJlY2F1c2Ugb2YgdGhlIHVzZSBvZiBkaXNjYXJkLCBDRU5PcyBjYW4gYmUgcG9vbGVkCi0gKiBhbmQgcmV1c2VkLiBJZiBhIENFTk8gZGV0ZXJtaW5lcyB0aGF0IGl0IGlzIGNvbnRhaW5lZCBpbiBhIHBvb2wsIGl0IHdpbGwgbWFuYWdlIGl0cyBvd24gcmVsZWFzZQotICogZnJvbSB0aGF0IHBvb2wuIFNlbGYtIG1hbmFnZW1lbnQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlIHdheSBpbiB3aGljaCBDRU5PcyBtaWdodCBjYWNoZQotICogY2VydGFpbiBjaGlsZHJlbiB3aGlsZSB3YWl0aW5nIHRvIGNyZWF0ZSB0aGUgcGFyZW50IEVNRiBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENhY2hlRXZlbnROb2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfTk9ERSA9ICJFTUZfUk9PVF9OT0RFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbm9kZU5hbWUgPSBudWxsOwotCXByaXZhdGUgVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbnVsbDsKLQlwcml2YXRlIE5vdGlmaWVyIGVtZk93bmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdmVyc2lvbklEOwotCi0JLyoKLQkgKiBUaGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSB0aGUgYXR0cmlidXRlcyBpcyBhIFN0cmluZ1tdLiBUaGUgY2hvaWNlIHdhcyBtYWRlCi0JICogdG8gdXNlIGFuIGFycmF5IHRvIGF2b2lkIHRoZSBjcmVhdGlvbiBvZiBhbm90aGVyIG9iamVjdCAocHJvYmFibHkgYSBIYXNodGFibGUpIGFuZCB0byBleHBsb2l0Ci0JICogYXJyYXktYWNjZXNzIHRpbWVzIHRvIGdldCB0aGUgbmFtZSBhbmQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZXMgKG9wcG9zZWQgdG8gZnVsbCBmbGVkZ2VkCi0JICogbWV0aG9kIGludm9jYXRpb25zKS4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gbnVsbDsKLQlwcml2YXRlIENhY2hlRXZlbnROb2RlIHBhcmVudCA9IG51bGw7Ci0JcHJpdmF0ZSBDYWNoZUV2ZW50UG9vbCBjb250YWluaW5nUG9vbCA9IG51bGw7Ci0JcHJpdmF0ZSBCb29sZWFuIGlnbm9yYWJsZSA9IG51bGw7Ci0KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUoQ2FjaGVFdmVudFBvb2wgY29udGFpbmluZ1Bvb2wpIHsKLQkJdGhpcy5jb250YWluaW5nUG9vbCA9IGNvbnRhaW5pbmdQb29sOwotCX0KLQotCS8qKgotCSAqIExpZmVjeWNsZSBtZXRob2QuIGluaXQoVHJhbnNsYXRvclJlc291cmNlKSB3aWxsIGNvbmZpZ3VyZSB0aGlzIEFkYXB0ZXIgYXMgYSBST09UIG5vZGUuCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpbnZva2UgZGlzY2FyZCgpIGJlZm9yZSBjb21wbGV0aW5nIGl0cyB0YXNrcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aGlzLmRpc2NhcmQoKTsKLQkJdGhpcy5zZXRFbWZPd25lcihyZXNvdXJjZSk7Ci0JCXRoaXMuc2V0VHJhbnNsYXRvcihyZXNvdXJjZS5nZXRSb290VHJhbnNsYXRvcigpKTsKLQkJdGhpcy5zZXRWZXJzaW9uSUQocmVzb3VyY2UuZ2V0VmVyc2lvbklEKCkpOwotCQl0aGlzLm5vZGVOYW1lID0gQ2FjaGVFdmVudE5vZGUuUk9PVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIExpZmVjeWNsZSBtZXRob2QuIGluaXQoQ2FjaGVFdmVudE5vZGUsIFN0cmluZywgQXR0cmlidXRlcykgd2lsbCBjb25maWd1cmUgdGhpcyBBZGFwdGVyIHRvIGJlCi0JICogYSBub24tUk9PVCBub2RlIG9mIHRoZSBBZGFwdGVyIGRhdGEgc3RydWN0dXJlCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpbnZva2UgZGlzY2FyZCgpIGJlZm9yZSBjb21wbGV0aW5nIGl0cyB0YXNrcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENhY2hlRXZlbnROb2RlIHBhcmVudEFyZywgU3RyaW5nIG5vZGVOYW1lQXJnLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXNBcmcpIHsKLQkJdGhpcy5kaXNjYXJkKCk7Ci0JCXRoaXMubm9kZU5hbWUgPSBub2RlTmFtZUFyZzsKLQkJaW5pdChwYXJlbnRBcmcsIGF0dHJpYnV0ZXNBcmcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KENhY2hlRXZlbnROb2RlIHBhcmVudFJlY29yZCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzQXJnKSB7Ci0JCXNldFBhcmVudChwYXJlbnRSZWNvcmQpOwotCi0JCXNldEF0dHJpYnV0ZXMoYXR0cmlidXRlc0FyZyk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJLyogSSBhbSBub3QgdGhlIHJvb3QgKi8KLQotCQkJLyoKLQkJCSAqIElmIHRoZSBwYXJlbnQgaXMgcGFydCBvZiB0aGUgRE9NIFBhdGgsIHRoZW4gd2UgaWdub3JlIGl0IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBncmFuZAotCQkJICogcGFyZW50Ci0JCQkgKi8KLQkJCWlmIChwYXJlbnQudHJhbnNsYXRvciAhPSBudWxsICYmIHBhcmVudC5pc0luRE9NUGF0aCgpKSB7Ci0JCQkJc2V0UGFyZW50KHBhcmVudC5nZXRQYXJlbnQoKSk7Ci0JCQl9Ci0KLQkJCXNldFZlcnNpb25JRChwYXJlbnQuZ2V0VmVyc2lvbklEKCkpOwotCQkJaWYgKHBhcmVudC5nZXRFbWZPd25lcigpICE9IG51bGwgJiYgcGFyZW50LmdldFRyYW5zbGF0b3IoKSAhPSBudWxsKSB7Ci0KLQkJCQkvKiBNeSBwYXJlbnQgaGFkIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlbXNlbGYgKi8KLQotCQkJCWlmIChwYXJlbnQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJCQlzZXRUcmFuc2xhdG9yKHBhcmVudC5nZXRUcmFuc2xhdG9yKCkuZmluZENoaWxkKG5vZGVOYW1lLCBwYXJlbnQuZ2V0RW1mT3duZXIoKSwgZ2V0VmVyc2lvbklEKCkpKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldFRyYW5zbGF0b3IocGFyZW50LmdldFRyYW5zbGF0b3IoKSk7Ci0JCQkJfQotCi0JCQkJaWYgKHRoaXMudHJhbnNsYXRvciA9PSBudWxsKSB7Ci0JCQkJCS8qIE91ciB0cmFuc2xhdG9yIGlzIG51bGwhIEFoaCEgUnVuISAqLwotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQYXJlbnQgVHJhbnNsYXRvciAoIiArIHBhcmVudC5nZXRUcmFuc2xhdG9yKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSIpIGRpZCBub3QgZmluZCBhIENoaWxkIFRyYW5zbGF0b3IgZm9yIFwiIiArIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCW5vZGVOYW1lICsgIlwiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJaWYgKHRoaXMudHJhbnNsYXRvci5nZXRSZWFkQWhlYWRIZWxwZXIobm9kZU5hbWUpID09IG51bGwgJiYgIXRoaXMudHJhbnNsYXRvci5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEkgZG8gbm90IHJlcXVpcmUgYSByZWFkIGFoZWFkIGN1ZSwgYW5kIEkgYW0gbm90IG1hbmFnZWQgYnkgbXkgcGFyZW50IHNvIEkgY2FuCi0JCQkJCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBteSBFTUYgb2JqZWN0Ci0JCQkJCSAqLwotCi0JCQkJCU5vdGlmaWVyIG15RW1mT3duZXIgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlRU1GT2JqZWN0KGdldE5vZGVOYW1lKCksIG51bGwpOwotCQkJCQlzZXRFbWZPd25lcihteUVtZk93bmVyKTsKLQkJCQkJdGhpcy50cmFuc2xhdG9yLnNldE1PRlZhbHVlKHBhcmVudC5nZXRFbWZPd25lcigpLCBteUVtZk93bmVyKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBFbHNlIEkgcmVxdWlyZSBhIHJlYWQgYWhlYWQgdmFsdWUgb3IgSSBhbSBiZWluZyBtYW5hZ2VkIGJ5IG15IHBhcmVudCwgc28gSSBoYXZlCi0JCQkJICogbm8gbmVlZCB0byBjcmVhdGUgYW4gRU1GIG9iamVjdAotCQkJCSAqLwotCQkJfQotCQkJLyoKLQkJCSAqIEVsc2UgSSBhbSBub3QgbWFwcGVkIHRvIHRoZSBFTUYgc3RhY2sgKFhNTCBFbGVtZW50cyBmb3VuZCBpbiB0aGUgRE9NUGF0aCBhcmUgaWdub3JlZCkKLQkJCSAqLwotCQl9Ci0JCS8qIHByb2Nlc3NBdHRyaWJ1dGVzIGlzIGd1YXJkZWQgYW5kIHdpbGwgbm90IGV4ZWN1dGUgdW5sZXNzIHJlYWR5ICovCi0JCXByb2Nlc3NBdHRyaWJ1dGVzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBjb21taXQoKSBpcyBpbnZva2VkIG9ubHkgaWYgdGhlIENhY2hlRXZlbnROb2RlIChDRU5PKSBoYXMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0aGV5IG5lZWQgYW5kCi0JICogc2hvdWxkIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gZG8gdG8gdGhlIEVNRiBmZWF0dXJlLgotCSAqIAotCSAqIFRoZSBjb21taXQoKSBtZXRob2Qgd2lsbCBpbnZva2UgZGlzY2FyZCgpIHdoZW4gaXQgaGFzIGNvbXBsZXRlZCBpdHMgdGFza3MsIGlmIG5lZWRlZC4gVGh1cywKLQkgKiBhZnRlciBpbnZva2luZyB0aGlzIG1ldGhvZCwgdGhlIENFTk8gbWF5IGhhdmUgbm8gbWVhbmluZ2Z1bCBzdGF0ZS4gSWYgZGlzY2FyZCgpIGlzIGludm9rZWQsCi0JICogYWxsIHByZXZpb3VzbHkgaGVsZCByZWZlcmVuY2Ugd2lsbCBiZSByZWxlYXNlZCBpbiBvcmRlciB0byBiZSBtYWRlIGVsaWdpYmxlIGZvciBHYXJiYWdlCi0JICogQ29sbGVjdGlvbi4KLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCi0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCB0aGlzLmlzSWdub3JhYmxlKCkpIHsKLQkJCWRpc2NhcmQoKTsKLQkJCXJlbGVhc2VGcm9tQ29udGFpbmluZ1Bvb2woKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVJlYWRBaGVhZEhlbHBlciBoZWxwZXIgPSBudWxsOwotCQlUcmFuc2xhdG9yIGFjdGl2ZVRyYW5zbGF0b3IgPSBnZXRUcmFuc2xhdG9yKCk7Ci0JCVRyYW5zbGF0b3IgcGFyZW50VHJhbnNsYXRvciA9IGdldFBhcmVudCgpLmdldFRyYW5zbGF0b3IoKTsKLQotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldEVtZk93bmVyKCkgPT0gbnVsbCkgewotCi0JCQkvKgotCQkJICogTm90IGVub3VnaCBpbmZvcm1hdGlvbiB5ZXQsIGFkZCB0aGUgQ2FjaGVFdmVudE5vZGUgdG8gdGhlIERPTSBDYWNoZSB0cmVlCi0JCQkgKi8KLQotCQkJcGFyZW50LmFwcGVuZFRvQnVmZmVyKHRoaXMpOwotCQkJaWYgKChoZWxwZXIgPSBnZXRQYXJlbnQoKS5nZXRSZWFkQWhlYWRIZWxwZXIoKSkgIT0gbnVsbCkgewotCQkJCS8qCi0JCQkJICogSWYgdGhlIHBhcmVudFJlY29yZCdzIGVtZk93bmVyIGlzIG51bGwsIHRoZW4gaXQgbXVzdCBub3QgYmUgaW5pdGlhbGl6ZWQgdGhlcmVmb3JlCi0JCQkJICogaXQgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMgbXVzdCByZXF1aXJlIHJlYWQgYWhlYWQgY2x1ZXMKLQkJCQkgKiAKLQkJCQkgKiBUaGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBjaGVja3MgaWYgdGhlIHBhcmVudCBpcyB0aGUgbm9kZSB3YWl0aW5nIGZvciBhCi0JCQkJICogcmVhZEFoZWFkIGN1ZQotCQkJCSAqLwotCQkJCUVPYmplY3QgcGFyZW50T3duZXIgPSBudWxsOwotCQkJCWlmIChoZWxwZXIubm9kZVZhbHVlSXNSZWFkQWhlYWROYW1lKGdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCS8qIFRoZSByZWFkQWhlYWROYW1lIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcU5hbWUgY2hpbGQgbm9kZSAqLwotCi0JCQkJCS8qIFdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgRW1mT3duZXIgaW4gdGhlIHBhcmVudCEgKi8KLQkJCQkJcGFyZW50T3duZXIgPSBwYXJlbnRUcmFuc2xhdG9yLmNyZWF0ZUVNRk9iamVjdChnZXRQYXJlbnQoKS5nZXROb2RlTmFtZSgpLCBnZXRCdWZmZXIoKSk7Ci0KLQkJCQkJLyoKLQkJCQkJICogTm93IHdlIG5lZWQgdG8gcGFyc2UgdGhlIGNhY2hlZCBET00gdHJlZSBhbmQgdXBkYXRlIHRoZSBlbWZPd25lciBvZiB0aGUKLQkJCQkJICogcGFyZW50Ci0JCQkJCSAqLwotCQkJCQlnZXRQYXJlbnQoKS51cGRhdGVFTUYocGFyZW50T3duZXIpOwotCi0JCQkJfSBlbHNlIGlmIChoZWxwZXIubm9kZU5hbWVJc1JlYWRBaGVhZE5hbWUoZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJLyogVGhlIHJlYWRBaGVhZE5hbWUgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBjaGlsZCBub2RlIChxTmFtZSkgKi8KLQotCQkJCQkvKiBXZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIEVtZk93bmVyIGluIHRoZSBwYXJlbnQhICovCi0JCQkJCXBhcmVudE93bmVyID0gcGFyZW50VHJhbnNsYXRvci5jcmVhdGVFTUZPYmplY3QoZ2V0UGFyZW50KCkuZ2V0Tm9kZU5hbWUoKSwgZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJCQkJLyoKLQkJCQkJICogTm93IHdlIG5lZWQgdG8gcGFyc2UgdGhlIGNhY2hlZCBET00gdHJlZSBhbmQgdXBkYXRlIHRoZSBlbWZPd25lciBvZiB0aGUKLQkJCQkJICogcGFyZW50Ci0JCQkJCSAqLwotCQkJCQlnZXRQYXJlbnQoKS51cGRhdGVFTUYocGFyZW50T3duZXIpOwotCQkJCX0KLQotCQkJfSAvKiBFbHNlIGFuIGFuY2VzdG9yIG9mIHRoZSBwYXJlbnQgaXMgd2FpdGluZyAqLwotCi0JCX0gZWxzZSB7Ci0JCQlpZiAoYWN0aXZlVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkJaWYgKGFjdGl2ZVRyYW5zbGF0b3IuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCi0JCQkJCU9iamVjdCB2YWx1ZSA9IGFjdGl2ZVRyYW5zbGF0b3IuY29udmVydFN0cmluZ1RvVmFsdWUoZ2V0Tm9kZU5hbWUoKSwgbnVsbCwgZ2V0QnVmZmVyKCksIGdldFBhcmVudCgpLmdldEVtZk93bmVyKCkpOwotCQkJCQlhY3RpdmVUcmFuc2xhdG9yLnNldE1PRlZhbHVlKGdldFBhcmVudCgpLmdldEVtZk93bmVyKCksIHZhbHVlKTsKLQkJCQkJcHJvY2Vzc0F0dHJpYnV0ZXMoKTsKLQkJCQl9IGVsc2UgewotCi0JCQkJCWFjdGl2ZVRyYW5zbGF0b3Iuc2V0VGV4dFZhbHVlSWZOZWNlc3NhcnkoZ2V0QnVmZmVyKCksIGdldEVtZk93bmVyKCksIGdldFZlcnNpb25JRCgpKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWRpc2NhcmQoKTsKLQkJCXJlbGVhc2VGcm9tQ29udGFpbmluZ1Bvb2woKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc3RydWN0IHRoZSBDYWNoZUV2ZW50Tm9kZSB0byBkaXNjYXJkIGFsbCByZWZlcmVuY2VzIHRvIG1ha2UgZXZlcnl0aGluZyBlbGlnaWJsZSBmb3IgZ2FyYmFnZQotCSAqIGNvbGxlY3Rpb24uIFRoaXMgc2hvdWxkIE9OTFkgYmUgY2FsbGVkIGFmdGVyIGNvbW1pdCBoYXMgc3VjY2VlZGVkLiBJbiB0aGUgY2FzZSBvZiBFTUYKLQkgKiBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgYSByZWFkQWhlYWROYW1lLCBwcm9jZXNzIG5vdCBiZSBjb21wbGV0ZWQgaW4gY29tbWl0KCksIGJ1dCByYXRoZXIgd2lsbAotCSAqIGJlIGRlZmVyZWQgdG8gdGhlIHVwZGF0ZUVNRigpIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2FzIG1hZGUgcHJpdmF0ZSBzcGVjaWZpY2FsbHkgYmVjYXVzZSBpdAotCSAqIGNvdWxkIGVyYXNlIGFsbCBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIENhY2hlRXZlbnROb2RlIGJlZm9yZSBpdCBoYXMgYmVlbiBwcm9jZXNzZWQuCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNjYXJkKCkgewotCQl0cmFuc2xhdG9yID0gbnVsbDsKLQkJZW1mT3duZXIgPSBudWxsOwotCQlidWZmZXIgPSBudWxsOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCWNoaWxkcmVuID0gbnVsbDsKLQkJYXR0cmlidXRlcyA9IG51bGw7Ci0JCXBhcmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbGVhc2VGcm9tQ29udGFpbmluZ1Bvb2woKSB7Ci0JCWlmIChjb250YWluaW5nUG9vbCAhPSBudWxsKQotCQkJY29udGFpbmluZ1Bvb2wucmVsZWFzZU5vZGUodGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoKSB7Ci0JCWlmIChpZ25vcmFibGUgPT0gbnVsbCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmICh0aGlzLnRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJCWlmICh0aGlzLnRyYW5zbGF0b3IuaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBkb21QYXRoID0gdGhpcy50cmFuc2xhdG9yLmdldERPTVBhdGgoKTsKLQkJCQkJcmVzdWx0ID0gKGRvbVBhdGggIT0gbnVsbCkgPyBkb21QYXRoLmluZGV4T2YodGhpcy5ub2RlTmFtZSkgPj0gMCA6IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlnbm9yYWJsZSA9IHJlc3VsdCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIGlnbm9yYWJsZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gY2hpbGQgaGFzIGEgdHJhbnNsYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGROb2RlTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgWE1MIGNoaWxkIG5vZGUKLQkgKiBAcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY2hpbGROb2RlTmFtZSBjYW4gYmUgaWdub3JlZCAoZS5nLiBpdCBpcyBwYXJ0IG9mIHRoZSBET00gUGF0aCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkSWdub3JhYmxlKFN0cmluZyBjaGlsZE5vZGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJVHJhbnNsYXRvciBjaGlsZFRyYW5zbGF0b3IgPSBudWxsOwotCQlpZiAodGhpcy5nZXRUcmFuc2xhdG9yKCkgIT0gbnVsbCkgewotCQkJY2hpbGRUcmFuc2xhdG9yID0gdGhpcy5nZXRUcmFuc2xhdG9yKCkuZmluZENoaWxkKGNoaWxkTm9kZU5hbWUsIHRoaXMuZ2V0RW1mT3duZXIoKSwgdGhpcy5nZXRWZXJzaW9uSUQoKSk7Ci0KLQkJCWlmIChjaGlsZFRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZFRyYW5zbGF0b3IuaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyB0ZW1wID0gbnVsbDsKLQkJCQkJcmVzdWx0ID0gKCh0ZW1wID0gY2hpbGRUcmFuc2xhdG9yLmdldERPTVBhdGgoKSkgIT0gbnVsbCkgPyB0ZW1wLmluZGV4T2YoY2hpbGROb2RlTmFtZSkgPj0gMCA6IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbkRPTVBhdGgoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKHRoaXMuZ2V0VHJhbnNsYXRvcigpICE9IG51bGwpIHsKLQotCQkJcmVzdWx0ID0gdGhpcy5nZXROb2RlTmFtZSgpLmVxdWFscyh0aGlzLmdldFRyYW5zbGF0b3IoKS5nZXRET01QYXRoKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigiQ2FjaGVFdmVudE5vZGVbIik7Ly8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKCJub2RlTmFtZT0iKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQobm9kZU5hbWUpOwotCQlvdXRwdXQuYXBwZW5kKCI7IHRyYW5zbGF0b3I9Iik7Ly8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKHRyYW5zbGF0b3IpOwotCQlvdXRwdXQuYXBwZW5kKCI7IGVtZk93bmVyPSIpOy8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCW91dHB1dC5hcHBlbmQoZW1mT3duZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlvdXRwdXQuYXBwZW5kKCJDb3VsZCBub3QgcmVuZGVyIGFzIHN0cmluZyEiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJb3V0cHV0LmFwcGVuZCgiOyBidWZmZXI9Iik7Ly8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKHRoaXMuYnVmZmVyKTsKLQkJb3V0cHV0LmFwcGVuZCgiOyBoYXNDaGlsZHJlbj0iKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQoKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJb3V0cHV0LmFwcGVuZCgiXG5cdGNoaWxkcmVuKCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlvdXRwdXQuYXBwZW5kKGkpOwotCQkJCW91dHB1dC5hcHBlbmQoIik6ICIpOy8vJE5PTi1OTFMtMSQKLQkJCQlvdXRwdXQuYXBwZW5kKHRoaXMuY2hpbGRyZW4uZ2V0KGkpKTsKLQkJCX0KLQkJfQotCQlvdXRwdXQuYXBwZW5kKCJdIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgRU1GIG1vZGVsIGJ5IGNyZWF0aW5nIEVNRiBGZWF0dXJlcyBhcyBuZWNlc3NhcnkgZnJvbSB0aGUgRE9NIFRyZWUgQ2FjaGUKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVFTUYoRU9iamVjdCBvd25lcikgewotCQl0aGlzLnNldEVtZk93bmVyKG93bmVyKTsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMudHJhbnNsYXRvci5zZXRNT0ZWYWx1ZSgoRU9iamVjdCkgdGhpcy5wYXJlbnQuZ2V0RW1mT3duZXIoKSwgb3duZXIpOwotCQkJdGhpcy5wcm9jZXNzQXR0cmlidXRlcygpOwotCQl9Ci0KLQkJdGhpcy51cGRhdGVFTUYoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHJhbnNsYXRvciBhbmQgdGhlIG93bmVyIG9mIHRoZSBwYXJlbnQgQ0VOTyBwYXNzZWQgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG5vbm51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVFTUYoKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ2FjaGVFdmVudE5vZGUgY2hpbGQgPSBudWxsOwotCQlUcmFuc2xhdG9yIGNoaWxkVHJhbnNsYXRvciA9IG51bGw7Ci0JCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCWlmICh0aGlzLmdldEVtZk93bmVyKCkgIT0gbnVsbCkgewotCQkJTm90aWZpZXIgcGFyZW50T3duZXIgPSB0aGlzLmdldEVtZk93bmVyKCk7Ci0JCQlUcmFuc2xhdG9yIHBhcmVudFRyYW5zbGF0b3IgPSB0aGlzLmdldFRyYW5zbGF0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5zaXplKCk7IGkrKykgewotCi0JCQkJY2hpbGQgPSAoQ2FjaGVFdmVudE5vZGUpIHRoaXMuY2hpbGRyZW4uZ2V0KGkpOyAvKiBDcmVhdGUgdGhlIEVNRiBmZWF0dXJlICovCi0JCQkJaWYgKHRoaXMuaXNDaGlsZElnbm9yYWJsZShjaGlsZC5nZXROb2RlTmFtZSgpKSkgewotCQkJCQl0aGlzLmFkZENoaWxkcmVuKGNoaWxkLmdldENoaWxkcmVuKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoaWxkVHJhbnNsYXRvciA9IHBhcmVudFRyYW5zbGF0b3IuZmluZENoaWxkKGNoaWxkLmdldE5vZGVOYW1lKCksIHBhcmVudE93bmVyLCBjaGlsZC5nZXRWZXJzaW9uSUQoKSk7Ci0JCQkJCWNoaWxkLnNldFRyYW5zbGF0b3IoY2hpbGRUcmFuc2xhdG9yKTsKLQotCQkJCQl2YWx1ZSA9IGNoaWxkVHJhbnNsYXRvci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShjaGlsZC5nZXROb2RlTmFtZSgpLCBudWxsLCBjaGlsZC5nZXRCdWZmZXIoKSwgcGFyZW50T3duZXIpOwotCQkJCQljaGlsZFRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUocGFyZW50T3duZXIsIHZhbHVlKTsKLQotCQkJCQlpZiAoY2hpbGRUcmFuc2xhdG9yLmlzT2JqZWN0TWFwKCkpIHsKLQkJCQkJCWNoaWxkLnNldEVtZk93bmVyKChOb3RpZmllcikgdmFsdWUpOwotCQkJCQkJY2hpbGRUcmFuc2xhdG9yLnNldFRleHRWYWx1ZUlmTmVjZXNzYXJ5KGNoaWxkLmdldEJ1ZmZlcigpLCBjaGlsZC5nZXRFbWZPd25lcigpLCBnZXRWZXJzaW9uSUQoKSk7Ci0JCQkJCX0KLQotCQkJCQljaGlsZC5wcm9jZXNzQXR0cmlidXRlcygpOwotCQkJCQljaGlsZC51cGRhdGVFTUYoKTsgLyogdXBkYXRlIHRoZSBFTUYgb2YgdGhlIGNoaWxkICovCi0KLQkJCQl9Ci0JCQkJY2hpbGQuZGlzY2FyZCgpOwotCQkJCWNoaWxkLnJlbGVhc2VGcm9tQ29udGFpbmluZ1Bvb2woKTsKLQkJCX0KLQkJCXRoaXMuY2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQ2FjaGVFdmVudE5vZGUgY2hpbGQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgdGhpcy5pc0lnbm9yYWJsZSgpKSB7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oTGlzdCBjaGlsZHJlbkFyZykgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXRoaXMuY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuQXJnKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDaGlsZChDYWNoZUV2ZW50Tm9kZSBjaGlsZCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIFJlYWRBaGVhZEhlbHBlciBnZXRSZWFkQWhlYWRIZWxwZXIoKSB7Ci0JCWlmICh0aGlzLnRyYW5zbGF0b3IgIT0gbnVsbCAmJiB0aGlzLnRyYW5zbGF0b3IuaGFzUmVhZEFoZWFkTmFtZXMoKSkgewotCQkJcmV0dXJuIHRyYW5zbGF0b3IuZ2V0UmVhZEFoZWFkSGVscGVyKG5vZGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZXMgZmllbGQgZm9yIGluZm8gb24gaG93IGl0IGlzIHN0cnVjdHVyZWQgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cikgewotCi0JCS8qCi0JCSAqIFRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGZyb20gdGhlIHBhcnNlciBtYXkgYmUgc3RvcmVkIGJ5IHJlZmVyZW5jZSwgc28gd2UgbXVzdCBjb3B5IHRoZW0KLQkJICogb3ZlciB0byBhIGxvY2FsIGRhdGEgc3RvcmUKLQkJICovCi0JCWlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5nZXRMZW5ndGgoKSA+IDApIHsKLQotCQkJaWYgKHRoaXMuYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzID0gbmV3IFN0cmluZ1thdHRyLmdldExlbmd0aCgpICogMl07Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHIuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCXRoaXMuYXR0cmlidXRlc1tpXSA9IGF0dHIuZ2V0UU5hbWUoaSk7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzW2kgKyBhdHRyLmdldExlbmd0aCgpXSA9IGF0dHIuZ2V0VmFsdWUoaSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIHByb2Nlc3NBdHRyaWJ1dGVzIG1heSBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzLiBJdCBpcyBjb25maWd1cmVkIHRvIG9ubHkgY2Fycnkgb3V0IHRoZQotCSAqIHByb2Nlc3Npbmcgb25lIHRpbWUuIEFmdGVyIGl0IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZXMgdGhlIGNvbnN0cnVjdGlvbiBvZiBUcmFuc2xhdG9ycyBhbmQKLQkgKiB2YWx1ZXMgaXQgd2lsbCBkaXNjYXJkIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlcyBmaWVsZCBieSBzZXR0aW5nIGl0IHRvIG51bGwuCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NBdHRyaWJ1dGVzKCkgewotCQkvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIGZvciBpbmZvIG9uIGhvdyBpdCBpcyBzdHJ1Y3R1cmVkICovCi0JCWlmICh0aGlzLmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgewotCi0JCQlpZiAodGhpcy5lbWZPd25lciAhPSBudWxsICYmIHRoaXMudHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkJVHJhbnNsYXRvciBhdHRyVHJhbnNsYXRvciA9IG51bGw7Ci0JCQkJZmluYWwgaW50IGxpbWl0ID0gdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aCAvIDI7Ci0JCQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbWl0OyBpKyspIHsKLQotCQkJCQkvKiBGaW5kIHRoZSBhdHRyaWJ1dGUgdHJhbnNsYXRvciBieSB1c2luZyB0aGUgYXR0cmlidXRlIG5hbWUgKGF0dHJpYnV0ZXNbaV0pICovCi0JCQkJCWF0dHJUcmFuc2xhdG9yID0gdGhpcy50cmFuc2xhdG9yLmZpbmRDaGlsZCh0aGlzLmF0dHJpYnV0ZXNbaV0sIHRoaXMuZW1mT3duZXIsIHRoaXMudmVyc2lvbklEKTsKLQotCQkJCQlpZiAoYXR0clRyYW5zbGF0b3IgIT0gbnVsbCkgewotCi0JCQkJCQkvKgotCQkJCQkJICogQ29udmVydCB0aGUgdmFsdWUgb2YgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgdmFsdWUgKGF0dHJpYnV0ZXNbaStsaW1pdF0pCi0JCQkJCQkgKiB0byBhIG1lYW5pbmdmdWwgdmFsdWUKLQkJCQkJCSAqLwotCQkJCQkJdmFsdWUgPSBhdHRyVHJhbnNsYXRvci5jb252ZXJ0U3RyaW5nVG9WYWx1ZSh0aGlzLmF0dHJpYnV0ZXNbaSArIGxpbWl0XSwgKEVPYmplY3QpIHRoaXMuZW1mT3duZXIpOwotCQkJCQkJYXR0clRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUoKEVPYmplY3QpIHRoaXMuZW1mT3duZXIsIHZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8qIEZvcmdldCB0aGUgYXR0cmlidXRlcyBzbyB3ZSBkbyBub3QgcHJvY2VzcyB0aGVtIGFnYWluICovCi0JCQkJdGhpcy5hdHRyaWJ1dGVzID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZHMgZGF0YSB0byB0aGUgYnVmZmVyIHN0b3JlZCBieSB0aGlzIENFTk8uIFRleHQgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgZGF0YSBhcnJheQotCSAqIGJlZ2luaW5nIGF0IHBvc2l0aW9uZyA8aT5zdGFydCA8L2k+IGFuZCBlbmRpbmcgYXQgcG9zaXRpb24gPGk+c3RhcnQrbGVuZ3RoIDwvaT4uCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kVG9CdWZmZXIoY2hhcltdIGRhdGEsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiB0aGlzLmlzSWdub3JhYmxlKCkpIHsKLQkJCXBhcmVudC5hcHBlbmRUb0J1ZmZlcihkYXRhLCBzdGFydCwgbGVuZ3RoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBhY3RzIGFzIGEgbW9yZSBlZmZpY2llbnQgZm9ybSBvZiAiYXBwZW5kIi4gVXNpbmcgdGhpcyBtZXRob2QgYXZvaWRzIHRoZSBuZWVkIHRvIGNvcHkgdGhlCi0JCSAqIGRhdGEgaW50byBpdHMgb3duIGRhdGEgc3RydWN0dXJlIChlLmcuIFN0cmluZykgYmVmb3JlIGJlaW5nIGFkZGVkIHRvIHRoZSBidWZmZXIKLQkJICovCi0JCXRoaXMuYnVmZmVyLmluc2VydChidWZmZXIubGVuZ3RoKCksIGRhdGEsIHN0YXJ0LCBsZW5ndGgpOwotCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBnaXZlbiBDRU5PIGFzIGEgY2hpbGQgb2YgdGhpcyBDRU5PLgotCSAqIAotCSAqIEBwYXJhbSByZWNvcmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRUb0J1ZmZlcihDYWNoZUV2ZW50Tm9kZSByZWNvcmQpIHsKLQotCQl0aGlzLmFkZENoaWxkKHJlY29yZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCdWZmZXIoKSB7Ci0JCWlmICh0aGlzLmJ1ZmZlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5idWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgTm90aWZpZXIgZ2V0RW1mT3duZXIoKSB7Ci0JCXJldHVybiBlbWZPd25lcjsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQYXJlbnQoQ2FjaGVFdmVudE5vZGUgcmVjb3JkKSB7Ci0JCXRoaXMucGFyZW50ID0gcmVjb3JkOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zbGF0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW1mT3duZXIoTm90aWZpZXIgbm90aWZpZXIpIHsKLQotCQl0aGlzLmVtZk93bmVyID0gbm90aWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHJhbnNsYXRvcihUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJdGhpcy50cmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbm9kZU5hbWU7Ci0JfQotCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0KLQkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoVHJhbnNsYXRvclJlc291cmNlKSB0aGlzLmdldEVtZk93bmVyKCkpLmdldFZlcnNpb25JRCgpOwotCi0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMudmVyc2lvbklEOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JRChpbnQgaSkgewotCQl2ZXJzaW9uSUQgPSBpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFBvb2wuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Nzk5ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFBvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIFByb3ZpZGVzIGFuIGluc3RhbmNlIHBvb2wgb2YgcmV1c2FibGUgQ2FjaGVFdmVudE5vZGVzLiBUaGUgcG9vbCB3aWxsIGRlZmF1bHQgdG8gMTAgbGl2ZQotICogaW5zdGFuY2VzLiBXaGVuIGl0cyBhdmFpbGFibGUgaW5zdGFuY2VzIHJlYWNoIGZpdmUgdGltZXMgaXRzIGluaXRpYWwgY2FwYWNpdHksIGl0IHdpbGwgc2hyaW5rCi0gKiBpdHNlbGYgZG93biB0byB0aGUgaW5pdGlhbCBjYXBhY2l0eS4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUV2ZW50UG9vbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUEFDSVRZID0gMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWV9JTkNSRU1FTlQgPSAyNTsKLQotCXByaXZhdGUgaW50IHBvb2xDYXBhY2l0eSA9IERFRkFVTFRfQ0FQQUNJVFk7Ci0JcHJpdmF0ZSBDYWNoZUV2ZW50U3RhY2sgYXZhaWxhYmxlUG9vbCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGludXNlUG9vbCA9IG51bGw7Ci0KLQlwdWJsaWMgQ2FjaGVFdmVudFBvb2woKSB7Ci0JCXRoaXMoREVGQVVMVF9DQVBBQ0lUWSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgQ2FjaGVFdmVudFBPb2wgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbCBjYXBhY2l0eQotCSAqIAotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGluc3RhbmNlcyB0byBjcmVhdGUuCi0JICovCi0JcHVibGljIENhY2hlRXZlbnRQb29sKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJcG9vbENhcGFjaXR5ID0gKGluaXRpYWxDYXBhY2l0eSA+IDApID8gaW5pdGlhbENhcGFjaXR5IDogREVGQVVMVF9DQVBBQ0lUWTsKLQkJYXZhaWxhYmxlUG9vbCA9IG5ldyBDYWNoZUV2ZW50U3RhY2soKTsKLQkJaW51c2VQb29sID0gbmV3IEFycmF5TGlzdChwb29sQ2FwYWNpdHkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIENhY2hlRXZlbnROb2RlIChDRU5PKSBpbml0aWFsaXplZCB0byB1c2UgdGhlIGdpdmVuIHJlc291cmNlIGFzIGl0cyBFTUYgT3duZXIuCi0JICogCi0JICogVEhJUyBNRVRIT0QgU0hPVUxEIE9OTFkgQkUgVVNFRCBUTyBDUkVBVEUgUk9PVCBOT0RFUy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSB0aGF0IHdpbGwgYmUgcG9wdWxhdGVkCi0JICogQHJldHVybiBhIENhY2hlRXZlbnROb2RlIHRvIHNlcnZlIGFzIHRoZSByb290LgotCSAqLwotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBjcmVhdGVDYWNoZUV2ZW50Tm9kZShUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJQ2FjaGVFdmVudE5vZGUgYWRhcHRlciA9IGZldGNoRnJlZU5vZGUoKTsKLQkJYWRhcHRlci5pbml0KHJlc291cmNlKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNoaWxkIENhY2hlRXZlbnROb2RlcyAoQ0VOT3MpIHRoYXQgd2lsbCBicmFuY2ggZnJvbSB0aGUgZ2l2ZW4gcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb250YWluaW5nIENFTk8KLQkgKiBAcGFyYW0gbm9kZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgWE1MIGVsZW1lbnQgbm9kZSBuYW1lCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBnaXZlbiBYTUwgZWxlbWVudAotCSAqIEByZXR1cm4gQSBDRU5PIHRoYXQgaGFzIGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIENhY2hlRXZlbnROb2RlIGNyZWF0ZUNhY2hlRXZlbnROb2RlKENhY2hlRXZlbnROb2RlIHBhcmVudCwgU3RyaW5nIG5vZGVOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJQ2FjaGVFdmVudE5vZGUgYWRhcHRlciA9IGZldGNoRnJlZU5vZGUoKTsKLQkJYWRhcHRlci5pbml0KHBhcmVudCwgbm9kZU5hbWUsIGF0dHJpYnV0ZXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBDYWNoZUV2ZW50Tm9kZSBDRU5PIGJhY2sgdG8gdGhlIHBvb2wgb2YgYXZhaWxhYmUgaW5zdGFuY2VzLiBUaGlzIG1ldGhvZCBzaG91bGQKLQkgKiBub3QgYmUgaW52b2tlZCBkaXJlY3RseS4gQ0VOT3Mgd2hpY2ggYXJlIGFjcXVpcmVkIGZyb20gYSBnaXZlbiBwb29sIHdpbGwgYXV0b21hdGljYWxseQotCSAqIHJlbGVhc2UgdGhlbXNlbHZlcyB3aGVuIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VOb2RlKENhY2hlRXZlbnROb2RlIGFkYXB0ZXIpIHsKLQkJZnJlZU5vZGUoYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogZnJlZXplUG9vbCgpIHNob3VsZCBiZSBpbnZva2VkIHRvIGZyZWUgYW55IHVudXNlZCByZXNvdXJjZXMuIEFmdGVyIGZyZWV6ZVBvb2wgaGFzIGJlZW4KLQkgKiBpbnZva2VkLCB3YXJtUG9vbCgpIHdpbGwgbmVlZCB0byBiZSBpbnZva2VkIGJlZm9yZSB0aGUgcG9vbCBjYW4gYmUgdXNlZCBhZ2Fpbi4KLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgZnJlZXplUG9vbCgpIHsKLQkJYXZhaWxhYmxlUG9vbC5jbGVhcigpOwotCQlhdmFpbGFibGVQb29sID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB3YXJtUG9vbCgpIG11c3QgYmUgaW52b2tlZCB0byBub3RpZnkgdGhlIHBvb2wgaXQgaXMgYWJvdXQgdG8gYmUgdXNlZC4gVGhpcyBzaG91bGQgb2NjdXIgb25seQotCSAqIG9uY2UgcGVyIGRvY3VtZW50IHJlbmRlcmluZy4gVW50aWwgdGhlIHBvb2wgaXMgaW4gdXNlLCBpdCBjb250YWlucyBubyBhdmFpbGFibGUKLQkgKiBDYWNoZUV2ZW50Tm9kZXMgKENFTk9zKSBpbiBvcmRlciB0byBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgaW4tbWVtb3J5IGZvb3RwcmludCBvZiB0aGUKLQkgKiBFTUYyU0FYV3JpdGVyLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YXJtUG9vbCgpIHsKLQkJZW5zdXJlTWluaW11bUNhcGFjaXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoZUV2ZW50Tm9kZSBmZXRjaEZyZWVOb2RlKCkgewotCQlDYWNoZUV2ZW50Tm9kZSByZXN1bHQgPSBudWxsOwotCi0JCWlmIChhdmFpbGFibGVQb29sID09IG51bGwgfHwgYXZhaWxhYmxlUG9vbC5pc0VtcHR5KCkpCi0JCQl3YXJtUG9vbCgpOwotCi0JCXJlc3VsdCA9IGF2YWlsYWJsZVBvb2wucG9wKCk7Ci0JCWludXNlUG9vbC5hZGQocmVzdWx0KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBmcmVlTm9kZShDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyKSB7Ci0JCWlmIChpbnVzZVBvb2wucmVtb3ZlKGFkYXB0ZXIpKQotCQkJYXZhaWxhYmxlUG9vbC5wdXNoKGFkYXB0ZXIpOwotCQkvL2Vsc2UKLQkJLy8JdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWRhcHRlciBub3QgY29udGFpbmVkIGluIHBvb2whIik7Ci0JCWlmIChhdmFpbGFibGVQb29sLnNpemUoKSA+ICg1ICogcG9vbENhcGFjaXR5KSkgewotCQkJYXZhaWxhYmxlUG9vbC5jbGVhcigpOwotCQkJZW5zdXJlTWluaW11bUNhcGFjaXR5KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlTWluaW11bUNhcGFjaXR5KCkgewotCQlpZiAoYXZhaWxhYmxlUG9vbCA9PSBudWxsKSB7Ci0JCQlhdmFpbGFibGVQb29sID0gbmV3IENhY2hlRXZlbnRTdGFjaygpOwotCQl9Ci0JCWlmIChhdmFpbGFibGVQb29sLnNpemUoKSA8IHBvb2xDYXBhY2l0eSkgewotCQkJZmluYWwgaW50IG1pbmltdW1DYXBhY2l0eSA9IHBvb2xDYXBhY2l0eSAtIGF2YWlsYWJsZVBvb2wuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5pbXVtQ2FwYWNpdHk7IGkrKykKLQkJCQlhdmFpbGFibGVQb29sLnB1c2gobmV3IENhY2hlRXZlbnROb2RlKHRoaXMpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRTdGFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZThjODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyNCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLS8qKgotICogQW4gdW5zeW5jaHJvbml6ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBTdGFjayAoTElGTykgZGF0YSBzdHJ1Y3R1cmUuIE5vIGNhc3RpbmcgaXMgcmVxdWlyZWQgd2hlbgotICogdXNpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZS4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUV2ZW50U3RhY2sgZXh0ZW5kcyBBcnJheUxpc3QgewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTIwODg5NTMyMDE0OTA1NDEwM0w7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgcGVlaygpIHsKLQkJaWYgKHNpemUoKSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQotCQlyZXR1cm4gKENhY2hlRXZlbnROb2RlKSBnZXQoc2l6ZSgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgcmVtb3ZpbmcgaXQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgcG9wKCkgewotCQlpZiAoc2l6ZSgpID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCi0JCXJldHVybiAoQ2FjaGVFdmVudE5vZGUpIHJlbW92ZShzaXplKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqICAgICAgICAgICAgQSBDRU5PIHRvIHB1c2ggb250byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2goQ2FjaGVFdmVudE5vZGUgYWRhcHRlcikgewotCQlhZGQoYWRhcHRlcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MzY3YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIG1hcHBpbmdzIGZvciBhIHBhY2thZ2UgcHJlZml4IHRvIGl0cyBjdXJyZW50IG5hbWVzcGFjZSBVUkkuIEFsc28sCi0gKiB0aGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gbWFwIHRoZSBwYWNrYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSB7Ci0JcHVibGljIHN0YXRpYyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSgpOwotCXByaXZhdGUgTWFwIHByZWZpeFRvUGFja2FnZVVSSXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIHBhY2thZ2VVUklzVG9QcmVmaXhlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcCBnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpIHsKLQkJcmV0dXJuIHByZWZpeFRvUGFja2FnZVVSSXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQcmVmaXhUb1BhY2thZ2VVUkkoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgdXJpICE9IG51bGwpIHsKLQkJCXByZWZpeFRvUGFja2FnZVVSSXMucHV0KHByZWZpeCwgdXJpKTsKLQkJCXBhY2thZ2VVUklzVG9QcmVmaXhlcy5wdXQodXJpLCBwcmVmaXgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWM0YmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBwcmVmaXhUb1BhY2thZ2VVUklzOwotCi0JcHJvdGVjdGVkIE1hcCBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7Ci0KLQlwdWJsaWMgTWFwIGdldFByZWZpeFRvUGFja2FnZVVSSSgpIHsKLQkJcmV0dXJuIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFByZWZpeFRvUGFja2FnZVVSSXMoKTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpIHsKLQkJcmV0dXJuIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGwjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZjYThlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFhNSUhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyIGV4dGVuZHMgU0FYWE1JSGFuZGxlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlVMTF9BVFRSSUIgPSBYTUxSZXNvdXJjZS5YU0lfTlMgKyAiOm51bGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0geG1pUmVzb3VyY2UKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIoWE1MUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFhNTEhlbHBlciBoZWxwZXIsIE1hcCBvcHRpb25zKSB7Ci0JCXN1cGVyKHhtaVJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhhbmRsZXIjaXNOdWxsKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGwoKSB7Ci0JCWJvb2xlYW4gaXNudWxsID0gc3VwZXIuaXNOdWxsKCk7Ci0JCWlmICghaXNudWxsKQotCQkJaXNudWxsID0gYXR0cmlicy5nZXRWYWx1ZShOVUxMX0FUVFJJQikgIT0gbnVsbDsKLQkJcmV0dXJuIGlzbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTM1ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLQotcHVibGljIGludGVyZmFjZSBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVyIHsKLQlVUkkgZGVOb3JtYWxpemUoVVJJIHVyaSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JTG9hZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlMb2FkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmViZmY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlMb2FkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMzAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5TQVhXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlMb2FkSW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5WE1JTG9hZEltcGwgZXh0ZW5kcyBYTUlMb2FkSW1wbCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaGVscGVyCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlMb2FkSW1wbChYTUxIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MTG9hZEltcGwjbWFrZURlZmF1bHRIYW5kbGVyKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVmYXVsdEhhbmRsZXIgbWFrZURlZmF1bHRIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3IFNBWFdyYXBwZXIobmV3IENvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyKHJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU0ZjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIGV4dGVuZHMgWE1JUmVzb3VyY2UgewotCWludCBGT1JNQVRfRU1GMSA9IDA7Ci0JLyoqCi0JICogZm9ybWF0IGZvciBNT0Y1IGNvbXBhdGliaWxpdHk7IG5vdGUgdGhhdCB0aGlzIGNhbiBOT1QgYmUgdXNlZCB3aXRoIHJlc291cmNlcyB1c2luZ3MgdGhlCi0JICogInBsYXRmb3JtOi9wbHVnaW4iIHByb3RvY29sIgotCSAqLwotCWludCBGT1JNQVRfTU9GNSA9IDE7Ci0KLQl2b2lkIGFkZE9yaWdpbmFsUGFja2FnZVVSSShTdHJpbmcgcGFja2FnZVVyaSwgU3RyaW5nIG9yaWdpbmFsVXJpKTsKLQotCWludCBnZXRGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQuIEJ5IGRlZmF1bHQgaXQgaXMgRk9STUFUX0VNRjEuCi0JICogCi0JICogQHNlZSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UjRk9STUFUX0VNRjEKLQkgKiBAc2VlIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSNGT1JNQVRfTU9GNQotCSAqLwotCXZvaWQgc2V0Rm9ybWF0KGludCBmb3JtYXQpOwotCi0JYm9vbGVhbiB1c2VzRGVmYXVsdEZvcm1hdCgpOwotCi0JLyoqCi0JICogQHBhcmFtIHJvb3RPYmplY3QKLQkgKi8KLQl2b2lkIHJlbW92ZVByZXNlcnZpbmdJZHMoRU9iamVjdCByb290T2JqZWN0KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5NWY5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSURVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGludCBmb3JtYXQgPSBGT1JNQVRfRU1GMTsKLQlwcm90ZWN0ZWQgTWFwIG9yaWdpbmFsUGFja2FnZVVSSXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZUlEcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BST1RPQ09MID0gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QTFVHSU4gPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hcHBhYmxlWE1JUmVzb3VyY2VJbXBsLgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCQlpbml0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JfQotCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQlpbml0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTEhlbHBlcigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCU1hcHBlZFhNSUhlbHBlciBoZWxwZXIgPSBkb0NyZWF0ZVhNTEhlbHBlcigpOwotCQloZWxwZXIuc2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpKTsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwcGVkWE1JSGVscGVyIGRvQ3JlYXRlWE1MSGVscGVyKCkgewotCQlyZXR1cm4gbmV3IE1hcHBlZFhNSUhlbHBlcih0aGlzLCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkjZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkgewotCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkjZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRPcmlnaW5hbFBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VVcmksIFN0cmluZyBvcmlnaW5hbFVyaSkgewotCQlvcmlnaW5hbFBhY2thZ2VVUklzLnB1dChwYWNrYWdlVXJpLCBvcmlnaW5hbFVyaSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRGb3JtYXQoKSB7Ci0JCXJldHVybiBmb3JtYXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0KGludCBmb3JtYXQpIHsKLQkJaWYgKCFpc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoKSkKLQkJCXRoaXMuZm9ybWF0ID0gZm9ybWF0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoKSB7Ci0JCVVSSSBhVVJJID0gZ2V0VVJJKCk7Ci0KLQkJcmV0dXJuIGFVUkkgIT0gbnVsbCAmJiBQTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBQTEFURk9STV9QTFVHSU4uZXF1YWxzKHVyaS5zZWdtZW50KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSNnZXRVUklGcmFnbWVudChFT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmICh1c2VzRGVmYXVsdEZvcm1hdCgpKQotCQkJcmV0dXJuIHN1cGVyLmdldFVSSUZyYWdtZW50KGVPYmplY3QpOwotCQlyZXR1cm4gSURVdGlsLmdldE9yQXNzaWduSUQoZU9iamVjdCwgdGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc0RlZmF1bHRGb3JtYXQoKSB7Ci0JCXJldHVybiBmb3JtYXQgPT0gQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9FTUYxOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbCNjcmVhdGVYTUxTYXZlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQlpZiAodXNlc0RlZmF1bHRGb3JtYXQoKSkKLQkJCXJldHVybiBzdXBlci5jcmVhdGVYTUxTYXZlKCk7Ci0JCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9TYXZlKE91dHB1dFN0cmVhbSwgTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9TYXZlKG91dHB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXREZWZhdWx0T3B0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVmYXVsdFNhdmVPcHRpb25zKCkgewotCQlpZiAoZGVmYXVsdFNhdmVPcHRpb25zID09IG51bGwpIHsKLQkJCWdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjZ2V0RU9iamVjdEJ5SUQoU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RCeUlEKFN0cmluZyBpZCkgewotCQlpZiAoaWRUb0VPYmplY3RNYXAgIT0gbnVsbCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gaWRUb0VPYmplY3RNYXAuZ2V0KGlkKTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIHVubG9hZGVkLiBUaGlzIGltcGxlbWVudGF0aW9uCi0JICoge0BsaW5rIEludGVybmFsRU9iamVjdCNlU2V0UHJveHlVUkkgc2V0c310aGUgb2JqZWN0IHRvIGJlIGEgcHJveHkgYW5kIGNsZWFycyB0aGUKLQkgKiB7QGxpbmsgI2VBZGFwdGVycyBhZGFwdGVyc30uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdW5sb2FkZWQoSW50ZXJuYWxFT2JqZWN0IGludGVybmFsRU9iamVjdCkgewotCQkvL292ZXJyaWRkZW4gZnJvbSB0aGUgc3VwZXIgY2xhc3M7IGNhbGwgc3VwZXIuZ2V0VVJJRnJhZ21lbnQgaW5zdGVhZCBvZiB0aGUgaW1wbGVtZW50YXRpb24KLQkJLy9hdCB0aGlzIGxldmVsLCB0byBhdm9pZCBJRCBnZW5lcmF0aW9uIGR1cmluZyB1bmxvYWQKLQkJLy9pbnRlcm5hbEVPYmplY3QuZVNldFByb3h5VVJJKHVyaS5hcHBlbmRGcmFnbWVudChnZXRVUklGcmFnbWVudChpbnRlcm5hbEVPYmplY3QpKSk7Ci0JCWludGVybmFsRU9iamVjdC5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KHN1cGVyLmdldFVSSUZyYWdtZW50KGludGVybmFsRU9iamVjdCkpKTsKLQkJaW50ZXJuYWxFT2JqZWN0LmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2RvTG9hZChqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQliYXNpY0RvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZG9Mb2FkKElucHV0U3RyZWFtLCBNYXApfSBpbnN0ZWFkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJhc2ljRG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9Mb2FkKGlucHV0U3RyZWFtLCBvcHRpb25zKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjaW5pdCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlzZXRFbmNvZGluZyhERUZBVUxUX0VOQ09ESU5HKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewotCQlyZXR1cm4gbmV3IENvbXBhdGliaWxpdHlYTUlMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2UjcmVtb3ZlUHJlc2VydmluZ0lkcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcmVzZXJ2aW5nSWRzKEVPYmplY3Qgcm9vdE9iamVjdCkgewotCQlzZXRQcmVzZXJ2ZUlEcyh0cnVlKTsKLQkJZ2V0Q29udGVudHMoKS5yZW1vdmUocm9vdE9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwcmVzZXJ2ZUlEcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZXNlcnZlSURzKCkgewotCQlyZXR1cm4gcHJlc2VydmVJRHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByZXNlcnZlSURzCi0JICogICAgICAgICAgICBUaGUgcHJlc2VydmVJRHMgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlSURzKGJvb2xlYW4gcHJlc2VydmVJRHMpIHsKLQkJdGhpcy5wcmVzZXJ2ZUlEcyA9IHByZXNlcnZlSURzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkZXRhY2hlZEhlbHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkZXRhY2hlZEhlbHBlcihFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlciAhPSBudWxsKSB7Ci0JCQllT2JqZWN0LmVBZGFwdGVycygpLnJlbW92ZShtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIpOwotCQl9Ci0KLQkJaWYgKHVzZVVVSURzKCkpIHsKLQkJCURFVEFDSEVEX0VPQkpFQ1RfVE9fSURfTUFQLnB1dChlT2JqZWN0LCBnZXRJRChlT2JqZWN0KSk7Ci0JCX0KLQotCQlpZiAoIWlzUHJlc2VydmVJRHMoKSAmJiBpZFRvRU9iamVjdE1hcCAhPSBudWxsICYmIGVPYmplY3RUb0lETWFwICE9IG51bGwpIHsKLQkJCWlkVG9FT2JqZWN0TWFwLnJlbW92ZShlT2JqZWN0VG9JRE1hcC5yZW1vdmUoZU9iamVjdCkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotICAgICAgICBpZiAoaXNMb2FkZWQpIHsKLSAgICAgICAgICAgIGFkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSAKLSAgICAgICAgICAgICAgICBhZGFwdGVyLndhaXRGb3JSZXNvdXJjZVRvTG9hZCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeyAgICAgICAgICAgIAotICAgICAgICAgICAgYWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyID09IG51bGwgJiYgIWlzTG9hZGVkKSAKLSAgICAgICAgICAgICAgICBhZGRTeW5jaHJvbml6YXRpb25Mb2FkaW5nQWRhcHRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGFkYXB0ZXIud2FpdEZvclJlc291cmNlVG9Mb2FkKCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzdXBlci5sb2FkKG9wdGlvbnMpOwotICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotICAgICAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgICAgIH0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgICAgICB9IGNhdGNoKEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0JcHVibGljIHZvaWQgbG9hZEV4aXN0aW5nKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCQotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgICAgIGlmIChpc0xvYWRlZCkgewotICAgICAgICAgICAgYWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIAotICAgICAgICAgICAgICAgIGFkYXB0ZXIud2FpdEZvclJlc291cmNlVG9Mb2FkKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCAmJiAhaXNMb2FkZWQpIAotICAgICAgICAgICAgICAgIGFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgYWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvYWQoKElucHV0U3RyZWFtKSBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBpb2U7Ci0gICAgICAgICAgICB9IGNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotICAgICAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICAgICAgfSBjYXRjaChFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCQotCSAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU3luY2hyb25pemF0aW9uTG9hZGluZ0FkYXB0ZXIoKSB7Ci0gICAgCXN5bmNocm9uaXplZCAoZUFkYXB0ZXJzKCkpIHsKLSAgICAgICAgaWYgKFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKSA9PSBudWxsKQotICAgICAgICAgICAgZUFkYXB0ZXJzKCkuYWRkKFJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCkpOwotICAgIAl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGFwdGVyLmZvcmNlUmVsZWFzZSgpOwotICAgICAgICAgICAgZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FzZSAxOiBMT0FEIFJFU09VUkNFIEZST00gRElTSyB0aGlzLmlzTG9hZGVkID09IGZhbHNlIEFORCBpc0xvYWRlZCA9PQotICAgICAqIHRydWUgKHdoaWNoIG1lYW5zIHdlIGVudGVyZWQgdGhlIGxvYWQoKSBtZXRob2QsIGJ1dCBoYXZlIG5vdCBjb21wbGV0ZWQKLSAgICAgKiB0aGUgbG9hZCksIGFuZCB3ZSdyZSBsb2FkaW5nIGZyb20gYSByZXNvdXJjZSBvbiBkaXNrLCB0aGVuIHdlIGFkZCB0aGUKLSAgICAgKiBhZGFwdGVyIENhc2UgMjogUkVTT1VSQ0UgQ1JFQVRJT04gKE5PVCBBIExPQUQpIENhc2UgNDogUkVTT1VSQ0UgQ1JFQVRJT04sCi0gICAgICogVU5MT0FERUQsIE5FVyBDT05URU5UUyAoTk9UIEEgTE9BRCkgUmVzb3VyY2UgaXMgY3JlYXRlZCBidXQgbm90IGZyb20gYQotICAgICAqIHJlc291cmNlIG9uIGRpc2ssIHNvIGNvbnRlbnRzIGlzIG51bGwgQU5EIG5vdCBlbXB0eSwgc28gbm8gYWRhcHRlcjogVEhJUwotICAgICAqIElTIE5PVCBBIExPQUQgQ2FzZSAzOiBSRVNPVVJDRSBIQVMgQkVFTiBVTkxPQURFRCwgQkVJTkcgUkVMT0FERUQgRlJPTQotICAgICAqIERJU0sgQ29udGVudHMgaXMgTk9UIG51bGwsIGJ1dCBpdCBpcyBFbXB0eSBhbmQgdGhlIHJlc291cmNlIGlzIGJlaW5nCi0gICAgICogbG9hZGVkIGZyb20gZGlzay4gV2UgbXVzdCBhZGQgdGhlIGFkYXB0ZXIuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXNvdXJjZUJlaW5nTG9hZGVkKGJvb2xlYW4gaXNMb2FkZWQpIHsKLSAgICAgICAgcmV0dXJuICghdGhpcy5pc0xvYWRlZCAmJiBpc0xvYWRlZCkgJiYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSNnZXRDb250ZW50cygpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0IGdldENvbnRlbnRzKCkgewotICAgICAgICB3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNpc0xvYWRlZCgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNMb2FkZWQoKSB7Ci0gICAgICAgIHdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5pc0xvYWRlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCkgewotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgbG9hZGluZ0FkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7Ci0gICAgICAgIGlmIChsb2FkaW5nQWRhcHRlciAhPSBudWxsKSBsb2FkaW5nQWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKLSAgICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY3NGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbDsKLQotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbCBleHRlbmRzIFhNSVNhdmVJbXBsIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuCi0JICogCi0JICogQHBhcmFtIGhlbHBlcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbChNYXAgb3B0aW9ucywgWE1MSGVscGVyIGhlbHBlciwgU3RyaW5nIGVuY29kaW5nKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIGhlbHBlciwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsI2luaXQoWE1MUmVzb3VyY2UsIE1hcCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucykgewotCQlzdXBlci5pbml0KHJlc291cmNlLCBvcHRpb25zKTsKLQkJeG1pVHlwZSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGwjYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSB7Ci0JCWRvYy5hZGRBdHRyaWJ1dGUoWE1JX1ZFUl9OUywgWE1JUmVzb3VyY2UuVkVSU0lPTl9WQUxVRSk7Ci0JCWRvYy5hZGRBdHRyaWJ1dGUoWE1JX1hNTE5TLCBYTUlSZXNvdXJjZS5YTUlfVVJJKTsKLQkJRVBhY2thZ2VbXSBwYWNrYWdlcyA9IGhlbHBlci5wYWNrYWdlcygpOwotCQlTdHJpbmdCdWZmZXIgeHNpU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCQlpZiAoZGVjbGFyZVNjaGVtYUxvY2F0aW9uKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlc1tpXTsKLQotCQkJCUVPYmplY3Qgcm9vdCA9IEVjb3JlVXRpbC5nZXRSb290Q29udGFpbmVyKGVQYWNrYWdlKTsKLQkJCQlpZiAocm9vdCBpbnN0YW5jZW9mIEVQYWNrYWdlKSB7Ci0JCQkJCUVQYWNrYWdlIHJvb3RFUGFja2FnZSA9IChFUGFja2FnZSkgcm9vdDsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290RVBhY2thZ2UuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJCQlTdHJpbmcgcm9vdE5zVVJJID0gcm9vdEVQYWNrYWdlLmdldE5zVVJJKCk7Ci0JCQkJCQlpZiAodXJpID09IG51bGwgPyByb290TnNVUkkgIT0gbnVsbCA6ICF1cmkudG9TdHJpbmcoKS5lcXVhbHMocm9vdE5zVVJJKSkgewotCQkJCQkJCWRlY2xhcmVYU0kgPSB0cnVlOwotCQkJCQkJCWlmICh4c2lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uLmFwcGVuZCgnICcpOwotCQkJCQkJCX0KLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQocm9vdE5zVVJJKTsKLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoJyAnKTsKLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoaGVscGVyLmdldEhSRUYocm9vdEVQYWNrYWdlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVjbGFyZVhTSSkgewotCQkJZG9jLmFkZEF0dHJpYnV0ZShYU0lfWE1MTlMsIFhNTFJlc291cmNlLlhTSV9VUkkpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5sZW5ndGg7IGkrKykgewotCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlc1tpXTsKLQkJCS8vTW9kaWZpZWQgZnJvbSBzdXBlcmNsYXNzIC0gZGlzcGF0Y2ggYmFjayB0byBoZWxwZXIgZm9yIGNvbXBhdGliaWxpdHkKLQkJCS8vU3RyaW5nIG5zVVJJID0gZVBhY2thZ2UuZ2V0TnNVUkkoKTsKLQkJCS8vU3RyaW5nIG5zUHJlZml4ID0gZVBhY2thZ2UuZ2V0TnNQcmVmaXgoKTsKLQkJCVN0cmluZ1tdIG5zSW5mbyA9ICgoTWFwcGVkWE1JSGVscGVyKSBoZWxwZXIpLmdldE5TSW5mbyhlUGFja2FnZSk7Ci0JCQlkb2MuYWRkQXR0cmlidXRlTlMoWE1MUmVzb3VyY2UuWE1MX05TLCBuc0luZm9bMF0sIG5zSW5mb1sxXSk7Ci0JCX0KLQotCQlpZiAoeHNpU2NoZW1hTG9jYXRpb24gIT0gbnVsbCkgewotCQkJZG9jLmFkZEF0dHJpYnV0ZShYU0lfU0NIRU1BX0xPQ0FUSU9OLCB4c2lTY2hlbWFMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNhdmVIcmVmKEVPYmplY3QgcmVtb3RlLCBFU3RydWN0dXJhbEZlYXR1cmUgZikgewotCQlTdHJpbmcgbmFtZSA9IGhlbHBlci5nZXRRTmFtZShmKTsKLQkJU3RyaW5nIGhyZWYgPSBoZWxwZXIuZ2V0SFJFRihyZW1vdGUpOwotCQlpZiAoaHJlZiAhPSBudWxsKSB7Ci0JCQlkb2Muc3RhcnRFbGVtZW50KG5hbWUpOwotCQkJRUNsYXNzIGVDbGFzcyA9IHJlbW90ZS5lQ2xhc3MoKTsKLQotCQkJRUNsYXNzIGV4cGVjdGVkVHlwZSA9IChFQ2xhc3MpIGYuZ2V0RVR5cGUoKTsKLQkJCS8vQ2hhbmdlZCBuZXh0IGxpbmUgdG8gYWx3YXlzIHdyaXRlIHR5cGUgaWYgZXhwZWN0ZWRUeXBlCi0JCQkvL2lzIGRpZmZlcmVudCBmcm9tIGVDbGFzcwotCQkJaWYgKGVDbGFzcyAhPSBleHBlY3RlZFR5cGUpIHsKLQkJCQlzYXZlVHlwZUF0dHJpYnV0ZShlQ2xhc3MpOwotCQkJfQotCi0JCQlkb2MuYWRkQXR0cmlidXRlKFhNTFJlc291cmNlLkhSRUYsIGhyZWYpOwotCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhYTlmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIG51bGwsIERPTV9BVFRSSUJVVEUpOwotCQl0aGlzLmF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWJjZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlQWRhcHRlcjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnM6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5IElOU1RBTkNFID0gbmV3IERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSgpOwotCi0JcHVibGljIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2FjY2VwdHMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKFN0cmluZyBkb21OYW1lKSB7Ci0JCXJldHVybiBkb21OYW1lICE9IG51bGwgJiYgZG9tTmFtZS5zdGFydHNXaXRoKFhNTE5TKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2FjY2VwdHMob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdHMoTm90aWZpY2F0aW9uIG5vdGlmKSB7Ci0JCXJldHVybiBub3RpZi5nZXRGZWF0dXJlKCkgPT0gTmFtZXNwYWNlQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkjY3JlYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlKFN0cmluZyBkb21OYW1lKSB7Ci0JCXJldHVybiBuZXcgTmFtZXNwYWNlVHJhbnNsYXRvcihkb21OYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGUoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbmFtZXNwYWNlcyA9IE5hbWVzcGFjZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlcygoRU9iamVjdCkgdGFyZ2V0KTsKLQkJaWYgKG5hbWVzcGFjZXMgPT0gbnVsbCB8fCBuYW1lc3BhY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobmFtZXNwYWNlcy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlc3VsdC5hZGQoY3JlYXRlKChOYW1lc3BhY2UpIG5hbWVzcGFjZXMuZ2V0KGkpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlKE5vdGlmaWNhdGlvbiBub3RpZikgewotCQlOYW1lc3BhY2UgbnMgPSAoTmFtZXNwYWNlKSBub3RpZi5nZXROZXdWYWx1ZSgpOwotCQlyZXR1cm4gY3JlYXRlKG5zKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlKE5hbWVzcGFjZSBucykgewotCQlyZXR1cm4gbmV3IE5hbWVzcGFjZVRyYW5zbGF0b3IoWE1MTlMgKyBucy5nZXRQcmVmaXgoKSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVwZW5kZW5jeVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlcGVuZGVuY3lUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNDgyMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVwZW5kZW5jeVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIERlcGVuZGVuY3lUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgYURlcGVuZGVudEZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQkJZGVwZW5kZW5jeUZlYXR1cmUgPSBhRGVwZW5kZW50RmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRDaGlsZChFT2JqZWN0IHBhcmVudCkgewotCQlFT2JqZWN0IGNoaWxkID0gYmFzaWNHZXREZXBlbmRlbmN5T2JqZWN0KHBhcmVudCk7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGNyZWF0ZUNoaWxkKHBhcmVudCk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZUNoaWxkKEVPYmplY3QgcGFyZW50KSB7Ci0JCUVPYmplY3QgY2hpbGQgPSBjcmVhdGVFTUZPYmplY3QoZGVwZW5kZW5jeUZlYXR1cmUpOwotCQlwYXJlbnQuZVNldChkZXBlbmRlbmN5RmVhdHVyZSwgY2hpbGQpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3QgZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJLy9yZXR1cm4gc3VwZXIuZ2V0TU9GQ2hpbGRyZW4oZ2V0Q2hpbGQobW9mT2JqZWN0KSk7Ci0JCXJldHVybiBzdXBlci5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE1PRlZhbHVlKGdldENoaWxkKG1vZk9iamVjdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJLy9zdXBlci5zZXRNT0ZWYWx1ZShnZXRDaGlsZChlbWZPYmplY3QpLCB2YWx1ZSk7Ci0JCXN1cGVyLnNldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCksIHZhbHVlLCAtMSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSwgaW50IG5ld0luZGV4KSB7Ci0JCXN1cGVyLnNldE1PRlZhbHVlKGdldENoaWxkKChFT2JqZWN0KSBvd25lciksIHZhbHVlLCBuZXdJbmRleCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5yZW1vdmVNT0ZWYWx1ZShnZXRDaGlsZCgoRU9iamVjdCkgb3duZXIpLCB2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuaXNTZXRNT0ZWYWx1ZShnZXRDaGlsZChlbWZPYmplY3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1blNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXN1cGVyLnVuU2V0TU9GVmFsdWUoZ2V0Q2hpbGQoZW1mT2JqZWN0KSk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lDaGlsZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZmVhdHVyZUV4aXN0cyhnZXRDaGlsZChlbWZPYmplY3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhckxpc3QoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJc3VwZXIuY2xlYXJMaXN0KGdldENoaWxkKG1vZk9iamVjdCkpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODJlYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBFTUYyRE9NQWRhcHRlciBleHRlbmRzIEFkYXB0ZXIgewotCi0KLQlDbGFzcyBBREFQVEVSX0NMQVNTID0gRU1GMkRPTUFkYXB0ZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERPTSBub2RlIHRoYXQgdGhlIHRhcmdldCBvZiB0aGlzIGFkYXB0ZXIgbWFwcyB0by4gSWYgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IG1hcHMgdG8KLQkgKiBtb3JlIHRoYW4gb25lIERPTSBub2RlLCB0aGlzIG5vZGUgaXMgdGhlIHRvcC1tb3N0IG5vZGUuCi0JICovCi0JTm9kZSBnZXROb2RlKCk7Ci0KLQl2b2lkIHNldE5vZGUoTm9kZSBhTm9kZSk7Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCWJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCXZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBET00gdHJlZSBmb3IgdGhpcyBhZGFwdGVyIGZyb20gdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBNT0YgT2JqZWN0LiBUaGlzIG1ldGhvZAotCSAqIHVwZGF0ZXMgQUxMIHRoZSBET00gbm9kZXMgZnJvbSBhbGwgdGhlIE1PRiBhdHRyaWJ1dGVzLgotCSAqLwotCXZvaWQgdXBkYXRlRE9NKCk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBNT0YgT2JqZWN0IGZyb20gdGhlIERPTSB0cmVlLiBBbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBET00gdHJlZSBhcmUgdXBkYXRlZCBpbnRvCi0JICogdGhlIE1PRiBvYmplY3QuCi0JICovCi0Jdm9pZCB1cGRhdGVNT0YoKTsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpOwotCi0JcHVibGljIHZvaWQgdXBkYXRlTU9GRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCk7Ci0KLQlFT2JqZWN0IGdldEVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIE1PRiBvYmplY3QgaXMgYSBwcm94eS4KLQkgKi8KLQlib29sZWFuIGlzTU9GUHJveHkoKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgRE9NIGFkYXB0ZXJzIGZyb20gdGhlIG5vZGUgQU5EIGFsbCBpdHMgY2hpbGQgbm9kZXMsIHJlY3Vyc2l2ZWx5LgotCSAqLwotCXZvaWQgcmVtb3ZlQWRhcHRlcnMoTm9kZSBub2RlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2ZmZWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5U2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJldmlzaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlN0cmluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlRyYW5zbGF0b3JTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5XRlRVdGlsc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEVNRjJET01BZGFwdGVySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgRU1GMkRPTUFkYXB0ZXIgewotCi0JZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGZEZWJ1ZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZk5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCi0JcHJvdGVjdGVkIE5vZGUgZk5vZGU7Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBmVHJhbnNsYXRvcjsKLQotCXByb3RlY3RlZCBFTUYyRE9NUmVuZGVyZXIgZlJlbmRlcmVyOwotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjaGlsZFRyYW5zbGF0b3JzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSb290ID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNSVU5OSU5HID0gImlzUnVubmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgY2xhc3MgRGVwZW5kZW5jeUFkYXB0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsIHsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJFTUYyRE9NRGVwZW5kZW5jeUFkYXB0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJRU1GMkRPTUFkYXB0ZXJJbXBsLnRoaXMubm90aWZ5Q2hhbmdlZChtc2cpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gS0VZLmVxdWFscyh0eXBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciByb290IGFkYXB0ZXJzLgotCSAqLwotCXB1YmxpYyBFTUYyRE9NQWRhcHRlckltcGwoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlLCBEb2N1bWVudCBkb2N1bWVudCwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJdGhpcygoTm90aWZpZXIpIHJlc291cmNlLCAoTm9kZSkgZG9jdW1lbnQsIHJlbmRlcmVyLCB0cmFuc2xhdG9yKTsKLQkJaXNSb290ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gQWRhcHRlciBnaXZlbiBhbiBFT2JqZWN0IGFuZCBhIG5vZGUKLQkgKi8KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXJJbXBsKE5vdGlmaWVyIG9iamVjdCwgTm9kZSBub2RlLCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcigpOwotCQlzZXRUYXJnZXQob2JqZWN0KTsKLQkJZk5vZGUgPSBub2RlOwotCQlmUmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCQlpbml0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQlhZGRFTUZBZGFwdGVyKCk7Ci0JCWFkZERPTUFkYXB0ZXIoKTsKLQkJYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZyb20gYSBET00gTm9kZS4gVGhlIEVPYmplY3Qgd2lsbCBiZSBjcmVhdGVkCi0JICovCi0JcHVibGljIEVNRjJET01BZGFwdGVySW1wbChOb2RlIG5vZGUsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZlJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JCWZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQkJc2V0VGFyZ2V0RnJvbU5vZGUoKTsKLQkJaW5pdENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJYWRkRU1GQWRhcHRlcigpOwotCQlhZGRET01BZGFwdGVyKCk7Ci0JCWFkZERlcGVuZGVuY3lBZGFwdGVySWZOZWNlc3NhcnkoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlcGVuZGVuY3lBZGFwdGVySWZOZWNlc3NhcnkoKSB7Ci0JCWlmICghZlRyYW5zbGF0b3IuaXNEZXBlbmRlbmN5UGFyZW50KCkpCi0JCQlyZXR1cm47Ci0JCUVPYmplY3QgY2hpbGQgPSBmVHJhbnNsYXRvci5iYXNpY0dldERlcGVuZGVuY3lPYmplY3QoZ2V0RU9iamVjdCgpKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlhZGREZXBlbmRlbmN5QWRhcHRlcihjaGlsZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENoaWxkVHJhbnNsYXRvcnMoKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJvb2xlYW4gaXNSdW5uaW5nID0gZmFsc2U7IC8vaXMgdGhlIE9TR0kgcGxhdGZvcm0gcnVubmluZyA/Ci0JCXRyeSB7Ci0JCQkvLyBJZiB0aGUgUGxhdGZvcm0gY2xhc3MgY2FuIGJlIGZvdW5kLCB0aGVuIGNvbnRpbnVlIHRvIGNoZWNrIGlmIHRoZSBPU0dJIHBsYXRmb3JtIGlzIHJ1bm5pbmcKLQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShQTEFURk9STSk7Ci0JCQlNZXRob2QgbSA9IGNsYXp6LmdldE1ldGhvZChJU1JVTk5JTkcpOwotCQkJaXNSdW5uaW5nID0gKChCb29sZWFuKW0uaW52b2tlKGNsYXp6KSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkgICAgIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfQkKLQkJLy9DaGVjayBmb3IgZXh0ZW5kZWQgY2hpbGQgdHJhbnNsYXRvcnMgYmVjYXVzZSB3ZSBhcmUgaW4gT1NHSSBtb2RlCi0JCWlmIChpc1J1bm5pbmcpIHsKLQkJCVRyYW5zbGF0b3JbXSBleHRlbmRlZENoaWxkcmVuID0gVHJhbnNsYXRvclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRUcmFuc2xhdG9ycygpOwotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICAJaWYgKGV4dGVuZGVkQ2hpbGRyZW5baV0gIT0gbnVsbCkKLQkgICAgICAgICAgICAJY2hpbGRyZW4uYWRkKGV4dGVuZGVkQ2hpbGRyZW5baV0pOwotCSAgICAgICAgfQotCQl9Ci0JCQotCQkKLQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3QoZlRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4oZ2V0VGFyZ2V0KCksIGZSZW5kZXJlci5nZXRWZXJzaW9uSUQoKSkpKTsKLQotCQlWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IGZhY3RvcnkgPSBmVHJhbnNsYXRvci5nZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBkb21OYW1lID0gbnVsbDsKLQkJCU5hbWVkTm9kZU1hcCBtYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlOb2RlIGF0dHJOb2RlID0gbWFwLml0ZW0oaSk7Ci0JCQkJCWRvbU5hbWUgPSBhdHRyTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQkvL0hhbmRsZSB2YXJpYWJsZSB0cmFuc2xhdG9ycwotCQkJCQlUcmFuc2xhdG9yIHQgPSBmVHJhbnNsYXRvci5maW5kQ2hpbGQoZG9tTmFtZSwgZ2V0VGFyZ2V0KCksIGZSZW5kZXJlci5nZXRWZXJzaW9uSUQoKSk7Ci0JCQkJCWlmICh0ICE9IG51bGwgJiYgIWNoaWxkcmVuLmNvbnRhaW5zKHQpKQotCQkJCQkJY2hpbGRyZW4uYWRkKHQpOwotCQkJCX0KLQkJCX0KLQkJCUxpc3QgY2hpbGRyZW5Gcm9tRU1GID0gZmFjdG9yeS5jcmVhdGUoZ2V0VGFyZ2V0KCkpOwotCQkJaWYgKGNoaWxkcmVuRnJvbUVNRiAhPSBudWxsKQotCQkJCWNoaWxkcmVuLmFkZEFsbChjaGlsZHJlbkZyb21FTUYpOwotCQl9Ci0KLQkJY2hpbGRUcmFuc2xhdG9ycyA9IChUcmFuc2xhdG9yW10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IFRyYW5zbGF0b3JbY2hpbGRyZW4uc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRvIGZhbHNlIGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBmcm9tIGJvdGggdGhlIERPTSBub2RlIGFuZCB0aGUgTU9GIG9iamVjdCB3aWxsIGJlCi0JICogaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBmTm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLQkJZk5vdGlmaWNhdGlvbkVuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyA9PSB0eXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVNRkFkYXB0ZXIoKSB7Ci0JCXRhcmdldC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoc2hvcnRDbGFzc05hbWUodGhpcykpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKGdldE5vZGUoKS5nZXROb2RlTmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcsJyk7Ci0JCXNiLmFwcGVuZChzaG9ydENsYXNzTmFtZShnZXRUYXJnZXQoKSkpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydENsYXNzTmFtZShPYmplY3QgbykgewotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY24gPSBvLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJaW50IGkgPSBjbi5sYXN0SW5kZXhPZignLicpOwotCQkJcmV0dXJuIGNuLnN1YnN0cmluZyhpICsgMSwgY24ubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUHJpbnRzIG91dCBhIE1PRiBub3RpZmljYXRpb24gZm9yIGRlYnVnZ2luZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlYnVnTU9GTm90aWZ5KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJU3RyaW5nIG5vdGlmVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJBREQiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkUiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLQkJCQkJbm90aWZUeXBlID0gIkFERF9NQU5ZIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkVfTUFOWSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDogewotCQkJCQlpZiAobXNnLmdldFBvc2l0aW9uKCkgPT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKQotCQkJCQkJbm90aWZUeXBlID0gIlJFUExBQ0UiOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCW5vdGlmVHlwZSA9ICJTRVQiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJVTlNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJNT0YgQ2hhbmdlOiAiICsgbm90aWZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0bm90aWZpZXIgICAgICA6ICIgKyBtc2cuZ2V0Tm90aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdGNoYW5nZWRGZWF0dXJlOiAiICsgbXNnLmdldEZlYXR1cmUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdG9sZFZhbHVlICAgICAgOiAiICsgbXNnLmdldE9sZFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRuZXdWYWx1ZSAgICAgIDogIiArIG1zZy5nZXROZXdWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgdGhlIGZlYXR1cmUgbWFwcyBmb3IgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZFRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gY2hpbGRUcmFuc2xhdG9yczsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBmaW5kVHJhbnNsYXRvcihOb3RpZmljYXRpb24gbm90KSB7Ci0JCWlmIChub3QuZ2V0RmVhdHVyZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hcHNbaV0uaXNNYXBGb3Iobm90LmdldEZlYXR1cmUoKSwgbm90LmdldE9sZFZhbHVlKCksIG5vdC5nZXROZXdWYWx1ZSgpKSkKLQkJCQlyZXR1cm4gbWFwc1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIE1PRiBub2RlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHdpbGwgcmVtb3ZlIHRoZSBkb20gZXF1aXZhbGVudC4KLQkgKiBJZiBtdWx0aXBsZSBkaWZmZXJlbmNlcyBhcmUgZm91bmQsIHdpbGwgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGlmZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG1vZkNoaWxkcmVuCi0JICogQHBhcmFtIGRvbUNoaWxkcmVuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IHVwZGF0ZURPTVNpbmdsZVJlbW92ZShOb2RlIHBhcmVudCwgTGlzdCBtb2ZDaGlsZHJlbiwgTGlzdCBkb21DaGlsZHJlbil7Ci0JCWludCBkb21JbmRleCA9IDA7Ci0JCWludCBmaXJzdERpZmZlcmVuY2UgPSAtMTsKLQkJZm9yIChPYmplY3QgbW9mQ2hpbGQgOiBtb2ZDaGlsZHJlbil7Ci0JCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gZ2V0RXhpc3RpbmdBZGFwdGVyKChFT2JqZWN0KW1vZkNoaWxkKTsKLQkJCWlmKGFkYXB0ZXIuZ2V0Tm9kZSgpICE9IGRvbUNoaWxkcmVuLmdldChkb21JbmRleCkpewotCQkJCWlmKGZpcnN0RGlmZmVyZW5jZSAhPSAtMSl7Ci0JCQkJCS8vc2Vjb25kIGRpZmZlcmVuY2U7IHJldHVybgotCQkJCQlyZXR1cm4gZmlyc3REaWZmZXJlbmNlOwotCQkJCX0KLQkJCQkvL3dlIGZvdW5kIHNvbWV0aGluZyB0aGF0IGlzIGRpZmZlcmVudAotCQkJCWZpcnN0RGlmZmVyZW5jZSA9IGRvbUluZGV4OwotCQkJCS8vc2tpcCBvdmVyIG9uZSBpbmRleCBhbmQgY2hlY2sgYWdhaW5zdCBuZXh0Ci0JCQkJZG9tSW5kZXggKys7Ci0JCQkJaWYoYWRhcHRlci5nZXROb2RlKCkgIT0gZG9tQ2hpbGRyZW4uZ2V0KGRvbUluZGV4KSl7Ci0JCQkJCS8vaWYgdGhlc2UgYXJlIGRpZmZlcmVudCB0aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBjaGFuZ2VzCi0JCQkJCXJldHVybiBmaXJzdERpZmZlcmVuY2U7Ci0JCQkJfQotCQkJfQotCQkJZG9tSW5kZXgrKzsKLQkJfQotCQlpZihmaXJzdERpZmZlcmVuY2UgIT0gLTEpewotCQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50LCAoRWxlbWVudCkgZG9tQ2hpbGRyZW4uZ2V0KGZpcnN0RGlmZmVyZW5jZSkpOwotCQkJLy9pZiB3ZSBhcmUgaGVyZSwgYW5kIGZpcnN0RGlmZmVyZW5jZSBpcyBub3QgLTEsIHRoYXQgbWVhbnMgd2UgaGF2ZSBpdGVyYXRlZAotCQkJLy90aHJvdWdoIHRoZSBlbnRpcmUgbW9mIGxpc3QsIGFuZCBhbGwgZWxlbWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gUmV0dXJuCi0JCQkvL2RvbWNoaWxkcmVuLnNpemUsIHNvIHRoYXQgbm8gbW9yZSBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gY2FsbGluZyBtZXRob2QuCi0JCQlyZXR1cm4gZG9tQ2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0JCS8vaWYgd2UgYXJlIGhlcmUsIHRoZW4gZmlyc3REaWZmZXJlbmNlIHdhcyAtMS4gT3VyIGFsZ28gaGFzIGZhaWxlZC4gTGV0IG9yaWdpbmFsIGFsZ28gcnVuLgotCQlyZXR1cm4gMDsKLQl9Ci0KLQkKLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBMaXN0IG1vZkNoaWxkcmVuLCBMaXN0IGRvbUNoaWxkcmVuLCBOb3RpZmllciBvd25lcikgewotCi0JCWludCBpID0gMDsKLQkJTm9kZSBwYXJlbnQgPSBmaW5kRE9NUGF0aChub2RlLCBtYXAsIGZhbHNlKTsKLQkJaWYoZG9tQ2hpbGRyZW4uc2l6ZSgpIC0gbW9mQ2hpbGRyZW4uc2l6ZSgpID09IDEpewotCQkJLy9hbiBlbWYgb2JqZWN0IGhhcyBiZWVuIGRlbGV0ZWQuIFJlbW92ZSBpdCBmcm9tIHRoZSBkb20gYXMgd2VsbAotCQkJaSA9IHVwZGF0ZURPTVNpbmdsZVJlbW92ZShwYXJlbnQsIG1vZkNoaWxkcmVuLCBkb21DaGlsZHJlbik7Ci0JCX0KLQkJLy9Vc2VkIGZvciBpbnNlcnRpbmcgcHJpbWl0aXZlcwotCQlMaXN0IGlub3JkZXJET01DaGlsZHJlbiA9IG51bGw7Ci0JCWlmKGkgPCBtb2ZDaGlsZHJlbi5zaXplKCkpewotCQkJaWYgKCFtYXAuaXNPYmplY3RNYXAoKSB8fCBtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJCWlub3JkZXJET01DaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbm9yZGVyRE9NQ2hpbGRyZW4uYWRkQWxsKGRvbUNoaWxkcmVuKTsKLQkJCX0KLQkJfQotCQkvLyBHbyB0aG91Z2ggdGhlIE1PRiBjaGlsZHJlbiBjaGVja2luZyB0byBzZWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLQkJLy8gTU9GIEFkYXB0ZXIgY2hpbGRyZW4gZXhpc3RzLiBJZiBub3QsIGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJLy8gQWxzbyBoYW5kbGVzIHJlb3JkZXJpbmcgY2hpbGRyZW4gdGhhdCBoYXZlIG1vdmVkLgotCQlmb3IgKDsgaSA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBtb2ZDaGlsZHJlbi5nZXQoaSk7Ci0JCQlFT2JqZWN0IG1vZkNoaWxkID0gbnVsbDsKLQotCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0KLQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgY2hpbGQgaXMgYSBNT0YgT2JqZWN0LgotCQkJaWYgKCFtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQltb2ZDaGlsZCA9IChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSk7Ci0JCQkJYWRhcHRlciA9IGdldEV4aXN0aW5nQWRhcHRlcihtb2ZDaGlsZCk7Ci0JCQl9Ci0KLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgaSA8IGRvbUNoaWxkcmVuLnNpemUoKSAmJiBkb21DaGlsZHJlbi5nZXQoaSkgPT0gYWRhcHRlci5nZXROb2RlKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKGRvbUNoaWxkcmVuLmlzRW1wdHkoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gQSBub2RlIGhhcyBiZWVuIHJlb3JkZXJlZCBpbiB0aGUgbGlzdAotCQkJCU5vZGUgcmVvcmRlck5vZGUgPSBhZGFwdGVyLmdldE5vZGUoKTsKLQkJCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSByZW9yZGVyTm9kZTsKLQkJCQlpZiAoaSA8IGRvbUNoaWxkcmVuLnNpemUoKSAmJiBkb21DaGlsZHJlbi5nZXQoaSkgIT0gcmVvcmRlck5vZGUpIHsKLQkJCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IChOb2RlKSBkb21DaGlsZHJlbi5nZXQoaSk7Ci0JCQkJfQotCQkJCWRvbUNoaWxkcmVuLnJlbW92ZShyZW9yZGVyTm9kZSk7Ci0JCQkJZG9tQ2hpbGRyZW4uYWRkKGksIHJlb3JkZXJOb2RlKTsKLQkJCQlpZiAocmVvcmRlck5vZGUgIT0gaW5zZXJ0QmVmb3JlTm9kZSkgewotCQkJCQlyZW9yZGVyRE9NQ2hpbGQocGFyZW50LCByZW9yZGVyTm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSwgbWFwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEEgbmV3IG5vZGUgaGFzIGJlZW4gYWRkZWQsIGNyZWF0ZSBpdAotCQkJCXBhcmVudCA9IGNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJCQlpZiAobW9mQ2hpbGQgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihtb2ZDaGlsZCwgbWFwKTsKLQkJCQkJTm9kZSBuZXdOb2RlID0gYWRhcHRlci5nZXROb2RlKCk7Ci0JCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgaSwgZG9tQ2hpbGRyZW4pOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBuZXdOb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCQkJZG9tQ2hpbGRyZW4uYWRkKGksIG5ld05vZGUpOwotCQkJCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBhZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCQl0cnkgewotCQkJCQkJaW5kZW50KG5ld05vZGUsIG1hcCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCQkJCX0KLQkJCQkJYWRhcHRlci51cGRhdGVET00oKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUaGUgbW9mIGZlYXR1cmUgaXMgYSBjb2xsZWN0aW9uIG9mIHByaW1pdGl2ZXMuCi0JCQkJCS8vIGNyZWF0ZSBhIG5ldyBkb20gbm9kZSBhbmQgbGlzdGVuIHRvIGl0LgotCQkJCQlFbGVtZW50IG5ld05vZGUgPSBjcmVhdGVOZXdOb2RlKG51bGwsIG1hcCk7Ci0JCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgaSwgaW5vcmRlckRPTUNoaWxkcmVuKTsKLQkJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGVBbmRXaGl0ZXNwYWNlKHBhcmVudCwgbmV3Tm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSk7Ci0JCQkJCWluZGVudChuZXdOb2RlLCBtYXApOwotCQkJCQlhZGRET01BZGFwdGVyKG5ld05vZGUpOyAvLyBIb29rIHVwIGxpc3RlbmVycwotCQkJCQlkb21DaGlsZHJlbi5hZGQoaSwgbmV3Tm9kZSk7Ci0JCQkJCWlmKGlub3JkZXJET01DaGlsZHJlbiAhPSBudWxsKXsKLQkJCQkJCWlub3JkZXJET01DaGlsZHJlbi5hZGQobmV3Tm9kZSk7Ci0JCQkJCX0KLQkJCQkJVGV4dCBuZXdUZXh0ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShtYXAuY29udmVydFZhbHVlVG9TdHJpbmcoY2hpbGQsIChFT2JqZWN0KSBvd25lcikpOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZShuZXdOb2RlLCBuZXdUZXh0LCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBhZGFwdGVycy4KLQkJZm9yICg7IGkgPCBkb21DaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50LCAoRWxlbWVudCkgZG9tQ2hpbGRyZW4uZ2V0KGkpKTsKLQkJfQotCi0JCS8vIElmIHRoZXJlIGFyZSBubyBNT0YgY2hpbGRyZW4sIHJlbW92ZSBhbnkgdW5uZWNlc3NhcnkgRE9NIG5vZGUgcGF0aHMKLQkJaWYgKG1vZkNoaWxkcmVuLnNpemUoKSA9PSAwICYmIG1hcC5oYXNET01QYXRoKCkpIHsKLQkJCWlmIChtYXAuc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKChFT2JqZWN0KSBvd25lcikpCi0JCQkJY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOwotCQkJZWxzZQotCQkJCXJlbW92ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIExpc3QgbW9mQ2hpbGRyZW4sIExpc3QgZG9tQ2hpbHJlbikgewotCi0JCUhhc2h0YWJsZSBub2RlVG9BZGFwdGVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBnZXRFeGlzdGluZ0FkYXB0ZXIoKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChpKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCW5vZGVUb0FkYXB0ZXIucHV0KGFkYXB0ZXIuZ2V0Tm9kZSgpLCBhZGFwdGVyKTsKLQkJfQotCi0JCS8vIEdvIHRob3VnaCB0aGUgRE9NIGNoaWxkcmVuIGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgY29ycmVzcG9uZGluZwotCQkvLyBNT0YgQWRhcHRlciBjaGlsZHJlbiBleGlzdHMuIElmIG5vdCwgY3JlYXRlIHRoZSBhZGFwdGVyLgotCQkvLyBBbHNvIGhhbmRsZXMgcmVvcmRlcmluZyBjaGlsZHJlbiB0aGF0IGhhdmUgbW92ZWQuCi0JCWludCBpID0gMDsKLQkJaW50IG1vZkluZGV4ID0gMDsKLQkJTGlzdCBhZGFwdGVyc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKDsgaSA8IGRvbUNoaWxyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUVsZW1lbnQgY2hpbGROb2RlID0gKEVsZW1lbnQpIGRvbUNoaWxyZW4uZ2V0KGkpOwotCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGkgPCBtb2ZDaGlsZHJlbi5zaXplKCkgPyBnZXRFeGlzdGluZ0FkYXB0ZXIoKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChpKSkgOiBudWxsOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiAhYWRhcHRlci5pc01PRlByb3h5KCkgJiYgYWRhcHRlci5nZXROb2RlKCkgPT0gY2hpbGROb2RlKSB7Ci0JCQkJLy8gQmVjYXVzZSB0aGUgYWRhcHRlciBpcyBwcm9jZXNzaW5nIFNUUlVDVFVSRV9DSEFOR0VEIGZyb20gdGhlCi0JCQkJLy8gRE9NLCB3ZQotCQkJCS8vIG11c3QgdXBkYXRlIGFsbCB0aGUgd2F5IGRvd24gdGhlIHRyZWUgc2luY2UgYW55dGhpbmcgdW5kZXIKLQkJCQkvLyB0aGUgbm90aWZ5aW5nCi0JCQkJLy8gRE9NIG5vZGUgY291bGQgaGF2ZSBjaGFuZ2VkLgotCQkJCWFkYXB0ZXIudXBkYXRlTU9GKCk7Ci0JCQkJbW9mSW5kZXgrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgbm9kZVRvQWRhcHRlci5nZXQoY2hpbGROb2RlKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZW9yZGVySWZOZWNlc3NhcnkoKEVMaXN0KSBtb2ZDaGlsZHJlbiwgYWRhcHRlci5nZXRFT2JqZWN0KCksIG1vZkluZGV4KTsKLQkJCQltb2ZJbmRleCsrOwotCQkJfSBlbHNlIHsKLQkJCQlhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihjaGlsZE5vZGUsIG1hcCk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJLy9XZSBkb24ndCB3YW50IHRvIHB1c2ggYW55dGhpbmcgYmFjayB0byB0aGUgY2hpbGQgZG9tCi0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCQkJbWFwLnNldE1PRlZhbHVlKGdldFRhcmdldCgpLCBhZGFwdGVyLmdldFRhcmdldCgpLCBtb2ZJbmRleCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCQlhZGFwdGVyc1RvVXBkYXRlLmFkZChhZGFwdGVyKTsKLQkJCQkJbW9mSW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBhZGFwdGVycy4KLQkJLy9tYWtlIGEgY29weSBzbyB3ZSByZW1vdmUgYWxsIGl0ZW1zIC0gYnVnIDE5MjQ2OCAKLQkJCQlPYmplY3RbXSBjaGlsZHJlbkFycmF5ID0gbW9mQ2hpbGRyZW4udG9BcnJheSgpOwotCQkJCWZvciAoOyBpIDwgY2hpbGRyZW5BcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQlyZW1vdmVNT0ZWYWx1ZSgoRU9iamVjdCkgY2hpbGRyZW5BcnJheVtpXSwgbWFwKTsKLQkJIAkJfQotCi0JCS8vIFRoZSBhZGFwdGVycyBjYW5ub3QgYmUgdXBkYXRlZCBhcyB0aGV5IGNyZWF0ZWQuIFdlIG11c3Qgd2FpdCB1bnRpbAotCQkvLyBhbGwgb2YgdGhlIGFkYXB0ZXJzIGFyZSBjcmVhdGVkIGFuZCByZW1vdmVkIGJlZm9yZSB1cGRhdGluZywKLQkJLy8gb3RoZXJ3aXNlCi0JCS8vIHdlIGNhbiBnZXQgaW4gYSBzdGF0ZSB3aGVyZSB0aGVyZSBhcmUgYWRhcHRlcnMgZmlnaHRpbmcgd2l0aAotCQkvLyBlYWNob3RoZXIKLQkJLy8gKG9uZSBmb3IgdGhlIG9sZCBub2RlIGFuZCBvbmUgZm9yIHRoZSBuZXcgbm9kZSkuCi0JCWZvciAoaW50IGogPSAwOyBqIDwgYWRhcHRlcnNUb1VwZGF0ZS5zaXplKCk7IGorKykgewotCQkJKChFTUYyRE9NQWRhcHRlcikgYWRhcHRlcnNUb1VwZGF0ZS5nZXQoaikpLnVwZGF0ZU1PRigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGZlYXR1cmUncyB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRBZGFwdGVyCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkVNRjJET01BZGFwdGVyIFRoZSBjaGlsZCB0byByZW1vdmUKLQkgKiBAcGFyYW0gbW9mQXR0cmlidXRlTmFtZQotCSAqICAgICAgICAgICAgU3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtb2ZBdHRyaWJ1dGUgdG8gcmVtb3ZlIHRoZSBjaGlsZCBmcm9tLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1PRlZhbHVlKEVPYmplY3QgdmFsdWUsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCi0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIodmFsdWUsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSBCT1RIIHRoZSBNT0YgT2JqZWN0IGFuZCB0aGUgRE9NIE5vZGVzCi0JCQlyZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCQl2YWx1ZS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCX0KLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHRyYW5zbGF0b3IuZ2V0RmVhdHVyZSgpOwotCQlib29sZWFuIGRvVW5sb2FkID0gZmVhdHVyZSA9PSBudWxsIHx8ICh0cmFuc2xhdG9yLmlzT2JqZWN0TWFwKCkgJiYgKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpOwotCi0JCS8vIHRyYW5zbGF0b3IucmVtb3ZlTU9GVmFsdWUoKSB3YXMgaGVyZSBvcmlnaW5hbGx5Ci0KLQkJLy8gVW5sb2FkIHRoZSBvYmplY3RzLgotCQlpZiAoZG9VbmxvYWQpCi0JCQlFeHRlbmRlZEVjb3JlVXRpbC51bmxvYWQodmFsdWUpOwotCi0JCS8vIFJlbW92ZSB0aGUgTU9GIHZhbHVlCi0JCXRyYW5zbGF0b3IucmVtb3ZlTU9GVmFsdWUoZ2V0VGFyZ2V0KCksIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW9yZGVySWZOZWNlc3NhcnkoRUxpc3QgZW1mQ2hpbGRyZW4sIEVPYmplY3QgZU9iaiwgaW50IGVtZkluZGV4KSB7Ci0JCWludCBjdXJySW5kZXggPSBlbWZDaGlsZHJlbi5pbmRleE9mKGVPYmopOwotCQlpZiAoY3VyckluZGV4ID4gLTEgJiYgY3VyckluZGV4ICE9IGVtZkluZGV4KQotCQkJZW1mQ2hpbGRyZW4ubW92ZShlbWZJbmRleCwgZU9iaik7Ci0JfQotCi0JLyoqCi0JICogZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluZGVudChOb2RlIG5ld05vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kSW5zZXJ0QmVmb3JlTm9kZShOb2RlIHBhcmVudE5vZGUsIFRyYW5zbGF0b3IgbWFwLCBMaXN0IG1vZkxpc3QsIGludCBtb2ZJbngsIExpc3QgZG9tTGlzdCkgewotCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBudWxsOwotCi0JCS8vIElmIHRoZXJlIGFyZSBubyBjdXJyZW50IGRvbSBjaGlsZHJlbiBmb3IgdGhpcyBtYXAsIGZpbmQgdGhlIGluaXRpYWwKLQkJLy8gaW5zZXJ0IHBvcy4KLQkJaWYgKGRvbUxpc3Quc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gZmluZEluaXRpYWxJbnNlcnRCZWZvcmVOb2RlKHBhcmVudE5vZGUsIG1hcCk7Ci0KLQkJLy8gSWYgc29tZSBkb20gbm9kZXMgdGhlbiBmaW5kIHRoZSBjb3JyZWN0IG9uZSB0byBpbnNlcnQgYmVmb3JlLgotCQlpbnQgaSA9IG1vZklueCArIDE7Ci0JCXdoaWxlIChpIDwgbW9mTGlzdC5zaXplKCkgJiYgaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBTdGFydCBhdCB0aGUgbW9mSW54IHBhc3NlZCBpbiBhbmQgbG9vayBmb3J3YXJkIGZvciB0aGUgZmlyc3QKLQkJCS8vIGFkYXB0ZWQKLQkJCS8vIE1PRiBvYmplY3QuIFVzZSB0aGF0IG5vZGUgYXMgdGhlIGluc2VydCBiZWZvcmUgbm9kZS4KLQkJCU9iamVjdCBvID0gbW9mTGlzdC5nZXQoaSk7Ci0JCQlpZiAoIW1hcC5pc09iamVjdE1hcCgpIHx8IG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKQotCQkJCWJyZWFrOwotCQkJRU9iamVjdCB0TU9GT2JqZWN0ID0gKEVPYmplY3QpIG87Ci0JCQlFTUYyRE9NQWRhcHRlciB0QWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcih0TU9GT2JqZWN0LCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJCWlmICh0QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IHRBZGFwdGVyLmdldE5vZGUoKTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCi0JCS8vIEhhbmRsZSBpbnNlcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQlpZiAoaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IERPTVV0aWxpdGllcy5nZXROZXh0Tm9kZVNpYmxpbmcoKE5vZGUpIGRvbUxpc3QuZ2V0KGRvbUxpc3Quc2l6ZSgpIC0gMSkpOwotCQlpZiAoaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlTm9kZSA9ICgoTm9kZSkgZG9tTGlzdC5nZXQoZG9tTGlzdC5zaXplKCkgLSAxKSkuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kSW5pdGlhbEluc2VydEJlZm9yZU5vZGUoTm9kZSBwYXJlbnROb2RlLCBUcmFuc2xhdG9yIG1hcE5vZGUpIHsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0KLQkJLy8gRmlyc3QsIHNraXAgcGFzdCBhbGwgdGhlIG1hcHMgaW4gdGhlIG9yZGVyZWQgY29sbGVjdGlvbgotCQkvLyBvZiBtYXBzLiBXZSB3YW50IHRvIGJlZ2luIHRoZSBzZWFyY2ggd2l0aCB0aGlzIG5vZGUuCi0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWFwc1tpXSA9PSBtYXBOb2RlKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gTm93IHNlYXJjaCBnbyB0aHJvdWdoIGVhY2ggbWFwIG5vZGUgdW50aWwgYSBjaGlsZCBub2RlIG1hdGNoaW5nCi0JCS8vIGl0cyBET00gbmFtZSBpcyBmb3VuZC4KLQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaiA9IGk7IGogPCBtYXBzLmxlbmd0aCAmJiBpbnNlcnRCZWZvcmVOb2RlID09IG51bGw7IGorKykgewotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJVHJhbnNsYXRvciBub2RlVG9GaW5kTWFwID0gbWFwc1tqXTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJTm9kZSBub2RlID0gY2hpbGROb2Rlcy5pdGVtKGspOwotCQkJCWlmIChub2RlVG9GaW5kTWFwLmlzTWFwRm9yKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IG5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlTm9kZTsKLQl9Ci0KLQkvKgotCSAqIFRyYXZlcnNlcyB0aGUgcGF0aCB0aGF0IDxtYXA+IHNwZWNpZmllcy4gUmV0dXJucyB0aGUgbGFzdCBub2RlIG9mIHRoZSBwYXRoIHRoYXQgd2FzIGFibGUgdG8KLQkgKiBiZSB0cmF2ZXJzZWQgb3IgbnVsbCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgdHJhdmVyc2VkLiBUaGUgPGFkZEFkYXB0ZXJzPiBib29sZWFuIGlzIHVzZWQgdG8KLQkgKiBkZXRlcm1pbmUgaWYgdGhlIHJlY2VpdmVyIGlzIGFkZGVkIGFzIGFuIGFkYXB0ZXIgdG8gZXZlcnkgbm9kZSBmb3VuZCBvbiB0aGUgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kRE9NUGF0aChOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXAsIGJvb2xlYW4gYWRkQWRhcHRlcnMpIHsKLQotCQlTdHJpbmcgcGF0aCA9IG1hcC5nZXRET01QYXRoKCk7Ci0JCU5vZGUgY3VyTm9kZSA9IHBhcmVudDsKLQkJSXRlcmF0b3IgaXRlciA9IERPTVV0aWxpdGllcy5jcmVhdGVQYXRoSXRlcmF0b3IocGF0aCk7Ci0KLQkJd2hpbGUgKGN1ck5vZGUgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIG5vZGVOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQljdXJOb2RlID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChjdXJOb2RlLCBub2RlTmFtZSk7Ci0JCQlpZiAoYWRkQWRhcHRlcnMgJiYgY3VyTm9kZSAhPSBudWxsKSB7Ci0JCQkJYWRkRE9NQWRhcHRlcihjdXJOb2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3VyTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgRE9NIG5vZGUgY2hpbGRyZW4gdGhhdCBjdXJyZW50bHkgZXhpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZ25hbWUuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RE9NQ2hpbGRyZW4oTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlOb2RlIHBhcmVudCA9IGZpbmRET01QYXRoKG5vZGUsIG1hcCwgdHJ1ZSk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkcmVuKHBhcmVudCwgbWFwLmdldERPTU5hbWVzKCkpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyZWZPYmplY3QsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNNT0ZQcm94eSgpKSB7Ci0JCQlyZW1vdmVET01BZGFwdGVyKGFkYXB0ZXIuZ2V0Tm9kZSgpLCBhZGFwdGVyKTsKLQkJCXJlZk9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQlhZGFwdGVyID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltQWRkRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJZlJlbmRlcmVyLnJlZ2lzdGVyRE9NQWRhcHRlcihhTm9kZSwgYW5BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCXJldHVybiBmUmVuZGVyZXIuZ2V0RXhpc3RpbmdET01BZGFwdGVyKGFOb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQlmUmVuZGVyZXIucmVtb3ZlRE9NQWRhcHRlcihhTm9kZSwgYW5BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRET01BZGFwdGVyKE5vZGUgY2hpbGROb2RlKSB7Ci0KLQkJLy8gT25seSBhZGQgdGhlIGFkYXB0ZXIgaWYgdGhpcyBpcyBhbiBjaGlsZCBub2RlIHRoYXQgd2lsbCBub3QgYmUKLQkJLy8gYWRhcHRlZC4gRm9yIGluc3RhbmNlIGEgc3VidHJlZSB0aGF0IG1hcHMgdG8gYSBNT0YgYXR0cmlidXRlCi0JCS8vIHNldHRpbmcuCi0JCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRU1GMkRPTUFkYXB0ZXIgYXR0ckFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKGNoaWxkTm9kZSk7Ci0KLQkJCWlmIChhdHRyQWRhcHRlciA9PSBudWxsIHx8IGF0dHJBZGFwdGVyLmdldE5vZGUoKSAhPSBnZXROb2RlKCkpIHsKLQkJCQkvLyBJZiB0aGUgbm9kZSBpcyBhZGFwdGVkLCBidXQgbm90IGJ5IHRoaXMgYWRhcHRlciB0aGVuIHJlbW92ZQotCQkJCS8vIGl0LiBUaGlzIGhhcHBlbnMgdG8gbm9uLW9iamVjdCBjaGlsZHJlbiB3aGVuIHRoZSBwYXJlbnQgdGFnCi0JCQkJLy8gbmFtZSBpcyBjaGFuZ2VkLgotCQkJCXJlbW92ZURPTUFkYXB0ZXIoY2hpbGROb2RlLCBhdHRyQWRhcHRlcik7Ci0KLQkJCQlpZiAoZkRlYnVnKSB7Ci0JCQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdENISUxEOiBBZGRpbmcgRE9NIGFkYXB0ZXI6ICIgKyB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRcdHRvOiAiICsgY2hpbGROb2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlwcmltQWRkRE9NQWRhcHRlcihjaGlsZE5vZGUsIHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVvcmRlciBhIGNoaWxkIGJlZm9yZSBhIGdpdmVuIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW9yZGVyRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSwgTm9kZSBpbnNlcnRCZWZvcmVOb2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQl0cnkgewotCQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCBmYWxzZSk7Ci0JCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIGluc2VydEJlZm9yZU5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld2xpbmVTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBET01VdGlsaXRpZXMuTkVXTElORV9TVFJJTkc7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmltR2V0SW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gRE9NVXRpbGl0aWVzLmdldEluZGVudFN0cmluZyhub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBjaGlsZCBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSkgewotCQlyZW1vdmVET01DaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGNoaWxkIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01DaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGROb2RlLCBib29sZWFuIHJlbW92ZUFkYXB0ZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChjaGlsZE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBMb29rIGZvciBhbnkgd2hpdGVzcGFjZSBwcmVjZWVkaW5nIHRoZSBub2RlIGJlaW5nCi0JCQkvLyByZW1vdmVkIGFuZCByZW1vdmUgaXQgYXMgd2VsbC4KLQkJCVRleHQgcHJldlRleHQgPSBET01VdGlsaXRpZXMuZ2V0UHJldmlvdXNUZXh0U2libGluZyhjaGlsZE5vZGUpOwotCQkJaWYgKHByZXZUZXh0ICE9IG51bGwgJiYgRE9NVXRpbGl0aWVzLmlzV2hpdGVzcGFjZShwcmV2VGV4dCkpIHsKLQkJCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKHByZXZUZXh0KTsKLQkJCX0KLQkJCS8vIFJlbW92ZSB0aGUgbm9kZS4KLQkJCWlmIChyZW1vdmVBZGFwdGVyKQotCQkJCXJlbW92ZUFkYXB0ZXJzKGNoaWxkTm9kZSk7Ci0JCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIERPTSBhZGFwdGVycyBmcm9tIHRoZSBub2RlIEFORCBhbGwgaXRzIGNoaWxkIG5vZGVzLCByZWN1cnNpdmVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBZGFwdGVycyhOb2RlIG5vZGUpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIobm9kZSk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCS8vIFJlbW92ZSB0aGUgYWRhcHRlciBmcm9tIGJvdGggdGhlIERPTSBub2RlIGFuZCB0aGUgTU9GIE9iamVjdC4KLQkJCXJlbW92ZURPTUFkYXB0ZXIobm9kZSwgYWRhcHRlcik7Ci0JCQlpZiAoYWRhcHRlci5nZXROb2RlKCkgPT0gbm9kZSkgewotCQkJCU5vdGlmaWVyIGxvY2FsVGFyZ2V0ID0gYWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJCQlpZiAobG9jYWxUYXJnZXQgIT0gbnVsbCkKLQkJCQkJbG9jYWxUYXJnZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCU5vZGVMaXN0IG5sID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gbmwuaXRlbShpKTsKLQkJCXJlbW92ZUFkYXB0ZXJzKG4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgPG1hcD51bmRlciA8bm9kZT4uIE9ubHkgdGhlIHBvcnRpb24gb2YgdGhlIHBhdGggdGhhdCBkb2VzIG5vdAotCSAqIGV4aXN0IChpZiBhbnkpIGlzIGNyZWF0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uVHJhbnNsYXRvcgotCSAqLwotCXByb3RlY3RlZCBOb2RlIGNyZWF0ZURPTVBhdGgoTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlJdGVyYXRvciBpID0gRE9NVXRpbGl0aWVzLmNyZWF0ZVBhdGhJdGVyYXRvcihtYXAuZ2V0RE9NUGF0aCgpKTsKLQkJTm9kZSBjdXJOb2RlID0gbm9kZTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWN1ck5vZGUgPSBmaW5kT3JDcmVhdGVOb2RlKG5vZGUsIG1hcCwgbm9kZU5hbWUpOwotCQl9Ci0JCXJldHVybiBjdXJOb2RlOwotCX0KLQotCXByb3RlY3RlZCBFbGVtZW50IGZpbmRPckNyZWF0ZU5vZGUoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwLCBTdHJpbmcgc2VnbWVudCkgewotCQlOb2RlIG5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKHBhcmVudCwgc2VnbWVudCk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCS8vIFRoZSBub2RlIGRpZCBub3QgYWxyZWFkeSBleGlzdCwgY3JlYXRlIGl0LgotCQkJRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCW5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudChzZWdtZW50KTsKLQkJCWlmIChtYXAuaXNFbXB0eVRhZygpKQotCQkJCXNldEVtcHR5VGFnKChFbGVtZW50KSBub2RlKTsKLQotCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluaXRpYWxJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwKTsKLQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQsIG5vZGUsIGluc2VydEJlZm9yZU5vZGUpOwotCQkJaW5kZW50KG5vZGUsIG1hcCk7Ci0JCQlhZGRET01BZGFwdGVyKG5vZGUpOyAvLyBIb29rIHVwIGxpc3RlbmVycwotCQl9Ci0JCXJldHVybiAoRWxlbWVudCkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIG5vZGUgcGFzc2VkIGluIGlmIGl0IGhhcyBvbmx5IHdoaXRlc3BhY2Ugbm9kZXMgYXMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjawotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUlmRW1wdHkoTm9kZSBub2RlKSB7Ci0JCU5vZGVMaXN0IG5sID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0KLQkJLy8gUnVuIHRocm91Z2ggYWxsIHRoZSBub2RlcyBjaGlsZHJlbi4gSWYgYSBub24td2hpdGVzcGFjZSBub2RlCi0JCS8vIHBpcyBmb3VuZCwgYmFpbC4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAoIURPTVV0aWxpdGllcy5pc1doaXRlc3BhY2UoY2hpbGROb2RlKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIGFyZSBubyBub24td2hpdGVzcGFjZSBjaGFycywgc28KLQkJLy8gc2ltcGx5IHJlbW92ZSB0aGUgbm9kZS4KLQkJcmVtb3ZlRE9NQ2hpbGQobm9kZS5nZXRQYXJlbnROb2RlKCksIG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgRE9NIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+ZnJvbSA8bm9kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01QYXRoKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJTm9kZSBjaGlsZE5vZGUgPSBmaW5kRE9NUGF0aChub2RlLCBtYXAsIGZhbHNlKTsKLQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsICYmIGNoaWxkTm9kZSAhPSBub2RlKSB7Ci0JCQlyZW1vdmVJZkVtcHR5KGNoaWxkTm9kZSk7Ci0JCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVBZGFwdGVyKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0JCS8vCUFzc2VydC5pc05vdE51bGwoY2hpbGRNYXAuZ2V0Q2hpbGRBZGFwdGVyQ2xhc3MoKSk7Ci0JCUFzc2VydC5pc05vdE51bGwobW9mT2JqZWN0KTsKLQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihtb2ZPYmplY3QuZUFkYXB0ZXJzKCksIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc01PRlByb3h5KCkpIHsKLQkJCXJlbW92ZUFkYXB0ZXJzKGFkYXB0ZXIuZ2V0Tm9kZSgpKTsKLQkJCW1vZk9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQlhZGFwdGVyID0gbnVsbDsKLQkJfQotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJYWRhcHRlciA9IHByaW1DcmVhdGVBZGFwdGVyKG1vZk9iamVjdCwgY2hpbGRNYXApOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1DcmVhdGVBZGFwdGVyKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0KLQkJRWxlbWVudCBuZXdOb2RlID0gY3JlYXRlTmV3Tm9kZShtb2ZPYmplY3QsIGNoaWxkTWFwKTsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NQWRhcHRlckltcGwobW9mT2JqZWN0LCBuZXdOb2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1DcmVhdGVBZGFwdGVyKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01BZGFwdGVySW1wbChub2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0KLQkJLy9Bc3NlcnQuaXNOb3ROdWxsKGNoaWxkTWFwLmdldENoaWxkQWRhcHRlckNsYXNzKCkpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKG5vZGUpOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzTU9GUHJveHkoKSB8fCBhZGFwdGVyLmdldFRhcmdldCgpID09IG51bGwpIHsKLQkJCQlyZW1vdmVET01BZGFwdGVyKG5vZGUsIGFkYXB0ZXIpOwotCQkJCWlmIChhZGFwdGVyLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQkJfQotCQkJCWFkYXB0ZXIgPSBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWRhcHRlciA9IHByaW1DcmVhdGVBZGFwdGVyKG5vZGUsIGNoaWxkTWFwKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVOZXdOb2RlKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0JCU5vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJRG9jdW1lbnQgZG9jID0gKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChjaGlsZE1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOwotCQlpZiAoY2hpbGRNYXAuaXNFbXB0eVRhZygpKQotCQkJc2V0RW1wdHlUYWcoZWxlbWVudCk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW1wdHlUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVJldmlzaXQudG9EbygpOwotCQkvL05lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZG8gdGhpcyB3aXRoIHB1cmUgRE9NIGFwaXMsIGlmIGl0IGlzCi0JCS8vIHBvc3NpYmxlCi0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBNT0Ygb2JqZWN0IGlzIGEgcHJveHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNT0ZQcm94eSgpIHsKLQkJaWYgKGlzUm9vdCB8fCB0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoSW50ZXJuYWxFT2JqZWN0KSB0YXJnZXQpLmVJc1Byb3h5KCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKLQkJaWYgKGlzUm9vdCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVPYmplY3QpIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERPTSBub2RlIHRoYXQgdGhlIHRhcmdldCBvZiB0aGlzIGFkYXB0ZXIgbWFwcyB0by4gSWYgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IG1hcHMgdG8KLQkgKiBtb3JlIHRoYW4gb25lIERPTSBub2RlLCB0aGlzIG5vZGUgaXMgdGhlIHRvcC1tb3N0IG5vZGUuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBhTm9kZSkgewotCQlmTm9kZSA9IGFOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURPTSgpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJcHJpbVVwZGF0ZURPTSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRigpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJcHJpbVVwZGF0ZU1PRigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET00oKSB7Ci0JCWlmIChpc1Jvb3QpCi0JCQl1cGRhdGVET01Sb290RmVhdHVyZSgpOwotCQllbHNlIHsKLQkJCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdXBkYXRlRE9NRmVhdHVyZShtYXBzW2ldLCBnZXROb2RlKCksIGdldEVPYmplY3QoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmltVXBkYXRlTU9GKCkgewotCQlpZiAoaXNSb290KQotCQkJdXBkYXRlTU9GUm9vdEZlYXR1cmUoKTsKLQkJZWxzZSB7Ci0JCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJCXVwZGF0ZU1PRkZlYXR1cmUobWFwc1tpXSwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NUm9vdEZlYXR1cmUoKSB7Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKGZUcmFuc2xhdG9yLCBmTm9kZSwgZ2V0UmVzb3VyY2VDb250ZW50cygpLCBnZXRET01DaGlsZHJlbihmTm9kZSwgZlRyYW5zbGF0b3IpLCBudWxsKTsKLQkJCXVwZGF0ZURPTURvY3VtZW50VHlwZSgpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRlJvb3RGZWF0dXJlKCkgewotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJdXBkYXRlTU9GRG9jdW1lbnRUeXBlKCk7Ci0JCQlwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKGZUcmFuc2xhdG9yLCBmTm9kZSwgZ2V0UmVzb3VyY2VDb250ZW50cygpLCBnZXRET01DaGlsZHJlbihmTm9kZSwgZlRyYW5zbGF0b3IpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlIGdldERvY3VtZW50VHlwZSgpIHsKLQkJcmV0dXJuICgoRG9jdW1lbnQpIGZOb2RlKS5nZXREb2N0eXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChUcmFuc2xhdG9yUmVzb3VyY2UpIGdldFRhcmdldCgpOwotCX0KLQotCXByb3RlY3RlZCBFTGlzdCBnZXRSZXNvdXJjZUNvbnRlbnRzKCkgewotCQlpZiAoIWlzUm9vdCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuICgoUmVzb3VyY2UpIGdldFRhcmdldCgpKS5nZXRDb250ZW50cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTURvY3VtZW50VHlwZSgpIHsKLQotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsLCBzeXN0ZW1JZCA9IG51bGwsIG9sZFB1YmxpY0lkLCBvbGRTeXN0ZW1JZDsKLQkJb2xkUHVibGljSWQgPSBkb2NUeXBlID09IG51bGwgPyBudWxsIDogZG9jVHlwZS5nZXRQdWJsaWNJZCgpOwotCQlvbGRTeXN0ZW1JZCA9IGRvY1R5cGUgPT0gbnVsbCA/IG51bGwgOiBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0JCVRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlwdWJsaWNJZCA9IHJlc291cmNlLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9IHJlc291cmNlLmdldFN5c3RlbUlkKCk7Ci0JCQlpZiAoIShTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChwdWJsaWNJZCwgb2xkUHVibGljSWQpICYmIFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHN5c3RlbUlkLCBvbGRTeXN0ZW1JZCkpKQotCQkJCWZSZW5kZXJlci5yZXBsYWNlRG9jdW1lbnRUeXBlKHJlc291cmNlLmdldERvY3R5cGUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTURvY3VtZW50VHlwZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFRyYW5zbGF0b3JSZXNvdXJjZS5ET0NfVFlQRV9GRUFUVVJFKQotCQkJdXBkYXRlRE9NRG9jdW1lbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTU9GRG9jdW1lbnRUeXBlKCkgewotCi0JCVRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGwsIHN5c3RlbUlkID0gbnVsbDsKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQotCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQlwdWJsaWNJZCA9IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJCXN5c3RlbUlkID0gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JCWlmICgoIShTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChwdWJsaWNJZCwgcmVzb3VyY2UuZ2V0UHVibGljSWQoKSkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoc3lzdGVtSWQsIHJlc291cmNlLmdldFN5c3RlbUlkKCkpKSkgfHwgCi0JCQkJKChyZXNvdXJjZS5nZXRQdWJsaWNJZCgpID09IG51bGwpIHx8IHJlc291cmNlLmdldFN5c3RlbUlkKCkgPT0gbnVsbCkpCi0JCQlyZXNvdXJjZS5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0KLQkJaWYgKGlzUm9vdCkgewotCQkJbm90aWZ5Q2hhbmdlZEZvclJvb3QobXNnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaXNEZXBlbmRlbmN5RmVhdHVyZShtc2cpKQotCQkJaGFuZGxlRGVwZW5kZW5jeUZlYXR1cmUobXNnKTsKLQotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWRlYnVnTU9GTm90aWZ5KG1zZyk7Ci0KLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkUgOgotCQkJCVRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IGZpbmRUcmFuc2xhdG9yKG1zZyk7Ci0JCQkJaWYgKHRyYW5zbGF0b3IgPT0gbnVsbCkKLQkJCQkJdHJhbnNsYXRvciA9IGFkZFZhcmlhYmxlVHJhbnNsYXRvcklmTmVjZXNzYXJ5KG1zZyk7Ci0JCQkJaWYgKHRyYW5zbGF0b3IgIT0gbnVsbCkKLQkJCQkJdXBkYXRlRE9NRmVhdHVyZSh0cmFuc2xhdG9yLCBnZXROb2RlKCksIGdldEVPYmplY3QoKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGFuZ2VkRm9yUm9vdChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJZGVidWdNT0ZOb3RpZnkobXNnKTsKLQotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQkJcHJpbVVwZGF0ZURPTSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLQkJCQl1cGRhdGVET01Eb2N1bWVudFR5cGUobXNnKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRXRvb2xzQ29weVNlc3Npb24uUkVTT1VSQ0VfQ09QSUVEIDoKLQkJCQl1cGRhdGVET00oKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlcGVuZGVuY3lBZGFwdGVyKEVPYmplY3QgY2hpbGQpIHsKLQkJQWRhcHRlciBleGlzdGluZyA9IEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoY2hpbGQsIERlcGVuZGVuY3lBZGFwdGVyLktFWSk7Ci0JCWlmIChleGlzdGluZyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlEZXBlbmRlbmN5QWRhcHRlciBmb3J3YXJkZXIgPSBuZXcgRGVwZW5kZW5jeUFkYXB0ZXIoKTsKLQkJY2hpbGQuZUFkYXB0ZXJzKCkuYWRkKGZvcndhcmRlcik7Ci0JCWZvcndhcmRlci5zZXRUYXJnZXQoY2hpbGQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERPTUFkYXB0ZXIoKSB7Ci0KLQkJcHJpbUFkZERPTUFkYXB0ZXIoZk5vZGUsIHRoaXMpOwotCQlpZiAoZkRlYnVnKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiQWRkaW5nIERPTSBhZGFwdGVyOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdHRvOiAiICsgZk5vZGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBHbyB0aHJvdWdoIHRoZSBtYXBzLiBBbGwgb2YgdGhlIERPTSBub2RlcyB0aGF0IGFyZSBub3QgbGlzdGVuZWQKLQkJLy8gdG8gYnkgYW5vdGhlciBET00gTm9kZSBhZGFwdGVyLCBtdXN0IGJlIGxpc3RlbmVkIHRvIGJ5IHRoaXMgYWRhcHRlci4KLQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IGZOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gY2hpbGROb2Rlcy5pdGVtKGopOwotCQkJaW50IG5vZGVUeXBlID0gY2hpbGROb2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAoIURPTVV0aWxpdGllcy5pc1RleHROb2RlKGNoaWxkTm9kZSkgJiYgbm9kZVR5cGUgIT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQlUcmFuc2xhdG9yIG1hcCA9IGZpbmRUcmFuc2xhdG9yKGNoaWxkTm9kZS5nZXROb2RlTmFtZSgpLCBmYWxzZSk7Ci0JCQkJaWYgKG1hcCAhPSBudWxsICYmIG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKQotCQkJCQlhZGRET01BZGFwdGVyKGNoaWxkTm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBhZGRWYXJpYWJsZVRyYW5zbGF0b3JJZk5lY2Vzc2FyeShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdCA9IGZUcmFuc2xhdG9yLmdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJVHJhbnNsYXRvciB0cmFucyA9IG51bGw7Ci0JCWlmIChmYWN0ICE9IG51bGwgJiYgZmFjdC5hY2NlcHRzKG1zZykpIHsKLQkJCXRyYW5zID0gZmFjdC5jcmVhdGUobXNnKTsKLQkJCWlmICh0cmFucyAhPSBudWxsKQotCQkJCWNoaWxkVHJhbnNsYXRvcnMgPSAoVHJhbnNsYXRvcltdKSBUcmFuc2xhdG9yLmNvbmNhdChjaGlsZFRyYW5zbGF0b3JzLCB0cmFucyk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHROb2RlKERvY3VtZW50IGRvYywgVHJhbnNsYXRvciBtYXAsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBub25udWxsdGV4dCA9ICh0ZXh0ICE9IG51bGwpID8gdGV4dCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBtYXAuaXNDREFUQUNvbnRlbnQoKSA/IGRvYy5jcmVhdGVDREFUQVNlY3Rpb24obm9ubnVsbHRleHQpIDogZG9jLmNyZWF0ZVRleHROb2RlKG5vbm51bGx0ZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RSZWFkQWhlYWROYW1lKCkgewotCQlpZiAoIWZUcmFuc2xhdG9yLmhhc1JlYWRBaGVhZE5hbWVzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlYWRBaGVhZE5hbWUgPSBudWxsOwotCi0JCVJlYWRBaGVhZEhlbHBlciBoZWxwZXIgPSBmVHJhbnNsYXRvci5nZXRSZWFkQWhlYWRIZWxwZXIoZk5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChoZWxwZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgY2hpbGQgPSBudWxsOwotCQlTdHJpbmdbXSBuYW1lcyA9IGhlbHBlci5nZXRWYWx1ZXMoKTsKLQkJaWYgKGhlbHBlci5nZXRDaGlsZERPTU5hbWUoKSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY2hpbGQgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKGZOb2RlLCBuYW1lc1tpXSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJcmVhZEFoZWFkTmFtZSA9IG5hbWVzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZCA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQoZk5vZGUsIGhlbHBlci5nZXRDaGlsZERPTU5hbWUoKSk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQlyZWFkQWhlYWROYW1lID0gRE9NVXRpbGl0aWVzLmdldENoaWxkVGV4dChjaGlsZCk7Ci0JCX0KLQkJaWYgKHJlYWRBaGVhZE5hbWUgPT0gbnVsbCkKLQkJCXJlYWRBaGVhZE5hbWUgPSBuYW1lc1swXTsKLQkJcmV0dXJuIHJlYWRBaGVhZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIHRleHQgZnJvbSA8bm9kZT5hbmQgY29udmVydHMgaXQgdG8gYW4gb2JqZWN0IHN1aXRhYmxlIGZvciBzZXR0aW5nIGludG8gPGZlYXR1cmU+Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBleHRyYWN0VmFsdWUoTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCwgRU9iamVjdCBlbWZPYmplY3QpIHsKLQotCQkvLyBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSB0ZXh0IGNoaWxkCi0JCU5vZGUgdGV4dE5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Q2hpbGRUZXh0Tm9kZShub2RlKTsKLQkJU3RyaW5nIHRyaW1tZWRWYWx1ZSA9IG51bGw7Ci0JCWlmICh0ZXh0Tm9kZSAhPSBudWxsKQotCQkJdHJpbW1lZFZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFwLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHRyaW1tZWRWYWx1ZSwgZW1mT2JqZWN0KTsKLQkJfSBjYXRjaCAoRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleCkgewotCQkJaGFuZGxlRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleCkgewotCQl0aHJvdyBleDsKLQotCX0KLQotCS8qCi0JICogRmluZHMgdGhlIGNoaWxkIG5vZGUgdGhhdCA8bWFwPiBzcGVjaWZpZXMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY2hpbGQgdGhhdCBzYXRpc2ZpZXMKLQkgKiA8bWFwPiB0aGVuIHRoZSBmaXJzdCBvbmUgaXMgcmV0dXJuZWQuCi0JICogCi0JICogVGhpcyBtZXRob2QgdHJhdmVyc2VzIHBhc3QgdGhlIGRvbVBhdGggaWYgb25lIGlzIHNwZWNpZmllZCBpbiB0aGUgPG1hcD4uCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZmluZERPTU5vZGUoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCXJldHVybiBmaW5kRE9NTm9kZShwYXJlbnQsIG1hcCwgZmFsc2UpOwotCX0KLQotCS8qCi0JICogRmluZHMgdGhlIGNoaWxkIG5vZGUgdGhhdCA8bWFwPiBzcGVjaWZpZXMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY2hpbGQgdGhhdCBzYXRpc2ZpZXMKLQkgKiA8bWFwPiB0aGVuIHRoZSBmaXJzdCBvbmUgaXMgcmV0dXJuZWQuIFRoZSA8YWRkQWRhcHRlcnM+IGJvb2xlYW4gaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlCi0JICogcmVjZWl2ZXIgaXMgYWRkZWQgYXMgYW4gYWRhcHRlciB0byBldmVyeSBub2RlIGZvdW5kIG9uIHRoZSBwYXRoLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHRyYXZlcnNlcyBwYXN0IHRoZSBkb21QYXRoIGlmIG9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDxtYXA+LgotCSAqLwotCXByb3RlY3RlZCBOb2RlIGZpbmRET01Ob2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCwgYm9vbGVhbiBhZGRBZGFwdGVycykgewotCi0JCS8vIEZpcnN0LCB0cmFjZSBkb3duIHRoZSBwYXRoCi0JCU5vZGUgY3VyTm9kZSA9IGZpbmRET01QYXRoKHBhcmVudCwgbWFwLCBhZGRBZGFwdGVycyk7Ci0JCWlmIChtYXAuaXNET01UZXh0VmFsdWUoKSB8fCBtYXAuaXNET01BdHRyaWJ1dGUoKSB8fCBjdXJOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gY3VyTm9kZTsKLQotCQkvLyBOb3cgbG9vayBmb3IgdGhlIGZpcnN0IERPTSBuYW1lIHdlIGNhbiBmaW5kCi0JCVN0cmluZ1tdIGRvbU5hbWVzID0gbWFwLmdldERPTU5hbWVzKCk7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBub2RlTmFtZSA9IGRvbU5hbWVzW2ldOwotCQkJTGlzdCBub2RlcyA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGRyZW4oY3VyTm9kZSwgbm9kZU5hbWUpOwotCQkJaWYgKG5vZGVzICE9IG51bGwgJiYgIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCWlmIChub2Rlcy5zaXplKCkgPiAxKQotCQkJCQloYW5kbGVJbnZhbGlkTXVsdGlOb2Rlcyhub2RlTmFtZSk7Ci0JCQkJbm9kZSA9IChOb2RlKSBub2Rlcy5nZXQoMCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlpZiAoYWRkQWRhcHRlcnMpCi0JCQkJCQlhZGRET01BZGFwdGVyKGN1ck5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW52YWxpZE11bHRpTm9kZXMoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkVNRjJET01BZGFwdGVySW1wbF9FUlJPUl8wLCBuZXcgT2JqZWN0W117bm9kZU5hbWV9KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgPG1hcD51bmRlciA8bm9kZT4uIE9ubHkgdGhlIHBvcnRpb24gb2YgdGhlIHBhdGggdGhhdCBkb2VzIG5vdAotCSAqIGV4aXN0IChpZiBhbnkpIGlzIGNyZWF0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uVHJhbnNsYXRvcgotCSAqLwotCXByb3RlY3RlZCBUZXh0IGZpbmRPckNyZWF0ZVRleHROb2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCwgU3RyaW5nIHRleHQpIHsKLQkJVGV4dCB0ZXh0Tm9kZSA9IERPTVV0aWxpdGllcy5nZXRDaGlsZFRleHROb2RlKHBhcmVudCk7Ci0JCWlmICh0ZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQl0ZXh0Tm9kZS5zZXREYXRhKHRleHQpOwotCQl9IGVsc2UgewotCQkJaWYgKCFpc0VtcHR5VGFnKChFbGVtZW50KSBwYXJlbnQpKSB7Ci0JCQkJVGV4dCBuZXdOb2RlID0gY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSwgbWFwLCB0ZXh0KTsKLQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG5ld05vZGUsIG51bGwpOwotCQkJCXJldHVybiBuZXdOb2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBmaW5kVHJhbnNsYXRvcihTdHJpbmcgdGFnTmFtZSwgYm9vbGVhbiBhdHRyaWJ1dGVNYXApIHsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJVHJhbnNsYXRvciBtYXAgPSBtYXBzW2ldOwotCQkJaWYgKG1hcC5pc01hcEZvcih0YWdOYW1lKSAmJiBhdHRyaWJ1dGVNYXAgPT0gbWFwLmlzRE9NQXR0cmlidXRlKCkpCi0JCQkJcmV0dXJuIG1hcHNbaV07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKE5vZGUgYU5vZGUpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIoYU5vZGUpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNNT0ZQcm94eSgpKSB7Ci0JCQlyZW1vdmVET01BZGFwdGVyKGFOb2RlLCBhZGFwdGVyKTsKLQkJCWFkYXB0ZXIuZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJYWRhcHRlciA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGVwZW5kZW5jeUZlYXR1cmUoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldE9sZFZhbHVlKCkgIT0gbnVsbCkKLQkJCXJlbW92ZURlcGVuZGVuY3lBZGFwdGVyKChFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCWlmIChtc2cuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKQotCQkJYWRkRGVwZW5kZW5jeUFkYXB0ZXIoKEVPYmplY3QpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlcGVuZGVuY3lGZWF0dXJlKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0JCQkJcmV0dXJuIGZUcmFuc2xhdG9yLmlzRGVwZW5kZW5jeVBhcmVudCgpICYmIGZUcmFuc2xhdG9yLmdldERlcGVuZGVuY3lGZWF0dXJlKCkgPT0gbXNnLmdldEZlYXR1cmUoKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW1wdHlUYWcoRWxlbWVudCBwYXJlbnQpIHsKLQkJUmV2aXNpdC50b0RvKCk7Ci0JCS8vRGV0ZXJtaW5lIGhvdyB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHB1cmUgRE9NIGFwaXMsIGlmIHBvc3NpYmxlLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IERPTSBvYmplY3QgZnJvbSB3aXRoIHRoZSB2YWx1ZXMgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgTU9GCi0JICogb2JqZWN0LiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlPYmplY3QgYXR0clZhbHVlID0gbnVsbDsKLQkJYm9vbGVhbiBpc1NldCA9IGZhbHNlOwotCQlpZiAobWFwLmlzSURNYXAoKSkgewotCQkJdHJ5IHsKLQkJCQlhdHRyVmFsdWUgPSBtYXAuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJCX0gY2F0Y2ggKElEVHJhbnNsYXRvci5Ob1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9JZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcmVzb3VyY2UsCi0JCQkJLy9ObyBuZWVkIHRvIHVwZGF0ZQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlzU2V0ID0gYXR0clZhbHVlICE9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlhdHRyVmFsdWUgPSBtYXAuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJCWlzU2V0ID0gbWFwLmlzU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJfQotCi0JCWlmIChtYXAuaXNET01BdHRyaWJ1dGUoKSkgewotCQkJLy8gQW4gYXR0cmlidXRlIG9mIHRoZSBNT0Ygb2JqZWN0IG1hcHMgdG8gYW4gYXR0cmlidXRlIG9mIHRoZQotCQkJLy8gRE9NIG5vZGUuIEdldCB0aGUgdmFsdWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgYW5kIHNldCBpdAotCQkJLy8gaW50byBET00gbm9kZS4KLQkJCUVsZW1lbnQgZSA9IChFbGVtZW50KSBjcmVhdGVET01QYXRoKG5vZGUsIG1hcCk7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwgJiYgaXNTZXQpCi0JCQkJZS5zZXRBdHRyaWJ1dGUobWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSwgbWFwLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGF0dHJWYWx1ZSwgbW9mT2JqZWN0KSk7Ci0JCQllbHNlCi0JCQkJZS5yZW1vdmVBdHRyaWJ1dGUobWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSk7Ci0JCX0gZWxzZSB7Ci0JCQl1cGRhdGVET01TdWJ0cmVlKG1hcCwgbm9kZSwgbW9mT2JqZWN0LCBhdHRyVmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IERPTSBvYmplY3QgZnJvbSB3aXRoIHRoZSB2YWx1ZXMgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgTU9GCi0JICogb2JqZWN0LiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJTGlua1VwZGF0ZXJUYXJnZXQuSU5TVEFOQ0UudXBkYXRlRE9NKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCi0JCUxpc3QgbW9mQ2hpbGRyZW4gPSBtYXAuZ2V0TU9GQ2hpbGRyZW4obW9mT2JqZWN0KTsKLQkJTGlzdCBkb21DaGlsZHJlbiA9IGdldERPTUNoaWxkcmVuKG5vZGUsIG1hcCk7Ci0KLQkJcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZkNoaWxkcmVuLCBkb21DaGlsZHJlbiwgbW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBmcm9tIHRoZSBET00gbm9kZSBzdWJ0cmVlLiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltVXBkYXRlTU9GRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoIW1hcC5mZWF0dXJlRXhpc3RzKG1vZk9iamVjdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU9iamVjdCBkb21WYWx1ZSA9IG51bGw7Ci0JCWJvb2xlYW4gdXBkYXRlTU9GQXR0QWRhcHRlciA9IGZhbHNlOwotCQlib29sZWFuIGlzVW5zZXQgPSBmYWxzZTsKLQkJRU1GMkRPTUFkYXB0ZXIgYXR0ckFkYXB0ZXIgPSBudWxsOwotCi0JCU5vZGUgY2hpbGQgPSBmaW5kRE9NTm9kZShub2RlLCBtYXAsIHRydWUpOwotCi0JCWlmIChtYXAuaXNET01BdHRyaWJ1dGUoKSAmJiBjaGlsZCAhPSBudWxsKSB7Ci0JCQkvLyBBbiBhdHRyaWJ1dGUgb2YgdGhlIE1PRiBvYmplY3QgbWFwcyB0byBhbiBhdHRyaWJ1dGUgb2YgdGhlCi0JCQkvLyBET00gbm9kZS4gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgRE9NIGF0dHJpYnV0ZSBhbmQgc2V0IGl0Ci0JCQkvLyBpbnRvIHRoZSBNT0Ygb2JqZWN0LgotCi0JCQlBdHRyIGRvbUF0dHIgPSAoQXR0cikgY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQkJCWlmIChkb21BdHRyICE9IG51bGwpIHsKLQkJCQlkb21WYWx1ZSA9IGRvbUF0dHIuZ2V0VmFsdWUoKTsKLQkJCQlkb21WYWx1ZSA9IG1hcC5jb252ZXJ0U3RyaW5nVG9WYWx1ZSgoU3RyaW5nKSBkb21WYWx1ZSwgbW9mT2JqZWN0KTsKLQkJCX0gZWxzZQotCQkJCWlzVW5zZXQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJLy8gQW4gYXR0cmlidXRlIG9mIHRoZSBNT0Ygb2JqZWN0IGlzIGFjdHVhbGx5IGEgc3ViLWVsZW1lbnQKLQkJCS8vIG9mIHRoZSBET00gbm9kZS4gU2VhcmNoIGZvciB0aGUgZmlyc3Qgc3ViLWVsZW1lbnQgd2l0aAotCQkJLy8gdGhlIGNvcnJlY3QgbmFtZSB0byB1c2UgYXMgYW4gYXR0cmlidXRlLgotCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIHNpbmdsZSB2YWx1ZWQgYXR0cmlidXRlIHRoYXQgaGFzCi0JCQkJLy8gYSBNT0Ygb2JqZWN0IGFzIGl0cyB2YWx1ZQotCQkJCWlmICghbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQkJYXR0ckFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKGNoaWxkLCBtYXApOwotCQkJCQl1cGRhdGVNT0ZBdHRBZGFwdGVyID0gdHJ1ZTsKLQkJCQkJZG9tVmFsdWUgPSBhdHRyQWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNoaWxkIGlzIGFkYXB0ZWQuIElmIG5vdCwgYWRhcHQKLQkJCQkJLy8gaXQuCi0JCQkJCWFkZERPTUFkYXB0ZXIoY2hpbGQpOwotCi0JCQkJCS8vIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIHRleHQgY2hpbGQKLQkJCQkJZG9tVmFsdWUgPSBleHRyYWN0VmFsdWUoY2hpbGQsIG1hcCwgbW9mT2JqZWN0KTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlpc1Vuc2V0ID0gdHJ1ZTsKLQkJfQotCi0JCS8vIFNldCB0aGUgYXR0cmlidXRlIGV4dHJhY3RlZCBmcm9tIHRoZSBET00gdG8gdGhlIE1PRiBvYmplY3QuCi0JCWJvb2xlYW4gaGFzQ2hhbmdlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlpZiAobWFwLmlzSURNYXAoKSkKLQkJCQltYXAuc2V0TU9GVmFsdWUobW9mT2JqZWN0LCBkb21WYWx1ZSk7Ci0JCQllbHNlIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBudWxsOwotCQkJCW9sZFZhbHVlID0gbWFwLmdldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCQkJYm9vbGVhbiBpc1NldCA9IG1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCQkJLy9JbiB0aGUgY2FzZSBvZiBlbnVtcyB3aXRoIGRlZmF1bHQgdmFsdWVzLCB3ZSBuZWVkIHRvIHRyaXAKLQkJCQkvLyB0aGUgYXR0cmlidXRlIGZyb20KLQkJCQkvL2RlZmF1bHQgdG8gYSBzZXQgdmFsdWUKLQkJCQlpZiAob2xkVmFsdWUgPT0gZG9tVmFsdWUpIHsKLQkJCQkJaWYgKG9sZFZhbHVlID09IG51bGwgfHwgaXNTZXQpCi0JCQkJCQloYXNDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChkb21WYWx1ZSA9PSBudWxsICYmICFpc1NldCkKLQkJCQkJLy9JZiB0aGUgZG9tVmFsdWUgaXMgbnVsbCBhbmQgdGhlIGZlYXR1cmUgaXMgbm90IHNldCwgdGhlbgotCQkJCQkvLyB3ZSBkb24ndCBuZWVkCi0JCQkJCS8vdG8gZG8gYW55dGhpbmcKLQkJCQkJaGFzQ2hhbmdlZCA9IGZhbHNlOwotCQkJCWVsc2UgaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWUuZXF1YWxzKGRvbVZhbHVlKSAmJiBpc1NldCkKLQkJCQkJaGFzQ2hhbmdlZCA9IGZhbHNlOwotCQkJCWlmIChvbGRWYWx1ZSA9PSBudWxsICYmIGRvbVZhbHVlID09IG51bGwgJiYgbWFwLmlzU2V0TU9GVmFsdWUobW9mT2JqZWN0KSA9PSBpc1Vuc2V0KQotCQkJCQloYXNDaGFuZ2VkID0gdHJ1ZTsKLQkJCQlpZiAoaGFzQ2hhbmdlZCkgewotCQkJCQlpZiAoIShtYXAuaXNEYXRhVHlwZSgpKSAmJiAhbWFwLmlzU2hhcmVkKCkpCi0JCQkJCQlyZW1vdmVNT0ZWYWx1ZSgoRU9iamVjdCkgb2xkVmFsdWUsIG1hcCk7Ci0JCQkJCWlmIChkb21WYWx1ZSA9PSBudWxsKQotCQkJCQkJbWFwLnVuU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJCQkJZWxzZQotCQkJCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgZG9tVmFsdWUpOwotCi0JCQkJCWlmICgoZG9tVmFsdWUgPT0gbnVsbCAmJiAhKG1hcC5pc0VudW1GZWF0dXJlKCkpKSB8fCBpc1Vuc2V0KQotCQkJCQkJbWFwLnVuU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsgLy91bnNldAotCQkJCQkvLyBudWxsCi0JCQkJCS8vIGZvcgotCQkJCQkvLyBub24KLQkJCQkJLy8gZW51bQotCQkJCQkvLyBmZWF0dXJlcwotCi0JCQkJCWlmICh1cGRhdGVNT0ZBdHRBZGFwdGVyICYmIGF0dHJBZGFwdGVyICE9IG51bGwpCi0JCQkJCQlhdHRyQWRhcHRlci51cGRhdGVNT0YoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJCWhhbmRsZUZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oZXgpOwotCQkJbWFwLnVuU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaGFzQ2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBmcm9tIHRoZSBET00gbm9kZSBzdWJ0cmVlLiBUaGlzIG1ldGhvZCBpcyBvbmx5Ci0JICogY2FsbGVkIGlmIHRoZSBET00gbm9kZSBjaGFuZ2VzIGFuZCB0aGUgbWFwIGlzIGFuIG9iamVjdCBsaW5rIG1hcC4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCi0JICogQHJldHVybiBSZXR1cm4gdHJ1ZSBpZiB0aGUgTU9GIGZlYXR1cmUgd2FzIHVwZGF0ZWQsIGZhbHNlIGlmIG5vIHVwZGF0ZSB3YXMgZG9uZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlTU9GTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJTGlua1VwZGF0ZXJUYXJnZXQuSU5TVEFOQ0UudXBkYXRlTU9GKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJLy8gSWYgdGhlIGZlYXR1cmUgaXMgYSBjb2xsZWN0aW9uIG9mIHN0cmluZ3Mgb3IgaW50cywgY2FsbCBhIHNwZWNpYWwKLQkJLy8gbWV0aG9kCi0JCS8vIHRoYXQgaGFuZGxlcyB0aGlzLgotCQlpZiAobWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCXVwZGF0ZU1PRk11bHRpUHJpbWl0aXZlRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IG5vZGVDaGlsZHJlbiA9IGdldERPTUNoaWxkcmVuKG5vZGUsIG1hcCk7Ci0JCUxpc3QgbW9mQ2hpbGRyZW4gPSBtYXAuZ2V0TU9GQ2hpbGRyZW4obW9mT2JqZWN0KTsKLQotCQlwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mQ2hpbGRyZW4sIG5vZGVDaGlsZHJlbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVwZW5kZW5jeUFkYXB0ZXIoRU9iamVjdCBvYmopIHsKLQkJQWRhcHRlciBleGlzdGluZyA9IEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIob2JqLCBEZXBlbmRlbmN5QWRhcHRlci5LRVkpOwotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKLQkJCW9iai5lQWRhcHRlcnMoKS5yZW1vdmUoZXhpc3RpbmcpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHRoZSBET00gY2hpbGRyZW4gZnJvbSA8cGFyZW50PnRoYXQgYXJlIHJlcHJlc2VudGVkIGJ5IDxtYXA+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURPTUNoaWxkcmVuKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCkgewotCQlTdHJpbmdbXSBkb21OYW1lcyA9IG1hcC5nZXRET01OYW1lcygpOwotCQlIYXNoU2V0IGRvbU5hbWVzU2V0ID0gbmV3IEhhc2hTZXQoZG9tTmFtZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb21OYW1lcy5sZW5ndGg7IGkrKykKLQkJCWRvbU5hbWVzU2V0LmFkZChkb21OYW1lc1tpXSk7Ci0KLQkJLy8gV2FsayB0aHJvdWdoIGFsbCB0aGUgY2hpbGRyZW4gYW5kIGZpbmQgYW55IHRoYXQgbWF0Y2ggdGhlIG1hcC4KLQkJTm9kZUxpc3QgbmwgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlMaXN0IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbmwuaXRlbShpKTsKLQkJCWlmIChkb21OYW1lc1NldC5jb250YWlucyhjaGlsZE5vZGUuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJdG9SZW1vdmUuYWRkKGNoaWxkTm9kZSk7Ci0JCX0KLQotCQkvLyBSZW1vdmUgYW55IGNoaWxkcmVuIHRoYXQgd2VyZSBmb3VuZC4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5zaXplKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSAoTm9kZSkgdG9SZW1vdmUuZ2V0KGkpOwotCQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50LCBjaGlsZE5vZGUsIHRydWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0RnJvbU5vZGUoKSB7Ci0JCXNldFRhcmdldChmVHJhbnNsYXRvci5jcmVhdGVFTUZPYmplY3QoZk5vZGUuZ2V0Tm9kZU5hbWUoKSwgZXh0cmFjdFJlYWRBaGVhZE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBET00gb2JqZWN0IGZyb20gd2l0aCB0aGUgdmFsdWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIE1PRgotCSAqIG9iamVjdC4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgdXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJcHJlVXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQlpZiAobWFwLmlzTXVsdGlWYWx1ZWQoKSkgewotCQkJCXVwZGF0ZURPTU11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZkRlYnVnKSB7Ci0JCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlVwZGF0aW5nIERPTSBOb2RlOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRmcm9tOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCXRyeSB7Ci0JCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJcHJpbVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQkJfQotCi0JCQlpZiAobWFwLmlzVGFyZ2V0TGlua01hcCgpKSB7Ci0JCQkJdXBkYXRlRE9NTGlua0ZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcG9zdFVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IERPTSBvYmplY3QgZnJvbSB0aGUgdmFsdWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIE1PRgotCSAqIG9iamVjdC4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlVwZGF0aW5nIERPTSBOb2RlIChsaW5rKTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRmcm9tOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcmltVXBkYXRlRE9NTGlua0ZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJVcGRhdGluZyBET00gTm9kZSAobXVsdGkpOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYSBET00gc3VidHJlZSB0byByZWZsZWN0IHRoZSBtb2ZPYmplY3QgYW5kIG1hcCBwYXNzZWQgaW4uIFRoZSBzdWJ0cmVlIGlzIG9mIDxub2RlPmlzCi0JICogdXBkYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01TdWJ0cmVlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0LCBPYmplY3QgYXR0clZhbHVlKSB7Ci0JCU9iamVjdCBpbm5lckF0dHJWYWx1ZSA9IGF0dHJWYWx1ZTsKLQkJaWYgKG1hcC5mZWF0dXJlRXhpc3RzKG1vZk9iamVjdCkpIHsKLQkJCWlmICgobWFwLmlzRW51bUZlYXR1cmUoKSB8fCBtYXAuaXNCb29sZWFuRmVhdHVyZSgpKSAmJiAobWFwLmlzVW5zZXR0YWJsZSgpICYmICFtYXAuaXNTZXRNT0ZWYWx1ZShtb2ZPYmplY3QpKSkKLQkJCQlpbm5lckF0dHJWYWx1ZSA9IG51bGw7Ci0JCX0gZWxzZQotCQkJaW5uZXJBdHRyVmFsdWUgPSBtYXAuZXh0cmFjdFN0cmluZ1ZhbHVlKG1vZk9iamVjdCk7Ci0KLQkJLy8gQ3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIERPTSBzdWJ0cmVlCi0JCWlmIChpbm5lckF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQlOb2RlIHBhcmVudCA9IGNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJCWlmIChtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgbW9mIHZhbHVlIGlzIG5vdCBhbm90aGVyCi0JCQkJLy8gbW9mIG9iamVjdCAocHJpbWl0aXZlKQotCQkJCWlmIChtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpICE9IG51bGwgJiYgbWFwLmdldERPTU5hbWUobW9mT2JqZWN0KS5zdGFydHNXaXRoKCIjIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuOwotCi0JCQkJRWxlbWVudCBjaGlsZCA9IG1hcC5pc0RPTVRleHRWYWx1ZSgpID8gKEVsZW1lbnQpIHBhcmVudCA6IGZpbmRPckNyZWF0ZU5vZGUocGFyZW50LCBtYXAsIG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOwotCi0JCQkJZmluZE9yQ3JlYXRlVGV4dE5vZGUoY2hpbGQsIG1hcCwgbWFwLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGlubmVyQXR0clZhbHVlLCBtb2ZPYmplY3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdlcmUgdGhlIG1vZiB2YWx1ZSBpcyBhIG1vZiBvYmplY3QuCi0JCQkJRU9iamVjdCBtb2ZWYWx1ZSA9IChFT2JqZWN0KSBpbm5lckF0dHJWYWx1ZTsKLQkJCQlFTUYyRE9NQWRhcHRlciB2YWx1ZUFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIobW9mVmFsdWUsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQkJCWlmICh2YWx1ZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJdmFsdWVBZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCWVsc2UgewotCQkJCQlyZW1vdmVET01DaGlsZHJlbihwYXJlbnQsIG1hcCk7Ci0JCQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKG1vZlZhbHVlLCBtYXApOwotCQkJCQlMaXN0IG1vZkNoaWxkcmVuID0gbWFwLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JCQkJCUxpc3QgZG9tQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihwYXJlbnQsIG1hcCk7Ci0KLQkJCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluc2VydEJlZm9yZU5vZGUocGFyZW50LCBtYXAsIG1vZkNoaWxkcmVuLCAwLCBkb21DaGlsZHJlbik7Ci0JCQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQsIGFkYXB0ZXIuZ2V0Tm9kZSgpLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gYWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluZGVudChhZGFwdGVyLmdldE5vZGUoKSwgbWFwKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJCQkJfQotCQkJCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSBhdHRyaWJ1dGUgdmFsdWUgd2FzIHNldCB0byBudWxsIG9yIHVuc2V0LiBSZW1vdmUgYW55Ci0JCQkvLyBleGlzdGluZyBET00gbm9kZXMuCi0JCQlOb2RlIGNoaWxkID0gZmluZERPTU5vZGUobm9kZSwgbWFwKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCXJlbW92ZURPTUNoaWxkKGNoaWxkLmdldFBhcmVudE5vZGUoKSwgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGEgZmVhdHVyZSB0aGF0IGlzIHNldCBieSBsaW5raW5nIHRvIGFub3RoZXIgZXhpc3Rpbmcgb2JqZWN0LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQKLQkgKiB3aGVuIHRoZSBNT0Ygb2JqZWN0IGlzIHVwZGF0ZWQgaW4gb3JkZXIgdG8gdXBkYXRlIERPTSBub2Rlcy4KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZMaW5rRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiVXBkYXRpbmcgTU9GT2JqZWN0IChsaW5rKTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcHJpbVVwZGF0ZU1PRkxpbmtGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRk11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiVXBkYXRpbmcgTU9GT2JqZWN0IChtdWx0aSk6ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRmcm9tOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuIFRoZSByZWxhdGlvbnNoaXAgTVVTVCBCRSBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGZvciB0aGlzIG1ldGhvZCB0byB3b3JrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRk11bHRpUHJpbWl0aXZlRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlMaXN0IG5vZGVDaGlsZHJlbiA9IGdldERPTUNoaWxkcmVuKG5vZGUsIG1hcCk7Ci0KLQkJbWFwLmNsZWFyTGlzdChtb2ZPYmplY3QpOwotCi0JCS8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2Ygbm9kZXMgYW5kIHVwZGF0ZSB0aGUgTU9GIGNvbGxlY3Rpb24KLQkJaW50IGFkZEluZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSAoTm9kZSkgbm9kZUNoaWxkcmVuLmdldChpKTsKLQkJCU9iamVjdCBhdHRyaWJ1dGVWYWx1ZSA9IGV4dHJhY3RWYWx1ZShjaGlsZCwgbWFwLCBtb2ZPYmplY3QpOwotCQkJYm9vbGVhbiBhZHZhbmNlQWRkSW5kZXggPSB0cnVlOwotCQkJaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpewotCQkJCWlmKG1hcC5nZXRGZWF0dXJlKCkgIT0gbnVsbCAmJiBtYXAuZ2V0RmVhdHVyZSgpLmlzVW5pcXVlKCkgJiYgbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSkgIT0gbnVsbCAmJiBtb2ZPYmplY3QuZUdldChtYXAuZ2V0RmVhdHVyZSgpKSBpbnN0YW5jZW9mIExpc3QgJiYgKChMaXN0KSBtb2ZPYmplY3QuZUdldChtYXAuZ2V0RmVhdHVyZSgpKSkuY29udGFpbnMoYXR0cmlidXRlVmFsdWUpKXsKLQkJCQkJYWR2YW5jZUFkZEluZGV4ID0gZmFsc2U7Ci0JCQkJCVN0cmluZyBkb21OYW1lID0gbWFwLmRvbU5hbWVBbmRQYXRoICE9IG51bGwgPyBtYXAuZG9tTmFtZUFuZFBhdGggOiAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgJ25vIGR1cGxpY2F0ZXMnIGNvbnN0cmFpbnQgaXMgdmlvbGF0ZWQgYnkgIitkb21OYW1lKyIgPSAiK2F0dHJpYnV0ZVZhbHVlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQloYW5kbGVJbnZhbGlkTXVsdGlOb2RlcyhjaGlsZC5nZXROb2RlTmFtZSgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYXAuc2V0TU9GVmFsdWUobW9mT2JqZWN0LCBhdHRyaWJ1dGVWYWx1ZSwgYWRkSW5kZXgpOwotCQkJCX0KLQkJCQlpZihhZHZhbmNlQWRkSW5kZXgpewotCQkJCQlhZGRJbmRleCArKzsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIEFkYXB0IHRoZSBub2RlIHNvIHVwZGF0ZSB3aWxsIG9jY3VyLgotCQkJYWRkRE9NQWRhcHRlcihjaGlsZCk7Ci0JCX0KLQkJaWYgKG1hcC5oYXNET01QYXRoKCkgJiYgbm9kZUNoaWxkcmVuLmlzRW1wdHkoKSAmJiBmaW5kRE9NUGF0aChub2RlLCBtYXAsIGZhbHNlKSAhPSBudWxsKQotCQkJbWFwLnNldE1PRlZhbHVlRnJvbUVtcHR5RE9NUGF0aChtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGZyb20gdGhlIERPTSBub2RlIHN1YnRyZWUuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRkZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJaWYgKG1hcC5pc011bHRpVmFsdWVkKCkpIHsKLQkJCXVwZGF0ZU1PRk11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAobWFwLmlzQ29tbWVudCgpKSB7Ci0JCQl1cGRhdGVNT0ZDb21tZW50RmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUT0RPIE1ERSBBZGQgYSBtYXAuaXNDb21tZW50KCkgYW5kIHVwZGF0ZU1PRkNvbW1lbnRGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQotCQlpZiAoZkRlYnVnKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiVXBkYXRpbmcgTU9GT2JqZWN0OiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0ZnJvbTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQlib29sZWFuIGhhc0NoYW5nZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJaGFzQ2hhbmdlZCA9IHByaW1VcGRhdGVNT0ZGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQotCQlpZiAobWFwLmlzVGFyZ2V0TGlua01hcCgpICYmIGhhc0NoYW5nZWQpCi0JCQl1cGRhdGVNT0ZMaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG1vZk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRkNvbW1lbnRGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCU5vZGUgY29tbWVudE5vZGUgPSBub2RlOwotCQkvKiBzY2FuIHVwIHRoZSBkb20gdG8gZmluZCB0aGUgZmlyc3QgY29tbWVudCBub2RlIGJlZm9yZSB0aGlzIG5vZGUgKi8KLQkJd2hpbGUgKChjb21tZW50Tm9kZSA9IGNvbW1lbnROb2RlLmdldFByZXZpb3VzU2libGluZygpKSAhPSBudWxsICYmIGNvbW1lbnROb2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCS8qIG5vIGNvbW1lbnQgYXZhaWxhYmxlICovCi0JCQlpZiAoY29tbWVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbW1lbnROb2RlICE9IG51bGwpCi0JCQltYXAuc2V0TU9GVmFsdWUobW9mT2JqZWN0LCBjb21tZW50Tm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwN2UzYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTUxvYWRPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJldmlzaXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTVJlbmRlcmVyIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckltcGwgewotCi0JcHJvdGVjdGVkIE1hcCBkb21BZGFwdGVyUmVnaXN0cnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbmVlZHNUb0NyZWF0ZURPTSA9IHRydWU7Ci0JcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERPTVJlbmRlcmVySW1wbC4KLQkgKi8KLQlwdWJsaWMgRU1GMkRPTVJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQlpZiAobWFuYWdlc0RPTUFkYXB0ZXJzKCkpCi0JCQlpbml0RE9NQWRhcHRlclJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvTG9hZChJbnB1dFN0cmVhbSwgTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICgoaW4gIT0gbnVsbCkgfHwgIXVzZVN0cmVhbXNGb3JJTygpKSB7Ci0JCQlsb2FkRG9jdW1lbnQoaW4sIG9wdGlvbnMpOwotCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZVJvb3RET01BZGFwdGVyKCk7Ci0JCQlhZGFwdGVyLnVwZGF0ZU1PRigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERvY3VtZW50KElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCURPTUxvYWRPcHRpb25zIGRvbU9wdHMgPSBuZXcgRE9NTG9hZE9wdGlvbnMoKTsKLQkJCWRvbU9wdHMuc2V0QWxsb3dKYXZhRW5jb2RpbmdzKHRydWUpOwotCQkJZG9tT3B0cy5zZXRFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXModHJ1ZSk7Ci0JCQlkb21PcHRzLnNldFZhbGlkYXRlKGlzVmFsaWRhdGluZygpKTsKLQkJCWRvY3VtZW50ID0gRE9NVXRpbGl0aWVzLmxvYWREb2N1bWVudChpbiwgZG9tT3B0cywgZ2V0UmVzb3VyY2UoKS5nZXRFbnRpdHlSZXNvbHZlcigpKTsKLQkJCW5lZWRzVG9DcmVhdGVET00gPSBmYWxzZTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0X3JleCkgewotCQkJdGhyb3cgdF9yZXg7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgaW94OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvU2F2ZShPdXRwdXRTdHJlYW0sIE1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNyZWF0ZURPTVRyZWVJZk5lY2Vzc2FyeSgpOwotCQlzZXJpYWxpemVEb2N1bWVudChvdXRwdXRTdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIGFkYXB0ZXJzIGFyZSBub3QgY2FjaGVkIHdpdGhpbiB0aGlzIHJlbmRlcmVyLCBlLmcuLCB0aGV5IGFyZQotCSAqIHN0b3JlZCBpbiBub3RpZnlpbmcgTm9kZXMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW5hZ2VzRE9NQWRhcHRlcnMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRET01BZGFwdGVyUmVnaXN0cnkoKSB7Ci0JCWlmIChkb21BZGFwdGVyUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWRvbUFkYXB0ZXJSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJET01BZGFwdGVyKE5vZGUgbm9kZSwgRU1GMkRPTUFkYXB0ZXIgYWRhcHRlcikgewotCQlkb21BZGFwdGVyUmVnaXN0cnkucHV0KG5vZGUsIGFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBFTUYyRE9NQWRhcHRlciBnZXRFeGlzdGluZ0RPTUFkYXB0ZXIoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoRU1GMkRPTUFkYXB0ZXIpIGRvbUFkYXB0ZXJSZWdpc3RyeS5nZXQobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJZG9tQWRhcHRlclJlZ2lzdHJ5LnJlbW92ZShhTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3ByZXBhcmVUb0FkZENvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVwYXJlVG9BZGRDb250ZW50cygpIHsKLQkJLy8gY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY3JlYXRlRE9NVHJlZSgpIHsKLQkJY3JlYXRlRG9jdW1lbnQoKTsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZVJvb3RET01BZGFwdGVyKCk7Ci0JCWFkYXB0ZXIudXBkYXRlRE9NKCk7Ci0JCW5lZWRzVG9DcmVhdGVET00gPSBmYWxzZTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZVJvb3RET01BZGFwdGVyKCkgewotCQlFTUYyRE9NQWRhcHRlciByb290ID0gbmV3IEVNRjJET01BZGFwdGVySW1wbChnZXRSZXNvdXJjZSgpLCBkb2N1bWVudCwgdGhpcywgZ2V0UmVzb3VyY2UoKS5nZXRSb290VHJhbnNsYXRvcigpKTsKLQkJcmVnaXN0ZXJET01BZGFwdGVyKGRvY3VtZW50LCByb290KTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChuZWVkc1RvQ3JlYXRlRE9NKQotCQkJY3JlYXRlRE9NVHJlZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBEb2N1bWVudCBnaXZlbgotCSAqIAotCSAqIEBhUmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCVRyYW5zbGF0b3JSZXNvdXJjZSByZXMgPSBnZXRSZXNvdXJjZSgpOwotCQlyZXMuc2V0RGVmYXVsdHMoKTsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRE9NVXRpbGl0aWVzLmNyZWF0ZU5ld0RvY3VtZW50KHJlcy5nZXREb2N0eXBlKCksIHJlcy5nZXRQdWJsaWNJZCgpLCByZXMuZ2V0U3lzdGVtSWQoKSk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemVEb2N1bWVudChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvKgotCQkgKiBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gY3JlYXRlT3V0cHV0Rm9ybWF0KCk7IFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9Ci0JCSAqIFNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXJGYWN0b3J5KE1ldGhvZC5YTUwpLm1ha2VTZXJpYWxpemVyKG91dCwgZm9ybWF0KTsKLQkJICogc2VyaWFsaXplci5hc0RPTVNlcmlhbGl6ZXIoKS5zZXJpYWxpemUoZG9jdW1lbnQpOwotCQkgKi8KLQkJdHJ5IHsKLQkJCVRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQkvKgotCQkJICogdHJ5IHsgZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfTEFOR1VBR0UsIFczQ19YTUxfU0NIRU1BKTsgfSBjYXRjaAotCQkJICogKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7IH0KLQkJCSAqLwotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0KLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIGdldFJlc291cmNlKCkuZ2V0RW5jb2RpbmcoKSk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlZFUlNJT04sIGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJubyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1BVQkxJQywgZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpKTsKLQkJCWlmIChnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLCBnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgIAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCQkvKiBzb3VyY2Uuc2V0U3lzdGVtSWQoZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpKTsgKi8KLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3V0KSk7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJfQotCX0KLQotCS8qCi0JICogcHJvdGVjdGVkIE91dHB1dEZvcm1hdCBjcmVhdGVPdXRwdXRGb3JtYXQoKSB7IE91dHB1dEZvcm1hdCBmb3JtYXQgPSBuZXcgT3V0cHV0Rm9ybWF0KCk7Ci0JICogZm9ybWF0LnNldEluZGVudGluZyh0cnVlKTsgZm9ybWF0LnNldExpbmVTZXBhcmF0b3IoRE9NVXRpbGl0aWVzLk5FV0xJTkVfU1RSSU5HKTsKLQkgKiAvLyROT04tTkxTLTEkIGZvcm1hdC5zZXRFbmNvZGluZyhnZXRSZXNvdXJjZSgpLmdldEVuY29kaW5nKCkpOwotCSAqIGZvcm1hdC5zZXRWZXJzaW9uKGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsgcmV0dXJuIGZvcm1hdDsgfQotCSAqLwotCi0JcHVibGljIHZvaWQgcmVwbGFjZURvY3VtZW50VHlwZShTdHJpbmcgZG9jVHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCVJldmlzaXQucmV2aXNpdCgpOwotCQlEb2N1bWVudCBuZXdEb2MgPSBudWxsOwotCQkvLyBOZWVkIGJlIGFibGUgdG8gdXBkYXRlIHRoZSBkb2N0eXBlIGRpcmVjdGx5IG9uIHRoZSBleGlzdGluZyBkb2N1bWVudDsgcmlnaHQgbm93IGNhbid0Ci0JCS8vIGJlY2F1c2UKLQkJLy8gb2YgbGltaXRhdGlvbnMgb24gcGFyc2VyIG5ldXRyYWwgYXBpcwotCi0JCXRyeSB7Ci0JCQluZXdEb2MgPSBET01VdGlsaXRpZXMuY3JlYXRlTmV3RG9jdW1lbnQoZG9jVHlwZU5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0KLQotCi0JCXJlcGxhY2VOb2RlKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLCBuZXdEb2MsIG5ld0RvYyk7Ci0JCXJlYWRhcHQoZG9jdW1lbnQsIG5ld0RvYyk7Ci0JCWRvY3VtZW50ID0gbmV3RG9jOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VOb2RlKE5vZGUgb2xkQ2hpbGQsIE5vZGUgbmV3UGFyZW50LCBEb2N1bWVudCBuZXdEb2MpIHsKLQkJTm9kZSBuZXdDaGlsZCA9IG5ld0RvYy5pbXBvcnROb2RlKG9sZENoaWxkLCBmYWxzZSk7Ci0JCW5ld1BhcmVudC5hcHBlbmRDaGlsZChuZXdDaGlsZCk7Ci0JCXJlYWRhcHQob2xkQ2hpbGQsIG5ld0NoaWxkKTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBvbGRDaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBsZW5ndGggPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJcmVwbGFjZU5vZGUoY2hpbGRyZW4uaXRlbShpKSwgbmV3Q2hpbGQsIG5ld0RvYyk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmVVbmxvYWQoKSB7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHJlc291cmNlLmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlci5yZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkYXB0KE5vZGUgb2xkQ2hpbGQsIE5vZGUgbmV3Q2hpbGQpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGdldEV4aXN0aW5nRE9NQWRhcHRlcihvbGRDaGlsZCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJlZ2lzdGVyRE9NQWRhcHRlcihuZXdDaGlsZCwgYWRhcHRlcik7Ci0JCQkvLyBTb21lIG5vZGVzIGFyZSBtYW5hZ2VkIGJ5IHRoZSBwYXJlbnQgYW5kIHRodXMgdGhlCi0JCQkvLyBub2RlIHNob3VsZCBub3QgYmUgc2V0IG9uIHRoZSBwYXJlbnQgYWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIuZ2V0Tm9kZSgpID09IG9sZENoaWxkKQotCQkJCWFkYXB0ZXIuc2V0Tm9kZShuZXdDaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKCkuZ2V0VmVyc2lvbklEKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNGZiYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSBleHRlbmRzIFJlbmRlcmVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVNRjJET01SZW5kZXJlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSgpOwotCi0JcHVibGljIEVNRjJET01SZW5kZXJlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeSNjcmVhdGVSZW5kZXJlcigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCkgewotCQlFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIgPSBuZXcgRU1GMkRPTVJlbmRlcmVyKCk7Ci0JCXJlbmRlcmVyLnNldFZhbGlkYXRpbmcoaXNWYWxpZGF0aW5nKCkpOwotCQlyZXR1cm4gcmVuZGVyZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1N2EwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIElOU1RBTkNFID0gbmV3IEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlcigpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyI2dldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBSZW5kZXJlckZhY3RvcnkgZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWERvY3VtZW50SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWERvY3VtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDBjMmFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhEb2N1bWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbi5FY29yZVV0aWxpdGllc1BsdWdpbjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoZSBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIGlzIHV0aWxpemVkIGJ5IHRoZSBTQVggcGFyc2VyIHRvIGFubm91bmNlIFhNTCBFdmVudHMsIHN1Y2ggYXMKLSAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIFhNTCBlbGVtZW50cyBhbmQgdGhlIGNvbnRlbnRzIG9mIHRob3NlIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBDYWNoZUV2ZW50U3RhY2sgZXZlbnRTdGFjayA9IG5ldyBDYWNoZUV2ZW50U3RhY2soKTsKLQlwcml2YXRlIENhY2hlRXZlbnRQb29sIGF2YWlsYWJsZUV2ZW50UG9vbCA9IG5ldyBDYWNoZUV2ZW50UG9vbCgpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgdG8gcG9wdWxhdGUgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU1GMlNBWERvY3VtZW50SGFuZGxlcihUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlJbnB1dFNvdXJjZSByZXN1bHQgPSBudWxsOwotCQl0aGlzLnJlc291cmNlLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKLQotCQl0cnkgewotCQkJRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSB0aGlzLnJlc291cmNlLmdldEVudGl0eVJlc29sdmVyKCk7Ci0KLQkJCWlmIChlbnRpdHlSZXNvbHZlciAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGVudGl0eVJlc29sdmVyLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBzdXBlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihpb2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RG9jdW1lbnQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogVGhlIGVuZERvY3VtZW50KCkgbWV0aG9kIHNob3VsZCBoYXZlIGZyb3plbiB0aGUgcG9vbCwgb3IgaXQgbWF5IG5vdCBiZSB3YXJtZWQgeWV0LiBJbgotCQkgKiBlaXRoZXIgY2FzZSwgdGhpcyBtZXRob2QgY2FsbCB3aWxsIGRvIGFzIGxpdHRsZSB3b3JrIGFzIG5lY2Vzc2FyeQotCQkgKi8KLQkJYXZhaWxhYmxlRXZlbnRQb29sLndhcm1Qb29sKCk7Ci0KLQkJLyogVGhpcyBsaW5lIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LCBidXQgaXMgbGVmdCBmb3Igc2FmdHkgKi8KLQkJZXZlbnRTdGFjay5jbGVhcigpOwotCQl0aGlzLmNyZWF0ZVJvb3QodGhpcy5yZXNvdXJjZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlhZGRUb1N0YWNrKHFOYW1lLCBhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBkYXRhLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCUNhY2hlRXZlbnROb2RlIGN1cnJlbnRSZWNvcmQgPSBnZXRDdXJyZW50UmVjb3JkKCk7Ci0JCWlmIChjdXJyZW50UmVjb3JkICE9IG51bGwpIHsKLQkJCWN1cnJlbnRSZWNvcmQuYXBwZW5kVG9CdWZmZXIoZGF0YSwgc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCUNhY2hlRXZlbnROb2RlIGN1cnJlbnRSZWNvcmQgPSBudWxsOwotCi0JCS8qCi0JCSAqIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBET01QYXRoIHdhcyBpZ25vcmVkIHNvIHRoZSBzdGFjayBkb2VzIG5vdAotCQkgKiBxdWl0ZSBtYXRjaCB3aXRoIHRoZSBYTUwgZGF0YSBzdHJ1Y3R1cmUuIEluIHRoaXMgY2FzZSB3ZSBkbyBub3RoaW5nCi0JCSAqLwotCQlpZiAocU5hbWUuZXF1YWxzKHRoaXMuZ2V0Q3VycmVudFJlY29yZCgpLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQljdXJyZW50UmVjb3JkID0gdGhpcy5yZW1vdmVDdXJyZW50UmVjb3JkKCk7Ci0JCQlpZiAoY3VycmVudFJlY29yZCAhPSBudWxsKSB7Ci0JCQkJY3VycmVudFJlY29yZC5jb21taXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjZW5kRG9jdW1lbnQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUNhY2hlRXZlbnROb2RlIGxhc3RSZWNvcmQgPSB0aGlzLnJlbW92ZUN1cnJlbnRSZWNvcmQoKTsKLQkJbGFzdFJlY29yZC5jb21taXQoKTsKLQkJYXZhaWxhYmxlRXZlbnRQb29sLmZyZWV6ZVBvb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXRocm93IGV4OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXRocm93IGV4OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ1dhcm5pbmcoZXgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUm9vdChUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2VBcmcpIHsKLQkJdGhpcy5ldmVudFN0YWNrLnB1c2goYXZhaWxhYmxlRXZlbnRQb29sLmNyZWF0ZUNhY2hlRXZlbnROb2RlKHJlc291cmNlQXJnKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9TdGFjayhTdHJpbmcgbm9kZU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlDYWNoZUV2ZW50Tm9kZSBwYXJlbnQgPSB0aGlzLmdldEN1cnJlbnRSZWNvcmQoKTsKLQkJaWYgKCFwYXJlbnQuaXNDaGlsZElnbm9yYWJsZShub2RlTmFtZSkpIHsKLQkJCXRoaXMuZXZlbnRTdGFjay5wdXNoKGF2YWlsYWJsZUV2ZW50UG9vbC5jcmVhdGVDYWNoZUV2ZW50Tm9kZShwYXJlbnQsIG5vZGVOYW1lLCBhdHRyaWJ1dGVzKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIGV2ZW50IHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICovCi0JcHJvdGVjdGVkIENhY2hlRXZlbnROb2RlIGdldEN1cnJlbnRSZWNvcmQoKSB7Ci0JCUNhY2hlRXZlbnROb2RlIHJlc3VsdCA9IG51bGw7Ci0JCWlmICghdGhpcy5ldmVudFN0YWNrLmlzRW1wdHkoKSkgewotCQkJcmVzdWx0ID0gdGhpcy5ldmVudFN0YWNrLnBlZWsoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBDRU5PIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZXZlbnQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBDRU5PIGFuZCByZW1vdmUgaXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FjaGVFdmVudE5vZGUgcmVtb3ZlQ3VycmVudFJlY29yZCgpIHsKLQkJQ2FjaGVFdmVudE5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKCF0aGlzLmV2ZW50U3RhY2suaXNFbXB0eSgpKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLmV2ZW50U3RhY2sucG9wKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLwlwcml2YXRlIGZpbmFsIHZvaWQgcHJpbnRTdGFjaygpIHsKLQkvLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmludGluZyBzdGFjayAuLi4iKTsKLQkvLwkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV2ZW50U3RhY2suc2l6ZSgpOyBpKyspIHsKLQkvLwkJLy8gZGVidWcoInN0YWNrWyIgKyBpICsgIl06ICIgKyBldmVudFN0YWNrLmdldChpKSk7Ci0JLy8JCS8vIH0KLQkvLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIuLi4gUHJpbnRlZCBzdGFjayIpOwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgZGVidWcoT2JqZWN0IG9iaikgewotCS8vCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ob2JqKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIHdhcm4oT2JqZWN0IG9iaikgewotCS8vCQkvL1N5c3RlbS5lcnIucHJpbnRsbihvYmopOwotCS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwNjRmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRU1GMlNBWFJlbmRlcmVyIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckltcGwgewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBFTUYyU0FYUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvTG9hZChqYXZhLmlvLklucHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyhpc1ZhbGlkYXRpbmcoKSk7Ci0JCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJLyoKLQkJCSAqIENhdXNlcyBlcnJvcnMgaW4gSUJNIEpESyB0cnkgeyBmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9MQU5HVUFHRSwKLQkJCSAqIFczQ19YTUxfU0NIRU1BKTsgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsgfQotCQkJICovCi0JCQlTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCQlFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRU1GMlNBWERvY3VtZW50SGFuZGxlcih0aGlzLmdldFJlc291cmNlKCkpOwotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBpc1ZhbGlkYXRpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gc25yZSkgewotCQkJfQotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpIHsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsIGlzVmFsaWRhdGluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nV2FybmluZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWFcIi4gVmFsaWRhdGlvbiB3aWxsIGJlIGRpc2FibGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0cnkgewotCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3MiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nV2FybmluZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3NcIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLyoKLQkJCSAqIHRyeSB7IHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgaGFuZGxlcik7IH0KLQkJCSAqIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsgfQotCQkJICovCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXIpOwotCQkJLy9yZWFkZXIuc2V0RFRESGFuZGxlcihoYW5kbGVyKTsKLQkJCXJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihoYW5kbGVyKTsKLQkJCUlucHV0U291cmNlIHRlc3Rzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW4pOwotCQkJcmVhZGVyLnBhcnNlKHRlc3Rzb3VyY2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHRfcmV4KSB7Ci0JCQl0aHJvdyB0X3JleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZG9TYXZlKGphdmEuaW8uT3V0cHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQkvKgotCQkgKiB0cnkgeyBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPQotCQkgKiBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcihvdXRwdXRTdHJlYW0sCi0JCSAqIGNyZWF0ZU91dHB1dEZvcm1hdCgpKTsgc2VyaWFsaXplci5zZXRPdXRwdXRCeXRlU3RyZWFtKG91dHB1dFN0cmVhbSk7IENvbnRlbnRIYW5kbGVyCi0JCSAqIGhhbmRsZXIgPSBzZXJpYWxpemVyLmFzQ29udGVudEhhbmRsZXIoKTsKLQkJICovCi0KLQkJVHJhbnNmb3JtZXJIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlTQVhUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJCWhhbmRsZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcigpOwotCi0JCQkJaGFuZGxlci5zZXRSZXN1bHQobmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLQkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGhhbmRsZXIuZ2V0VHJhbnNmb3JtZXIoKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlZFUlNJT04sIGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgIm5vIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAgICAgCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSk7Ci0JCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQotCQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLCBnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkpOwotCi0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiU0FYIFdyaXRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlFTUYyU0FYV3JpdGVyIHdyaXRlciA9IG5ldyBFTUYyU0FYV3JpdGVyKCk7Ci0JCQl3cml0ZXIuc2VyaWFsaXplKHRoaXMucmVzb3VyY2UsIGhhbmRsZXIpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gc2F4ZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oc2F4ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByb3RlY3RlZCBPdXRwdXRGb3JtYXQgY3JlYXRlT3V0cHV0Rm9ybWF0KCkgeyBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOwotCSAqIGZvcm1hdC5zZXRJbmRlbnRpbmcodHJ1ZSk7IGZvcm1hdC5zZXRMaW5lU2VwYXJhdG9yKERPTVV0aWxpdGllcy5ORVdMSU5FX1NUUklORyk7Ci0JICogLy8kTk9OLU5MUy0xJCBmb3JtYXQuc2V0RW5jb2RpbmcoZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkgKiBmb3JtYXQuc2V0VmVyc2lvbihnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7IGlmICh0aGlzLnJlc291cmNlICE9IG51bGwpCi0JICogZm9ybWF0LnNldERvY3R5cGUodGhpcy5yZXNvdXJjZS5nZXRQdWJsaWNJZCgpLCB0aGlzLnJlc291cmNlLmdldFN5c3RlbUlkKCkpOyByZXR1cm4gZm9ybWF0OyB9Ci0JICovCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcHJlcGFyZVRvQWRkQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZXBhcmVUb0FkZENvbnRlbnRzKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNnZXRWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKS5nZXRWZXJzaW9uSUQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTQ0ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTksIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBVc2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIEVNRjJTQVhSZW5kZXJlcgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJTQVhSZW5kZXJlckZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVNRjJTQVhSZW5kZXJlckZhY3RvcnkoKTsKLQotCXByb3RlY3RlZCBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkjY3JlYXRlUmVuZGVyZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZW5kZXJlciBjcmVhdGVSZW5kZXJlcigpIHsKLQkJRU1GMlNBWFJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IEVNRjJTQVhSZW5kZXJlcigpOwotCQlyZW5kZXJlci5zZXRWYWxpZGF0aW5nKGlzVmFsaWRhdGluZygpKTsKLQkJcmV0dXJuIHJlbmRlcmVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1NTczNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKLQotLyoqCi0gKiBUaGUgRU1GMlNBWFdyaXRlciBoYW5kbGVzIHRoZSBzZXJpYWxpemF0aW9uIG9mIEVNRiBSZXNvdXJjZXMgdXNpbmcgU0FYIGV2ZW50cy4gU0FYIGV2ZW50cyBhcmUKLSAqIHRyaWdnZXJlZCB0byB0aGUgY29udGVudCBoYW5kbGVyIGFzIHRoZSB0cmVlIGlzIGJlaW5nIHBhcnNlZC4gVGhlc2UgZXZlbnRzIGNhbiB0aGVuIGJlIHdyaXR0ZW4KLSAqIGludG8gYW55IHN0cmVhbSB3cmFwcGVkIGJ5IHRoZSBDb250ZW50SGFuZGxlci4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyU0FYV3JpdGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICIiOy8vImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBVc2VkIGluIHRob3NlIGNhc2VzIHdoZXJlIG5vIEF0dHJpYnV0ZXMgYXJlIG5lY2Vzc2FyeSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMgRU1QVFlfQVRUUklCVVRFUyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotCi0JLyoqCi0JICogU2VyaWFsaXplIGFuIEVNRiByZXNvdXJjZSBpbnRvIGFuIFhNTCBTdHJlYW0gdXNpbmcgdGhlIGdpdmVuIENvbnRlbnRIYW5kbGVyLiBOb3RlIHRoYXQgdGhpcwotCSAqIG1ldGhvZCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvcHkgYSBnaXZlbiBFTUYgUmVzb3VyY2UgaWYgdGhlIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgaXMgdXNlZCBhcwotCSAqIHRoZSBnaXZlbiBDb250ZW50SGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZShUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UsIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCVRyYW5zbGF0b3Igcm9vdFRyYW5zbGF0b3IgPSByZXNvdXJjZS5nZXRSb290VHJhbnNsYXRvcigpOwotCQlFTGlzdCBjb250ZW50cyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0KLQkJaWYgKGNvbnRlbnRzLnNpemUoKSAhPSAxKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgY29udGVudHMgb2YgYSByZXNvdXJjZSBtYXkgb25seSBjb250YWluIG9uZSBFTUYgTW9kZWwgT2JqZWN0LiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCXNlcmlhbGl6ZShoYW5kbGVyLCBlbGVtZW50LCByb290VHJhbnNsYXRvciwgbmV3IFdyaXRlckhpbnRzKHJlc291cmNlKSk7Ci0JCWhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXJpYWxpemUoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgRU9iamVjdCB0YXJnZXQsIFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgV3JpdGVySGludHMgaGludHMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCUxpc3QgbW9mQ2hpbGRyZW4gPSBudWxsOwotCQlPYmplY3QgcmF3VmFsdWUgPSBudWxsOwotCQlFT2JqZWN0IG5ld1RhcmdldCA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgbmV4dFRyYW5zbGF0b3IgPSBudWxsOwotCQljaGFyW10gY2hhcmFjdGVyRGF0YSA9IG51bGw7Ci0JCVN0cmluZyBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG51bGw7Ci0JCVN0cmluZyBjaGlsZERvbU5hbWUgPSBudWxsOwotCQlmaW5hbCBpbnQgdmVyc2lvbiA9IGhpbnRzLmdldFZlcnNpb24oKTsKLQotCQkvKgotCQkgKiBQcm9jZXNzaW5nIGhpbnRzIGFyZSB1c2VkIHRvIHJlbWVtYmVyIHdoZXJlIGFyZSBpbiB0aGUgaXRlcmF0aW9uIG9mIHRoZSB0cmFuc2xhdG9yJ3MKLQkJICogY2hpbGRyZW4uIHNlZSB0aGUgVHJhbnNsYXRvckZpbHRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdGhpcyBhcnJheSBpcyB1c2VkLgotCQkgKi8KLQkJaW50W10gcHJvY2Vzc2luZ0hpbnRzID0gVHJhbnNsYXRvckZpbHRlci5jcmVhdGVQcm9jZXNzaW5nSGludHMoKTsKLQotCQlTdHJpbmcgdGFyZ2V0RG9tTmFtZSA9IHRyYW5zbGF0b3IuZ2V0RE9NTmFtZSh0YXJnZXQpOwotCi0JCWF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKHRyYW5zbGF0b3IsIHRhcmdldCwgaGludHMpOwotCi0JCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgdGFyZ2V0RG9tTmFtZSwgdGFyZ2V0RG9tTmFtZSwgYXR0cmlidXRlcyk7Ci0KLQkJY3VycmVudENoaWxkVHJhbnNsYXRvciA9IFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IodHJhbnNsYXRvciwgcHJvY2Vzc2luZ0hpbnRzW1RyYW5zbGF0b3JGaWx0ZXIuTkVYVF9TVEFSVF9ISU5UX0lORFhdLCBwcm9jZXNzaW5nSGludHMsIHRhcmdldCwgdmVyc2lvbik7Ci0JCXdoaWxlIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCS8qIEZvciBlYWNoIENoaWxkIFRyYW5zbGF0b3Igb2YgdGhlIFRyYW5zbGF0b3IgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIHRoZSBtZXRob2QgKi8KLQotCQkJLyogRG9lcyB0aGUgVHJhbnNsYXRvciBoYXZlIGFueSBNT0YgQ2hpbGRyZW4/ICovCi0JCQltb2ZDaGlsZHJlbiA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuZ2V0TU9GQ2hpbGRyZW4odGFyZ2V0KTsKLQkJCW9wZW5Eb21QYXRoSWZOZWNlc3NhcnkoaGFuZGxlciwgaGludHMsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIHRhcmdldCwgbW9mQ2hpbGRyZW4pOwotCi0JCQlpZiAoY3VycmVudENoaWxkVHJhbnNsYXRvci5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJLyoKLQkJCQkgKiBUcmFuc2xhdG9ycyB3aGljaCBhcmUgbWFuYWdlZCBieSB0aGVpciBwYXJlbnRzIHJlcXVpcmUgbGVzcyBwcm9jZXNzaW5nIC0tIGp1c3QKLQkJCQkgKiBjb252ZXJ0IHRoZWlyIHZhbHVlIHRvIGEgc3RyaW5nIGFuZCB3cml0ZSBpdCBvdXQgYXMgdGhlIGNvbnRlbnQgb2YgYW4gWE1MIGVsZW1lbnQKLQkJCQkgKi8KLQkJCQljaGlsZERvbU5hbWUgPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKLQkJCQlpZiAoIWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNFbXB0eVRhZygpKSB7Ci0JCQkJCS8qIFRoZSBUcmFuc2xhdG9yIGlzIG5vdCBhbiBFbXB0eSB0YWcuIEl0cyB0ZXh0IGNvbnRlbnQgaXMgc2lnbmlmaWNhbnQgKi8KLQotCQkJCQlpZiAobW9mQ2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtb2ZDaGlsZHJlbi5zaXplKCk7IGorKykgewotCi0JCQkJCQkJLyogVGV4dCBvbmx5IHRyYW5zbGF0b3JzIHdpbGwgbm90IGhhdmUgb3BlbiBhbmQgY2xvc2UgWE1MIGVsZW1lbnRzICovCi0JCQkJCQkJaWYgKCFjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzRE9NVGV4dFZhbHVlKCkpCi0JCQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCi0JCQkJCQkJcmF3VmFsdWUgPSBtb2ZDaGlsZHJlbi5nZXQoaik7Ci0JCQkJCQkJLyogY29udmVydFZhbHVlVG9TdHJpbmcgc2hvdWxkIGFsd2F5cyByZXR1cm4gYSBub24tbnVsbCBTdHJpbmcgKi8KLQkJCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuY29udmVydFZhbHVlVG9TdHJpbmcocmF3VmFsdWUsIHRhcmdldCk7Ci0JCQkJCQkJY2hhcmFjdGVyRGF0YSA9IFhNTEVuY29kZXJEZWNvZGVyLmVzY2FwZShjb252ZXJ0ZWRWYWx1ZSkudG9DaGFyQXJyYXkoKTsKLQkJCQkJCQloYW5kbGVyLmNoYXJhY3RlcnMoY2hhcmFjdGVyRGF0YSwgMCwgY2hhcmFjdGVyRGF0YS5sZW5ndGgpOwotCi0JCQkJCQkJaWYgKCFjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzRE9NVGV4dFZhbHVlKCkpCi0JCQkJCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZSBUcmFuc2xhdG9yIGlzIGFuIEVtcHR5IEVsZW1lbnQgKGl0cyBtZXJlIHByZXNlbmNlIGhhcyBzaWduaWZpY2FuY2UpIChlLmcuCi0JCQkJCSAqIDxjYXNjYWRlLWRlbGV0ZS8+Ci0JCQkJCSAqLwotCi0JCQkJCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzQm9vbGVhbkZlYXR1cmUoKSkgewotCQkJCQkJLyogQm9vbGVhbiBmZWF0dXJlcyBtYXkgb3IgbWF5IG5vdCBiZSByZW5kZXJlZCAqLwotCQkJCQkJcmF3VmFsdWUgPSBtb2ZDaGlsZHJlbi5nZXQoMCk7Ci0JCQkJCQlpZiAocmF3VmFsdWUgIT0gbnVsbCAmJiAoKEJvb2xlYW4pIHJhd1ZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCQkJCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lKTsKLQkJCQkJCX0KLQotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogQWx3YXlzIHJlbmRlciBhbnkgb3RoZXIgRW1wdHkgZWxlbWVudHMgKi8KLQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQotCQkJCS8qIFRoZSBUcmFuc2xhdG9yIGlzIGEgbW9yZSBjb21wbGV4IGZlYXR1cmUsIGhhbmRsZSBpdHMgcHJvY2Vzc2luZyByZWN1cnNpdmVseSAqLwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBqKyspIHsKLQkJCQkJbmV3VGFyZ2V0ID0gKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChqKTsKLQkJCQkJc2VyaWFsaXplKGhhbmRsZXIsIG5ld1RhcmdldCwgY3VycmVudENoaWxkVHJhbnNsYXRvciwgaGludHMpOwotCQkJCX0KLQkJCX0KLQotCQkJLyogRmV0Y2ggdGhlIG5leHQgcGVlciB0cmFuc2xhdG9yICovCi0JCQluZXh0VHJhbnNsYXRvciA9IFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IodHJhbnNsYXRvciwgcHJvY2Vzc2luZ0hpbnRzW1RyYW5zbGF0b3JGaWx0ZXIuTkVYVF9TVEFSVF9ISU5UX0lORFhdLCBwcm9jZXNzaW5nSGludHMsIHRhcmdldCwgdmVyc2lvbik7Ci0KLQkJCWNsb3NlRG9tUGF0aElmTmVjZXNzYXJ5KGhhbmRsZXIsIGhpbnRzLCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBuZXh0VHJhbnNsYXRvciwgdGFyZ2V0LCBtb2ZDaGlsZHJlbik7Ci0KLQkJCS8qCi0JCQkgKiBXZSBuZWVkZWQgdG8gaW52b2tlIGNsb3NlRG9tUGF0aElmTmVjZXNzYXJ5KCkgd2l0aCB0aGUgcGVlciwgbm93IHdlIG1vdmUgb24gdG8KLQkJCSAqIHByb2Nlc3MgdGhhdCBwZWVyCi0JCQkgKi8KLQkJCWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IgPSBuZXh0VHJhbnNsYXRvcjsKLQotCQl9Ci0JCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIHRhcmdldERvbU5hbWUsIHRhcmdldERvbU5hbWUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBET00gUGF0aCBzaG91bGQgYmUgcmVuZGVyZWQuIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwKLQkgKiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBFbXB0eSBYTUwgZWxlbWVudHMgYXJlIHJlbGV2YW50IGFuZCBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgWE1MCi0JICogc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIFRoZSBFTUYgVGFyZ2V0IG9mIHRoZSBUcmFuc2xhdGlvbgotCSAqIEBwYXJhbSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBUcmFuc2xhdG9yCi0JICogQHBhcmFtIG1vZkNoaWxkcmVuCi0JICogICAgICAgICAgICBUaGUgbW9mQ2hpbGRyZW4gdGhhdCB3ZXJlIGZvdW5kIGZvciB0aGUgVHJhbnNsYXRvciBvbiB0aGUgVGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRSZW5kZXJEb21QYXRoKEVPYmplY3QgdGFyZ2V0LCBUcmFuc2xhdG9yIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIExpc3QgbW9mQ2hpbGRyZW4pIHsKLQkJcmV0dXJuICAoY3VycmVudENoaWxkVHJhbnNsYXRvci5zaG91bGRSZW5kZXJFbXB0eURPTVBhdGgodGFyZ2V0KSB8fCBtb2ZDaGlsZHJlbi5zaXplKCkgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuRG9tUGF0aElmTmVjZXNzYXJ5IHdpbGwgd3JpdGUgdGhlIGN1cnJlbnQgRE9NIFBhdGggdG8gdGhlIHNlcmlhbGl6YXRpb24gc3RyZWFtIGlmIGl0IGhhcwotCSAqIG5vdCBiZWVuIHdyaXR0ZW4gYnkgYSBwcmV2aW91cyBwZWVyIHRyYW5zbGF0b3IuIFRoZSBwcm9jZXNzaW5nIHJlc3VsdHMgaW4gdGhlIGNvbGxhcHNlIG9mCi0JICogUGVlciBUcmFuc2xhdG9ycyB3aXRoIG1hdGNoaW5nIERPTSBQYXRocyBpbnRvIGEgc2luZ2xlIFhNTCBwYXJlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgVGhlIENvbnRlbnRIYW5kbGVyIHdoaWNoIGlzIHdyaXRpbmcgdGhlIFhNTCByZXN1bHQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIEEgR2xvYmFsIGNvbnRhaW5lciBmb3IgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBzaW5nbGUgWE1MIGRvY3VtZW50Ci0JICogQHBhcmFtIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgVHJhbnNsYXRvciBiZWluZyBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBUaGUgRU1GIFRhcmdldCBvZiB0aGUgVHJhbnNsYXRpb24KLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRG9tUGF0aElmTmVjZXNzYXJ5KENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsIFdyaXRlckhpbnRzIGhpbnRzLCBUcmFuc2xhdG9yIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIEVPYmplY3QgdGFyZ2V0LCBMaXN0IG1vZkNoaWxkcmVuKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQkvKiBJZiB0aGUgdHJhbnNsYXRvciBkb2VzIG5vdCBoYXZlIGEgRE9NIFBhdGgsIHRoZW4gd2UgZG8gbm90aGluZyAqLwotCQlpZiAoY3VycmVudENoaWxkVHJhbnNsYXRvci5oYXNET01QYXRoKCkgJiYgc2hvdWxkUmVuZGVyRG9tUGF0aCh0YXJnZXQsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIG1vZkNoaWxkcmVuKSkgewotCi0JCQlTdHJpbmcgY2hpbGREb21QYXRoID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0KLQkJCS8qCi0JCQkgKiBJc0RvbVBhdGhBY3RpdmUoKSB3aWxsIHZlcmlmeSB3aGV0aGVyIHRoaXMgRE9NIFBhdGggaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZQotCQkJICogWE1MIHN0cmVhbQotCQkJICovCi0JCQlpZiAoIWhpbnRzLmlzRG9tUGF0aEFjdGl2ZShjaGlsZERvbVBhdGgpKSB7Ci0KLQkJCQkvKgotCQkJCSAqIFdyaXRlIGFuIG9wZW4gZWxlbWVudCBmb3IgdGhlIERPTSBQYXRoIGFuZCAicmVtZW1iZXIiIHRoYXQgd2UgaGF2ZSB3cml0dGVuIGl0Ci0JCQkJICovCi0JCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbVBhdGgsIGNoaWxkRG9tUGF0aCwgRU1QVFlfQVRUUklCVVRFUyk7Ci0JCQkJaGludHMucHVzaERvbVBhdGgoY2hpbGREb21QYXRoKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvc2VEb21QYXRoSWZOZWNlc3Nhcnkgd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUgbmV4dCBwZWVyIFRyYW5zbGF0b3Igc2hhcmVzIHRoZSBhY3RpdmUgRE9NCi0JICogUGF0aCBvZiB0aGUgY3VycmVudCBUcmFuc2xhdG9yLiBJZiB0aGUgbmV4dCBwZWVyIFRyYW5zbGF0b3IgaGFzIHRoZSBzYW1lIERPTSBQYXRoLCBubyBhY3Rpb24KLQkgKiB3aWxsIGJlIHRha2VuIChoZW5jZSBjb25kZW5zaW5nIHRoZSBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIFhNTCBwYXJlbnQpLiBIb3dldmVyLCBpZiB0aGUgRE9NCi0JICogUGF0aCBkaWZmZXJzIChpbmNsdWRpbmcgdGhlIE5leHQgUGVlciBUcmFuc2xhdG9yIGhhcyBubyBET00gUGF0aCkgdGhlbiB0aGUgY3VycmVudCBET00gUGF0aAotCSAqIHdpbGwgYmUgY2xvc2VkIChhIGNsb3NlIFhNTCBlbGVtZW50IGlzIGdlbmVyYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgVGhlIENvbnRlbnRIYW5kbGVyIHdoaWNoIGlzIHdyaXRpbmcgdGhlIFhNTCByZXN1bHQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIEEgR2xvYmFsIGNvbnRhaW5lciBmb3IgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBzaW5nbGUgWE1MIGRvY3VtZW50Ci0JICogQHBhcmFtIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBsYXN0IFRyYW5zbGF0b3IgdG8gaGF2ZSBjb21wbGV0ZWQgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSBuZXh0VHJhbnNsYXRvcgotCSAqICAgICAgICAgICAgVGhlIG5leHQgcGVlciBUcmFuc2xhdG9yIHRoYXQgd2lsbCBiZWNvbWUgYWN0aXZlCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgVGhlIEVNRiBUYXJnZXQgb2YgdGhlIFRyYW5zbGF0aW9uCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VEb21QYXRoSWZOZWNlc3NhcnkoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgV3JpdGVySGludHMgaGludHMsIFRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciwgVHJhbnNsYXRvciBuZXh0VHJhbnNsYXRvciwgRU9iamVjdCB0YXJnZXQsIExpc3QgbW9mQ2hpbGRyZW4pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmhhc0RPTVBhdGgoKSAmJiBzaG91bGRSZW5kZXJEb21QYXRoKHRhcmdldCwgY3VycmVudENoaWxkVHJhbnNsYXRvciwgbW9mQ2hpbGRyZW4pKSB7Ci0JCQlTdHJpbmcgY2hpbGREb21QYXRoID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0JCQlpZiAobmV4dFRyYW5zbGF0b3IgIT0gbnVsbCkgeyAvKgotCQkJCQkJCQkJCSAgICogVGhlcmUgYXJlIG1vcmUgcGVlcnMgYWZ0ZXIgdGhpcyBlbGVtZW50LCB3ZSBjYW4gcGVlawotCQkJCQkJCQkJCSAgICogYWhlYWQKLQkJCQkJCQkJCQkgICAqLwotCQkJCVN0cmluZyBuZXh0UGVlckRvbVBhdGggPSBuZXh0VHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0JCQkJaWYgKG5leHRQZWVyRG9tUGF0aCA9PSBudWxsIHx8ICFuZXh0UGVlckRvbVBhdGguZXF1YWxzKGNoaWxkRG9tUGF0aCkpIHsKLQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21QYXRoLCBjaGlsZERvbVBhdGgpOwotCQkJCQloaW50cy5wb3BEb21QYXRoKCk7Ci0JCQkJfQotCi0JCQl9IGVsc2UgeyAvKiBUaGlzIHdhcyB0aGUgbGFzdCBjaGlsZCBlbGVtZW50LCB3ZSBtdXN0IGNsb3NlIHRoZSBkb21wYXRoICovCi0JCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21QYXRoLCBjaGlsZERvbVBhdGgpOwotCQkJCWhpbnRzLnBvcERvbVBhdGgoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFnZ3JlZ2F0ZSB0aGUgQXR0cmlidXRlIHRyYW5zbGF0b3IgY2hpbGRyZW4gZnJvbSBhIGdpdmVuIHRyYW5zbGF0b3IuIFRoaXMgbWV0aG9kIHdpbGwgcmVxdWVzdAotCSAqIHRoZSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgZnJvbSB0aGUgV3JpdGVySGludHMgb2JqZWN0LiBUaGUgV3JpdGVySGludHMgbWFpbnRhaW5zIHRoaXMKLQkgKiByZXVzYWJsZSBjb2xsZWN0aW9uIHRvIGxpbWl0IHRoZSByZXF1aXJlbWVudCBmb3IgbmV3IG9iamVjdCBjcmVhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvcgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiBAcmV0dXJuIGFuIGluaXRpYWxpemVkIHNldCBvZiBBdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gVHJhbnNsYXRvciBhbmQgRU1GIFRhcmdldAotCSAqLwotCXByaXZhdGUgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgRU9iamVjdCB0YXJnZXQsIFdyaXRlckhpbnRzIGhpbnRzKSB7Ci0KLQkJQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlcyA9IGhpbnRzLmdldEF0dHJpYnV0ZUhvbGRlcigpOwotCQlpbnQgdmVyc2lvbiA9IGhpbnRzLmdldFZlcnNpb24oKTsKLQkJT2JqZWN0IHJhd1ZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIGNoaWxkRG9tTmFtZSA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgYXR0cmlidXRlVHJhbnNsYXRvciA9IG51bGw7Ci0JCWludFtdIHByb2Nlc3NpbmdIaW50cyA9IFRyYW5zbGF0b3JGaWx0ZXIuY3JlYXRlUHJvY2Vzc2luZ0hpbnRzKCk7Ci0KLQkJd2hpbGUgKChhdHRyaWJ1dGVUcmFuc2xhdG9yID0gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0QXR0cmlidXRlVHJhbnNsYXRvcih0cmFuc2xhdG9yLCBwcm9jZXNzaW5nSGludHNbVHJhbnNsYXRvckZpbHRlci5ORVhUX1NUQVJUX0hJTlRfSU5EWF0sIHByb2Nlc3NpbmdIaW50cywgdGFyZ2V0LCB2ZXJzaW9uKSkgIT0gbnVsbCkgewotCi0JCQlMaXN0IG1vZkNoaWxkcmVuID0gYXR0cmlidXRlVHJhbnNsYXRvci5nZXRNT0ZDaGlsZHJlbih0YXJnZXQpOwotCQkJaWYgKG1vZkNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaisrKSB7Ci0KLQkJCQkJY2hpbGREb21OYW1lID0gYXR0cmlidXRlVHJhbnNsYXRvci5nZXRET01OYW1lKHRhcmdldCk7Ci0JCQkJCXJhd1ZhbHVlID0gbW9mQ2hpbGRyZW4uZ2V0KGopOwotCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGF0dHJpYnV0ZVRyYW5zbGF0b3IuY29udmVydFZhbHVlVG9TdHJpbmcocmF3VmFsdWUsIHRhcmdldCk7Ci0JCQkJCWNvbnZlcnRlZFZhbHVlID0gWE1MRW5jb2RlckRlY29kZXIuZXNjYXBlKGNvbnZlcnRlZFZhbHVlKTsKLQkJCQkJYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgIlN0cmluZyIsIGNvbnZlcnRlZFZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQljaGlsZERvbU5hbWUgPSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKLQkJCQljb252ZXJ0ZWRWYWx1ZSA9IChTdHJpbmcpIGF0dHJpYnV0ZVRyYW5zbGF0b3IuZ2V0TU9GVmFsdWUodGFyZ2V0KTsKLQkJCQlpZiAoY29udmVydGVkVmFsdWUgIT0gbnVsbCkKLQkJCQkJYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgIlN0cmluZyIsIGNvbnZlcnRlZFZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIFdyaXRlckhpbnRzIGlzIHVzZWQgdG8gInJlbWVtYmVyIiBjZXJ0YWluIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB3aGlsZSB0aGUgd3JpdGVyIGlzCi0JICogcHJvY2Vzc2luZy4gT2YgcGFydGljdWxhciBpbnRlcmVzdCBhcmUgdGhlIHZlcnNpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgRE9NIFBhdGggb3V0cHV0LgotCSAqIENvbnNlY3V0aXZlIGVsZW1lbnRzIHdpdGggY29uc2lzdGVudCAoaWRlbnRpY2FsKSBET00gUGF0aHMgYXJlIGNvbGxhcHNlZCB1bmRlciBhIHNpbmdsZSBYTUwKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIFRoZSBXcml0ZXJIaW50cyBwcm92aWRlcyBnbG9iYWwgc3RhdGUgYmV0d2VlbiByZWN1cnNpdmUgaW52b2NhdGlvbnMgb2Ygc2VyaWFsaXplKCkuIEl0IHNob3VsZAotCSAqIGJlIG5vdCBiZSB1c2VkIHRvIHN0b3JlIGxvY2FsIGRhdGEgKGUuZy4gZGF0YSB0aGF0IGlzIG9ubHkgcmVsZXZhbnQgdG8gYSBzaW5nbGUgVHJhbnNsYXRvciBpbgotCSAqIGEgZ2l2ZW4gY29udGV4dCkuCi0JICogCi0JICogVGhlIFdyaXRlckhpbnRzIGFsc28gc3RvcmVzIGFuIEF0dHJpYnV0ZXNJbXBsIG9iamVjdCB0aGF0IGlzIHJlLXVzZWQgdG8gc3RvcmUgYXR0cmlidXRlcy4gVGhlCi0JICogZ2V0QXR0cmlidXRlcygpIG1ldGhvZCB3aWxsIHJlcXVlc3QgdGhlIEF0dHJpYnV0ZXMgSG9sZGVyLgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBjbGFzcyBXcml0ZXJIaW50cyB7Ci0JCXByaXZhdGUgZmluYWwgVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlOwotCQlwcml2YXRlIGZpbmFsIFN0YWNrIGRvbVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCXByaXZhdGUgZmluYWwgQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlc0ltcGwgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLQotCQlwdWJsaWMgV3JpdGVySGludHMoVHJhbnNsYXRvclJlc291cmNlIHJlcykgewotCQkJdGhpcy5yZXNvdXJjZSA9IHJlczsKLQkJfQotCi0JCS8qKgotCQkgKiBQdXNoIGEgbmV3IGRvbVBhdGggb250byB0aGUgc3RhY2sKLQkJICogCi0JCSAqIEBwYXJhbSBkb21QYXRoCi0JCSAqICAgICAgICAgICAgYSBET01QYXRoIHdoaWNoIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICovCi0JCXB1YmxpYyB2b2lkIHB1c2hEb21QYXRoKFN0cmluZyBkb21QYXRoKSB7Ci0KLQkJCWlmIChkb21QYXRoICE9IG51bGwgJiYgZG9tUGF0aC5sZW5ndGgoKSA+IDApCi0JCQkJZG9tU3RhY2sucHVzaChkb21QYXRoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQb3AgdGhlIGN1cnJlbnQgZG9tUGF0aCBmcm9tIHRoZSBBcnJheQotCQkgKi8KLQkJcHVibGljIHZvaWQgcG9wRG9tUGF0aCgpIHsKLQotCQkJaWYgKCFkb21TdGFjay5pc0VtcHR5KCkpCi0JCQkJZG9tU3RhY2sucG9wKCk7Ci0JCX0KLQotCQkvKioKLQkJICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gRE9NUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICogCi0JCSAqIEBwYXJhbSBkb21QYXRoCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gRE9NUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRG9tUGF0aEFjdGl2ZShTdHJpbmcgZG9tUGF0aCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmICghZG9tU3RhY2suaXNFbXB0eSgpKSB7Ci0KLQkJCQlTdHJpbmcgY3VycmVudERvbVBhdGggPSAoU3RyaW5nKSBkb21TdGFjay5wZWVrKCk7Ci0JCQkJaWYgKGN1cnJlbnREb21QYXRoICE9IG51bGwgJiYgZG9tUGF0aCAhPSBudWxsKQotCQkJCQlyZXN1bHQgPSBjdXJyZW50RG9tUGF0aC5lcXVhbHMoZG9tUGF0aCk7Ci0JCQkJZWxzZSBpZiAoIShjdXJyZW50RG9tUGF0aCA9PSBudWxsIF4gZG9tUGF0aCA9PSBudWxsKSkKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBFTUYgUmVzb3VyY2UKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLQkJCXJldHVybiB0aGlzLnJlc291cmNlLmdldFZlcnNpb25JRCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgYW4gZW1wdHkgQXR0cmlidXRlc0ltcGwgb2JqZWN0IHRvIHN0b3JlIGF0dHJpYnV0ZXMuIFdpdGhpbiB0aGUgY29udGV4dCBvZiBhIGdpdmVuCi0JCSAqIFdyaXRlckhpbnRzIG9iamVjdCAoYW5kIGhlbmNlIHNpbmdsZSBYTUwgZG9jdW1lbnQpLCB0aGUgb2JqZWN0IHJldHVybmVkIGlzIGEgc2luZ2xldG9uLgotCQkgKiBUaGUgc2FtZSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgaXMgY2xlYXJlZCBhbmQgcmV1c2VkIGZvciBlYWNoIGludm9jYXRpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIGFuIGVtcHR5IEF0dHJpYnV0ZXNJbXBsIG9iamVjdCB0byBzdG9yZSBhdHRyaWJ1dGVzCi0JCSAqLwotCQlwdWJsaWMgQXR0cmlidXRlc0ltcGwgZ2V0QXR0cmlidXRlSG9sZGVyKCkgewotCQkJdGhpcy5hdHRyaWJ1dGVzSW1wbC5jbGVhcigpOwotCQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc0ltcGw7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2IzYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIERlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgTWFwLyo8U3RyaW5nIHNob3J0TmFtZSwgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcj4qLyBkZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7IAotCXByaXZhdGUgTWFwLyo8UmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciwgUmVzb3VyY2UuRmFjdG9yeT4qLyBmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlLkZhY3RvcnkgdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgVVJJJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsI2dldEZhY3RvcnkoVVJJKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RmlsZU5hbWVGYWN0b3J5KFVSSSB1cmkpIHsKLQotCQlpZih1cmkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih1cmkpOwotCQkJCi0JCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0RmFjdG9yeShkZXNjcmlwdG9yKTsJCi0JCQl9CQotCQl9Ci0JCXJldHVybiBudWxsOwotCQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KHVyaSwgbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpLCBTdHJpbmcgY29udGVudFR5cGUpCi0JewotCQlSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IG51bGw7Ci0JCWlmKHVyaSAhPSBudWxsICYmIHVyaS5sYXN0U2VnbWVudCgpICE9IG51bGwpIHsKLQkJCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodXJpKTsKLQkJCQotCQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VGYWN0b3J5ID0gZ2V0RmFjdG9yeShkZXNjcmlwdG9yKTsJCi0JCQl9CQotCQl9Ci0JCWlmKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKQotCQkJcmVzb3VyY2VGYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeSh1cmksIGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIHJlc291cmNlRmFjdG9yeTsgCi0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBmaWxlIG5hbWUgcmVwcmVzZW50aW5nIHRoZSBsYXN0IHNlZ21lbnQgb2YgYSBVUkkgd2l0aCB0aGUgY29ycmVzcG9uZGluZwotCSAqIFJlc291cmNlLkZhY3RvcnkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFN0cmluZyBhU2ltcGxlRmlsZU5hbWUsIFJlc291cmNlLkZhY3RvcnkgYUZhY3RvcnkpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoYVNpbXBsZUZpbGVOYW1lKTsKLQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gdXJpLmxhc3RTZWdtZW50KCk7IAotCQlhZGREZXNjcmlwdG9yKG5ldyBTdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKGxhc3RTZWdtZW50LCBhRmFjdG9yeSkpOwkJCi0JfSAKLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFVSSSB1cmkpIHsKLQkJcmV0dXJuIChSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQodXJpLmxhc3RTZWdtZW50KCkpOwotCX0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIE1hcCBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBzeW5jaHJvbml6ZWQgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeyAgCi0JCVJlc291cmNlLkZhY3RvcnkgZmFjdG9yeSA9IChGYWN0b3J5KSBmYWN0b3JpZXMuZ2V0KGRlc2NyaXB0b3IpOwotCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3Rvcmllcy5wdXQoZGVzY3JpcHRvciwgKGZhY3RvcnkgPSBkZXNjcmlwdG9yLmNyZWF0ZUZhY3RvcnkoKSkpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0b3IoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7IAotCQlkZXNjcmlwdG9ycy5wdXQoZGVzY3JpcHRvci5nZXRTaG9ydFNlZ21lbnQoKSwgZGVzY3JpcHRvcik7Ci0JfQotIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvR2VuZXJpY1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0dlbmVyaWNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTRmMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvR2VuZXJpY1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBTcGVjaWFsaXplZCB0cmFuc2xhdG9yIGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBzaW1wbGUgbWFwcGluZ3Mgd2l0aCBubyBzcGVjaWFsaXplZCBiZWhhdmlvci4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGVDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gcGF0aHMKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRocyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIGVDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUcmFuc2xhdG9yW10KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICogICAgICAgICAgICBUaGUgY2hpbGRyZW4gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBhcHBlbmRDaGlsZHJlbihHZW5lcmljVHJhbnNsYXRvciB0cmFuLCBUcmFuc2xhdG9yW10gY2hpbGQpIHsKLQkJVHJhbnNsYXRvcltdIG9yZ0NoaWxkID0gdHJhbi5nZXRDaGlsZHJlbigpOwotCQlUcmFuc2xhdG9yW10gbmV3Q2hpbGRyZW4gPSAoVHJhbnNsYXRvcltdKSBjb25jYXQob3JnQ2hpbGQsIGNoaWxkKTsKLQkJdHJhbi5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiB0cmFuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBhcHBlbmRDaGlsZChHZW5lcmljVHJhbnNsYXRvciB0cmFuLCBUcmFuc2xhdG9yIGNoaWxkKSB7Ci0JCU9iamVjdFtdIG9yZ0NoaWxkID0gdHJhbi5nZXRDaGlsZHJlbigpOwotCQlUcmFuc2xhdG9yW10gbmV3Q2hpbGRyZW4gPSAoVHJhbnNsYXRvcltdKSBjb25jYXQob3JnQ2hpbGQsIGNoaWxkKTsKLQkJdHJhbi5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiB0cmFuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JRFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lEVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjBmN2YwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lEVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIElEVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCXB1YmxpYyBjbGFzcyBOb1Jlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODYzMzIwMTI5MTI4ODIzNzUzMEw7Ci0KLQkJcHVibGljIE5vUmVzb3VyY2VFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIE5vUmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgSURfRkVBVFVSRSA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VJREF0dHJpYnV0ZSgpOwotCXN0YXRpYyBmaW5hbCBwdWJsaWMgSURUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IElEVHJhbnNsYXRvcigpOwotCi0JcHVibGljIElEVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoImlkIiwgSURfRkVBVFVSRSwgRE9NX0FUVFJJQlVURSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSkgZW1mT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9SZXNvdXJjZUV4Y2VwdGlvbigpOwotCQlTdHJpbmcgaWQgPSByZXMuZ2V0SUQoZW1mT2JqZWN0KTsKLQkJaWYgKGlkID09IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKChpZCAhPSBudWxsICYmICFpZC5lcXVhbHModmFsdWUpKSB8fCAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKGlkKSkpCi0JCQlyZXMuc2V0SUQoZW1mT2JqZWN0LCAoU3RyaW5nKSB2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9SZXNvdXJjZUV4Y2VwdGlvbigpOwotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGVtZk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE5vUmVzb3VyY2VFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRJRChlbWZPYmplY3QpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0lETWFwKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JUm9vdE9iamVjdFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JUm9vdE9iamVjdFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDgxMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSVJvb3RPYmplY3RSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJvb3RPYmplY3RSZXNvdXJjZSB7Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0xpbmtVcGRhdGVyVGFyZ2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9MaW5rVXBkYXRlclRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWNkMWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0xpbmtVcGRhdGVyVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTGlua1VwZGF0ZXJUYXJnZXQgZXh0ZW5kcyBPYmplY3QgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rVXBkYXRlclRhcmdldCBJTlNUQU5DRSA9IG5ldyBMaW5rVXBkYXRlclRhcmdldCgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExpbmtVcGRhdGVyTXVsdGlUYXJnZXQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKi8KLQlwcml2YXRlIExpbmtVcGRhdGVyVGFyZ2V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdXBkYXRlRE9NKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXJlZnJlc2hTb3VyY2VPYmplY3RzKG1hcCwgbm9kZSwgbW9mT2JqZWN0LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0YoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmVmcmVzaFNvdXJjZU9iamVjdHMobWFwLCBub2RlLCBtb2ZPYmplY3QsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU291cmNlT2JqZWN0cyhUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCwgYm9vbGVhbiBkb21VcGRhdGUpIHsKLQkJVHJhbnNsYXRvclBhdGhbXSBwYXRocyA9IG1hcC5nZXRUcmFuc2xhdG9yUGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJVHJhbnNsYXRvclBhdGggcGF0aCA9IHBhdGhzW2ldOwotCQkJTGlzdCBhbGxTb3VyY2VPYmplY3RzID0gcGF0aC5maW5kT2JqZWN0cyhtb2ZPYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsU291cmNlT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGN1ck9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlFTUYyRE9NQWRhcHRlciBjdXJBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihjdXJPYmplY3QuZUFkYXB0ZXJzKCksIEVNRjJET01BZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoY3VyQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWlmIChkb21VcGRhdGUpCi0JCQkJCQljdXJBZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCQllbHNlCi0JCQkJCQljdXJBZGFwdGVyLnVwZGF0ZU1PRigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NYXBwZWRYTUlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL01hcHBlZFhNSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQ2YWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL01hcHBlZFhNSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JRFV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwZWRYTUlIZWxwZXIgZXh0ZW5kcyBYTUxIZWxwZXJJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLU1BBQ0VfUFJPVE9DT0wgPSAid29ya3NwYWNlOi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MID0gInBsYXRmb3JtOi9yZXNvdXJjZS8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIE5VTExfRkVBVFVSRSA9IG5ldyBVbnN1cHBvcnRlZEZlYXR1cmUoKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2luZ01hcHMgPSB0cnVlOwotCXByb3RlY3RlZCBNYXAgY2FjaGVkUmVsYXRpdmVVUklzOwotCXByb3RlY3RlZCBNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hcHBlZFhNTEhlbHBlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgTWFwcGVkWE1JSGVscGVyKFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgcHJlZml4ZXNUb1VSSXMpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQl0aGlzLnByZWZpeGVzVG9VUklzLnB1dEFsbChwcmVmaXhlc1RvVVJJcyk7Ci0JCXB1c2hDb250ZXh0KCk7IC8vTmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRleHQgdG8gemVybwotCQlTZXQga2V5cyA9IHByZWZpeGVzVG9VUklzLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpIHByZWZpeGVzVG9VUklzLmdldChwcmVmaXgpOwotCQkJbmFtZXNwYWNlU3VwcG9ydC5kZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpKTsKLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFVSSSByZXNvbHZlKFVSSSByZWxhdGl2ZSwgVVJJIGJhc2UpIHsKLQkJVVJJIHJlc29sdmVkID0gbnVsbDsKLQkJYm9vbGVhbiBpc01hcHBlZCA9IGZhbHNlOwotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJVVJJIGxvY2FscmVzb3VyY2VVUkkgPSBudWxsOwotCQkJaWYgKHJlbGF0aXZlLmhhc0ZyYWdtZW50KCkpCi0JCQkJbG9jYWxyZXNvdXJjZVVSSSA9IHJlbGF0aXZlLnRyaW1GcmFnbWVudCgpOwotCQkJZWxzZQotCQkJCWxvY2FscmVzb3VyY2VVUkkgPSByZWxhdGl2ZTsKLQkJCWlzTWFwcGVkID0gISgoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKSBzZXQuZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSShsb2NhbHJlc291cmNlVVJJKS5lcXVhbHMobG9jYWxyZXNvdXJjZVVSSSkpOwotCQl9Ci0JCWlmICghaXNNYXBwZWQpIHsKLQkJCWlmIChpc1VzaW5nQ29udGFpbmVyUmVsYXRpdmVQYXRocygpICYmIHNldCAhPSBudWxsKQotCQkJCXJlc29sdmVkID0gc2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShyZWxhdGl2ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvbHZlZCA9IHJlbGF0aXZlOwotCQl9Ci0JCXJldHVybiByZXNvbHZlZCA9PSBudWxsID8gc3VwZXIucmVzb2x2ZShyZWxhdGl2ZSwgYmFzZSkgOiByZXNvbHZlZDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaXNVc2luZ0NvbnRhaW5lclJlbGF0aXZlUGF0aHMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVXNpbmdDb250YWluZXJSZWxhdGl2ZVBhdGhzKCkgewotCQlyZXR1cm4gKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIHJlc291cmNlKS5nZXRGb3JtYXQoKSA9PSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUgfHwgdXNpbmdNYXBzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCS8qCi0JCSAqIHByb2JsZW0gLSB0aGUgaW5jb21pbmcga2V5IHZhbHVlIHBhaXIgaXMgZWpiYm5kLT5lamJibmQueG1pOyBob3dldmVyLCB0aGUgbWFwIGFscmVhZHkgaGFzCi0JCSAqIGEga2V5IHZhbHVlIHBhaXIgb2YgZWpiYm5kLT5odHRwOi8vL2VqYmJuZC5lY29yZQotCQkgKi8KLQkJaWYgKHVyaS5lbmRzV2l0aCgiLmVjb3JlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdXNpbmdNYXBzID0gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4aXN0aW5nID0gcHJlZml4ZXNUb1VSSXMuZ2V0KHByZWZpeCk7Ci0JCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQlwcmVmaXhlc1RvVVJJcy5wdXQocHJlZml4LCB1cmkpOwotCQkJbmFtZXNwYWNlU3VwcG9ydC5kZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpKTsKLQkJfSBlbHNlIGlmICghZXhpc3RpbmcuZXF1YWxzKHVyaSkpIHsKLQkJCWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLmFkZE9yaWdpbmFsUGFja2FnZVVSSShleGlzdGluZywgdXJpKTsKLQkJCWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLnNldEZvcm1hdChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSBnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSBnZXRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0SFJFRihFT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SFJFRihFT2JqZWN0IG9iaikgewotCQlpZiAoIWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLnVzZXNEZWZhdWx0Rm9ybWF0KCkpIHsKLQkJCVVSSUNvbnZlcnRlciBjb252ID0gZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlpZiAoY29udiAhPSBudWxsICYmIGNvbnYgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKSB7Ci0JCQkJU3RyaW5nIGhyZWYgPSBnZXRDb21wYXRpYmxpbHR5SFJFRihvYmosIChDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKSBjb252KTsKLQkJCQlyZXR1cm4gdXNlV29ya3NwYWNlUHJvdG9jb2xJZk5lY2Vzc2FyeShocmVmKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SFJFRihvYmopOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2VXb3Jrc3BhY2VQcm90b2NvbElmTmVjZXNzYXJ5KFN0cmluZyBocmVmKSB7Ci0JCWlmIChocmVmICE9IG51bGwgJiYgaHJlZi5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkKLQkJCXJldHVybiBXT1JLU1BBQ0VfUFJPVE9DT0wgKyBocmVmLnN1YnN0cmluZygxOSk7Ci0JCXJldHVybiBocmVmOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENvbXBhdGlibGlsdHlIUkVGKEVPYmplY3Qgb2JqLCBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyIGNvbnYpIHsKLQkJLy9JbXBsZW1lbnRhdGlvbiBjb3BpZWQgZnJvbSBzdXBlci5nZXRIUkVGKEVPYmplY3QpCi0JCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgb2JqOwotCi0JCVVSSSBvYmplY3RVUkkgPSBvLmVQcm94eVVSSSgpOwotCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCVJlc291cmNlIG90aGVyUmVzb3VyY2UgPSBvYmouZVJlc291cmNlKCk7Ci0JCQlpZiAob3RoZXJSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJb2JqZWN0VVJJID0gaGFuZGxlRGFuZ2xpbmdIUkVGKG9iaik7Ci0JCQkJaWYgKG9iamVjdFVSSSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCW9iamVjdFVSSSA9IG90aGVyUmVzb3VyY2UuZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQob3RoZXJSZXNvdXJjZS5nZXRVUklGcmFnbWVudChvYmopKTsKLQkJfQotCi0JCS8vTW9kaWZpZWQgdG8gZGlzcGF0Y2ggYmFjayB0byBVUkkgQ29udmVydGVyCi0JCWlmICghb2JqZWN0VVJJLmlzUmVsYXRpdmUoKSkgewotCQkJb2JqZWN0VVJJID0gbWFrZVJlbGF0aXZlKG9iamVjdFVSSSwgY29udik7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBVUkkgbWFrZVJlbGF0aXZlKFVSSSBvYmplY3RVUkksIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgY29udikgewotCQlVUkkgaW5uZXJPYmplY3RVUkkgPSBvYmplY3RVUkk7Ci0JCVN0cmluZyBmcmFnbWVudCA9IGlubmVyT2JqZWN0VVJJLmZyYWdtZW50KCk7Ci0JCWlubmVyT2JqZWN0VVJJID0gaW5uZXJPYmplY3RVUkkudHJpbUZyYWdtZW50KCk7Ci0JCVVSSSByZWxhdGl2ZSA9IChVUkkpIGdldENhY2hlZFJlbGF0aXZlVVJJcygpLmdldChpbm5lck9iamVjdFVSSSk7Ci0JCWlmIChyZWxhdGl2ZSA9PSBudWxsKSB7Ci0JCQlyZWxhdGl2ZSA9IGNvbnYuZGVOb3JtYWxpemUoaW5uZXJPYmplY3RVUkkpOwotCQkJaWYgKHJlbGF0aXZlLmlzUmVsYXRpdmUoKSkKLQkJCQljYWNoZWRSZWxhdGl2ZVVSSXMucHV0KGlubmVyT2JqZWN0VVJJLCByZWxhdGl2ZSk7Ci0JCX0KLQkJcmV0dXJuIHJlbGF0aXZlLmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJJQ29udmVydGVyIGdldFVSSUNvbnZlcnRlcigpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldENhY2hlZFJlbGF0aXZlVVJJcygpIHsKLQkJaWYgKGNhY2hlZFJlbGF0aXZlVVJJcyA9PSBudWxsKQotCQkJY2FjaGVkUmVsYXRpdmVVUklzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGNhY2hlZFJlbGF0aXZlVVJJczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldElEKEVPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJRChFT2JqZWN0IG9iaikgewotCQlpZiAoZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkudXNlc0RlZmF1bHRGb3JtYXQoKSkKLQkJCXJldHVybiBzdXBlci5nZXRJRChvYmopOwotCQlyZXR1cm4gSURVdGlsLmdldE9yQXNzaWduSUQob2JqLCByZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldE5TSW5mbyhFUGFja2FnZSBwa2cpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1hcHBlZFByZWZpeChwa2cpOwotCQlpZiAocHJlZml4ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde3BrZy5nZXROc1ByZWZpeCgpLCBwa2cuZ2V0TnNVUkkoKX07Ci0JCXJldHVybiBuZXcgU3RyaW5nW117cHJlZml4LCBwcmVmaXggKyAiLnhtaSJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwZWRQcmVmaXgoRVBhY2thZ2UgcGtnKSB7Ci0JCVN0cmluZyBuc1VSSSA9IHBrZy5nZXROc1VSSSgpOwotCQlpZiAodXNpbmdNYXBzIHx8ICFnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKS51c2VzRGVmYXVsdEZvcm1hdCgpKQotCQkJcmV0dXJuIChTdHJpbmcpIHBhY2thZ2VVUklzVG9QcmVmaXhlcy5nZXQobnNVUkkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBlZFByZWZpeE9yRGVmYXVsdChFUGFja2FnZSBwa2cpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1hcHBlZFByZWZpeChwa2cpOwotCQlyZXR1cm4gcHJlZml4ID09IG51bGwgPyBwa2cuZ2V0TnNQcmVmaXgoKSA6IHByZWZpeDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgewotCQlyZXR1cm4gcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFja2FnZVVSSXNUb1ByZWZpeGVzCi0JICogICAgICAgICAgICBUaGUgcGFja2FnZVVSSXNUb1ByZWZpeGVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VVUklzVG9QcmVmaXhlcyhNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzKSB7Ci0JCXRoaXMucGFja2FnZVVSSXNUb1ByZWZpeGVzID0gcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UU5hbWUoRUNsYXNzIGMpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKGMpOwotCi0JCWlmICh4bWxNYXAgIT0gbnVsbCkgewotCQkJWE1MUmVzb3VyY2UuWE1MSW5mbyBjbHNJbmZvID0geG1sTWFwLmdldEluZm8oYyk7Ci0KLQkJCWlmIChjbHNJbmZvICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY2xzSW5mby5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCQlyZXR1cm4gZ2V0UU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKLQkJCX0KLQkJfQotCi0JCUVQYWNrYWdlIHAgPSBjLmdldEVQYWNrYWdlKCk7Ci0JCXBhY2thZ2VzLnB1dChwLCBudWxsKTsKLQotCQlpZiAocC5nZXROc1ByZWZpeCgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQgCi0JCQlyZXR1cm4gbmFtZTsKLQotCQkvL01vZGlmaWVkIGZyb20gc3VwZXJjbGFzcwotCQkvL3JldHVybiBwLmdldE5zUHJlZml4KCkgKyAiOiIgKyBuYW1lOwotCQlyZXR1cm4gZ2V0TWFwcGVkUHJlZml4T3JEZWZhdWx0KHApICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI3NldFZhbHVlKEVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSwKLQkgKiAgICAgIE9iamVjdCwgaW50KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgcG9zaXRpb24pIHsKLQkJaWYgKGZlYXR1cmUgPT0gTlVMTF9GRUFUVVJFKQotCQkJcmV0dXJuOwotCQlpZiAoIWZlYXR1cmUuaXNUcmFuc2llbnQoKSkgewotCQkJaWYgKHZhbHVlID09IG51bGwgJiYgZmVhdHVyZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkuaXNQcmltaXRpdmUoKSkKLQkJCQkvL0ZvciBjb21wYXRpYmlsaXR5IHdpdGggTU9GNSB3aGVyZSB0eXBlcyBsaWtlIEludGVnZXIgbWlnaHQgaGF2ZSBiZWVuIHNldAotCQkJCS8vYW5kIHNlcmlhbGl6ZWQgYXMgInhzaTpuaWwiCi0JCQkJcmV0dXJuOwotCi0JCQlzdXBlci5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBwb3NpdGlvbik7Ci0JCX0KLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlciNnZXRGZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQpIHsKLQkJaWYgKFVuc3VwcG9ydGVkRmVhdHVyZS5pc1Vuc3VwcG9ydGVkKGVDbGFzcywgbmFtZSkpCi0JCQlyZXR1cm4gTlVMTF9GRUFUVVJFOwotCQlyZXR1cm4gc3VwZXIuZ2V0RmVhdHVyZShlQ2xhc3MsIG5hbWVzcGFjZVVSSSwgbmFtZSwgaXNFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyI2dldEZlYXR1cmVLaW5kKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBnZXRGZWF0dXJlS2luZChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZSA9PSBOVUxMX0ZFQVRVUkUpCi0JCQlyZXR1cm4gWE1MSGVscGVyLkRBVEFUWVBFX1NJTkdMRTsKLQkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmVLaW5kKGZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL011bHRpT2JqZWN0VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTXVsdGlPYmplY3RUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjI2ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTXVsdGlPYmplY3RUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aU9iamVjdFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gRU1QVFlfVFJBTlNMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltde307Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgTXVsdGlPYmplY3RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFRyYW5zbGF0b3IgZ2V0RGVsZWdhdGVGb3IoRU9iamVjdCBvKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBUcmFuc2xhdG9yIGdldERlbGVnYXRlRm9yKFN0cmluZyBkb21OYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSk7Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIGdldERlbGVnYXRlRm9yKG5vZGVOYW1lLCByZWFkQWhlYWROYW1lKS5jcmVhdGVFTUZPYmplY3Qobm9kZU5hbWUsIHJlYWRBaGVhZE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbikgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZX1RSQU5TTEFUT1JTOwotCQlyZXR1cm4gZ2V0RGVsZWdhdGVGb3IoKEVPYmplY3QpIG8pLmdldENoaWxkcmVuKG8sIHZlcnNpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0RE9NTmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGdldERlbGVnYXRlRm9yKChFT2JqZWN0KSB2YWx1ZSkuZ2V0RE9NTmFtZSh2YWx1ZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTWFuYWdlZEJ5UGFyZW50KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudEVuZFRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZ2V0RE9NUGF0aCgpKSkgewotCQkJcmV0dXJuIHN1cGVyLnNob3VsZEluZGVudEVuZFRhZyhub2RlKTsKLQkJfQotCQlUcmFuc2xhdG9yIGRlbGVnYXRlID0gZ2V0RGVsZWdhdGVGb3Iobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5zaG91bGRJbmRlbnRFbmRUYWcobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNob3VsZEluZGVudEVuZFRhZyhub2RlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9OYW1lc3BhY2VUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9OYW1lc3BhY2VUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNGNjMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTmFtZXNwYWNlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTQsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5OYW1lc3BhY2VBZGFwdGVyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgTmFtZXNwYWNlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZSkgewotCQlzdXBlcihkb21OYW1lLCBOYW1lc3BhY2VBZGFwdGVyLk5PVElGSUNBVElPTl9GRUFUVVJFLCBET01fQVRUUklCVVRFKTsKLQkJaW5pdFByZWZpeCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJlZml4KCkgewotCQlTdHJpbmcgZE5hbWUgPSBnZXRET01OYW1lKG51bGwpOwotCQlwcmVmaXggPSBkTmFtZS5zdWJzdHJpbmcoRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LlhNTE5TLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIuYWRkTmFtZXNwYWNlKHByZWZpeCwgKFN0cmluZykgdmFsdWUsIGVtZk9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc1NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIGdldE1PRlZhbHVlKGVtZk9iamVjdCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmV0dXJuIE5hbWVzcGFjZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwocHJlZml4LCBtb2ZPYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjdW5TZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1blNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCwgZW1mT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2ZlYXR1cmVFeGlzdHMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzRGF0YVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYXBGb3IoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNNYXBGb3IoT2JqZWN0IGFGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAoYUZlYXR1cmUgPT0gZmVhdHVyZSkgewotCQkJTmFtZXNwYWNlIG5hbWVzcGFjZSA9IChOYW1lc3BhY2UpIChvbGRWYWx1ZSA9PSBudWxsID8gbmV3VmFsdWUgOiBvbGRWYWx1ZSk7Ci0JCQlpZiAobmFtZXNwYWNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHByZWZpeC5lcXVhbHMobmFtZXNwYWNlLmdldFByZWZpeCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvT2JqZWN0VHJhbnNsYXRvckZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvT2JqZWN0VHJhbnNsYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQ3OWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL09iamVjdFRyYW5zbGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyIGV4dGVuZHMgVHJhbnNsYXRvckZpbHRlciB7Ci0KLQlwdWJsaWMgT2JqZWN0VHJhbnNsYXRvckZpbHRlcigpIHsKLQkJc3VwZXIobnVsbCwgLTEpOwotCX0KLQotCXB1YmxpYyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyKFRyYW5zbGF0b3IgdHJhbnMsIGludCB2ZXJzaW9uKSB7Ci0JCXN1cGVyKHRyYW5zLCB2ZXJzaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IHNjYW5OZXh0VHJhbnNsYXRvcihUcmFuc2xhdG9yW10gY2hpbGRyZW4sIGludCBzdGFydCkgewotCQlpbnQgZm91bmQgPSBzdGFydCArIDE7Ci0JCWZvciAoOyBmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aDsgKytmb3VuZCkgewotCQkJaWYgKCFjaGlsZHJlbltmb3VuZF0uaXNET01BdHRyaWJ1dGUoKSkKLQkJCQlicmVhazsKLQkJfQotCQlmb3VuZCA9IChmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aCkgPyBmb3VuZCA6IC0xOwotCQlyZXR1cm4gZm91bmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlYWRBaGVhZEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVhZEFoZWFkSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDFhMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVhZEFoZWFkSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFJlYWRBaGVhZEhlbHBlciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudERPTU5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNoaWxkRE9NTmFtZTsKLQotCXB1YmxpYyBSZWFkQWhlYWRIZWxwZXIoU3RyaW5nIHBhcmVudERPTU5hbWUsIFN0cmluZ1tdIHZhbHVlcywgU3RyaW5nIGNoaWxkRE9NTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhcmVudERPTU5hbWUgPSBwYXJlbnRET01OYW1lOwotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsKLQkJdGhpcy5jaGlsZERPTU5hbWUgPSBjaGlsZERPTU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRET01OYW1lKCkgewotCQlyZXR1cm4gY2hpbGRET01OYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudERPTU5hbWUoKSB7Ci0JCXJldHVybiBwYXJlbnRET01OYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZERPTU5hbWUoU3RyaW5nIHN0cmluZykgewotCQljaGlsZERPTU5hbWUgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudERPTU5hbWUoU3RyaW5nIHN0cmluZykgewotCQlwYXJlbnRET01OYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKFN0cmluZ1tdIHN0cmluZ3MpIHsKLQkJdmFsdWVzID0gc3RyaW5nczsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIG5vZGVWYWx1ZUlzUmVhZEFoZWFkTmFtZShTdHJpbmcgbm9kZU5hbWUpIHsKLQotCQlyZXR1cm4gKGNoaWxkRE9NTmFtZSAhPSBudWxsKSA/IGNoaWxkRE9NTmFtZS5lcXVhbHMobm9kZU5hbWUpIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbm9kZU5hbWVJc1JlYWRBaGVhZE5hbWUoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobm9kZU5hbWUuZXF1YWxzKHZhbHVlc1tpXSkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0ODE4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUmVmZXJlbmNlZFJlc291cmNlIGV4dGVuZHMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIHsKLQkvL1RPRE8gLSByZW5hbWUgcGFja2FnZWQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURURfRVJST1JfTVNHID0gIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX1dBU19TQVZFRCA9IDYwMTsKLQkKLQkvKioKLQkgKiBBIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBhIFJlZmVyZW5jZWRSZXNvdXJjZSBpcyBhYm91dAotCSAqIHRvIHNhdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRSA9IDYwMjsKLQkKLQkvKioKLQkgKiBBIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBhIFJlZmVyZW5jZWRSZXNvdXJjZSBoYXMgZmFpbGVkCi0JICogdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9TQVZFX0ZBSUxFRCA9IDYwMzsKLQotCS8qKgotCSAqIEFjY2VzcyB0aGlzIHJlc291cmNlIGZvciByZWFkIG9ubHkuIFRoaXMgY2FsbCBpbmNyZW1lbnRzIHRoZSB1c2UgcmVhZCBjb3VudCBvZiB0aGlzIHJlc291cmNlLgotCSAqIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZXkgdXNlIHRoZSByZXNvdXJjZS4gVGhleSBzaG91bGQgY2FsbAotCSAqIHJlbGVhc2VGcm9tUmVhZCgpIGFmdGVyIHRoZXkgYXJlIGRvbmUgbW9kaWZ5aW5nIHRoaXMgcmVzb3VyY2UuCi0JICovCi0Jdm9pZCBhY2Nlc3NGb3JSZWFkKCk7Ci0KLQkvKioKLQkgKiBBY2Nlc3MgdGhpcyByZXNvdXJjZSBmb3Igd3JpdGUgb25seS4gVGhpcyBjYWxsIGluY3JlbWVudHMgdGhlIHVzZSB3cml0ZSBjb3VudCBvZiB0aGlzCi0JICogcmVzb3VyY2UuIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZXkgbW9kaWZ5IHRoZSByZXNvdXJjZS4gVGhleSBzaG91bGQgY2FsbAotCSAqIHJlbGVhc2VGcm9tV3JpdGUoKSBhZnRlciB0aGV5IGFyZSBkb25lIG1vZGlmeWluZyB0aGlzIHJlc291cmNlLgotCSAqLwotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgaGFzIGp1c3QgYmVlbiBsb2FkZWQgYW5kIG5vdCB5ZXQgYWNjZXNzZWQgZm9yIHJlYWQgb3Igd3JpdGUuCi0JICovCi0JYm9vbGVhbiBpc05ldygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIGFueSB3cml0ZSByZWZlcmVuY2VzLgotCSAqLwotCWJvb2xlYW4gaXNSZWFkT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBzaGFyZWQgZm9yIHJlYWQgb3Igd3JpdGUgYnkgbW9yZSB0aGFuIG9uZSBhY2Nlc3Nvci4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGlzIHNoYXJlZCBmb3Igd3JpdGUgYnkgbW9yZSB0aGFuIG9uZSBhY2Nlc3Nvci4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQotCS8qKgotCSAqIFJlbGVhc2UgcmVhZCB0aGUgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UuIFRoaXMgY2FsbCBkZWNyZW1lbnRzIHRoZSB1c2UgY291bnQgb2YgdGhpcyByZXNvdXJjZQotCSAqIGFuZCB3aWxsIHJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSBpdHMgcmVzb3VyY2Ugc2V0IGlmIHRoZSB1c2UgY291bnQgZ29lcyB0byAwLiBDbGllbnRzIHNob3VsZAotCSAqIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGV5IGFyZSBkb25lIGFjY2Vzc2luZyB0aGUgcmVzb3VyY2UgYW5kIG9ubHkgYWZ0ZXIgdGhleSBoYXZlIGNhbGxlZAotCSAqIGFjY2Vzc0ZvclJlYWQoKSB0byBvYnRhaW4gYWNjZXNzLgotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHdyaXRlIHRoZSBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZS4gVGhpcyBjYWxsIGRlY3JlbWVudHMgdGhlIHdyaXRlIGNvdW50IG9mIHRoaXMKLQkgKiByZXNvdXJjZSBhbmQgd2lsbCByZW1vdmUgdGhlIHJlc291cmNlIGZyb20gaXRzIHJlc291cmNlIHNldCBpZiB0aGUgdXNlIGNvdW50IGdvZXMgdG8gMC4KLQkgKiBDbGllbnRzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhleSBhcmUgZG9uZSBhY2Nlc3NpbmcgdGhlIHJlc291cmNlIGFuZCBvbmx5IGFmdGVyIHRoZXkKLQkgKiBoYXZlIGNhbGxlZCBhY2Nlc3NGb3JXcml0ZSgpIHRvIG9idGFpbiBhY2Nlc3MuCi0JICovCi0Jdm9pZCByZWxlYXNlRnJvbVdyaXRlKCk7Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGlzIHJlc291cmNlIG9ubHkgaWYgdGhlIHdyaXRlIGNvdW50IGlzIGVxdWFsIHRvIDEuCi0JICovCi0Jdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBkaXJ0eSBhbmQgaXMgbm90IHNoYXJlZCBmb3Igd3JpdGUuCi0JICovCi0JYm9vbGVhbiBuZWVkc1RvU2F2ZSgpOwotCi0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHdlIHNob3VsZCBhbGxvdyBhIHJlZnJlc2ggdG8gdGFrZSBwbGFjZSBldmVuIHdoZW4gdGhpcyByZXNvdXJjZSBpcyBkaXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXZvaWQgc2V0Rm9yY2VSZWZyZXNoKGJvb2xlYW4gYik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBzaG91bGQgYWxsb3cgYSByZWZyZXNoIHRvIHRha2UgcGxhY2UgZXZlbiB3aGVuIHRoaXMgcmVzb3VyY2UgaXMgZGlydHkuCi0JICovCi0JYm9vbGVhbiBzaG91bGRGb3JjZVJlZnJlc2goKTsKLQotCWJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvcGVuIHJlYWQgYWNjZXNzZXMgb24gdGhpcyByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0UmVhZENvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3BlbiB3cml0ZSBhY2Nlc3NlcyBvbiB0aGlzIHJlc291cmNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRXcml0ZUNvdW50KCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIGJlaW5nIGFjY2Vzc2VkLCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSByZXNvdXJjZSBzZXQuCi0JICovCi0Jdm9pZCB1bmxvYWRJZk5lY2Vzc2FyeSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5ZmU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXM7Ci0JcHJvdGVjdGVkIExpc3QgbG9jYWxBZGFwdGVyRmFjdG9yaWVzOwotCi0JLyoqCi0JICogUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBhY3R1YWxseSBpbnN0YW50aWF0ZSBhIG5ldyBSZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGwjY3JlYXRlUmVzb3VyY2UoVVJJKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlcyA9IGRvQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJYWRhcHROZXcocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGFwdE5ldyhSZXNvdXJjZSByZXMpIHsKLQkJaWYgKGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnbG9iYWxBZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7Ci0JCQkJZmFjdG9yeS5hZGFwdEFsbE5ldyhyZXMpOwotCQkJfQotCQl9Ci0JCWlmIChsb2NhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBsb2NhbEFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCWZhY3RvcnkuYWRhcHRBbGxOZXcocmVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBsb2NhbCBhZGFwdGVyIGZhY3RvcnkgaXMgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeW91IHVzZSB0byBvbmx5IGFkYXB0IHRoZSByZXNvdXJjZQotCSAqIHNwZWNpZmljIHRvIHRoZSBSZXNvdXJjZUZhY3RvcnkgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMb2NhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGxvY2FsQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzLmFkZChmYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGxvY2FsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKQotCQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzLnJlbW92ZShmYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBBIGdsb2JhbCBhZGFwdGVyIGZhY3Rvcnkgd2lsbCBiZSB1c2VkIHRvIGFkYXB0IGFueSByZXNvdXJjZSBjcmVhdGVkIGJ5IGFueSBSZXNvdXJjZUZhY3RvcnkKLQkgKiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRHbG9iYWxBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWlmIChnbG9iYWxBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpCi0JCQlnbG9iYWxBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUdsb2JhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkKLQkJCWdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMucmVtb3ZlKGZhY3RvcnkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RlMjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JRFV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFJlZmVyZW5jZWRSZXNvdXJjZSB7Ci0JLy9UT0RPIEFkZCB0b1N0cmluZyBob29rCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPX1NUUklORyA9ICJSZWZlcmVuY2VkWE1JUmVzb3VyY2UsIGZpbGUgPSAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09VTlRfVE9fU1RSSU5HID0gIiBSPSAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPVU5UX1RPX1NUUklORyA9ICIgVz0gIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgcmVhZFJlZmVyZW5jZUNvdW50ID0gMTsKLQlwcml2YXRlIGludCBlZGl0UmVmZXJlbmNlQ291bnQgPSAwOwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3ID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZVJlZnJlc2g7Ci0JCi0JICBwdWJsaWMgc3RhdGljIGNsYXNzIEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdCBleHRlbmRzIEVBZGFwdGVyTGlzdAotCSAgewotCi0JICAgIC8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc4NTU0MzgzMzkxODc1NDA3MThMOwotCi0JCXB1YmxpYyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QoTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJCXN1cGVyKG5vdGlmaWVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLmFkZChvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN1cGVyLmFkZChpbmRleCwgb2JqZWN0KTsKLQkgICAgfQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkgICAgfQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpCi0JICAgIHsKLQkgICAgIHN1cGVyLmNsZWFyKCk7Ci0JICAgIH0KLQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5zZXQoaW5kZXgsIG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN1cGVyLm1vdmUobmV3UG9zaXRpb24sIG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgbW92ZShpbnQgbmV3UG9zaXRpb24sIGludCBvbGRQb3NpdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2xkUG9zaXRpb24pOwotCSAgICB9Ci0JICB9Ci0KLQkgCi0JLyoqCi0JICogUmVmZXJlbmNhYmxlWE1JUmVzb3VyY2VJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2dldFJlYWRDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRSZWFkQ291bnQoKSB7Ci0JCXJldHVybiByZWFkUmVmZXJlbmNlQ291bnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2UjZ2V0V3JpdGVDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRXcml0ZUNvdW50KCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50OwotCX0KLQotCi0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2FjY2Vzc0ZvclJlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JSZWFkKCkgewotCQljaGVja0RlbGV0ZWQoKTsKLQkJaWYgKCFpc05ldygpKQotCQkJcmVhZFJlZmVyZW5jZUNvdW50Kys7Ci0JCWlzTmV3ID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JXcml0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCQljaGVja0RlbGV0ZWQoKTsKLQkJZWRpdFJlZmVyZW5jZUNvdW50Kys7Ci0JCWlmIChpc05ldykKLQkJCXJlbGVhc2VGcm9tUmVhZCgpOwotCQlpc05ldyA9IGZhbHNlOwotCQlpZiAoIWlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSkKLQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgdGhpcyByZXNvdXJjZSBoYXMgYmVlbiByZW1vdmVkIGFuZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgZG9lcyBub3QgaGF2ZSBhCi0JICogUmVzb3VyY2VTZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tEZWxldGVkKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oREVMRVRFRF9FUlJPUl9NU0cpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb2xsZWN0Q29udGFpbmVkT2JqZWN0cyhqYXZhLnV0aWwuTGlzdCBjb2xsZWN0aW5nLCBFT2JqZWN0IHBhcmVudE9iamVjdCkgewotCi0JCWphdmEudXRpbC5JdGVyYXRvciBjaGlsZHJlbiA9IHBhcmVudE9iamVjdC5lQ29udGVudHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGNoaWxkcmVuLm5leHQoKTsKLQkJCWNvbGxlY3RpbmcuYWRkKGNoaWxkKTsKLQkJCWNvbGxlY3RDb250YWluZWRPYmplY3RzKGNvbGxlY3RpbmcsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnN1cmVGdWxsSURIeWRyYXRpb24oKSB7Ci0JCUxpc3QgYWxsUmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3Igcm9vdE9iamVjdHMgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyb290T2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgcm9vdE9iamVjdHMubmV4dCgpOwotCQkJYWxsUmVmT2JqZWN0cy5hZGQoY2hpbGQpOwotCQkJY29sbGVjdENvbnRhaW5lZE9iamVjdHMoYWxsUmVmT2JqZWN0cywgY2hpbGQpOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGFsbFJlZk9iamVjdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotCQkJSURVdGlsLmFzc2lnbklEKChFT2JqZWN0KSBpdGVyLm5leHQoKSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBiZWluZyBhY2Nlc3NlZCwgdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHVubG9hZElmTmVjZXNzYXJ5KCkgewotCQlpZiAoKGdldFRvdGFsUmVmZXJlbmNlQ291bnQoKSA8PSAwKSB8fCAoZWRpdFJlZmVyZW5jZUNvdW50IDw9IDAgJiYgaXNNb2RpZmllZCgpKSkKLQkJCXVubG9hZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHdyaXRlIGFjY2Vzc2VzIHRvIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBpbnQgVGhlIG51bWJlciBvZiByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VG90YWxSZWZlcmVuY2VDb3VudCgpIHsKLQkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudCArIHJlYWRSZWZlcmVuY2VDb3VudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzTmV3Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0JCXJldHVybiBpc05ldzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzUmVhZE9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50IDw9IDA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc1NoYXJlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gZ2V0VG90YWxSZWZlcmVuY2VDb3VudCgpID4gMTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzU2hhcmVkRm9yV3JpdGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50ID4gMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNwcmVEZWxldGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNyZWxlYXNlRnJvbVJlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCXJlYWRSZWZlcmVuY2VDb3VudC0tOwotCQlpZiAocmVhZFJlZmVyZW5jZUNvdW50IDwgMCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWFkIHJlZmVyZW5jZSBjb3VudCBlcnJvcjogICIgKyB0aGlzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXVubG9hZElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNyZWxlYXNlRnJvbVdyaXRlCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpIHsKLQkJZWRpdFJlZmVyZW5jZUNvdW50LS07Ci0JCWlmIChlZGl0UmVmZXJlbmNlQ291bnQgPCAwKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldyaXRlIHJlZmVyZW5jZSBjb3VudCBlcnJvcjogICIgKyB0aGlzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXVubG9hZElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNzYXZlSWZOZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1NoYXJlZEZvcldyaXRlKCkpIC8vIGNhbGxlciBpcyB0aGUgb25seSByZWZlcmVuY2VyCi0JCQlzYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFRPX1NUUklORyArIGdldFVSSSgpLnRvU3RyaW5nKCkgKyBSRUFEX0NPVU5UX1RPX1NUUklORyArIG5ldyBJbnRlZ2VyKHJlYWRSZWZlcmVuY2VDb3VudCkgKyBXUklURV9DT1VOVF9UT19TVFJJTkcgKyBuZXcgSW50ZWdlcihlZGl0UmVmZXJlbmNlQ291bnQpOwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjbmVlZHNUb1NhdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRzVG9TYXZlKCkgewotCQlyZXR1cm4gaXNNb2RpZmllZCgpICYmICFpc1NoYXJlZEZvcldyaXRlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNzZXRGb3JjZVJlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZVJlZnJlc2goYm9vbGVhbiBiKSB7Ci0JCWZvcmNlUmVmcmVzaCA9IGI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2Ujc2hvdWxkRm9yY2VSZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRGb3JjZVJlZnJlc2goKSB7Ci0JCXJldHVybiBmb3JjZVJlZnJlc2g7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNEb0xvYWQoSW5wdXRTdHJlYW0gYXJnMCwgTWFwIGFyZzEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaXNUcmFja2luZ01vZHMgPSBpc1RyYWNraW5nTW9kaWZpY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24oZmFsc2UpOwotCQkJc3VwZXIuYmFzaWNEb0xvYWQoYXJnMCwgYXJnMSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9VbmxvYWQoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvVW5sb2FkKCkgewotCQkKLQkJdHJ5IHsKLQkJCS8vIFVzaW5nIGxvYWQgbG9jayB0byBlbnN1cmUgbm8gb3RoZXIgdGhyZWFkcyB3aWxsIGF0dGVtcHQgYSBsb2FkIGR1cmluZyB0aGUgdW5sb2FkIHByb2Nlc3MKLQkJCWFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCk7Ci0JCQl3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOwotCQkJCi0JCQlpZiAoaXNUcmFja2luZ01vZGlmaWNhdGlvbigpICYmIGVkaXRSZWZlcmVuY2VDb3VudCA8IDEpIC8vZG8gbm90IHR1cm4gb2ZmIG1vZGlmaWNhdGlvbiBpZgotCQkJCS8vIHdlIHN0aWxsIGhhdmUgYSB3cml0ZSBjb3VudAotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKLQkJCXN1cGVyLmRvVW5sb2FkKCk7Ci0JCQlzZXRGb3JjZVJlZnJlc2goZmFsc2UpOwotCQkJc2V0TW9kaWZpZWQoZmFsc2UpOyAvL2RjYiAtIHRoaXMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgcmVzb3VyY2VzIHdpdGhvdXQgZmlsZXMgYXJlCi0JCQkvLyBtYXJrZWQgYXMgbm90IG1vZGlmaWVkLgotCQkJaWYgKHJlYWRSZWZlcmVuY2VDb3VudCA9PSAwICYmIGVkaXRSZWZlcmVuY2VDb3VudCA9PSAwICYmIGdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCWdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHRoaXMpOwotCQkJfQotCQkKLQkJfSBmaW5hbGx5IHsKLQkJCS8vUmVtb3ZpbmcgdGhlIGxvYWQgbG9jawotCQkJcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKLQkJfQotCQkJCi0JfQotCi0KLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgaGFzIGJlZW4gdW5sb2FkZWQsIGFuZCB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcy4gVHJlYXQgdGhlIHJlc291cmNlIGxpa2UgYSBuZXcKLQkgKiBSZXNvdXJjZQotCSAqLwotCS8vIG5ldmVyIHVzZWQKLS8vCXByaXZhdGUgdm9pZCByZXNldEFzTmV3KCkgewotLy8JCXJlYWRSZWZlcmVuY2VDb3VudCA9IDE7Ci0vLwkJaXNOZXcgPSB0cnVlOwotLy8JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2Ujc2F2ZShPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbm90aWZ5QWJvdXRUb1NhdmUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLnNhdmUob3B0aW9ucyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBub3RpZnlTYXZlRmFpbGVkKCk7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIEVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVNhdmVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5U2F2ZWQoKSB7Ci0JCW5vdGlmeVNhdmVFdmVudChSRVNPVVJDRV9XQVNfU0FWRUQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBYm91dFRvU2F2ZSgpIHsKLSAgICAgICAgbm90aWZ5U2F2ZUV2ZW50KFJFU09VUkNFX0FCT1VUX1RPX1NBVkUpOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTYXZlRmFpbGVkKCkgewotICAgICAgICBub3RpZnlTYXZlRXZlbnQoUkVTT1VSQ0VfU0FWRV9GQUlMRUQpOwotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5U2F2ZUV2ZW50KGludCBldmVudFR5cGUpIHsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCSAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9Ci0JCQluZXcgTm90aWZpY2F0aW9uSW1wbChldmVudFR5cGUsIHRoaXMsIHRoaXMpCi0JCQl7Ci0JCQkgIEBPdmVycmlkZQotCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpCi0JCQkgIHsKLQkJCQlyZXR1cm4gUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC50aGlzOwotCQkJICB9Ci0JCQkgIEBPdmVycmlkZQotCQkJcHVibGljIGludCBnZXRGZWF0dXJlSUQoQ2xhc3MgZXhwZWN0ZWRDbGFzcykKLQkJCSAgewotCQkJCXJldHVybiBldmVudFR5cGU7Ci0JCQkgIH0KLQkJCX07Ci0JCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlZmVyZW5jZWRSZXNvdXJjZSN3YXNSZXZlcnRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0IGVBZGFwdGVycygpCi0JICB7Ci0JICAgIGlmIChlQWRhcHRlcnMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVBZGFwdGVycyA9ICBuZXcgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQWRhcHRlcnM7Ci0JICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWMzN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUgYXBpIGZvciByZW5kZXJpbmcgYW4gRU1GIG9iamVjdCB0byBYTUwgYW5kIHZpY2UgdmVyc2EKLSAqLwotcHVibGljIGludGVyZmFjZSBSZW5kZXJlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhQX1NDSEVNQV9MQU5HVUFHRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hTGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXM0NfWE1MX1NDSEVNQSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLQotCXZvaWQgc2V0UmVzb3VyY2UoVHJhbnNsYXRvclJlc291cmNlIGFSZXNvdXJjZSk7Ci0KLQlUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsKLQotCXZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCWJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCk7Ci0KLQl2b2lkIHByZXBhcmVUb0FkZENvbnRlbnRzKCk7Ci0KLQlpbnQgZ2V0VmVyc2lvbklEKCk7Ci0KLQlib29sZWFuIGlzTW9kaWZpZWQoKTsKLQotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQotCXZvaWQgYWNjZXNzRm9yUmVhZCgpOwotCi0Jdm9pZCByZWxlYXNlRnJvbVJlYWQoKTsKLQotCXZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpOwotCi0Jdm9pZCBwcmVEZWxldGUoKTsKLQotCXZvaWQgcHJlVW5sb2FkKCk7Ci0KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQotCXZvaWQgc2V0QmF0Y2hNb2RlKGJvb2xlYW4gaXNCYXRjaCk7Ci0JCi0JYm9vbGVhbiBpc0JhdGNoTW9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2YzA1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIGFic3RyYWN0IFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQotCXByaXZhdGUgc3RhdGljIFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGRlZmF1bHRIYW5kbGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRpbmcgPSB0cnVlOwotCi0JLyoqCi0JICogSW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiB1c2UgdGhlCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBOb3RpZmllciBOb3RpZmljYXRpb25FbmdpbmUgPSBOb3RpZmllci5JTlNUQU5DRTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlbmRlcmVyRmFjdG9yeSBnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgewotCQlpZiAoZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9PSBudWxsKQotCQkJZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IGdldERlZmF1bHRIYW5kbGVyKCkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOwotCQlyZXR1cm4gZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuXG4qKipTZXR0aW5nIGZhY3Rvcnk6ICIgKyBmYWN0b3J5KTsKLQkJTm90aWZpY2F0aW9uRW5naW5lLm5vdGlmeUxpc3RlbmVycyhmYWN0b3J5KTsKLQkJZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJSZW5kZXJlckZhY3RvcnkgaW5zdGFuY2U6ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm90aWZpZXIgewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE5vdGlmaWVyIElOU1RBTkNFID0gbmV3IE5vdGlmaWVyKCk7Ci0KLQkJLy8gdXNlIGEgV2Vha0hhc2hNYXAgZm9yIGEgd2VhayBIYXNoU2V0Ci0JCXByaXZhdGUgZmluYWwgTWFwIHJlc291cmNlRmFjdG9yeUxpc3RlbmVycyA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgTm90aWZpZXIoKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoUmVuZGVyZXJGYWN0b3J5IHJlbmRlcmVyRmFjdG9yeSkgewotCi0JCQlmaW5hbCBpbnQgbGVuZ3RoID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLnNpemUoKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZnlpbmcgIiArIGxlbmd0aCArICIgbGlzdGVuZXJzIik7Ci0KLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBTaW5jZSB0aGUgcmVuZGVyZXIgZmFjdG9yaWVzIGFyZSBzaW5nbGV0b25zLCB0aGlzIHJlZmVyZW5jZSBjaGVjayBzaG91bGQgYWx3YXlzCi0JCQkJICogd29yawotCQkJCSAqLwotCQkJCWlmIChyZW5kZXJlckZhY3RvcnkgIT0gUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkgewotCQkJCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlRmFjdG9yeUxpc3RlbmVycykgewotCQkJCQkJZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gKExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTm90aWZ5aW5nIExpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQkJCQkJCWxpc3RlbmVyLnVwZGF0ZVJlbmRlcmVyRmFjdG9yeShyZW5kZXJlckZhY3RvcnkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBsaXN0ZW5lcjogIiArIGwpOwotCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMucHV0KGwsIG51bGwpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXJUb1JlbW92ZSkgewotCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyVG9SZW1vdmUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLQkJdm9pZCB1cGRhdGVSZW5kZXJlckZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IG5ld1JlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKLQkJcmV0dXJuIHZhbGlkYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgewotCQl2YWxpZGF0aW5nID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBnZXREZWZhdWx0SGFuZGxlcigpIHsKLQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpCi0JCQlkZWZhdWx0SGFuZGxlciA9IEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5JTlNUQU5DRTsKLQkJcmV0dXJuIGRlZmF1bHRIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBoYW5kbGVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRIYW5kbGVyKFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzVkZjRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgewotCi0JUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YjUxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgewotCQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXNjcmlwdG9yIGlzIGFwcGxpY2FibGUgdG8gdGhlIGdpdmVuIGZpbGVVUkkuCi0JICogCi0JICogQHBhcmFtIGZpbGVVUkkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBkZWNsYXJlcyBhIHJlc291cmNlIGZhY3RvcnkgYXBwbGljYWJsZSB0byB0aGUgZ2l2ZW4gVVJJLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW5hYmxlZEZvcihVUkkgZmlsZVVSSSk7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnRlbnRUeXBlIGlzIG9uZSBvcHRpb25hbCB3YXkgdGhhdCBhIFJlc291cmNlRmFjdG9yeQotCSAqIG1pZ2h0IGFwcGx5IHRvIGEgVVJJLiBDbGllbnRzIHNob3VsZCBjYWxsIHtAbGluayBpc0VuYWJsZWRGb3J9IAotCSAqIGluc3RlYWQgb2YgY29tcGFyaW5nIHRoZSBjb250ZW50IFR5cGVzIHdoZW4gc2VhcmNoaW5nIGZvciBhbgotCSAqIGFwcGxpY2FibGUgZGVzY3JpcHRvciBmcm9tIGEgc2V0LiAgCi0JICogCi0JICogPHA+PGI+U3ViY2xhc3NlcyBtYXkgcmV0dXJuIG51bGwuKG9wdGlvbmFsKTwvYj48L3A+Ci0JICogIAotCSAqIEByZXR1cm4gVGhlIGNvbnRlbnQgdHlwZSB0aGF0IHRoaXMgZGVzY3JpcHRvciBpcyBhcHBsaWNhYmxlIHRvLgotCSAqLwotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEluIHRoZSBjYXNlIHdoZXJlIG1vcmUgdGhhbiBvbmUgZmFjdG9yeSBpcyBkZWZpbmVkIGZvciB0aGUgc2FtZSBmaWxlTmFtZSwgCi0JICogYW5kIGNyZWF0aW9uIGlzIHBhc3NlZCBhIHVyaSBvbmx5IGEgZGVmYXVsdCBmYWN0b3J5IGlzIG5lZWRlZAotCSAqIAotCSAqICAKLQkgKiBAcmV0dXJuIFRoZSBib29sZWFuIGRlc2NyaWJpbmcgdGhlIGRlZmF1bHQgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHNob3J0IHNlZ21lbnQgaXMgb25lIHBvc3NpYmxlIHdheSB0aGF0IGEgUmVzb3VyY2VGYWN0b3J5Ci0JICogbWlnaHQgYXBwbHkgdG8gYSBVUkkuIENsaWVudHMgc2hvdWxkIGNhbGwge0BsaW5rIGlzRW5hYmxlZEZvcn0gCi0JICogaW5zdGVhZCBvZiBjb21wYXJpbmcgdGhlIHNob3J0IHNlZ21lbnRzIHdoZW4gc2VhcmNoaW5nIGZvciBhbgotCSAqIGFwcGxpY2FibGUgZGVzY3JpcHRvciBmcm9tIGEgc2V0LiAgCi0JICogCi0JICogPHA+PGI+U3ViY2xhc3NlcyBtYXkgTk9UIHJldHVybiBudWxsIHVubGVzcyB0aGV5IGFsc28gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI2hhc2hDb2RlKCl9IGFuZCB7QGxpbmsgI2VxdWFscyhPYmplY3QpfS48L2I+PC9wPgotCSAqICAKLQkgKiBAcmV0dXJuIFRoZSBzaG9ydCBzZWdtZW50IHRoYXQgdGhpcyBkZXNjcmlwdG9yIGlzIGFwcGxpY2FibGUgdG8uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTaG9ydFNlZ21lbnQoKTsKLQkKLQkKLQkvKioKLQkgKiBUaGUgY29ycmVjdCBpbnN0YW5jZSBvZiBSZXNvdXJjZS5GYWN0b3J5LiBUaGUgaW5zdGFuY2UgcmV0dXJuZWQKLQkgKiBtYXkgb3IgbWF5IG5vdCBiZSB1bmlxdWUsIHNvIGlmIHlvdSByZXF1aXJlIHRoZSBzYW1lIGluc3RhbmNlIAotCSAqIGZvciBlYWNoIGNhbGwsIHlvdSBzaG91bGQgY2FjaGUgdGhlIHZhbHVlIHJldHVybmVkIHRoZSBmaXJzdAotCSAqIHRpbWUgZnJvbSB0aGlzIG1ldGhvZC4gCi0JICogCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBSZXNvdXJjZS5GYWN0b3J5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSZXNvdXJjZS5GYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0U2hvcnRTZWdtZW50KCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmKG8gaW5zdGFuY2VvZiBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKQotCQkJcmV0dXJuIGdldFNob3J0U2VnbWVudCgpLmVxdWFscygoKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpbykuZ2V0U2hvcnRTZWdtZW50KCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUm9vdFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jvb3RUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYmEyZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUm9vdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgUm9vdFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSb290VHJhbnNsYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIFJvb3RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKE5vdGlmaWVyLCBPYmplY3QsIGludCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJKChSZXNvdXJjZSkgb3duZXIpLmdldENvbnRlbnRzKCkuYWRkKG5ld0luZGV4LCAoRU9iamVjdCl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNyZW1vdmVNT0ZWYWx1ZShOb3RpZmllciwgT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZU1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJKChSZXNvdXJjZSkgb3duZXIpLmdldENvbnRlbnRzKCkucmVtb3ZlKHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShSZXNvdXJjZSByZXMsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocmVzICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZCgoRU9iamVjdCl2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc011bHRpVmFsdWVkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU291cmNlTGlua1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1NvdXJjZUxpbmtUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MWUwZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU291cmNlTGlua1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUxpbmtUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIFNvdXJjZUxpbmtUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgU291cmNlTGlua1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGgpOwotCQlmU3R5bGUgfD0gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFNvdXJjZUxpbmtUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQotCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQlpZiAoc3RyVmFsdWUgIT0gbnVsbCkKLQkJCS8vIEZpbmQgdGhlIG9iamVjdCB3aXRoIHRoZSBuYW1lIHRoYXQgbWF0Y2hlcyBtYXRjaE5hbWUKLQkJCXZhbHVlID0gZlRyYW5zbGF0b3JQYXRoc1swXS5maW5kT2JqZWN0KG93bmVyLCBzdHJWYWx1ZS50cmltKCkpOwotCQlpZiAoKGZTdHlsZSAmIFRyYW5zbGF0b3IuU1RSSU5HX1JFU1VMVF9PSykgIT0gMCkKLQkJCXJldHVybiAoKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBzdHJWYWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlUcmFuc2xhdG9yUGF0aCBwYXRoID0gZlRyYW5zbGF0b3JQYXRoc1swXTsKLQkJT2JqZWN0IGF0dHJWYWx1ZSA9IHBhdGguZ2V0TGFzdE1hcCgpLmdldE1PRlZhbHVlKChFT2JqZWN0KSB2YWx1ZSk7Ci0JCXJldHVybiBwYXRoLmdldExhc3RNYXAoKS5jb252ZXJ0VmFsdWVUb1N0cmluZyhhdHRyVmFsdWUsIG93bmVyKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1N0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1N0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmNDZmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9TdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIERlY2xhcmVzIGEgc3ViY2xhc3MgdG8gY3JlYXRlIFJlc291cmNlLkZhY3RvcnkoaWVzKSBmcm9tIGFuIGV4dGVuc2lvbi4gCi0gKi8KLWNsYXNzIFN0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIHsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzaG9ydFNlZ21lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZS5GYWN0b3J5IGZhY3Rvcnk7Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNob3J0U2VnbWVudCBBIG5vbi1udWxsIG5hbWUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmYWN0b3J5Ci0JICogQHBhcmFtIGZhY3RvcnkgQSBub24tbnVsbCBSZXNvdXJjZS5GYWN0b3J5IHRoYXQgY2FuIGxvYWQgZmlsZXMgb2YgdGhlIGdpdmVuIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcihTdHJpbmcgc2hvcnRTZWdtZW50LCBSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzaG9ydFNlZ21lbnQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnkpOwotCQl0aGlzLnNob3J0U2VnbWVudCA9IHNob3J0U2VnbWVudDsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9ICAKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihVUkkgZmlsZVVSSSkgewotCQkvKiBzaG9ydFNlZ21lbnQgbXVzdCBiZSBub24tbnVsbCBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgY3JlYXRlZCwgCi0JCSAqIGEgdmFsaWRhdGlvbiBjaGVjayBpbiBpbml0KCkgdmVyaWZpZXMgdGhpcyByZXF1aXJlbWVudCAqLwotCQlpZihmaWxlVVJJICE9IG51bGwgJiYgZmlsZVVSSS5sYXN0U2VnbWVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gc2hvcnRTZWdtZW50LmVxdWFscyhmaWxlVVJJLmxhc3RTZWdtZW50KCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSAKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBjcmVhdGVGYWN0b3J5KCkgewotCQkgcmV0dXJuIGZhY3Rvcnk7CQkJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydFNlZ21lbnQoKSB7Ci0JCXJldHVybiBzaG9ydFNlZ21lbnQ7Ci0JfSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZWU5MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgVHJhbnNsYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19TVFlMRSA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRE9NX0FUVFJJQlVURSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU1QVFlfVEFHID0gMSA8PCAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENEQVRBX0NPTlRFTlQgPSAxIDw8IDI7Ci0JLyoqCi0JICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGVuZCB0YWcgc2hvdWxkIE5PVCBiZSBpbmRlbnRlZDsgYnkgZGVmYXVsdCBpdCBpcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTkRfVEFHX05PX0lOREVOVCA9IDEgPDwgMzsKLQkvKioKLQkgKiBTdHlsZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBib29sZWFucyBzaG91bGQgTk9UIGJlIGNvbnZlcnRlZCBhcyAiVHJ1ZSIgYW5kICJGYWxzZSI7IGRlZmF1bHQKLQkgKiBpcyB0aGF0IHRoZXkgYXJlCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQk9PTEVBTl9MT1dFUkNBU0UgPSAxIDw8IDQ7Ci0JLyoqCi0JICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIGFuIGVudW0gdmFsdWUgY29udGFpbnMgaHlwaGVucyBJZiB0aGlzIGlzIHRydWUsIHRoZW4gaW50ZXJuYWxseSB0aGUKLQkgKiBoeXBoZW5zIGFyZSByZXBsYWNlZCB3aXRoIHVuZGVyc2NvcmVzCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5VTV9GRUFUVVJFX1dJVEhfSFlQSEVOUyA9IDEgPDwgNTsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IE9CSkVDVF9NQVAgPSAxIDw8IDY7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgQk9PTEVBTl9GRUFUVVJFID0gMSA8PCA3OwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU0hBUkVEX1JFRkVSRU5DRSA9IDEgPDwgODsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBmZWF0dXJlIG1heSBiZSBzaWduaWZpY2FudCBldmVuIGlmIGl0IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU1QVFlfQ09OVEVOVF9JU19TSUdOSUZJQ0FOVCA9IDEgPDwgOTsKLQotCS8qKgotCSAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBmZWF0dXJlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1lbnQgbm9kZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IENPTU1FTlRfRkVBVFVSRSA9IDEgPDwgMTA7Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlbiBhbiBlVW5zZXQoKSB3aWxsIGJlIGludm9rZWQgb24gdGhlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVTlNFVF9JRl9OVUxMID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBjb250ZW50cyBhcyBhIFN0cmluZyBpZiB0aGUgZmVhdHVyZSBpcyB1bnJlc29sdmVhYmxlIChVc2VkIGJ5IHRoZQotCSAqIFNvdXJjZUxpbmtUcmFuc2xhdG9yKQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUUklOR19SRVNVTFRfT0sgPSAxIDw8IDEyOwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGZET01OYW1lczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZET01QYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTWFwIHJlYWRBaGVhZE5hbWVzOwotCXByb3RlY3RlZCBpbnQgZlN0eWxlID0gTk9fU1RZTEU7Ci0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCXByb3RlY3RlZCBUcmFuc2xhdG9yUGF0aFtdIGZUcmFuc2xhdG9yUGF0aHM7Ci0JcHJvdGVjdGVkIEVDbGFzcyBlbWZDbGFzczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lU3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8vIGFkZGVkIGJ5IE1ERQotCXByb3RlY3RlZCBTdHJpbmcgZG9tTmFtZUFuZFBhdGggPSBudWxsOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFueSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBUcmFuc2xhdG9yIGFyZSB0aGVtc2VsdmVzIERlcGVuZGVuY3lUcmFuc2xhdG9ycwotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzRGVwZW5kZW5jeVBhcmVudDsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGRlcGVuZGVuY3lGZWF0dXJlOwotCXByb3RlY3RlZCBzdGF0aWMgRWNvcmVQYWNrYWdlIEVDT1JFX1BBQ0tBR0UgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCi0JLy8gVXNlIHRoaXMgaWRlbnRpZmllciBmb3IgdGhlIERPTU5hbWUgd2hlbiB0aGUgYXR0cmlidXRlCi0JLy8gdmFsdWUgaXMgdG8gYmUgZXh0cmFjdGVkIGRpcmVjdGx5IGZyb20gdGhlIHRleHQgb2YgdGhlIG5vZGUuCi0JLy8gVGhpcyBpcyByYXJlLCBidXQgb2NjdXJzIGluIHRoZSB3ZWIueG1sIGluIHRoZSBjYXNlIG9mIGEKLQkvLyBXZWxjb21lRmlsZS4KLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBURVhUX0FUVFJJQlVURV9WQUxVRSA9ICIkVEVYVF9BVFRSSUJVVEVfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBDT05UQUlORVJfRkVBVFVSRSA9IG5ldyBDb250YWluZXJGZWF0dXJlKCk7Ci0KLQlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBST09UX0ZFQVRVUkUgPSBuZXcgUm9vdEZlYXR1cmUoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ29udGFpbmVyRmVhdHVyZSBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwgewotCQlwcm90ZWN0ZWQgQ29udGFpbmVyRmVhdHVyZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJvb3RGZWF0dXJlIGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCB7Ci0JCXByb3RlY3RlZCBSb290RmVhdHVyZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBmaW5kQ2hpbGQoU3RyaW5nIHRhZ05hbWUsIE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQotCQlUcmFuc2xhdG9yIHJlc3VsdCA9IG51bGw7Ci0JCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRyZW4odGFyZ2V0LCB2ZXJzaW9uSUQpOwotCi0JCWlmIChtYXBzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJCVRyYW5zbGF0b3IgbWFwID0gbWFwc1tpXTsKLQkJCQlpZiAobWFwLmlzTWFwRm9yKHRhZ05hbWUpKSB7Ci0JCQkJCXJlc3VsdCA9IG1hcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBmYWN0b3J5ID0gZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCAmJiBmYWN0b3J5LmFjY2VwdHModGFnTmFtZSkpIHsKLQkJCQlyZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZSh0YWdOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHN0cmluZyB0b2dldGhlciBhcnJheXMgb2YgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTEubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3Qgb2JqZWN0MikgewotCQlPYmplY3RbXSBuZXdBcnJheSA9IG5ldyBPYmplY3RbXXtvYmplY3QyfTsKLQkJcmV0dXJuIGNvbmNhdChhcnJheTEsIG5ld0FycmF5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGFyZW50QW5kVGV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwYXJlbnRGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHBhcmVudCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBwYXJlbnRGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JCXBhcmVudC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltde25ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBjaGlsZEZlYXR1cmUpfSk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7Ci0JCXNldEVNRkNsYXNzKGVDbGFzcyk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKLQkJc2V0RmVhdHVyZShhRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJdGhpcyhkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCQlzZXRFTUZDbGFzcyhlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXRoaXMoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBuZXcgVHJhbnNsYXRvclBhdGhbXXtwYXRofSk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKLQkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKLQkJZlRyYW5zbGF0b3JQYXRocyA9IHBhdGhzOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7Ci0JCWZTdHlsZSA9IHN0eWxlOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVjb3JlUGFja2FnZSBnZXRFY29yZVBhY2thZ2UoKSB7Ci0JCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGZET01OYW1lc1swXTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RE9NTmFtZXMoKSB7Ci0JCXJldHVybiBmRE9NTmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRET01QYXRoKCkgewotCQlyZXR1cm4gZkRPTVBhdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRE9NUGF0aCgpIHsKLQkJcmV0dXJuIGZET01QYXRoICE9IG51bGwgJiYgZkRPTVBhdGgubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBET00gbmFtZXMgYW5kIHBhdGggb3V0IG9mIDxkb21OYW1lQW5kUGF0aD5hbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKFN0cmluZyBkb21OYW1lQW5kUGF0aEFyZykgewotCQlpZiAoZG9tTmFtZUFuZFBhdGhBcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGlueCA9IGRvbU5hbWVBbmRQYXRoQXJnLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWlmIChpbnggIT0gLTEpIHsKLQkJCWZET01OYW1lcyA9IHBhcnNlRE9NTmFtZXMoZG9tTmFtZUFuZFBhdGhBcmcuc3Vic3RyaW5nKGlueCArIDEpKTsKLQkJCWZET01QYXRoID0gZG9tTmFtZUFuZFBhdGhBcmcuc3Vic3RyaW5nKDAsIGlueCk7Ci0JCX0gZWxzZSB7Ci0JCQlmRE9NTmFtZXMgPSBwYXJzZURPTU5hbWVzKGRvbU5hbWVBbmRQYXRoQXJnKTsKLQkJCWZET01QYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBhZGRlZCBieSBNREUKLQkJdGhpcy5kb21OYW1lQW5kUGF0aCA9IGRvbU5hbWVBbmRQYXRoQXJnOwotCi0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgYW4gZW1wdHkgdGFnOyBlZywgPGRpc3RyaWJ1dGFibGUvPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ0RBVEFDb250ZW50KCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIENEQVRBX0NPTlRFTlQpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIERPTU5hbWUgcmVwcmVzZW50cyBhIHN1YiBlbGVtZW50IG5hbWUgb3IgYW4gYXR0cmlidXRlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgRE9NTmFtZSBpcyBhbiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RPTUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBET01fQVRUUklCVVRFKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSB3cml0dGVuIGFzIGFuIGVtcHR5IHRhZzsgZWcsIDxkaXN0cmlidXRhYmxlLz4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VGFnKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEVNUFRZX1RBRykgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5VcHBlcmNhc2UoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgQk9PTEVBTl9GRUFUVVJFKSAhPSAwICYmIChmU3R5bGUgJiBCT09MRUFOX0xPV0VSQ0FTRSkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5GZWF0dXJlKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEJPT0xFQU5fRkVBVFVSRSkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRFbmRUYWcoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgRU5EX1RBR19OT19JTkRFTlQpID09IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50RW5kVGFnKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc2hvdWxkSW5kZW50RW5kVGFnKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpIHsKLQkJcmV0dXJuICgoZlN0eWxlICYgRU1QVFlfVEFHKSAhPSAwKSB8fCAoKGZTdHlsZSAmIEVNUFRZX0NPTlRFTlRfSVNfU0lHTklGSUNBTlQpICE9IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyB0byBhbm90aGVyIE1PRiBvYmplY3QgKG5vdCBhIHByaW1pdGl2ZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09iamVjdE1hcCgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBPQkpFQ1RfTUFQKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmb3IgYSBzaGFyZWQgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgU0hBUkVEX1JFRkVSRU5DRSkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VudW1XaXRoSHlwaGVucygpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBFTlVNX0ZFQVRVUkVfV0lUSF9IWVBIRU5TKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtYXAgcmVwcmVzZW50cyBhIGNhc2Ugd2hlcmUgdGhlIHRleHQgb2YgdGhlIERPTU5vZGUgcmVwcmVzZW50cyB0aGUKLQkgKiBvYmplY3RzIG9uZSBhbmQgb25seSBhdHRyaWJ1dGUgdmFsdWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBjYXNlIGlzIGEgPHdlbGNvbWUtZmlsZT5maWxlLnR4dAotCSAqIDwvd2VsY29tZS1maWxlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RPTVRleHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGZET01OYW1lc1swXSA9PSBURVhUX0FUVFJJQlVURV9WQUxVRTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWQgaXMgdGhlIG1vZiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgc2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSURNYXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWQgaXMgdGhlIG1vZiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgc2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlua01hcCgpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdG9yUGF0aHMgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RhcmdldExpbmtNYXAoKSB7Ci0JCXJldHVybiBpc0xpbmtNYXAoKSAmJiAhaXNPYmplY3RNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcCBpcyB0aGUgb25lIHJlcHJlc2VudGluZyBhIG5vZGUgd2l0aCB0aGUgbmFtZSA8ZG9tTmFtZT4uIEJ5IGRlZmF1bHQKLQkgKiB0aGlzIG1ldGhvZCBzaW1wbHkgY29tcGFyZXMgdGhlIERPTSBuYW1lIG9mIHRoZSBtYXAgYWdhaW5zdCB0aGUgPGRvbU5hbWU+cGFyYW1ldGVyCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGRvbU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hcEZvcihTdHJpbmcgZG9tTmFtZSkgewotCQlpZiAoZG9tTmFtZS5lcXVhbHMoZ2V0RE9NUGF0aCgpKSkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZET01OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRvbU5hbWUuZXF1YWxzKGZET01OYW1lc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKE9iamVjdCBhRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgPT0gYUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgZmVhdHVyZSBiZWluZyBtYXBwZWQgaXMgYSBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBmZWF0dXJlIGlzIG11bHRpIHZhbHVlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJcmV0dXJuIGZlYXR1cmUuaXNNYW55KCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgY29tbWEgc2VwYXJhdGVkIG5hbWVzIGZyb20gPGRvbU5hbWVzU3RyaW5nPi4gUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqIEBwYXJhbSBkb21OYW1lc1N0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBwYXJzZURPTU5hbWVzKFN0cmluZyBkb21OYW1lc1N0cmluZykgewotCQlpbnQgc3RhcnRJbnggPSAwOwotCQlpbnQgaW54ID0gZG9tTmFtZXNTdHJpbmcuaW5kZXhPZignLCcpOwotCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCXdoaWxlIChpbnggIT0gLTEpIHsKLQkJCXJlc3VsdHMuYWRkKGRvbU5hbWVzU3RyaW5nLnN1YnN0cmluZyhzdGFydElueCwgaW54KSk7Ci0JCQlzdGFydElueCA9IGlueCArIDE7Ci0JCQlpbnggPSBkb21OYW1lc1N0cmluZy5pbmRleE9mKCcsJywgc3RhcnRJbngpOwotCQl9Ci0JCWlmIChzdGFydElueCA9PSAwKQotCQkJcmVzdWx0cy5hZGQoZG9tTmFtZXNTdHJpbmcpOwotCQllbHNlCi0JCQlyZXN1bHRzLmFkZChkb21OYW1lc1N0cmluZy5zdWJzdHJpbmcoc3RhcnRJbngpKTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWNuID0gY24uc3Vic3RyaW5nKCsraSwgY24ubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoY24pOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKGZET01OYW1lc1swXSk7Ci0JCWZvciAoaW50IGogPSAxOyBqIDwgZkRPTU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlzYi5hcHBlbmQoJ3wnKTsKLQkJCXNiLmFwcGVuZChmRE9NTmFtZXNbal0pOwotCQl9Ci0JCXNiLmFwcGVuZCgnLCcpOwotCQlzYi5hcHBlbmQoaGFzaENvZGUoKSk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBUcmFuc2xhdG9yUGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBUcmFuc2xhdG9yUGF0aAotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUGF0aFtdIGdldFRyYW5zbGF0b3JQYXRocygpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdG9yUGF0aHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zbGF0b3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlUcmFuc2xhdG9yIG1hcEluZm8gPSAoVHJhbnNsYXRvcikgb2JqZWN0OwotCQlyZXR1cm4gZkRPTU5hbWVzLmVxdWFscyhtYXBJbmZvLmdldERPTU5hbWVzKCkpICYmIChmZWF0dXJlID09IG51bGwgJiYgbWFwSW5mby5nZXRGZWF0dXJlKCkgPT0gbnVsbCB8fCBmZWF0dXJlLmVxdWFscyhtYXBJbmZvLmdldEZlYXR1cmUoKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSArZkRPTU5hbWVzLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaXNNYW5hZ2VkQnlQYXJlbnQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihudWxsLCAtMSkgPT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEluIHRoZSA5OSUgY2FzZSB0aGVyZSBpcyBvbmx5IG9uZSBub2RlIG5hbWUgdG8gYmUgY29uY2VybmVkIHdpdGgsIGJ1dCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotCSAqIGZvciB0aGUgY2FzZXMgd2hlcmUgbXVsdGlwbGUgZG9tIG5hbWVzIG1hcCB0byBvbmUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCWlmIChlbWZDbGFzcyA9PSBudWxsKSB7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGlzT2JqZWN0TWFwKCkpCi0JCQkJcmV0dXJuIGNyZWF0ZUVNRk9iamVjdChmZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlRU1GT2JqZWN0KGVtZkNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlpZiAoYUZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBjcmVhdGVFTUZPYmplY3QoKChFUmVmZXJlbmNlKSBhRmVhdHVyZSkuZ2V0RVJlZmVyZW5jZVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChFQ2xhc3MgYW5FQ2xhc3MpIHsKLQkJaWYgKGFuRUNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFuRUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZShhbkVDbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dFZhbHVlSWZOZWNlc3NhcnkoU3RyaW5nIHRleHRWYWx1ZSwgTm90aWZpZXIgb3duZXIsIGludCB2ZXJzaW9uSWQpIHsKLQkJVHJhbnNsYXRvciB0ZXh0VHJhbnNsYXRvciA9IHRoaXMuZmluZENoaWxkKFRyYW5zbGF0b3IuVEVYVF9BVFRSSUJVVEVfVkFMVUUsIG93bmVyLCB2ZXJzaW9uSWQpOwotCQlpZiAodGV4dFRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iamVjdFZhbHVlID0gdGV4dFRyYW5zbGF0b3IuY29udmVydFN0cmluZ1RvVmFsdWUodGV4dFZhbHVlLCAoRU9iamVjdCkgb3duZXIpOwotCQkJdGV4dFRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUob3duZXIsIG9iamVjdFZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBmZWF0dXJlIGlzIHZhbGlkIG9uIGEgcGFydGljdWxhciBtb2ZPYmplY3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIFJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIHNwZWNpZmllZCBleGlzdHMgb24gdGhlIE1PRiBvYmplY3QuCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVtZk9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZS5nZXROYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRvcnMgd2hpY2ggZG8gbm90IGhhdmUgYSBmZWF0dXJlIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB3aXRoIGN1c3RvbSBiZWhhdmlvci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3RTdHJpbmdWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlpZiAoaXNFbXB0eVRhZygpICYmIGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy9GYWtlIGl0IG91dCB3aXRoIGEgdmFsdWUgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUsIFN0cmluZyB2YWx1ZSwgTm90aWZpZXIgb3duZXIpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCWlmICghdGhpcy5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlRU1GT2JqZWN0KG5vZGVOYW1lLCByZWFkQWhlYWROYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gY29udmVydFN0cmluZ1RvVmFsdWUodmFsdWUsIChFT2JqZWN0KSBvd25lcik7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHN0cmluZyB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QgVGhlIGNvbnZlcnRlZCB2YWx1ZQotCSAqIEBwYXJhbSBzdHJWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBzdHJWYWx1ZTsKLQkJU3RyaW5nIGlubmVyU3RyVmFsdWUgPSBzdHJWYWx1ZTsKLQkJaWYgKGlubmVyU3RyVmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKGlzRW51bVdpdGhIeXBoZW5zKCkpCi0JCQkJaW5uZXJTdHJWYWx1ZSA9IGlubmVyU3RyVmFsdWUucmVwbGFjZSgnLScsICdfJyk7Ci0JCQlpZiAoIWlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCQlpbm5lclN0clZhbHVlID0gaW5uZXJTdHJWYWx1ZS50cmltKCk7Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gRmVhdHVyZVZhbHVlQ29udmVydGVyLkRFRkFVTFQuY29udmVydFZhbHVlKGlubmVyU3RyVmFsdWUsIGZlYXR1cmUpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKGlzRW1wdHlUYWcoKSAmJiAhaXNET01BdHRyaWJ1dGUoKSAmJiAhaXNET01UZXh0VmFsdWUoKSAmJiBpc0Jvb2xlYW5GZWF0dXJlKCkpCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCUVPYmplY3QgY29udmVydFRvVHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChjb252ZXJ0VG9UeXBlID09IG51bGwpCi0JCQkJdmFsdWUgPSBpbm5lclN0clZhbHVlOwotCQkJZWxzZSBpZiAoY29udmVydFRvVHlwZS5lcXVhbHMoZ2V0RWNvcmVQYWNrYWdlKCkuZ2V0RVN0cmluZygpKSkgewotCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSB2YWx1ZSBvZiBhIHNwZWNpZmllZCB0eXBlIHRvIGEgc3RyaW5nIHZhbHVlLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBmb3Igc3BlY2lhbAotCSAqIGNhc2VzIHdoZXJlIHNwZWNpYWwgY29udmVyc2lvbiBuZWVkcyB0byBvY2N1ciBiYXNlZCBvbiB0aGUgZmVhdHVyZSBhbmQgb3Igb2JqZWN0IHR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgVGhlIGNvbnZlcnRlZCB2YWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKGlzRW1wdHlUYWcoKSB8fCB2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGlzRW51bVdpdGhIeXBoZW5zKCkpCi0JCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKCdfJywgJy0nKTsKLQkJZWxzZSBpZiAoaXNCb29sZWFuVXBwZXJjYXNlKCkpCi0JCQlyZXR1cm4gKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgPyAiVHJ1ZSIgOiAiRmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldFZhcmlhYmxlQ2hpbGRyZW4oTm90aWZpZXIgdGFyZ2V0LCBpbnQgdmVyc2lvbikgewotCQlUcmFuc2xhdG9yW10gcmVzdWx0cyA9IG51bGw7Ci0JCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdG9yeSA9IGdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJTGlzdCB2YXJpYWJsZVRyYW5zbGF0b3JzID0gZmFjdG9yeS5jcmVhdGUodGFyZ2V0KTsKLQkJCWlmICh2YXJpYWJsZVRyYW5zbGF0b3JzICE9IG51bGwgJiYgdmFyaWFibGVUcmFuc2xhdG9ycy5zaXplKCkgPiAwKSB7Ci0JCQkJT2JqZWN0W10gdnRvYSA9IHZhcmlhYmxlVHJhbnNsYXRvcnMudG9BcnJheSgpOwotCi0JCQkJcmVzdWx0cyA9IG5ldyBUcmFuc2xhdG9yW3Z0b2EubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspCi0JCQkJCXJlc3VsdHNbaV0gPSAoVHJhbnNsYXRvcikgdnRvYVtpXTsKLQkJCX0KLQotCQl9Ci0JCWlmIChyZXN1bHRzID09IG51bGwpCi0JCQlyZXN1bHRzID0gbmV3IFRyYW5zbGF0b3JbMF07Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbnVsbCBieSBkZWZhdWx0OyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byByZXR1cm4gc3BlY2lmaWMgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIE1PRiBjaGlsZHJlbiB0aGF0IGN1cnJlbnRseSBleGlzdCBmb3IgdGhlIHZhbHVlcyBvZiBhbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIExpc3QgZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlPYmplY3QgdmFsdWUgPSBnZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQlMaXN0IHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmIChpc011bHRpVmFsdWVkKCkpCi0JCQlyZXN1bHQgPSAoTGlzdCkgdmFsdWU7Ci0JCWVsc2UgaWYgKHZhbHVlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZhbHVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZk9iamVjdC5lR2V0KGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSB2YWx1ZSBvZiBhIGZlYXR1cmUgaW4gYSBtb2Ygb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUsIGludCBuZXdJbmRleCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlpZiAoKGZTdHlsZSAmIFVOU0VUX0lGX05VTEwpICE9IDAgJiYgdmFsdWUgPT0gbnVsbCkKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5lVW5zZXRPclJlbW92ZSgoRU9iamVjdCkgb3duZXIsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5lU2V0T3JBZGQoKEVPYmplY3QpIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwgbmV3SW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlzZXRNT0ZWYWx1ZSgoRU9iamVjdCkgb3duZXIsIHZhbHVlKTsKLQkJfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlzZXRNT0ZWYWx1ZSgoUmVzb3VyY2UpIG93bmVyLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCS8vCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkvLwkJCWVtZk9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJc2V0TU9GVmFsdWUoZW1mT2JqZWN0LCB2YWx1ZSwgLTEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKFJlc291cmNlIHJlcywgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKQotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KXZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQlFeHRlbmRlZEVjb3JlVXRpbC5lVW5zZXRPclJlbW92ZSgoRU9iamVjdCkgb3duZXIsIGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWJvb2xlYW4gaXNTZXQgPSBmZWF0dXJlICE9IG51bGwgJiYgZW1mT2JqZWN0LmVJc1NldChmZWF0dXJlKTsKLQkJaWYgKGlzRW1wdHlUYWcoKSkKLQkJCXJldHVybiBpc1NldCAmJiAoKEJvb2xlYW4pIGVtZk9iamVjdC5lR2V0KGZlYXR1cmUpKS5ib29sZWFuVmFsdWUoKTsKLQkJcmV0dXJuIGlzU2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCWVtZk9iamVjdC5lVW5zZXQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJMaXN0KEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQkoKExpc3QpIG1vZk9iamVjdC5lR2V0KGZlYXR1cmUpKS5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGFGZWF0dXJlOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvL1RoaXMgd2F5IGFuIGluc3RhbmNlIGNoZWNrIGhhcHBlbnMgb25seSBvbmNlCi0JCWlmIChhRmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCWZTdHlsZSB8PSBPQkpFQ1RfTUFQOwotCQkJaWYgKCEoKEVSZWZlcmVuY2UpIGFGZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpCi0JCQkJZlN0eWxlIHw9IFNIQVJFRF9SRUZFUkVOQ0U7Ci0JCX0KLQotCQlpZiAoZ2V0RWNvcmVQYWNrYWdlKCkuZ2V0RUJvb2xlYW4oKSA9PSBmZWF0dXJlLmdldEVUeXBlKCkpCi0JCQlmU3R5bGUgfD0gQk9PTEVBTl9GRUFUVVJFOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVNRkNsYXNzKEVDbGFzcyBhbkVDbGFzcykgewotCQl0aGlzLmVtZkNsYXNzID0gYW5FQ2xhc3M7Ci0JCWlmIChhbkVDbGFzcyAhPSBudWxsKQotCQkJZlN0eWxlIHw9IE9CSkVDVF9NQVA7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWFkQWhlYWROYW1lcygpIHsKLQkJcmV0dXJuIHJlYWRBaGVhZE5hbWVzICE9IG51bGwgJiYgIXJlYWRBaGVhZE5hbWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlYWQgYWhlYWQgbmFtZXMsIGlmIHRoZXkgYXJlIGRlZmluZWQsIGZvciBhIGdpdmVuIHBhcmVudCBub2RlIG5hbWUuIFRoaXMgaXMgdXNlZAotCSAqIHdoZW4gY3JlYXRpb24gb2YgYSBzcGVjaWZpYyBFTUYgb2JqZWN0IGlzIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YgYSBjaGlsZCBub2RlLgotCSAqLwotCXB1YmxpYyBSZWFkQWhlYWRIZWxwZXIgZ2V0UmVhZEFoZWFkSGVscGVyKFN0cmluZyBwYXJlbnROYW1lKSB7Ci0JCWlmIChyZWFkQWhlYWROYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVhZEFoZWFkSGVscGVyKSByZWFkQWhlYWROYW1lcy5nZXQocGFyZW50TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVhZEFoZWFkSGVscGVyKFJlYWRBaGVhZEhlbHBlciBoZWxwZXIpIHsKLQkJaWYgKHJlYWRBaGVhZE5hbWVzID09IG51bGwpCi0JCQlyZWFkQWhlYWROYW1lcyA9IG5ldyBIYXNoTWFwKDMpOwotCQlyZWFkQWhlYWROYW1lcy5wdXQoaGVscGVyLmdldFBhcmVudERPTU5hbWUoKSwgaGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lDaGlsZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lQYXJlbnQoKSB7Ci0JCWlmIChpc0RlcGVuZGVuY3lQYXJlbnQgPT0gbnVsbCkgewotCQkJaXNEZXBlbmRlbmN5UGFyZW50ID0gQm9vbGVhbi5GQUxTRTsKLQkJCVRyYW5zbGF0b3JbXSB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKG51bGwsIC0xKTsKLQkJCWlmICh0aGVDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkvL0ZvciBub3cgd2UgYXNzdW1lIG9uZQotCQkJCQlpZiAodGhlQ2hpbGRyZW5baV0uaXNEZXBlbmRlbmN5Q2hpbGQoKSkgewotCQkJCQkJaXNEZXBlbmRlbmN5UGFyZW50ID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJZGVwZW5kZW5jeUZlYXR1cmUgPSB0aGVDaGlsZHJlbltpXS5nZXREZXBlbmRlbmN5RmVhdHVyZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0RlcGVuZGVuY3lQYXJlbnQuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RGVwZW5kZW5jeUZlYXR1cmUoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmN5RmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBiYXNpY0dldERlcGVuZGVuY3lPYmplY3QoRU9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIChFT2JqZWN0KSBwYXJlbnQuZUdldChkZXBlbmRlbmN5RmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHdoZW4gdGhlIERPTSBwYXRoIGlzIG5vdCBudWxsLCBhbmQgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLiBEZWZhdWx0IGlzIGZhbHNlLCBidXQKLQkgKiBzdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpOwotCX0KLQotCS8qKgotCSAqIFVzZSB3aGVuIHRoZSB0cmFuc2xhdG9yIHRvbGVyYXRlcyBwYXJlbnQgbm9kZXMgdGhhdCByZWxhdGUgdG8gdGhlIERPTSBwYXRoLCBhbmQgbm8gY2hpbGRyZW47Ci0JICogZGVmYXVsdCBpcyBkbyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWVGcm9tRW1wdHlET01QYXRoKEVPYmplY3QgZU9iamVjdCkgewotCi0JfQotCi0JLyoqCi0JICogTmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVTcGFjZSgpIHsKLQkJcmV0dXJuIGZOYW1lU3BhY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBkb20gYXR0cmlidXRlCi0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVTcGFjZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWZOYW1lU3BhY2UgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpIHsKLQkJaWYgKGlzT2JqZWN0TWFwKCkpCi0JCQlyZXR1cm4gRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LklOU1RBTkNFOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VudW1GZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsICYmIEVDT1JFX1BBQ0tBR0UuZ2V0RUVudW0oKS5pc0luc3RhbmNlKGZlYXR1cmUuZ2V0RVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldHRhYmxlKCkgewotCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsICYmIGZlYXR1cmUuaXNVbnNldHRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEYXRhVHlwZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBDT01NRU5UX0ZFQVRVUkUpICE9IDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGI4M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLQotLyoKLSAqIFRyYW5zbGF0b3IgZmlsdGVycyBjYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gT2JqZWN0IGFuZCBBdHRyaWJ1dGUgVHJhbnNsYXRvcnMgd2l0aG91dAotICogYnJlYWtpbmcgdGhlbSBvdXQgaW50byBzZXBlcmF0ZSBkYXRhIHN0cnVjdHVyZXMuIFRoZSBGaWx0ZXIgd2lsbCByZWx5IG9uIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAqIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gVHJhbnNsYXRvci4KLSAqIAotICogZ2V0TmV4dENoaWxkKCkgd2lsbCByZXR1cm4gbnVsbCB3aGVuIG5vIG90aGVyIHRyYW5zbGF0b3JzIG9mIHRoZSBnaXZlbiBnZW5yZSBhcmUgYXZhaWxhYmxlLgotICogCi0gKiBUaGUgcHJvY2Vzc2luZyBoaW50cyB3aGljaCBhcmUgY3JlYXRlZCBhbmQgdGhlbiBwYXNzZWQgdG8gZ2V0TmV4dCpUcmFuc2xhdG9yKCkgc3RvcmUgaW5mb3JtYXRpb24KLSAqIHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGVkIGJldHdlZW4gY2FsbHMuIFRoZSBjcmVhdGVQcm9jZXNzaW5nSGludHMoKSB3aWxsIGNyZWF0ZSBhIHByb3Blcmx5Ci0gKiBpbml0aWFsaXplZCBhcnJheS4gVGhlIGNvbnN0YW50cyBORVhUX1NUQVJUX0hJTlRfSU5EWCBhbmQgTU9ERV9ISU5UX0lORFggcHJvdmlkZSBwb2ludGVycyBpbnRvCi0gKiB0aGUgYXJyYXkgZm9yIHRoZSBORVhUX1NUQVJUIHBvc2l0aW9uIGFuZCB0aGUgcHJvcGVyIG1vZGUgdG8gb3BlcmF0ZSBpbgotICogKFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREUgb3IKLSAqICAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGZpbmFsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcjsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IHZlcnNpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVhUX1NUQVJUX0hJTlRfSU5EWCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ISU5UX0lORFggPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERSA9IDE7Ci0KLQkvKgotCSAqIFRoZXNlIFRyYW5zbGF0b3JGaWx0ZXJzIGFyZSB1c2VkIGluIGEgc3RhdGVsZXNzIG1vZGUuIE9ubHkgdGhlaXIgc2Nhbk5leHRUcmFuc2xhdG9yKCkgbWV0aG9kcwotCSAqIHdpbGwgYmUgaW52b2tlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JGaWx0ZXIgb2JqZWN0VHJhbnNsYXRvckZpbHRlciA9IG5ldyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyKG51bGwsIC0xKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yRmlsdGVyIGF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIgPSBuZXcgQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcihudWxsLCAtMSk7Ci0KLQotCXByb3RlY3RlZCBpbnQgbW9kZSA9IFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREU7Ci0JcHJvdGVjdGVkIGludCBpbmRleCA9IC0xOwotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgVHJhbnNsYXRvckZpbHRlcihUcmFuc2xhdG9yIHRyYW5zLCBpbnQgdmVyc2lvbikgewotCQl0aGlzLnRyYW5zbGF0b3IgPSB0cmFuczsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsaW5nIHBlZWsgdHdpY2Ugd2lsbCBhZHZhbmNlIHRoZSBjdXJyZW50IGNoaWxkCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgcGVla05leHRDaGlsZChFT2JqZWN0IHRhcmdldCkgewotCQljYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yID0gZ2V0TmV4dENoaWxkKHRhcmdldCk7Ci0JCXJldHVybiBjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yOwotCX0KLQotCS8qKgotCSAqIGdldE5leHRDaGlsZCgpIHdpbGwgcmV0dXJuIG51bGwgd2hlbiBubyBvdGhlciB0cmFuc2xhdG9ycyBvZiB0aGUgZ2l2ZW4gZ2VucmUgYXJlIGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXROZXh0Q2hpbGQoRU9iamVjdCB0YXJnZXQpIHsKLQotCQlUcmFuc2xhdG9yIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3I7Ci0JCQljYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yID0gbnVsbDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlpbnQgZm91bmQgPSAwOwotCQlUcmFuc2xhdG9yIGNoaWxkcmVuW10gPSBudWxsOwotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJCWNhc2UgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSA6Ci0JCQkJY2hpbGRyZW4gPSB0aGlzLnRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4odGFyZ2V0LCB0aGlzLnZlcnNpb24pOwotCi0JCQkJLyogTG9vayBmb3IgdGhlIG5leHQgQXR0cmlidXRlIFRyYW5zbGF0b3IgKi8KLQkJCQlmb3VuZCA9IHNjYW5OZXh0VHJhbnNsYXRvcihjaGlsZHJlbiwgdGhpcy5pbmRleCk7Ci0KLQkJCQlpZiAoZm91bmQgPj0gMCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiBmb3VuZCwgKDEpIHVwZGF0ZSB0aGUgcmVzdWx0LCAoMikgdXBkYXRlIHRoZSBpbmRleCBzbyB3ZSBjYW4gc2tpcCBhaGVhZCBvbgotCQkJCQkgKiB0aGUgbmV4dCBpbnZvY2F0aW9uICgzKSBlc2NhcGUgdGhlIFZBUklBQkxFX1RSQU5TTEFUT1JTIHByb2Nlc3NpbmcKLQkJCQkJICovCi0JCQkJCXJlc3VsdCA9IGNoaWxkcmVuW2ZvdW5kXTsKLQkJCQkJdGhpcy5pbmRleCA9IGZvdW5kOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBSZXNldCB0aGUgaW5kZXguIERPIE5PVCBCUkVBSy4gQWxsb3cgZW50cnkgaW50byBWQVJJQUJMRV9UUkFOU0xBVE9SUyBjYXNlCi0JCQkJICovCi0JCQkJdGhpcy5pbmRleCA9IC0xOwotCQkJCS8qCi0JCQkJICogdXBkYXRlIHRoZSBtb2RlIHRvIFZBUklBQkxFX1RSQU5TTEFUT1JTIHNvIHdlIGNhbiBza2lwIHRvIGl0IGRpcmVjdGx5IG5leHQgdGltZQotCQkJCSAqLwotCQkJCXRoaXMubW9kZSA9IFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREU7Ci0JCQkvLyRGQUxMLVRIUk9VR0gkCi0JCQljYXNlIFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREUgOgotCQkJCWNoaWxkcmVuID0gdGhpcy50cmFuc2xhdG9yLmdldFZhcmlhYmxlQ2hpbGRyZW4odGFyZ2V0LCB0aGlzLnZlcnNpb24pOwotCQkJCWZvdW5kID0gc2Nhbk5leHRUcmFuc2xhdG9yKGNoaWxkcmVuLCB0aGlzLmluZGV4KTsKLQkJCQlpZiAoZm91bmQgPj0gMCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiBmb3VuZCwgKDEpIHVwZGF0ZSB0aGUgcmVzdWx0LCAoMikgdXBkYXRlIHRoZSBpbmRleCBzbyB3ZSBjYW4gc2tpcCBhaGVhZCBvbgotCQkJCQkgKiB0aGUgbmV4dCBpbnZvY2F0aW9uCi0JCQkJCSAqLwotCQkJCQlyZXN1bHQgPSBjaGlsZHJlbltmb3VuZF07Ci0JCQkJCXRoaXMuaW5kZXggPSBmb3VuZDsKLQkJCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBjcmVhdGVQcm9jZXNzaW5nSGludHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W117LTEsIFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREV9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBnZXROZXh0QXR0cmlidXRlVHJhbnNsYXRvcihUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIGludCBzdGFydEhpbnQsIGludFtdIG5leHRIaW50LCBFT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb24pIHsKLQotCQlyZXR1cm4gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0Q2hpbGQodHJhbnNsYXRvciwgc3RhcnRIaW50LCBuZXh0SGludCwgdGFyZ2V0LCB2ZXJzaW9uLCBhdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IoVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBpbnQgc3RhcnRIaW50LCBpbnRbXSBuZXh0SGludCwgRU9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uKSB7Ci0KLQkJcmV0dXJuIFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dENoaWxkKHRyYW5zbGF0b3IsIHN0YXJ0SGludCwgbmV4dEhpbnQsIHRhcmdldCwgdmVyc2lvbiwgb2JqZWN0VHJhbnNsYXRvckZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmV4dENoaWxkKCkgdGFrZXMgaGludHMgb24gd2hlcmUgdG8gYmVnaW4gaW4gdGhlIGNoaWxkcmVuIGFycmF5IG9mIHRoZSBnaXZlbiBUcmFuc2xhdG9yLgotCSAqIFdoZW4gaXQgZmluZHMgdGhlIHRyYW5zbGF0b3IsIGl0IHdpbGwgdXBkYXRlIHRoZSBoaW50cyBhcnJheSB3aXRoIHRoZSBzdGFydCBoaW50IGZvciB0aGUgbmV4dAotCSAqIGludm9jYXRpb24oaGludHNbMF0pIGFuZCB3aGVuIG5lY2Vzc2FyeSBpdCB3aWxsIHVzZSB1cGRhdGUgdGhlIG1vZGUgKGhpbnRzWzFdKSB0byBlaXRoZXIKLQkgKiBTVEFOREFSRF9UUkFOU0xBVE9SUyBvciBWQVJJQUJMRV9UUkFOU0xBVE9SUy4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvcgotCSAqIEBwYXJhbSBzdGFydEhpbnQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIGEgdHdvLWVsZW1lbnQgYXJyYXk6IGhpbnRzWzBdIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBuZXh0IHN0YXJ0SGludCBhbmQgaGludHNbMV0KLQkgKiAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgbW9kZS4KLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIHZlcnNpb24KLQkgKiBAcGFyYW0gdHJhbnNsYXRvckZpbHRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgZ2V0TmV4dENoaWxkKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgaW50IHN0YXJ0SGludCwgaW50W10gaGludHMsIEVPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbiwgVHJhbnNsYXRvckZpbHRlciB0cmFuc2xhdG9yRmlsdGVyKSB7Ci0KLQkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOwotCQkKLQkJaW50IGlubmVyU3RhcnRIaW50ID0gc3RhcnRIaW50OwotCQlpbnQgaW5kZXggPSBpbm5lclN0YXJ0SGludDsKLQkJVHJhbnNsYXRvciBjaGlsZHJlbltdID0gbnVsbDsKLQotCQlzd2l0Y2ggKGhpbnRzW01PREVfSElOVF9JTkRYXSkgewotCQkJY2FzZSBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFIDoKLQkJCQljaGlsZHJlbiA9IHRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4odGFyZ2V0LCB2ZXJzaW9uKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBpbm5lclN0YXJ0SGludCA8IGNoaWxkcmVuLmxlbmd0aCkgewotCi0JCQkJCS8qIExvb2sgZm9yIHRoZSBuZXh0IEF0dHJpYnV0ZSBUcmFuc2xhdG9yICovCi0JCQkJCWluZGV4ID0gdHJhbnNsYXRvckZpbHRlci5zY2FuTmV4dFRyYW5zbGF0b3IoY2hpbGRyZW4sIGluZGV4KTsKLQotCQkJCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIElmIGZvdW5kLCAoMSkgdXBkYXRlIHRoZSByZXN1bHQsICgyKSB1cGRhdGUgdGhlIGluZGV4IHNvIHdlIGNhbiBza2lwCi0JCQkJCQkgKiBhaGVhZCBvbiB0aGUgbmV4dCBpbnZvY2F0aW9uICgzKSBlc2NhcGUgdGhlIFZBUklBQkxFX1RSQU5TTEFUT1JTCi0JCQkJCQkgKiBwcm9jZXNzaW5nCi0JCQkJCQkgKi8KLQkJCQkJCXJlc3VsdCA9IGNoaWxkcmVuW2luZGV4XTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIERPIE5PVCBCUkVBSyB3ZSB3aWxsIGRlZmF1bHQgdG8gVkFSSUFCTEUgVFJBTlNMQVRPUlMgTU9ERSBzbyB3ZSBtdXN0IHJlc2V0Ci0JCQkJCSAqIHRoZSBzdGFydEhpbnQgYXBwcm9wcmlhdGVseQotCQkJCQkgKi8KLQkJCQkJaW5uZXJTdGFydEhpbnQgPSAtMTsKLQkJCQl9Ci0KLQkJCS8vJEZBTEwtVEhST1VHSCQKLQkJCWNhc2UgVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERSA6Ci0JCQkJaGludHNbTU9ERV9ISU5UX0lORFhdID0gVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERTsKLQkJCQkvKgotCQkJCSAqIFJlc2V0IHRoZSBpbmRleC4KLQkJCQkgKi8KLQkJCQlpbmRleCA9IGlubmVyU3RhcnRIaW50OwotCQkJCWNoaWxkcmVuID0gdHJhbnNsYXRvci5nZXRWYXJpYWJsZUNoaWxkcmVuKHRhcmdldCwgdmVyc2lvbik7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBpbm5lclN0YXJ0SGludCA8IGNoaWxkcmVuLmxlbmd0aCkgewotCQkJCQlpbmRleCA9IHRyYW5zbGF0b3JGaWx0ZXIuc2Nhbk5leHRUcmFuc2xhdG9yKGNoaWxkcmVuLCBpbmRleCk7Ci0JCQkJCXJlc3VsdCA9IChpbmRleCA+PSAwKSA/IGNoaWxkcmVuW2luZGV4XSA6IG51bGw7Ci0JCQkJfQotCQl9Ci0KLQkJaGludHNbTkVYVF9TVEFSVF9ISU5UX0lORFhdID0gKHJlc3VsdCA9PSBudWxsICYmIGNoaWxkcmVuICE9IG51bGwpID8gY2hpbGRyZW4ubGVuZ3RoIDogaW5kZXg7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgc2Nhbk5leHRUcmFuc2xhdG9yKFRyYW5zbGF0b3JbXSBjaGlsZHJlbiwgaW50IHN0YXJ0KTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKLQkJcmV0dXJuIG1vZGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzhiNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLQotcHVibGljIGNsYXNzIFRyYW5zbGF0b3JQYXRoIHsKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIG1hcEluZm9QYXRoOwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gYXJyYXkgb2YgVHJhbnNsYXRvciB0aGF0IHNwZWNpZmllcyB0aGUgcGF0aCB0byBmb2xsb3cgZnJvbSBhbiBvYmplY3QgdG8KLQkgKiBhbm90aGVyIG9iamVjdAotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUGF0aChUcmFuc2xhdG9yW10gcGF0aCkgewotCQltYXBJbmZvUGF0aCA9IHBhdGg7Ci0JfQotCi0JcHVibGljIExpc3QgZmluZE9iamVjdHMoRU9iamVjdCBzdGFydE9iamVjdCkgewotCQlPYmplY3QgY3VyID0gc3RhcnRPYmplY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwSW5mb1BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCVRyYW5zbGF0b3IgY3VyTWFwID0gbWFwSW5mb1BhdGhbaV07Ci0JCQlpZiAoY3VyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjdXJBdHRyID0gY3VyTWFwLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoY3VyQXR0ciA9PSBUcmFuc2xhdG9yLkNPTlRBSU5FUl9GRUFUVVJFKSB7Ci0JCQkJCWN1ckF0dHIgPSAoKEVPYmplY3QpIGN1cikuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJCQljdXIgPSAoKEVPYmplY3QpIGN1cikuZUNvbnRhaW5lcigpOwotCQkJCX0gZWxzZSBpZiAoY3VyQXR0ciA9PSBUcmFuc2xhdG9yLlJPT1RfRkVBVFVSRSkgewotCQkJCQljdXIgPSAoKFRyYW5zbGF0b3JSZXNvdXJjZSkgc3RhcnRPYmplY3QuZVJlc291cmNlKCkpLmdldFJvb3RPYmplY3QoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdXIgPSAoKEVPYmplY3QpIGN1cikuZUdldChjdXJBdHRyKTsKLQkJCQl9Ci0JCQkJaWYgKGN1ck1hcC5pc011bHRpVmFsdWVkKCkpIHsKLQkJCQkJcmV0dXJuIChMaXN0KSBjdXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZmluZE9iamVjdChFT2JqZWN0IHN0YXJ0T2JqZWN0LCBPYmplY3QgbWF0Y2hWYWx1ZSkgewotCQlMaXN0IG9iamVjdHMgPSBmaW5kT2JqZWN0cyhzdGFydE9iamVjdCk7Ci0JCWlmIChvYmplY3RzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZpbmRPYmplY3Qob2JqZWN0cywgZ2V0TGFzdE1hcCgpLCBtYXRjaFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBmaW5kT2JqZWN0KExpc3Qgb2JqZWN0TGlzdCwgVHJhbnNsYXRvciBtYXAsIE9iamVjdCBtYXRjaFZhbHVlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG1vZk9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBjdXJNYXRjaFZhbHVlID0gbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSk7Ci0JCQlpZiAobWF0Y2hWYWx1ZS5lcXVhbHMoY3VyTWF0Y2hWYWx1ZSkpCi0JCQkJcmV0dXJuIG1vZk9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRMYXN0TWFwKCkgewotCQlyZXR1cm4gbWFwSW5mb1BhdGhbbWFwSW5mb1BhdGgubGVuZ3RoIC0gMV07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWNuID0gY24uc3Vic3RyaW5nKCsraSwgY24ubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoY24pOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKG1hcEluZm9QYXRoWzBdKTsKLQkJZm9yIChpbnQgaiA9IDE7IGogPCBtYXBJbmZvUGF0aC5sZW5ndGg7IGorKykgewotCQkJc2IuYXBwZW5kKCdcbicpOwotCQkJc2IuYXBwZW5kKG1hcEluZm9QYXRoW2pdKTsKLQkJfQotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjOWM0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotcHVibGljIGludGVyZmFjZSBUcmFuc2xhdG9yUmVzb3VyY2UgZXh0ZW5kcyBSZWZlcmVuY2VkUmVzb3VyY2UgewotCS8qCi0JICogbXVzdCBtYWtlIGEgc3ViY2xhc3MgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgZm9yIEVTdHJ1Y3R1cmFsRmVhdHVyZSBpcyBwcm90ZWN0ZWQKLQkgKi8KLQlzdGF0aWMgY2xhc3MgRG9jVHlwZUZlYXR1cmUgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIHsKLQkJcHJvdGVjdGVkIERvY1R5cGVGZWF0dXJlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCi0JRVN0cnVjdHVyYWxGZWF0dXJlIERPQ19UWVBFX0ZFQVRVUkUgPSBuZXcgRG9jVHlwZUZlYXR1cmUoKTsKLQotCS8qKgotCSAqIFRoZSBwdWJsaWMgaWQgb2YgdGhlIFhNTCBkb2N1bWVudCwgaWYgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRQdWJsaWNJZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlFT2JqZWN0IGdldFJvb3RPYmplY3QoKTsKLQotCS8qKgotCSAqIFRoZSBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudCwgaWYgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRTeXN0ZW1JZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGljIGlkIGFuZCBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQl2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBwdWJsaWMvc3lzdGVtIGlkcyBpZiBuZWNlc3NhcnkKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSBpbiB0aGUgZG9jdW1lbnQgdHlwZSBoZWFkZXIgb2YgdGhlIHNlcmlhbGl6ZWQgeG1sIGZpbGUKLQkgKi8KLQlTdHJpbmcgZ2V0RG9jdHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWE1MIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotCSAqLwotCVN0cmluZyBnZXRYTUxWZXJzaW9uKCk7Ci0KLQlUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCk7Ci0KLQkvKioKLQkgKiBFbnRpdHkgcmVzb2x2ZXIgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHVzaW5nIHN0YW5kYXJkIHBhcnNlcnMgdG8gcmVhZCB0aGUgcmVzb3VyY2UKLQkgKi8KLQlFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpOwotCi0JYm9vbGVhbiB1c2VzRFREKCk7Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpOwotCi0Jdm9pZCBzZXRWZXJzaW9uSUQoaW50IGkpOwotCi0JUmVuZGVyZXIgZ2V0UmVuZGVyZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MjdmYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFJlbmRlcmVyRmFjdG9yeS5MaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgUmVuZGVyZXJGYWN0b3J5IHJlbmRlcmVyRmFjdG9yeTsKLQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnksIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcykgewotCQlzdXBlcigpOwotCQlyZW5kZXJlckZhY3RvcnkgPSBhUmVuZGVyZXJGYWN0b3J5OwotCQlzZXRMaXN0ZW5pbmdGb3JVcGRhdGVzKGxpc3RlbmluZ0ZvclVwZGF0ZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXRoaXMoYVJlbmRlcmVyRmFjdG9yeSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuaW5nRm9yVXBkYXRlcyhib29sZWFuIHNob3VsZEJlTGlzdGVuaW5nRm9yVXBkYXRlcykgewotCi0JCWlmICh0aGlzLmxpc3RlbmluZ0ZvclVwZGF0ZXMgXiBzaG91bGRCZUxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQkJCWlmICghc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzKQotCQkJCVJlbmRlcmVyRmFjdG9yeS5Ob3RpZmljYXRpb25FbmdpbmUucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQllbHNlCi0JCQkJUmVuZGVyZXJGYWN0b3J5Lk5vdGlmaWNhdGlvbkVuZ2luZS5hZGRMaXN0ZW5lcih0aGlzKTsKLQotCQkJdGhpcy5saXN0ZW5pbmdGb3JVcGRhdGVzID0gc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5pbmdGb3JVcGRhdGVzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5pbmdGb3JVcGRhdGVzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBkb0NyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVuZGVyZXIgYVJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKCk7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeS5MaXN0ZW5lciN1cGRhdGVSZW5kZXJlckZhY3RvcnkoY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUmVuZGVyZXJGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBuZXdSZW5kZXJlckZhY3RvcnkpIHsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0aW5nIHJlbmRlcmVyIGZhY3RvcnkiKTsKLQkJcmVuZGVyZXJGYWN0b3J5ID0gbmV3UmVuZGVyZXJGYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1ZmVhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbi5FY29yZVV0aWxpdGllc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwgZXh0ZW5kcyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgVHJhbnNsYXRvclJlc291cmNlLCBJUm9vdE9iamVjdFJlc291cmNlewotCXN0YXRpYyBmaW5hbCBwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIElEX0ZFQVRVUkUgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FSURBdHRyaWJ1dGUoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkVSU0lPTiA9ICIxLjAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFJlbmRlcmVyIHJlbmRlcmVyOwotCS8qKgotCSAqIFRoZSBwdWJsaWMgSWQgdG8gdXNlIGF0IHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCS8qKgotCSAqIFRoZSBzeXN0ZW0gSWQgdG8gdXNlIGF0IHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlkOwotCXByb3RlY3RlZCBTdHJpbmcgeG1sVmVyc2lvbjsKLQkvLyBEZWZhdWx0IHRoZSByZXNvdXJjZXMgdG8gSjJFRSAxLjQKLQlwcm90ZWN0ZWQgaW50IHZlcnNpb25JRDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgU3ViY2xhc3NlcyBzaG91bGQKLQkgKiAgICAgICAgICAgICBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yawotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgU3ViY2xhc3NlcyBzaG91bGQKLQkgKiAgICAgICAgICAgICBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yawotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIodXJpKTsKLQkJc2V0UmVuZGVyZXIoYVJlbmRlcmVyKTsKLQkJdmVyc2lvbklEID0gZ2V0RGVmYXVsdFZlcnNpb25JRCgpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcigpOwotCQlzZXRSZW5kZXJlcihhUmVuZGVyZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlpZiAoc3VwZXIuZ2V0RW5jb2RpbmcoKSA9PSBudWxsKQotCQkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmNvZGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCkgewotCQlpZiAoY29udGVudHMgPT0gbnVsbCB8fCBjb250ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRDb250ZW50cygpLmdldCgwKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgYVB1YmxpY0lkLCBTdHJpbmcgYVN5c3RlbUlkKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9ICEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIGFQdWJsaWNJZCkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoc3lzdGVtSWQsIGFTeXN0ZW1JZCkpOwotCQlwdWJsaWNJZCA9IGFQdWJsaWNJZDsKLQkJc3lzdGVtSWQgPSBhU3lzdGVtSWQ7Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQllTm90aWZ5KG5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5TRVQsIG51bGwsIG51bGwpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoKSB7Ci0JCQkJCXJldHVybiBET0NfVFlQRV9GRUFUVVJFOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCQkJCXJldHVybiBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsLnRoaXM7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB4bWxWZXJzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRYTUxWZXJzaW9uKCkgewotCQlpZiAoeG1sVmVyc2lvbiA9PSBudWxsKQotCQkJeG1sVmVyc2lvbiA9IERFRkFVTFRfVkVSU0lPTjsKLQkJcmV0dXJuIHhtbFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgeG1sVmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0geG1sVmVyc2lvbgotCSAqICAgICAgICAgICAgVGhlIHhtbFZlcnNpb24gdG8gc2V0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0WE1MVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgewotCQl0aGlzLnhtbFZlcnNpb24gPSB4bWxWZXJzaW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJhc2ljRG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlib29sZWFuIGlzVHJhY2tpbmdNb2RzID0gaXNUcmFja2luZ01vZGlmaWNhdGlvbigpOwotCQl0cnkgewotCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKLQkJCXJlbmRlcmVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCX0KLQkJLy8gbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gcmVjb3JkVGltZSgiTG9hZCIsIHN0YXJ0LCBlbmQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZW5kZXJlci51c2VTdHJlYW1zRm9ySU8oKSkgewotICAgICAgICAgICAgc3VwZXIuc2F2ZShvcHRpb25zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmeUFib3V0VG9TYXZlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRvU2F2ZSgoT3V0cHV0U3RyZWFtKW51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIG5vdGlmeVNhdmVkKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICBub3RpZnlTYXZlRmFpbGVkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlOwotICAgICAgICAgICAgICAgIEVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5U2F2ZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsI2RvU2F2ZShPdXRwdXRTdHJlYW0sCi0JICogICAgICBNYXApCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXJlbmRlcmVyLmRvU2F2ZShvdXRwdXRTdHJlYW0sIG9wdGlvbnMpOwotCQlzZXRNb2RpZmllZChmYWxzZSk7Ci0JCS8vIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIHJlY29yZFRpbWUoIlNhdmUiLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgcmVjb3JkVGltZShTdHJpbmcgdHlwZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXHQiICsgdHlwZSArICJcdCIgKwotCS8vIChlbmQgLSBzdGFydCkgKwotCS8vICJcdFx0XHRtcyIgKyAiXHQiICsgKCggdGhpcy5nZXRWZXJzaW9uSUQoKSkgLyAxMC4wKSArICJcdCIgKyB0aGlzKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCS8vIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb1VubG9hZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB7Ci0JCXJlbmRlcmVyLnByZVVubG9hZCgpOwotCQlzdXBlci5kb1VubG9hZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArIGdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVuZGVyZXIuCi0JICogCi0JICogQHJldHVybiBSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcigpIHsKLQkJcmV0dXJuIHJlbmRlcmVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlbmRlcmVyLgotCSAqIAotCSAqIEBwYXJhbSByZW5kZXJlcgotCSAqICAgICAgICAgICAgVGhlIHJlbmRlcmVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJaWYgKHJlbmRlcmVyLmdldFJlc291cmNlKCkgIT0gdGhpcykKLQkJCXJlbmRlcmVyLnNldFJlc291cmNlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEZvciBjb21wYXRpYmlsaXR5IG9mIG9sZCBzdWJ0eXBlIHJlc291cmNlcywgcmV0dXJucyB0aGUgc3VwZXIKLQkgKiBpbXBsZW1lbnRhdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJpbUdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudHMoKSB7Ci0JCXdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCk7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplQ29udGVudHMoKTsKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRzKCkgewotCQljb250ZW50cyA9IG5ldyBSZXNvdXJjZUltcGwuQ29udGVudHNFTGlzdCgpIHsKLQkJCS8qKgotCQkJICogCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmVuZGVyZXIucHJlcGFyZVRvQWRkQ29udGVudHMoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkKG9iamVjdCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJCXJlbmRlcmVyLnByZXBhcmVUb0FkZENvbnRlbnRzKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwgJiYgcHVibGljSWQgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHB1YklkID0gcHVibGljSWQgPT0gbnVsbCA/IGdldERlZmF1bHRQdWJsaWNJZCgpIDogcHVibGljSWQ7Ci0JCVN0cmluZyBzeXNJZCA9IHN5c3RlbUlkID09IG51bGwgPyBnZXREZWZhdWx0U3lzdGVtSWQoKSA6IHN5c3RlbUlkOwotCQlzZXREb2N0eXBlVmFsdWVzKHB1YklkLCBzeXNJZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2luaXQoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBudWxsIGJ5IGRlZmF1bHQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNjcmVhdGVFbnRpdHlSZXNvbHZlcigpCi0JICovCi0JcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRQdWJsaWNJZCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gdmVyc2lvbklEOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklEKGludCBpKSB7Ci0JCXZlcnNpb25JRCA9IGk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSN1c2VzRFREKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1c2VzRFREKCkgewotCQlyZXR1cm4gZ2V0UHVibGljSWQoKSAhPSBudWxsICYmIGdldFN5c3RlbUlkKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIG5vdGlmeSB3aGVuIHRoZSBJRCBnZXRzIHNldDsgbmVlZCB0aGlzIHRvIHB1c2ggaXQgaW50bwotCSAqIHRoZSByZXNvdXJjZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSNzZXRJRChFT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0SUQoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJU3RyaW5nIG9sZElkID0gZ2V0SUQoZU9iamVjdCk7Ci0JCXN1cGVyLnNldElEKGVPYmplY3QsIGlkKTsKLQkJZU9iamVjdC5lTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqZWN0LCBOb3RpZmljYXRpb24uU0VULCBJRF9GRUFUVVJFLCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGV4dGVudCBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogcmVzb3VyY2UgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgbG9hZGVkIG9yIHNhdmVkLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc01vZGlmaWVkKCkgfHwgcmVuZGVyZXIuaXNNb2RpZmllZCgpOwotCX0KLQotCS8qCi0JICogT3ZlcnJpZGVuIHRvIGdpdmUgdGhlIHJlbmRlcmVyIGEgaG9vawotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2FjY2Vzc0ZvcldyaXRlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JXcml0ZSgpIHsKLQkJcmVuZGVyZXIuYWNjZXNzRm9yV3JpdGUoKTsKLQkJc3VwZXIuYWNjZXNzRm9yV3JpdGUoKTsKLQl9Ci0KLQkvKgotCSAqIE92ZXJyaWRlbiB0byBnaXZlIHRoZSByZW5kZXJlciBhIGhvb2sKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JSZWFkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JSZWFkKCkgewotCQlyZW5kZXJlci5hY2Nlc3NGb3JSZWFkKCk7Ci0JCXN1cGVyLmFjY2Vzc0ZvclJlYWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCXJlbmRlcmVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCQlzdXBlci5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgewotCQlyZW5kZXJlci5yZWxlYXNlRnJvbVdyaXRlKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tV3JpdGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbCNwcmVEZWxldGUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByZURlbGV0ZSgpIHsKLQkJc3VwZXIucHJlRGVsZXRlKCk7Ci0JCXJlbmRlcmVyLnByZURlbGV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gc3VwZXIuaXNTaGFyZWQoKSB8fCByZW5kZXJlci5pc1NoYXJlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NoYXJlZEZvcldyaXRlKCkgfHwgcmVuZGVyZXIuaXNTaGFyZWRGb3JXcml0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQkJaWYgKGlzTG9hZGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlpZiAocmVuZGVyZXIudXNlU3RyZWFtc0ZvcklPKCkpIHsKLQkJCQlzdXBlci5sb2FkKG9wdGlvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAoIWlzTG9hZGVkKCkpIHsKLQkJCQlpc1NoYXJlZCgpOwotCQkJCWxvYWRFeGlzdGluZyhvcHRpb25zKTsKLQkJCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkgICAgQWRhcHRlcltdIGVBZGFwdGVycyA9IGVCYXNpY0FkYXB0ZXJBcnJheSgpOwotCSAgICBpZiAoZUFkYXB0ZXJzICE9IG51bGwgJiYgZURlbGl2ZXIoKSkKLQkgICAgewotCSAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gZUFkYXB0ZXJzLmxlbmd0aDsgaSA8IHNpemU7ICsraSkKLQkgICAgICB7Ci0JICAgICAgCUFkYXB0ZXIgdGVtcDsKLQkgICAgCSAgaWYgKCh0ZW1wID0gZUFkYXB0ZXJzW2ldKSAhPSBudWxsKQotCSAgICAJCSAgdGVtcC5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9VbnN1cHBvcnRlZEZlYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Vuc3VwcG9ydGVkRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQyNDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Vuc3VwcG9ydGVkRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTMsIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUF0dHJpYnV0ZUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICovCi1wdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRGZWF0dXJlIGV4dGVuZHMgRUF0dHJpYnV0ZUltcGwgewotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBjYXB0dXJlIGZlYXR1cmVzIHRoYXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbnN1cHBvcnRlZChFQ2xhc3MgYW5FQ2xhc3MsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCi0JCWlmIChmZWF0dXJlTmFtZS5lcXVhbHMoImlzWmVyb1BhcmFtcyIpICYmIGFuRUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoIk1ldGhvZEVsZW1lbnQiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBVbnN1cHBvcnRlZEZlYXR1cmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1ZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1ZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0ZWVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgewotCS8qKiBSZXR1cm5zIHdoZXRoZXIgYSBUcmFuc2xhdG9yIHNob3VsZCBiZSBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gRE9NIG5hbWUgKi8KLQlib29sZWFuIGFjY2VwdHMoU3RyaW5nIGRvbU5hbWUpOwotCi0JLyoqIFJldHVybnMgd2hldGhlciBhIFRyYW5zbGF0b3Igc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBmZWF0dXJlICovCi0JYm9vbGVhbiBhY2NlcHRzKE5vdGlmaWNhdGlvbiBub3RpZik7Ci0KLQlUcmFuc2xhdG9yIGNyZWF0ZShOb3RpZmljYXRpb24gbm90aWYpOwotCi0JLyoqIENyZWF0ZXMgYSBuZXcgVHJhbnNsYXRvciBmb3IgdGhlIERPTSBuYW1lICovCi0JVHJhbnNsYXRvciBjcmVhdGUoU3RyaW5nIGRvbU5hbWUpOwotCi0JLyoqIENyZWF0ZXMgdmFyaWFibGUgdHJhbnNsYXRvcnMgZm9yIGFuIEVNRiBvYmplY3QgdG8gYmUgcmVuZGVyZWQgKi8KLQlMaXN0IGNyZWF0ZShOb3RpZmllciB0YXJnZXQpOwotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9YTUxFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvWE1MRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiN2YzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9YTUxFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMjAsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFbmNvZGVyRGVjb2RlciB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFhNTEVuY29kZXJEZWNvZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIElkZW50aWZpZXMgdGhlIGxhc3QgcHJpbnRhYmxlIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZSByYW5nZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUKLQkgKiBlbmNvZGluZyB1c2VkIHdpdGggdGhpcyBzZXJpYWxpemVyLiBGb3IgOC1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSBlaXRoZXIgMHg3RSBvciAweEZGLiBGb3IKLQkgKiAxNi1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSAweEZGRkYuIENoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHByaW50YWJsZSB3aWxsIGJlIGVzY2FwZWQgdXNpbmcKLQkgKiBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIGludCBfbGFzdFByaW50YWJsZSA9IDB4RkZGRTsKLQotCXByb3RlY3RlZCBzdGF0aWMgWE1MRW5jb2RlckRlY29kZXIgX3NpbmdsZXRvbjsKLQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCS8vIE5PVF9JTVBMRU1FTlRFRAotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0KLQkvKioKLQkgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIGl0IG1heSBiZSBwcmludGVkIGFzIHRleHQgY29udGVudCBvciBhdHRyaWJ1dGUgdmFsdWUuIE5vbiBwcmludGFibGUKLQkgKiBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLiBXaGVyZSB0aGUgZm9ybWF0IHNwZWNpZmllcyBhIGRlYXVsdCBlbnRpdHkKLQkgKiByZWZlcmVuY2UsIHRoYXQgcmVmZXJlbmNlIGlzIHVzZWQgKGUuZy4gPHR0PiZhbXA7bHQ7PC90dD4pLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gZXNjYXBlCi0JICovCi0JcHVibGljIGNoYXJbXSBlbmNvZGUoY2hhcltdIHZhbHVlKSB7Ci0JCWJvb2xlYW4gdW5tb2RpZmllZCA9IHRydWU7Ci0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5sZW5ndGgpOwotCQlTdHJpbmcgY2hhclJlZiA9IG51bGw7Ci0JCWNoYXIgY2g7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHsKLQkJCWNoID0gdmFsdWVbaV07Ci0JCQkvLyBJZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGVudGl0eSByZWZlcmVuY2UgZm9yIHRoaXMKLQkJCS8vIGNoYXJhY3RlciwgcHJpbnQgaXQuIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBlbnRpdHkKLQkJCS8vIHJlZmVyZW5jZXMgaXMgYWxtb3N0IGJ1dCBub3QgaWRlbnRpY2FsIGJldHdlZW4KLQkJCS8vIFhNTCBhbmQgSFRNTC4KLQkJCWNoYXJSZWYgPSBnZXRFbnRpdHlSZWYoY2gpOwotCQkJaWYgKGNoYXJSZWYgIT0gbnVsbCkgewotCQkJCXNidWYuYXBwZW5kKCcmJyk7Ci0JCQkJc2J1Zi5hcHBlbmQoY2hhclJlZik7Ci0JCQkJc2J1Zi5hcHBlbmQoJzsnKTsKLQkJCQl1bm1vZGlmaWVkID0gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKChjaCA+PSAnICcgJiYgY2ggPD0gX2xhc3RQcmludGFibGUgJiYgY2ggIT0gMHhGNykgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpIHsKLQkJCQkvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBwcmludGFibGUsIHByaW50IGFzIGNoYXJhY3RlcgotCQkJCS8vIHJlZmVyZW5jZS4KLQkJCQkvLyBOb24gcHJpbnRhYmxlcyBhcmUgYmVsb3cgQVNDSUkgc3BhY2UgYnV0IG5vdCB0YWIgb3IgbGluZQotCQkJCS8vIHRlcm1pbmF0b3IsIEFTQ0lJIGRlbGV0ZSwgb3IgYWJvdmUgYSBjZXJ0YWluIFVuaWNvZGUKLQkJCQkvLyB0aHJlc2hvbGQuCi0JCQkJc2J1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzYnVmLmFwcGVuZCgiJiMiKTsvLyROT04tTkxTLTEkCi0JCQkJc2J1Zi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjaCkpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQkJdW5tb2RpZmllZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh1bm1vZGlmaWVkKQotCQkJcmV0dXJuIHZhbHVlOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc2J1Zi5sZW5ndGgoKV07Ci0JCXNidWYuZ2V0Q2hhcnMoMCwgc2J1Zi5sZW5ndGgoKSwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIGl0IG1heSBiZSBwcmludGVkIGFzIHRleHQgY29udGVudCBvciBhdHRyaWJ1dGUgdmFsdWUuIE5vbiBwcmludGFibGUKLQkgKiBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLiBXaGVyZSB0aGUgZm9ybWF0IHNwZWNpZmllcyBhIGRlYXVsdCBlbnRpdHkKLQkgKiByZWZlcmVuY2UsIHRoYXQgcmVmZXJlbmNlIGlzIHVzZWQgKGUuZy4gPHR0PiZhbXA7bHQ7PC90dD4pLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gZXNjYXBlCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBjaGFyUmVmID0gbnVsbDsKLQkJY2hhciBjaDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgKytpKSB7Ci0JCQljaCA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCS8vIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcwotCQkJLy8gY2hhcmFjdGVyLCBwcmludCBpdC4gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGVudGl0eQotCQkJLy8gcmVmZXJlbmNlcyBpcyBhbG1vc3QgYnV0IG5vdCBpZGVudGljYWwgYmV0d2VlbgotCQkJLy8gWE1MIGFuZCBIVE1MLgotCQkJY2hhclJlZiA9IGdldEVudGl0eVJlZihjaCk7Ci0JCQlpZiAoY2hhclJlZiAhPSBudWxsKSB7Ci0JCQkJc2J1Zi5hcHBlbmQoJyYnKTsKLQkJCQlzYnVmLmFwcGVuZChjaGFyUmVmKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJfSBlbHNlIGlmICgoY2ggPj0gJyAnICYmIGNoIDw9IF9sYXN0UHJpbnRhYmxlICYmIGNoICE9IDB4RjcpIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKSB7Ci0JCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBub3QgcHJpbnRhYmxlLCBwcmludCBhcyBjaGFyYWN0ZXIKLQkJCQkvLyByZWZlcmVuY2UuCi0JCQkJLy8gTm9uIHByaW50YWJsZXMgYXJlIGJlbG93IEFTQ0lJIHNwYWNlIGJ1dCBub3QgdGFiIG9yIGxpbmUKLQkJCQkvLyB0ZXJtaW5hdG9yLCBBU0NJSSBkZWxldGUsIG9yIGFib3ZlIGEgY2VydGFpbiBVbmljb2RlCi0JCQkJLy8gdGhyZXNob2xkLgotCQkJCXNidWYuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2J1Zi5hcHBlbmQoIiYjIik7Ly8kTk9OLU5MUy0xJAotCQkJCXNidWYuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoY2gpKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAoX3NpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlfc2luZ2xldG9uID0gbmV3IFhNTEVuY29kZXJEZWNvZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9zaW5nbGV0b24uZW5jb2RlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzIGNoYXJhY3RlciB2YWx1ZSwgb3IgbnVsbCBpZiBubyBzdWNoIGVudGl0eQotCSAqIGV4aXN0cy4gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIDx0dD4nJmFtcDsnPC90dD4gd2lsbCByZXR1cm4gPHR0PiImYW1wO2FtcDsiPC90dD4uCi0JICogCi0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICBDaGFyYWN0ZXIgdmFsdWUKLQkgKiBAcmV0dXJuIENoYXJhY3RlciBlbnRpdHkgbmFtZSwgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW50aXR5UmVmKGNoYXIgY2gpIHsKLQkJLy8gRW5jb2RlIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMgaW50byB0aGUgZXF1aXZhbGVudCBjaGFyYWN0ZXIKLQkJLy8gcmVmZXJlbmNlcy4KLQkJLy8gVGhlc2UgZml2ZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhbGwgWE1MIGRvY3VtZW50cy4KLQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCcgOgotCQkJCXJldHVybiAibHQiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJz4nIDoKLQkJCQlyZXR1cm4gImd0IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICciJyA6Ci0JCQkJcmV0dXJuICJxdW90IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICdcJycgOgotCQkJCXJldHVybiAiYXBvcyI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnJicgOgotCQkJCXJldHVybiAiYW1wIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmU1NTliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgewotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkOTE3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5VXRpbCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWRhcHRlckZhY3RvcnlVdGlsLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkYXB0TmV3KE5vdGlmaWVyIG5ld09iamVjdCwgTGlzdCBmYWN0b3JpZXMpIHsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWZhY3QgPSAoQWRhcHRlckZhY3RvcnkpIGZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlmYWN0LmFkYXB0TmV3KG5ld09iamVjdCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQWRhcHRlckZhY3RvcmllcyhMaXN0IGRlc2NyaXB0b3JzLCBMaXN0IGZhY3RvcmllcykgewotCQlBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYzsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoaSk7Ci0JCQlhZGFwdGVyRmFjdCA9IGRlc2MuY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdCAhPSBudWxsKQotCQkJCWZhY3Rvcmllcy5hZGQoYWRhcHRlckZhY3QpOwotCQl9Ci0JCWRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXJyYXlVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXJyYXlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2I4OGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FycmF5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXJyYXlVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uY2F0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBudWxsOwotCQlpZiAoYXJyYXkxLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpID09IGFycmF5Mi5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSkKLQkJCWNvbXBvbmVudFR5cGUgPSBhcnJheTEuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWVsc2UKLQkJCWNvbXBvbmVudFR5cGUgPSBPYmplY3QuY2xhc3M7Ci0KLQkJcmV0dXJuIGNvbmNhdChhcnJheTEsIGFycmF5MiwgY29tcG9uZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIsIENsYXNzIGNvbXBvbmVudFR5cGUpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gKE9iamVjdFtdKSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBhcnJheTEubGVuZ3RoICsgYXJyYXkyLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MS5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdEFsbChqYXZhLnV0aWwuTGlzdCBhcnJheXMsIENsYXNzIGNvbXBvbmVudFR5cGUpIHsKLQkJaW50IHJlc3VsdExlbmd0aCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXN1bHRMZW5ndGggKz0gKChPYmplY3RbXSkgYXJyYXlzLmdldChpKSkubGVuZ3RoOwotCQl9Ci0JCU9iamVjdFtdIHJlc3VsdCA9IChPYmplY3RbXSkgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50VHlwZSwgcmVzdWx0TGVuZ3RoKTsKLQkJaW50IHBvcyA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IChPYmplY3RbXSkgYXJyYXlzLmdldChpKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgcG9zLCBhcnJheS5sZW5ndGgpOwotCQkJcG9zICs9IGFycmF5Lmxlbmd0aDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjM1YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbi5FY29yZVV0aWxpdGllc1BsdWdpbjsKLQotCi0KLS8qKgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzIGluIGNvZGUuIFRoZSBwcmVkaWNhdGUKLSAqIG1ldGhvZHMgYWxsIHRlc3QgYSBjb25kaXRpb24gYW5kIHRocm93IHNvbWUgdHlwZSBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QKLSAqIGhvbGQuCi0gKiA8cD4KLSAqIEFzc2VydGlvbiBmYWlsdXJlIGV4Y2VwdGlvbnMsIGxpa2UgbW9zdCBydW50aW1lIGV4Y2VwdGlvbnMsIGFyZSB0aHJvd24gd2hlbiBzb21ldGhpbmcgaXMKLSAqIG1pc2JlaGF2aW5nLiBBc3NlcnRpb24gZmFpbHVyZXMgYXJlIGludmFyaWFibHkgdW5zcGVjaWZpZWQgYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQKLSAqIG5ldmVyIHJlbHkgb24gdGhlc2UgYmVpbmcgdGhyb3duIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi0vLyBUaGlzIGNsYXNzIHdhcywgb3JpZ2luYWxseSwgY29waWVkIGRpcmVjdGx5IGZyb20gY29tLmlibS5pdHAuY29tbW9uLgotLy8gSXQgd2FzIGNvcGllZCB0byBvdXIgb3duIHBhY2thZ2UganVzdCB0byBtaW5pbWl6ZSBtaW5vciBkZXBlbmRlbmNpZXMKLS8vIG9uIG90aGVyIHBhY2thZ2VzIGFuZCBpbnRlcm5hbCBBUElzLgotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7Ci0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCi0JcHJpdmF0ZSBBc3NlcnQoKSB7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuCi0JICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gaXNMZWdhbChleHByZXNzaW9uLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbgotCSAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0Ci0JICogZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZAotCSAqIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlzTm90TnVsbChvYmplY3QsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kCi0JICogb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJudWxsX2FyZ3VtZW50OiAiICsgbWVzc2FnZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mCi0JICogdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gaXNUcnVlKGV4cHJlc3Npb24sICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mCi0JICogdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoImFzc2VydGlvbiBmYWlsZWQ6ICIgKyBtZXNzYWdlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGU0OTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb248L2NvZGU+IGlzIGEgcnVudGltZSBleGNlcHRpb24gdGhyb3duIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4KLSAqIDxjb2RlPkFzc2VydDwvY29kZT4uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IGRlY2xhcmVkIHB1YmxpYyB0byBwcmV2ZW50IHNvbWUgbWlzdXNlczsgcHJvZ3JhbXMgdGhhdCBjYXRjaCBvciBvdGhlcndpc2UKLSAqIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvIHVuZXhwZWN0ZWQgYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlCi0gKiBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLSAqIDwvcD4KLSAqLwotLy8gVGhpcyBjbGFzcyB3YXMsIG9yaWdpbmFsbHksIGNvcGllZCBkaXJlY3RseSBmcm9tIGNvbS5pYm0uaXRwLmNvbW1vbi4KLS8vIEl0IHdhcyBjb3BpZWQgdG8gb3VyIG93biBwYWNrYWdlIGp1c3QgdG8gbWluaW1pemUgbWlub3IgZGVwZW5kZW5jaWVzCi0vLyBvbiBvdGhlciBwYWNrYWdlcyBhbmQgaW50ZXJuYWwgQVBJcy4KLWNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM0MDgyODQwMDgzNDI2ODM2MjFMOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JICovCi0JcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQlzdXBlcihkZXRhaWwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzb2NpYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODVkMGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjE1IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbiB7Ci0JcHJvdGVjdGVkIE9iamVjdCBrZXk7Ci0JcHJvdGVjdGVkIE9iamVjdCB2YWx1ZTsKLQotCS8qKgotCSAqIEFzc29jaWF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKE9iamVjdCBhS2V5LCBPYmplY3QgYVZhbHVlKSB7Ci0JCXNldEtleShhS2V5KTsKLQkJc2V0VmFsdWUoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6NDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3S2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KGphdmEubGFuZy5PYmplY3QgbmV3S2V5KSB7Ci0JCWtleSA9IG5ld0tleTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6NDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgewotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Nsb25lYWJsZVB1YmxpYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Nsb25lYWJsZVB1YmxpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzM5ZmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9DbG9uZWFibGVQdWJsaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjIsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBleHBvc2VzIHRoZSBjbG9uZSBtZXRob2QsIGZvciBvYmplY3RzIHRoYXQgbmVlZCB0byBnZW5lcmljYWxseSBjb3B5IG90aGVyCi0gKiBjbG9uZWFibGUgb2JqZWN0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsb25lYWJsZVB1YmxpYyBleHRlbmRzIENsb25lYWJsZSwgQWRhcHRlci5JbnRlcm5hbCB7Ci0JT2JqZWN0IGNsb25lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db21tYW5kQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvbW1hbmRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2I4ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvbW1hbmRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI3LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgSm9obiBNb3VycmEKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRDb250ZXh0IGltcGxlbWVudHMgSUNvbW1hbmRDb250ZXh0IHsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgTWFwIHByb3BlcnRpZXM7Ci0JcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIENvbW1hbmRDb250ZXh0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aGlzKG1vbml0b3IsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzCi0JICogQHBhcmFtIHJlc291cmNlU2V0Ci0JICovCi0JcHVibGljIENvbW1hbmRDb250ZXh0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWFwIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQl0aGlzLnByb3BlcnRpZXMgPSBjb25maWd1cmF0aW9uUHJvcGVydGllczsKLQkJdGhpcy5yZXNvdXJjZVNldCA9IHJlc291cmNlU2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5jb21tYW5kLmZyYW1ld29yay5JQ29tbWFuZENvbnRleHQjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLndzLnJkLmNvbW1hbmQuZnJhbWV3b3JrLklDb21tYW5kQ29udGV4dCNnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpCi0JICovCi0JcHVibGljIE1hcCBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpIHsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuY29tbWFuZC5mcmFtZXdvcmsuSUNvbW1hbmRDb250ZXh0I2dldFJlc291cmNlU2V0KCkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKQotCQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29weUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29weUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMzkyOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvcHlHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY29weSBhIGdyb3VwIG9mIFJlZk9iamVjdHMgYW5kL29yIFJlc291cmNlcy4gVGhpcyBncm91cCB3aWxsIGVuc3VyZSB0aGF0Ci0gKiBhbGwgbm9uLWNvbXBvc2l0ZSByZWxhdGlvbnNoaXBzIGFyZSBkZWZlcnJlZCB1bnRpbCBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIGFyZSBjb3BpZWQuIFRoaXMKLSAqIGFsbG93cyB5b3UgdG8gbWFrZSBjb3BpZXMgb2YgYSBncm91cCBvZiBvYmplY3RzIHRoYXQgbWF5IGhhdmUgbm9uLWNvbXBvc2l0ZSByZWxhdGlvbnNoaXBzIGFuZAotICogZW5zdXJlIHRoYXQgdGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgcG9pbnRpbmcgdG8gdGhlIGNvcGllZCBvYmplY3QgaWYgaXQgaXMgcGFydCBvZiB0aGUgZ3JvdXAKLSAqIChlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCBhIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCkuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjE6MTcgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvcHlHcm91cCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0SWRTdWZmaXg7Ci0JcHJvdGVjdGVkIFJlc291cmNlU2V0IGNvcHlDb250ZXh0OwotCXByb3RlY3RlZCBMaXN0IHJlc291cmNlczsKLQlwcm90ZWN0ZWQgTGlzdCByZWZPYmplY3RzOwotCXByb3RlY3RlZCBMaXN0IGNvcGllZFJlc291cmNlczsKLQlwcm90ZWN0ZWQgTGlzdCBjb3BpZWRSZWZPYmplY3RzOwotCXByb3RlY3RlZCBib29sZWFuIHByZXNlcnZlSWRzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb3B5R3JvdXAgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29weUdyb3VwKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCXJldHVybiBhZGQoYVJlZk9iamVjdCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlpZiAoYVJlZk9iamVjdCAhPSBudWxsICYmICFjb250YWluc1JlZk9iamVjdChhUmVmT2JqZWN0KSkgewotCQkJZ2V0UmVmT2JqZWN0cygpLmFkZChjcmVhdGVBc3NvY2lhdGlvbihhUmVmT2JqZWN0LCBpZFN1ZmZpeCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNzozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlhZGQoYVJlc291cmNlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjc6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJZ2V0UmVzb3VyY2VzKCkuYWRkKGNyZWF0ZUFzc29jaWF0aW9uKGFSZXNvdXJjZSwgbmV3VXJpKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvcGllZChFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJaWYgKGFSZWZPYmplY3QgIT0gbnVsbCkKLQkJCWdldENvcGllZFJlZk9iamVjdHMoKS5hZGQoYVJlZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb3BpZWQoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJZ2V0Q29waWVkUmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCQlpZiAoZ2V0Q29weUNvbnRleHQoKSAhPSBudWxsKQotCQkJCWdldENvcHlDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWlucyhMaXN0IGFzc29jaWF0aW9ucywgT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmIChhbk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgc2l6ZSA9IGFzc29jaWF0aW9ucy5zaXplKCk7Ci0JCUFzc29jaWF0aW9uIGFzc29jOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJYXNzb2MgPSAoQXNzb2NpYXRpb24pIGFzc29jaWF0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoYXNzb2MuZ2V0S2V5KCkgPT0gYW5PYmplY3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmCi0JICogCi0JICogQGFSZWZPYmplY3QgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBncm91cC4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1JlZk9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGdldFJlZk9iamVjdHMoKSwgYVJlZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYKLQkgKiAKLQkgKiBAYVJlc291cmNlIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgZ3JvdXAuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGdldFJlc291cmNlcygpLCBhUmVzb3VyY2UpOwotCX0KLQotCXByaXZhdGUgQXNzb2NpYXRpb24gY3JlYXRlQXNzb2NpYXRpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgQXNzb2NpYXRpb24oa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgUmVmT2JqZWN0cyB0aGF0IHdlcmUgY29waWVkLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q29waWVkUmVmT2JqZWN0cygpIHsKLQkJaWYgKGNvcGllZFJlZk9iamVjdHMgPT0gbnVsbCkKLQkJCWNvcGllZFJlZk9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBjb3BpZWRSZWZPYmplY3RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBMaXN0IG9mIFJlc291cmNlcyB0aGF0IHdlcmUgY29waWVkLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q29waWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29waWVkUmVzb3VyY2VzID09IG51bGwpCi0JCQljb3BpZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBjb3BpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnRleHQgdG8gYWRkIGFsbCBjb3BpZWQgcmVzb3VyY2VzIGludG8uIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDg6MDk6NDUgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0IGdldENvcHlDb250ZXh0KCkgewotCQlyZXR1cm4gY29weUNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjQ0OjQzIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRJZFN1ZmZpeCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRJZFN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPyBEZWZhdWx0cyB0byBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFByZXNlcnZlSWRzKCkgewotCQlyZXR1cm4gcHJlc2VydmVJZHM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UmVmT2JqZWN0cygpIHsKLQkJaWYgKHJlZk9iamVjdHMgPT0gbnVsbCkKLQkJCXJlZk9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZWZPYmplY3RzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IHByaW1HZXRSZWZPYmplY3RzKCkgewotCQlyZXR1cm4gcmVmT2JqZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBwcmltR2V0UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCWlmIChhUmVmT2JqZWN0ICE9IG51bGwgJiYgcHJpbUdldFJlZk9iamVjdHMoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IHByaW1HZXRSZWZPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGFzc29jaWF0aW9uLmdldEtleSgpID09IGFSZWZPYmplY3QpCi0JCQkJCXJldHVybiBwcmltR2V0UmVmT2JqZWN0cygpLnJlbW92ZShhc3NvY2lhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNzozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgcHJpbUdldFJlc291cmNlcygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gcHJpbUdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0JCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbiA9IChBc3NvY2lhdGlvbikgaXQubmV4dCgpOwotCQkJCWlmIChhc3NvY2lhdGlvbi5nZXRLZXkoKSA9PSBhUmVzb3VyY2UpCi0JCQkJCXJldHVybiBwcmltR2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFzc29jaWF0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjb250ZXh0IHRvIGFkZCBhbGwgY29waWVkIHJlc291cmNlcyBpbnRvLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA4OjA5OjQ1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdDb3B5Q29udGV4dAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLkNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5Q29udGV4dChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQgbmV3Q29weUNvbnRleHQpIHsKLQkJY29weUNvbnRleHQgPSBuZXdDb3B5Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBhbiBJRCBzdWZmaXggaXMgbm90IGRlZmluZWQgZm9yIGEgRU9iamVjdCB0aGF0IGlzIHRvIGJlIGNvcGllZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQuCi0JICogQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMTo0NDo0MyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGVmYXVsdElkU3VmZml4Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdElkU3VmZml4KGphdmEubGFuZy5TdHJpbmcgbmV3RGVmYXVsdElkU3VmZml4KSB7Ci0JCWRlZmF1bHRJZFN1ZmZpeCA9IG5ld0RlZmF1bHRJZFN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlSWRzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlc2VydmVJZHMgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IHJlcXVpcmUgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGFmdGVyIHRoZSBncm91cAotCSAqIGhhcyBiZWVuIGNvcGllZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29weVV0aWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0Q29weShFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbCkgewotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NTG9hZE9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01Mb2FkT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWFlOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01Mb2FkT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRE9NTG9hZE9wdGlvbnMgewotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlOwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93SmF2YUVuY29kaW5nczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXM7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbG93SmF2YUVuY29kaW5ncygpIHsKLQkJcmV0dXJuIGFsbG93SmF2YUVuY29kaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZEVudGl0eVJlZmVyZXJlbmNlcygpIHsKLQkJcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlKCkgewotCQlyZXR1cm4gdmFsaWRhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWxsb3dKYXZhRW5jb2RpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBhbGxvd0phdmFFbmNvZGluZ3MKLQkgKiAgICAgICAgICAgIFRoZSBhbGxvd0phdmFFbmNvZGluZ3MgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dKYXZhRW5jb2RpbmdzKGJvb2xlYW4gYWxsb3dKYXZhRW5jb2RpbmdzKSB7Ci0JCXRoaXMuYWxsb3dKYXZhRW5jb2RpbmdzID0gYWxsb3dKYXZhRW5jb2RpbmdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzCi0JICogICAgICAgICAgICBUaGUgZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyhib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcykgewotCQl0aGlzLmV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyA9IGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWxpZGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsaWRhdGUKLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZShib29sZWFuIHZhbGlkYXRlKSB7Ci0JCXRoaXMudmFsaWRhdGUgPSB2YWxpZGF0ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDIyNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTVV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY2xhc3MgY29udGFpbmluZyBjb21tb24gZG9tIG1hbmlwdWxhdGlvbiBhbmQgc2VhcmNoIGZ1bmN0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIERPTVV0aWxpdGllcyB7Ci0JLy8gSGFuZHkgQ29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UX1NUUklORyA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FX1NUUklORyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCS8vSGFjayB0byBiZSByZW1vdmVkIHdoZW4gdGhlIERPTSBhcGlzIGNoYW5nZSBzdWNoIHRoYXQgdGhlcmUgaXMgYW4gZWFzaWVyCi0JLy93YXkgdG8gZmx1ZmYgdXAgYW5kIHNldCB0aGUgZG9jdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9FTlRJVFlfU1RSSU5HID0gImR1bW15IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9FTlRJVFlfTk9ERV9TVFJJTkcgPSAiPGR1bW15Lz4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGRlZmF1bHREb2N1bWVudEJ1aWxkZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZGVmYXVsdEVudGl0eVJlc29sdmVyOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIHN1YiBub2RlcyBvZiBhIHBhdGguCi0JICovCi0Jc3RhdGljIHB1YmxpYyBJdGVyYXRvciBjcmVhdGVQYXRoSXRlcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHRQYXRoID0gcGF0aC5zdGFydHNXaXRoKCIvIikgPyBwYXRoLnN1YnN0cmluZygxKSA6IHBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRQYXRoLmxlbmd0aCgpID09IDApCi0JCQl0UGF0aCA9IG51bGw7Ci0JCWZpbmFsIFN0cmluZyBhUGF0aCA9IHRQYXRoOwotCi0JCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQlpbnQgcHJldkluZGV4ID0gMDsKLQkJCWludCBjdXJJbmRleCA9IDA7Ci0JCQlTdHJpbmcgcGF0aFN0cmluZyA9IGFQYXRoOwotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCXJldHVybiBwYXRoU3RyaW5nICE9IG51bGwgJiYgcHJldkluZGV4ICE9IC0xOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJY3VySW5kZXggPSBwYXRoU3RyaW5nLmluZGV4T2YoJy8nLCBwcmV2SW5kZXgpOwotCQkJCVN0cmluZyBub2RlU3RyaW5nID0gbnVsbDsKLQkJCQlpZiAoY3VySW5kZXggIT0gLTEpCi0JCQkJCW5vZGVTdHJpbmcgPSBwYXRoU3RyaW5nLnN1YnN0cmluZyhwcmV2SW5kZXgsIGN1ckluZGV4KyspOwotCQkJCWVsc2UKLQkJCQkJbm9kZVN0cmluZyA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKHByZXZJbmRleCk7Ci0JCQkJcHJldkluZGV4ID0gY3VySW5kZXg7Ci0JCQkJcmV0dXJuIG5vZGVTdHJpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRleHQgZm9yIHRoZSBwYXNzZWQgaW4gbm9kZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDaGlsZFRleHQoTm9kZSBub2RlKSB7Ci0JCVRleHQgdGV4dE5vZGUgPSBnZXRDaGlsZFRleHROb2RlKG5vZGUpOwotCQlpZiAodGV4dE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiB0ZXh0Tm9kZS5nZXREYXRhKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGV4dCBmb3IgdGhlIHBhc3NlZCBpbiBub2RlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgVGV4dCBnZXRDaGlsZFRleHROb2RlKE5vZGUgbm9kZSkgewotCQlOb2RlIHRleHROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlICh0ZXh0Tm9kZSAhPSBudWxsICYmIERPTVV0aWxpdGllcy5pc1RleHROb2RlKHRleHROb2RlKSkgewotCQkJaWYgKCFpc1doaXRlc3BhY2UodGV4dE5vZGUpKQotCQkJCXJldHVybiAoVGV4dCkgdGV4dE5vZGU7Ci0JCQl0ZXh0Tm9kZSA9IHRleHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBvZiB0aGUgbm9kZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCVJldmlzaXQudG9EbygpOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhc3Qgbm9uLXRleHQgY2hpbGQgb2YgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgbGFzdCBub24tdGV4dCBjaGlsZCBub2RlIG9mCi0JICogQG5vZGUuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZ2V0TGFzdE5vZGVDaGlsZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlIGNoaWxkID0gbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCWNoaWxkID0gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5leHQgbm9uLXRleHQgc2libGluZyBhZnRlciBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCBub24tdGV4dCBzaWJsaW5nIG5vZGUgYWZ0ZXIKLQkgKiBAbm9kZS4gSWYgdGhlcmUgaXMgbm8gbmV4dCBub24tdGV4dCBzaWJsaW5nLCBudWxsIGlzIHJldHVybmVkLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGdldE5leHROb2RlU2libGluZyhOb2RlIG5vZGUpIHsKLQkJTm9kZSBzaWJsaW5nID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCXJldHVybiBzaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgY2hpbGQgTm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgTm9kZSBnZXROb2RlQ2hpbGQoTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJTm9kZSBjaGlsZCA9IG51bGw7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbi5nZXROb2RlTmFtZSgpLmVxdWFscyhub2RlTmFtZSkpIHsKLQkJCQljaGlsZCA9IG47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIFRyYXZlcnNlcyB0aGUgcGF0aCBwYXNzZWQgaW4gPHBhdGhOYW1lPi4gVGhlIHBhdGggaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm0KLQkgKiAnbm9kZTEvbm9kZTIvbm9kZTMnLiBUaGlzIG1ldGhvZCBzdGFydHMgYXQgbm9kZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIE5vZGUgZ2V0Tm9kZUNoaWxkRm9yUGF0aChOb2RlIHBhcmVudCwgU3RyaW5nIHBhdGhOYW1lKSB7Ci0KLQkJTm9kZSBjdXJOb2RlID0gcGFyZW50OwotCQlJdGVyYXRvciBpID0gRE9NVXRpbGl0aWVzLmNyZWF0ZVBhdGhJdGVyYXRvcihwYXRoTmFtZSk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGNoaWxkID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQljdXJOb2RlID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChjdXJOb2RlLCBjaGlsZCk7Ci0JCQlpZiAoY3VyTm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBjdXJOb2RlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgTm9kZSBjaGlsZHJlbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXMKLQkgKi8KLQlzdGF0aWMgcHVibGljIExpc3QgZ2V0Tm9kZUNoaWxkcmVuKE5vZGUgbm9kZSwgU3RyaW5nW10gbm9kZU5hbWVzKSB7Ci0JCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBub2RlTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG5vZGVOYW1lc1tqXS5lcXVhbHMobi5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGZvdW5kKQotCQkJCQlyZXN1bHRzLmFkZChuKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIE5vZGUgY2hpbGRyZW4gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKi8KLQlzdGF0aWMgcHVibGljIExpc3QgZ2V0Tm9kZUNoaWxkcmVuKE5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbi5nZXROb2RlTmFtZSgpLmVxdWFscyhub2RlTmFtZSkpCi0JCQkJcmVzdWx0cy5hZGQobik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaXJzdCBub24tdGV4dCBzaWJsaW5nIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCBub24tdGV4dCBzaWJsaW5nIG5vZGUgYmVmb3JlCi0JICogQG5vZGUuIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIG5vbi10ZXh0IHNpYmxpbmcsIG51bGwgaXMgcmV0dXJuZWQuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZ2V0UHJldmlvdXNOb2RlU2libGluZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlIHNpYmxpbmcgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIERPTVV0aWxpdGllcy5pc1RleHROb2RlKHNpYmxpbmcpKQotCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCXJldHVybiBzaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgdGV4dCBub2RlIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCB0ZXh0IG5vZGUgYmVmb3JlCi0JICogQG5vZGUuIE51bGwgaWYgbm8gc3VjaCBub2RlIGV4aXN0LgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGdldFByZXZpb3VzVGV4dChOb2RlIG5vZGUpIHsKLQkJVGV4dCBzaWJsaW5nID0gZ2V0UHJldmlvdXNUZXh0U2libGluZyhub2RlKTsKLQotCQlpZiAoc2libGluZyA9PSBudWxsICYmIG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpCi0JCQlzaWJsaW5nID0gZ2V0UHJldmlvdXNUZXh0KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQotCQlyZXR1cm4gc2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IHRleHQgc2libGluZyBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3QgdGV4dCBzaWJsaW5nIG5vZGUgYmVmb3JlCi0JICogQG5vZGUuIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIHRleHQgc2libGluZywgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBnZXRQcmV2aW91c1RleHRTaWJsaW5nKE5vZGUgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCU5vZGUgc2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCU5vZGUgbGFzdFRleHQgPSBudWxsOwotCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJbGFzdFRleHQgPSBzaWJsaW5nOwotCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIChUZXh0KSBsYXN0VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IHRleHQgc2libGluZyBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3QgdGV4dCBzaWJsaW5nIG5vZGUgYmVmb3JlCi0JICogQG5vZGUuIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIHRleHQgc2libGluZywgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyYWlsaW5nV2hpdGVzcGFjZShUZXh0IG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0RGF0YSgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IGkgPSB0ZXh0Lmxlbmd0aCgpIC0gMTsKLQkJZm9yICg7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dC5jaGFyQXQoaSkpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoKytpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIDxuZXdOb2RlPmludG8gPHBhcmVudD5hZnRlciA8cmVmTm9kZT4uIElmIDxyZWZOb2RlPmlzIG51bGwgdGhlbiB0aGUgbm9kZSBpcyBpbnNlcnRlZAotCSAqIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcmVudCdzIGNoaWxkIG5vZGVzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydEFmdGVyTm9kZShOb2RlIHBhcmVudCwgTm9kZSBuZXdOb2RlLCBOb2RlIHJlZk5vZGUpIHsKLQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gbnVsbDsKLQkJaWYgKHJlZk5vZGUgIT0gbnVsbCkgewotCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IHJlZk5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG5ld05vZGUsIHBhcmVudC5nZXRGaXJzdENoaWxkKCkpOwotCQllbHNlCi0JCQlpbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbmV3Tm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGEgPG5ld05vZGU+aW50byA8cGFyZW50PmJlZm9yZSA8cmVmTm9kZT4uIFRoaXMgdXRpbGl0eSBtZXRob2QgaXMgdXNlZCB0byBlbnN1cmUgdGhhdAotCSAqIHRoZSBpbnNlcnRpb24gZG9lcyBub3QgcmVzdWx0IGluIHR3byBhZGphY2VudCB0ZXh0IG5vZGVzLiBUaGUgRE9NIG1vZGVsIGRvZXMgbm90IGhhbmRsZQotCSAqIGFkamFjZW50IHRleHQgbm9kZXMuIFRoZXkgbXVzdCBiZSBqb2luZWQgdG9nZXRoZXIuCi0JICogCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGluc2VydEJlZm9yZU5vZGUoTm9kZSBwYXJlbnQsIE5vZGUgbmV3Tm9kZSwgTm9kZSByZWZOb2RlKSB7Ci0JCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHQgdGV4dE5ld05vZGUgPSAoVGV4dCkgbmV3Tm9kZTsKLQotCQkJLy8gSWYgdGhlIGluc2VydCBiZWZvcmUgbm9kZSBpcyB0ZXh0LCBqb2luIGl0IHdpdGggdGhlIG5ldyBub2RlLgotCQkJaWYgKHJlZk5vZGUgIT0gbnVsbCAmJiByZWZOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlUZXh0IHRleHRSZWZOb2RlID0gKFRleHQpIHJlZk5vZGU7Ci0JCQkJdGV4dFJlZk5vZGUuc2V0RGF0YSh0ZXh0TmV3Tm9kZS5nZXREYXRhKCkgKyB0ZXh0UmVmTm9kZS5nZXREYXRhKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIElmIHRoZSBub2RlIHdlIGFyZSBpbnNlcnRpbmcgYWZ0ZXIgaXMgdGV4dCwKLQkJCS8vIGpvaW4gaXQgd2l0aCB0aGUgbmV3IG5vZGUuCi0JCQlOb2RlIGluc2VydEFmdGVyTm9kZSA9IChyZWZOb2RlID09IG51bGwpID8gcGFyZW50LmdldExhc3RDaGlsZCgpIDogcmVmTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmIChpbnNlcnRBZnRlck5vZGUgIT0gbnVsbCAmJiBpbnNlcnRBZnRlck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVRleHQgdGV4dEluc2VydEFmdGVyTm9kZSA9IChUZXh0KSBpbnNlcnRBZnRlck5vZGU7Ci0JCQkJdGV4dEluc2VydEFmdGVyTm9kZS5zZXREYXRhKHRleHRJbnNlcnRBZnRlck5vZGUuZ2V0RGF0YSgpICsgdGV4dE5ld05vZGUuZ2V0RGF0YSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gVGhlcmUgaXMgbm8gdGV4dCBub2RlIHRvIGpvaW4gdG8sIHNpbXBsZSBpbnNlcnQgdGhlIG5vZGUuCi0JCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGEgPG5ld05vZGU+aW50byA8cGFyZW50PmJlZm9yZSA8cmVmTm9kZT4uIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBpbnNlcnQgdGhlIG5vZGUgYmVmb3JlCi0JICogYW55IHdoaXRlc3BhY2Ugbm9kZXMgdGhhdCBhcHBlYXIgaW4gdGhlIHRyZWUgYmVmb3JlIDxyZWZOb2RlPi4gVGhpcyBtZXRob2Qgd2lsbCBhbHNvIGVuc3VyZQotCSAqIHRoYXQgdGhlIGluc2VydGlvbiBkb2VzIG5vdCByZXN1bHQgaW4gdHdvIGFkamFjZW50IHRleHQgbm9kZXMuIFRoZSBET00gbW9kZWwgZG9lcyBub3QgaGFuZGxlCi0JICogYWRqYWNlbnQgdGV4dCBub2Rlcy4gVGhleSBtdXN0IGJlIGpvaW5lZCB0b2dldGhlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZk5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UoTm9kZSBwYXJlbnQsIE5vZGUgbmV3Tm9kZSwgTm9kZSByZWZOb2RlKSB7Ci0JCU5vZGUgY3VyTm9kZSA9IChyZWZOb2RlID09IG51bGwpID8gcGFyZW50LmdldExhc3RDaGlsZCgpIDogcmVmTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJTm9kZSBsYXN0Tm9kZSA9IHJlZk5vZGU7Ci0KLQkJd2hpbGUgKGN1ck5vZGUgIT0gbnVsbCAmJiAoRE9NVXRpbGl0aWVzLmlzV2hpdGVzcGFjZShjdXJOb2RlKSB8fCBET01VdGlsaXRpZXMuaXNDb21tZW50KGN1ck5vZGUpKSkgewotCQkJbGFzdE5vZGUgPSBjdXJOb2RlOwotCQkJY3VyTm9kZSA9IGN1ck5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQotCQlpbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbmV3Tm9kZSwgbGFzdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgdGV4dCBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIHRleHQgbm9kZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNoZWNrCi0JICovCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzVGV4dE5vZGUoTm9kZSBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0JCXJldHVybiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB8fCAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBpcyBlbnRpcmVseSBjb21tZW50IG9yIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gQW5zd2VyIHRydWUgaWYgdGhlIG5vZGUgaXMgd2hpdGVzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNoZWNrCi0JICovCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudChOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlyZXR1cm4gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGVudGlyZWx5IHdoaXRlcGFjZSBvciBub3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIEFuc3dlciB0cnVlIGlmIHRoZSBub2RlIGlzIHdoaXRlc3BhY2UsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjawotCSAqLwotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoTm9kZSBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlUZXh0IHRleHROb2RlID0gKFRleHQpIG5vZGU7Ci0JCVN0cmluZyB0ZXh0ID0gdGV4dE5vZGUuZ2V0RGF0YSgpOwotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dC5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIDxub2RlPgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCByZW1vdmVBbGxDaGlsZHJlbihOb2RlIG5vZGUpIHsKLQkJTm9kZUxpc3QgbGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJbm9kZS5yZW1vdmVDaGlsZChsaXN0Lml0ZW0oaSkpOwotCQl9Ci0JfQotCi0JLy8gdHJhdmVyc2VzIHRoZSBET00gc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBub2RlIGFuZCByZXR1cm5zIGEgbGlzdAotCS8vIG9mIG5vZGVzIG1hdGNoaW5nIHRoZSBzZWFyY2ggc3RyaW5nCi0KLQlzdGF0aWMgcHVibGljIEFycmF5TGlzdCBnZXRBbGxOb2RlcyhOb2RlIG5vZGUsIFN0cmluZyBub2RlTmFtZSkgewotCQlBcnJheUxpc3Qgbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJU3RyaW5nW10gbm9kZU5hbWVzID0ge25vZGVOYW1lfTsKLQkJZmluZEFsbE5vZGVzKG5vZGUsIG5vZGVOYW1lcywgbm9kZUxpc3QpOwotCi0JCXJldHVybiBub2RlTGlzdDsKLQl9Ci0KLQkvLyB0cmF2ZXJzZXMgdGhlIERPTSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIG5vZGUgYW5kIHJldHVybnMgYSBsaXN0Ci0JLy8gb2Ygbm9kZXMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBzdHJpbmdzCi0KLQlzdGF0aWMgcHVibGljIEFycmF5TGlzdCBnZXRBbGxOb2RlcyhOb2RlIG5vZGUsIFN0cmluZ1tdIG5vZGVOYW1lc0FycmF5KSB7Ci0JCUFycmF5TGlzdCBub2RlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmluZEFsbE5vZGVzKG5vZGUsIG5vZGVOYW1lc0FycmF5LCBub2RlTGlzdCk7Ci0KLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCS8vIHJlY3Vyc2l2ZSBoZWxwZXIgZm9yIGdldEFsbE5vZGVzCi0Jc3RhdGljIHByaXZhdGUgdm9pZCBmaW5kQWxsTm9kZXMoTm9kZSBub2RlLCBTdHJpbmdbXSBub2RlTmFtZXMsIEFycmF5TGlzdCByZXN1bHRzKSB7Ci0KLQkJTm9kZUxpc3Qgbm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChub2Rlcy5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKG5vZGVOYW1lc1tqXSkpIHsKLQkJCQkJCXJlc3VsdHMuYWRkKG5vZGVzLml0ZW0oaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmRBbGxOb2Rlcyhub2Rlcy5pdGVtKGkpLCBub2RlTmFtZXMsIHJlc3VsdHMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3lzdGVtIGRlZmluZWQgSkFYUCBkb2N1bWVudCBidWlsZGVyCi0JICovCi0Jc3RhdGljIHB1YmxpYyBEb2N1bWVudEJ1aWxkZXIgbmV3RGVmYXVsdERvY3VtZW50QnVpbGRlcihET01Mb2FkT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlkYmYuc2V0VmFsaWRhdGluZyhvcHRpb25zLmlzVmFsaWRhdGUoKSk7Ci0JCWRiZi5zZXROYW1lc3BhY2VBd2FyZShvcHRpb25zLmlzVmFsaWRhdGUoKSk7Ci0JCS8qCi0JCSAqIENhdXNlcyBlcnJvcnMgaW4gSUJNIEpESyB0cnkgeyBkYmYuc2V0QXR0cmlidXRlKFJlbmRlcmVyLkpBWFBfU0NIRU1BX0xBTkdVQUdFLAotCQkgKiBSZW53ZGVyZXIuVzNDX1hNTF9TQ0hFTUEpOyB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgeyB9Ci0JCSAqLwotCQl0cnkgewotCQkJZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzIiwgbmV3IEJvb2xlYW4ob3B0aW9ucy5pc0FsbG93SmF2YUVuY29kaW5ncygpKSk7IC8vJE5PTi1OTFMtMSQJICAgICAgICAKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nV2FybmluZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3NcIi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLCBuZXcgQm9vbGVhbihvcHRpb25zLmlzVmFsaWRhdGUoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCWRiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ1dhcm5pbmcoIldhcm5pbmc6IFBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IFwiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hXCIuIFZhbGlkYXRpb24gd2lsbCBiZSBkaXNhYmxlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvZG9tL2RlZmVyLW5vZGUtZXhwYW5zaW9uIiwgQm9vbGVhbi5GQUxTRSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nV2FybmluZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvZG9tL2RlZmVyLW5vZGUtZXhwYW5zaW9uXCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlkYmYuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhvcHRpb25zLmlzRXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKCkpOwotCQlEb2N1bWVudEJ1aWxkZXIgcmVzdWx0ID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQlyZXN1bHQuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJvckhhbmRsZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJdGhyb3cgYXJnMDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQl0aHJvdyBhcmcwOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ1dhcm5pbmcoYXJnMCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0dWIgZG9jdW1lbnQsIHdoZXJlIHRoZSBEb2N1bWVudFR5cGUgaXMgZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVycy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIERvY3VtZW50IGNyZWF0ZU5ld0RvY3VtZW50KFN0cmluZyBkb2N0eXBlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGdldERlZmF1bHREb2N1bWVudEJ1aWxkZXIoKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBjcmVhdGVIZWFkZXJJbnB1dFN0cmVhbShkb2N0eXBlLCBwdWJsaWNJZCwgc3lzdGVtSWQsIHRydWUpOwotCQlEb2N1bWVudCByZXN1bHQgPSBidWlsZGVyLnBhcnNlKGluKTsKLQkJcmVtb3ZlRHVtbXlFbnRpdHkocmVzdWx0KTsKLQkJcmVtb3ZlRXh0cmFuZW91c0NvbW1lbnRzKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBsb2FkRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIERPTUxvYWRPcHRpb25zIG9wdGlvbnMsIEVudGl0eVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRE9NVXRpbGl0aWVzLm5ld0RlZmF1bHREb2N1bWVudEJ1aWxkZXIob3B0aW9ucyk7Ci0JCWJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIocmVzb2x2ZXIpOwotCQlEb2N1bWVudCByZXN1bHQgPSBidWlsZGVyLnBhcnNlKGluKTsKLQkJcmVtb3ZlRXh0cmFuZW91c0NvbW1lbnRzKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB0aGUgRE9NIExldmVsIDIgQVBJcyBhcmUgbm90IGFkdmFuY2VkIGVub3VnaCBmb3Igc2V0dGluZyB0aGUKLQkgKiBkb2N1bWVudCB0eXBlOyBzbyB0aGUgb25seSBwYXJzZXIgaW5kZXBlbmRlbnQgd2F5IG9mIGFjY29tcGxpc2hpbmcgdGhpcyBpcyBieSBjcmVhdGluZyBhCi0JICogc3RyZWFtIGFuZCBwYXJzaW5nIGl0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0oU3RyaW5nIGRvY3R5cGUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXJldHVybiBjcmVhdGVIZWFkZXJJbnB1dFN0cmVhbShkb2N0eXBlLCBwdWJsaWNJZCwgc3lzdGVtSWQsIGZhbHNlKTsKLQl9Ci0KLQotCQotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKFN0cmluZyBkb2N0eXBlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgYm9vbGVhbiBpbmNsdWRlRHVtbXkpIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotCQkvLyBUaGUgcHJpb3IgY29kZSAod2hpY2ggaXMgc3RpbGwgaW4gdGhlIGNhdGNoIGJsb2NrKSwgdXNlcwotCQkvLyB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcgW1N5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpXTsKLQkJLy8gb24gWi9PUyB0aGlzIGlzIENwMTA0Ny4gVGhlIGNvbWJpbmF0aW9uIG9mICJVVEYtOCIgaW4gdGhlIGhlYWRlcgotCQkvLyBhbmQgIkNwMTA0NyIgaW4gdGhlIHdyaXRlciBjcmVhdGUgYW4gdW51c2FibGUgaW5wdXQgc3RyZWFtLgotCi0JCVByaW50V3JpdGVyIHdyaXRlcjsKLQotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkJCXdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXRwdXRXcml0ZXIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSAoZWFybGllciBjb2RlKQotCQkJd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dHB1dFN0cmVhbSk7IAotCQl9Ci0KLQkJd3JpdGVIZWFkZXIod3JpdGVyLCBkb2N0eXBlLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlpZiAoaW5jbHVkZUR1bW15KQotCQkJYWRkRHVtbXlFbnRpdHkod3JpdGVyKTsKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JCXdyaXRlci5jbG9zZSgpOwotCi0JCWJ5dGVbXSBieXRlcyA9IG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVIZWFkZXIoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgZG9jdHlwZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJd3JpdGVyLndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIlwiIGVuY29kaW5nPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZSgiXCI/PiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCk7Ci0KLQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJd3JpdGVyLndyaXRlKCI8IURPQ1RZUEUgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShkb2N0eXBlKTsKLQkJCXdyaXRlci53cml0ZSgiIFBVQkxJQyBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUocHVibGljSWQpOwotCQkJd3JpdGVyLndyaXRlKCJcIiBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoc3lzdGVtSWQpOwotCQkJd3JpdGVyLndyaXRlKCJcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRHVtbXlFbnRpdHkoUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCVJldmlzaXQucmV2aXNpdCgpOwotCQl3cml0ZXIucHJpbnRsbihEVU1NWV9FTlRJVFlfTk9ERV9TVFJJTkcpOwotCQkvL01ham9yIGhhY2sgYmVjYXVzZSB3ZSBjYW4gbm90IHBhcnNlIGFuIGVtcHR5IGRvY3VtZW50Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVEdW1teUVudGl0eShEb2N1bWVudCBkb2MpIHsKLQkJZG9jLnJlbW92ZUNoaWxkKGdldE5vZGVDaGlsZChkb2MsIERVTU1ZX0VOVElUWV9TVFJJTkcpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUV4dHJhbmVvdXNDb21tZW50cyhEb2N1bWVudCBkb2MpIHsKLQkJLy9hbm90aGVyIG1ham9yIGhhY2sgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBYTUw0SiA0LjAuNyB0aGF0IGFkZGVkIGFsbCB0aGUKLQkJLy9jb21tZW50cyBmcm9tIHRoZSBkdGQgdG8gdGhlIGRvY3VtZW50LiBDYW4gYmUgcmVtb3ZlZCBhZnRlciB3ZSBtb3ZlIHVwCi0JCS8vWGVyY2VzIGxldmVscwotCQlOb2RlIGFOb2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCU5vZGUgbmV4dE5vZGUgPSBhTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKGFOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpCi0JCQkJZG9jLnJlbW92ZUNoaWxkKGFOb2RlKTsKLQkJCWFOb2RlID0gbmV4dE5vZGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3IgcGVyZm9ybWFuY2UsIGNhY2hlIGEgc3RhdGljIGluc3RhbmNlIG9mIHRoZSBKQVhQIHJlZ2lzdGVyZWQgZG9jdW1lbnQgYnVpbGRlci4gVmFsaWRhdGlvbgotCSAqIGlzIGRpc2FibGVkIGZvciB0aGlzIGluc3RhbmNlLiBJZiB5b3UgbmVlZCB2YWxpZGF0aW9uLCB1c2UKLQkgKiB7QGxpbmsgI25ld0RlZmF1bHREb2N1bWVudEJ1aWxkZXIoYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbil9Ci0JICogCi0JICogQHJldHVybiBEb2N1bWVudEJ1aWxkZXIKLQkgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBKQVhQIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERlZmF1bHREb2N1bWVudEJ1aWxkZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChkZWZhdWx0RG9jdW1lbnRCdWlsZGVyID09IG51bGwpIHsKLQkJCURPTUxvYWRPcHRpb25zIG9wdHMgPSBuZXcgRE9NTG9hZE9wdGlvbnMoKTsKLQkJCW9wdHMuc2V0QWxsb3dKYXZhRW5jb2RpbmdzKHRydWUpOwotCQkJb3B0cy5zZXRFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXModHJ1ZSk7Ci0JCQlvcHRzLnNldFZhbGlkYXRlKGZhbHNlKTsKLQkJCWRlZmF1bHREb2N1bWVudEJ1aWxkZXIgPSBuZXdEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKG9wdHMpOwotCQkJZGVmYXVsdERvY3VtZW50QnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihkZWZhdWx0RW50aXR5UmVzb2x2ZXIpOwotCQkJZGVmYXVsdERvY3VtZW50QnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IEVycm9ySGFuZGxlcigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQotCQlyZXR1cm4gZGVmYXVsdERvY3VtZW50QnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnRpdHlSZXNvbHZlciBnZXREZWZhdWx0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBkZWZhdWx0RW50aXR5UmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgewotCQlkZWZhdWx0RW50aXR5UmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EYW5nbGluZ0hSRUZFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EYW5nbGluZ0hSRUZFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwNzcxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGFuZ2xpbmdIUkVGRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDEyLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBwcm94eSBjYW4gbm90IGJlIHJlc29sdmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEYW5nbGluZ0hSRUZFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM2OTEyODc0Mjg5OTI2MzMyN0w7Ci0KLQlwdWJsaWMgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIERhbmdsaW5nSFJFRkV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTU5NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvMTAvMjAwMSAyOjQ5OjQ5IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyIGltcGxlbWVudHMgRmVhdHVyZVZhbHVlQ29udmVydGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTEVEX0NPTlZFUlNJT05fUEFUVEVSTiA9IFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkZhaWxlZF90b19jb252ZXJ0X18wX190b19fX0VSUk9SXzsKLQotCS8qKgotCSAqIERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIEJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9Cb29sZWFuKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuQm9vbGVhbl9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgQnl0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0J5dGUoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIEJ5dGUudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgQnl0ZSkKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5CeXRlX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBDaGFyYWN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9DaGFyYWN0ZXIoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBhVmFsdWUpLmxlbmd0aCgpID09IDEpCi0JCQlyZXR1cm4gbmV3IENoYXJhY3RlcigoKFN0cmluZykgYVZhbHVlKS5jaGFyQXQoMCkpOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkNoYXJhY3Rlcl9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgRG91YmxlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvRG91YmxlKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gRG91YmxlLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHREb3VibGUoKTsKLQkJCX0KLQkJfQotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgRG91YmxlKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkRvdWJsZV9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgRUVudW1MaXRlcmFsLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvRW51bShPYmplY3QgYVZhbHVlLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSBudWxsOwotCQlFRW51bSBlZW51bSA9IChFRW51bSkgYUZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCWxpdGVyYWwgPSBlZW51bS5nZXRFRW51bUxpdGVyYWwoKFN0cmluZykgYVZhbHVlKTsKLQkJZWxzZSBpZiAoYVZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCWxpdGVyYWwgPSBlZW51bS5nZXRFRW51bUxpdGVyYWwoKChJbnRlZ2VyKSBhVmFsdWUpLmludFZhbHVlKCkpOwotCQllbHNlIGlmIChhVmFsdWUgaW5zdGFuY2VvZiBFRW51bUxpdGVyYWwpCi0JCQlsaXRlcmFsID0gKEVFbnVtTGl0ZXJhbCkgYVZhbHVlOwotCi0JCWlmIChsaXRlcmFsID09IG51bGwpCi0JCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRW51bWVyYXRpb25fVUlfKTsKLQotCQlyZXR1cm4gbGl0ZXJhbC5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgRmxvYXQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9GbG9hdChPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEZsb2F0LnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRGbG9hdCgpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5GbG9hdF9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgSW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0ludGVnZXIoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRJbnRlZ2VyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuSW50ZWdlcl9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgSmF2YSBPYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9KYXZhT2JqZWN0KE9iamVjdCBhVmFsdWUpIHsKLQkJcmV0dXJuIGFWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIExvbmcuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9Mb25nKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTG9uZy52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBkZWZhdWx0TG9uZygpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBMb25nKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkxvbmdfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIE1vZk9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb01vZk9iamVjdChPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLk1vZk9iamVjdF9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgU2hvcnQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9TaG9ydChPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFNob3J0LnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRTaG9ydCgpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5TaG9ydF9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgU3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvU3RyaW5nKE9iamVjdCBhVmFsdWUpIHsKLQkJcmV0dXJuIGFWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIHRoZSB0eXBlIG9mCi0JICogQGFuQXR0cmlidXRlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKE9iamVjdCBhVmFsdWUsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlIGFuQXR0cmlidXRlKSB7Ci0KLQkJRUNsYXNzaWZpZXIgbWV0YSA9IGFuQXR0cmlidXRlLmdldEVUeXBlKCk7Ci0JCWlmIChtZXRhLmVDbGFzcygpID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUVudW0oKSkKLQkJCXJldHVybiBjb252ZXJ0VG9FbnVtKGFWYWx1ZSwgYW5BdHRyaWJ1dGUpOwotCQlpZiAobWV0YS5nZXRFUGFja2FnZSgpIGluc3RhbmNlb2YgRWNvcmVQYWNrYWdlKQotCQl7Ci0JCQlzd2l0Y2ggKG1ldGEuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FU1RSSU5HIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb1N0cmluZyhhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCT09MRUFOX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU4gOgotCQkJCQlyZXR1cm4gY29udmVydFRvQm9vbGVhbihhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVJTlRFR0VSX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVCA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9JbnRlZ2VyKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUZMT0FUX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUZMT0FUIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0Zsb2F0KGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUNIQVJBQ1RFUl9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVDSEFSIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJhY3RlcihhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVMT05HX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUxPTkcgOgotCQkJCQlyZXR1cm4gY29udmVydFRvTG9uZyhhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCWVRFX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJZVEUgOgotCQkJCQlyZXR1cm4gY29udmVydFRvQnl0ZShhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVET1VCTEVfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FRE9VQkxFIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0RvdWJsZShhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTSE9SVF9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTSE9SVCA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9TaG9ydChhVmFsdWUpOwotCQkJCS8vCQljYXNlIEVjb3JlUGFja2FnZS5FRU5VTToKLQkJCQkvLwkJCXJldHVybiBjb252ZXJ0VG9FbnVtKGFWYWx1ZSwgYW5BdHRyaWJ1dGUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVPQkpFQ1QgOgotCQkJCQlyZXR1cm4gY29udmVydFRvTW9mT2JqZWN0KGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUpBVkFfT0JKRUNUIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0phdmFPYmplY3QoYVZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtZXRhLmdldEVQYWNrYWdlKCkgaW5zdGFuY2VvZiBYTUxUeXBlUGFja2FnZSkKLQkJewotCQkJc3dpdGNoIChtZXRhLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLlNUUklORyA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb1N0cmluZyhhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5CT09MRUFOX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJPT0xFQU4gOgotCQkJCXJldHVybiBjb252ZXJ0VG9Cb29sZWFuKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLklOVF9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5JTlRFR0VSIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuSU5UIDoKLQkJCQlyZXR1cm4gY29udmVydFRvSW50ZWdlcihhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5GTE9BVF9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5GTE9BVCA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0Zsb2F0KGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkxPTkdfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuTE9ORyA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0xvbmcoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuQllURV9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5CWVRFIDoKLQkJCQlyZXR1cm4gY29udmVydFRvQnl0ZShhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5ET1VCTEVfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuRE9VQkxFIDoKLQkJCQlyZXR1cm4gY29udmVydFRvRG91YmxlKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLlNIT1JUX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLlNIT1JUIDoKLQkJCQlyZXR1cm4gY29udmVydFRvU2hvcnQoYVZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYVZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIHRoZSB0eXBlIG9mCi0JICogQGFGZWF0dXJlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFZhbHVlKE9iamVjdCBhVmFsdWUsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJaWYgKGFWYWx1ZSA9PSBudWxsIHx8IGFGZWF0dXJlID09IG51bGwgfHwgIShhRmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpKQotCQkJcmV0dXJuIGFWYWx1ZTsgLy9ub3RoaW5nIHRvIGNvbnZlcnQKLQkJcmV0dXJuIGNvbnZlcnRWYWx1ZShhVmFsdWUsIChFQXR0cmlidXRlKSBhRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IERvdWJsZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIGRlZmF1bHREb3VibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBGbG9hdCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRmxvYXQgZGVmYXVsdEZsb2F0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgSW50ZWdlciB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBkZWZhdWx0SW50ZWdlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IExvbmcgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIExvbmcgZGVmYXVsdExvbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBTaG9ydCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU2hvcnQgZGVmYXVsdFNob3J0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGYWlsZWQgdG8gY29udmVydAotCSAqIAotCSAqIEBhVmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmYWlsZWRUb0NvbnZlcnQoT2JqZWN0IGFWYWx1ZSwgU3RyaW5nIGFTdHJpbmcpIHsKLQkJU3RyaW5nIGVycm9yU3RyaW5nID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KEZBSUxFRF9DT05WRVJTSU9OX1BBVFRFUk4sIG5ldyBPYmplY3RbXXthVmFsdWUudG9TdHJpbmcoKSwgYVN0cmluZ30pOwotCQl0aHJvdyBuZXcgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihlcnJvclN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2ZWRiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTQsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgR0xPQkFMX0ZBQ1RPUlkgPSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShERUZBVUxUX0VYVEVOU0lPTikpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkodXJpLCBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkKLQl7Ci0JCU9iamVjdCByZXNvdXJjZUZhY3RvcnkgPSBudWxsOwotCQlTdHJpbmcgcHJvdG9jb2wgPSB1cmkuc2NoZW1lKCk7Ci0JCXJlc291cmNlRmFjdG9yeSA9IHByb3RvY29sVG9GYWN0b3J5TWFwLmdldChwcm90b2NvbCk7Ci0JCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkgewotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHVyaS5maWxlRXh0ZW5zaW9uKCk7Ci0JCQlyZXNvdXJjZUZhY3RvcnkgPSBleHRlbnNpb25Ub0ZhY3RvcnlNYXAuZ2V0KGV4dGVuc2lvbik7Ci0JCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpIHsKLQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBkZWxlZ2F0ZWRHZXRGYWN0b3J5KHVyaSk7Ci0JCQkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBHTE9CQUxfRkFDVE9SWSkgewotCQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBleHRlbnNpb25Ub0ZhY3RvcnlNYXAuZ2V0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04pOwotCQkJCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpCi0JCQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBHTE9CQUxfRkFDVE9SWTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc291cmNlRmFjdG9yeSBpbnN0YW5jZW9mIFJlc291cmNlLkZhY3RvcnkuRGVzY3JpcHRvciA/ICgoUmVzb3VyY2UuRmFjdG9yeS5EZXNjcmlwdG9yKSByZXNvdXJjZUZhY3RvcnkpLmNyZWF0ZUZhY3RvcnkoKSA6IChSZXNvdXJjZS5GYWN0b3J5KSByZXNvdXJjZUZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGwjZGVsZWdhdGVkR2V0RmFjdG9yeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBGYWN0b3J5IGRlbGVnYXRlZEdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlyZXR1cm4gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFmNjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjI1OjQzIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24gewotCXByb3RlY3RlZCBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlZmVyZW5jZVZhbHVlOwotCXByb3RlY3RlZCBFT2JqZWN0IGNvcHlDb250YWluZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZFN1ZmZpeDsKLQotCS8qKgotCSAqIERlZmVycmVkQ29weSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24oRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlyZWZlcmVuY2UgPSBhUmVmZXJlbmNlOwotCQlyZWZlcmVuY2VWYWx1ZSA9IGFWYWx1ZTsKLQkJaWRTdWZmaXggPSBhU3VmZml4OwotCQljb3B5Q29udGFpbmVyID0gYUNvcHlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjMyOjI4IEFNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgZ2V0Q29weUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvcHlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjM0OjU2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkU3VmZml4KCkgewotCQlyZXR1cm4gaWRTdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjM0OjU2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOTozMjoyOCBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZVZhbHVlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlVmFsdWU7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcGVyZm9ybUFjdGlvbigpOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWZlMDZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW50ZXJmYWNlIHRvIGFuIG9iamVjdCB3aGljaCBjYW4gZW5jb2RlIGFuZCBkZWNvZGUgdmFsdWVzLiBUaGlzIHR5cGljYWxseSBpbnZvbHZlcwotICogY3J5cHRvZ3JhcGh5IGFsZ29yaXRobXMuIFRoaXMgaW50ZXJmYWNlLCBhbG9uZyB3aXRoIHRoZSBzdXBwbGllZCBhZGFwdGVycyBwcm92aWRlIGFuIGV4dGVuc2lvbgotICogbWVjaGFuaXNtIGZvciBwbHVnZ2FibGUgY3J5dG9ncmFwaHkgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgYXR0cmlidXRlCi0gKiB2YWx1ZXMsIGFuZCBpcyB1c2VkIHByZXZhbGVudGx5IGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgcGFzc3dvcmQgdmFsdWVzIG9mIG1vZiBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVuY29kZXJEZWNvZGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODhiMzAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBbiBhZGFwdGVyIGZvciBFbmNvZGVyRGVjb2RlciBpbXBsZW1lbnRhdGlvbnMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVuY29kZXJEZWNvZGVyQWRhcHRlciBpbXBsZW1lbnRzIEVuY29kZXJEZWNvZGVyIHsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjE1MTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBSZWdpc3RyeSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyB2YWx1ZSBkZWNvZGVycyBhbmQgZW5jb2RlcnMuIFVzYWdlIEV4YW1wbGU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiAKLSAqIAotICogLy8gVXNlIHRoZSBzdGFuZGFyZCBXZWJTcGhlcmUgcGFzc3dvcmQgdmFsdWUgZW5jb2Rlci9kZWNvZGVyLgotICogRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKS5zZXREZWZhdWx0RW5jb2RlckRlY29kZXIobmV3IGNvbS5pYm0uZWpzLnNlY3VyaXR5LnV0aWwuV0FTRW5jb2RlckRlY29kZXIoKSk7Ci0gKiAvLyBCZWdpbiB0cmFja2luZyBjaGFuZ2VzLi4uCi0gKiBXcml0ZUJhY2tIZWxwZXIuYmVnaW4oKTsKLSAqIC8vIExvYWQgYSByZXNvdXJjZSB3aGljaCBtYXkgaGF2ZSB1bi1lbmNvZGVkIHZhbHVlcy4uLgotICogLy8gTm90ZTogVGhlIFdDQ00gd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB1bi1lbmNvZGVkIHZhbHVlcy4gIElmIHVuZW5jb2RlZCB2YWx1ZXMKLSAqIC8vIGFyZSBmb3VuZCwgdGhlIHZhbHVlIHdpbGwgYmUgZW5jb2RlZCwgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICogLy8gV3JpdGVCYWNrSGVscGVyLgotICogUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VTZXQubG9hZCgmcXVvdDtteVJlc291cmNlJnF1b3Q7KTsKLSAqIC8vIEVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIGR1ZSB0byBlbmNvZGluZyBhcmUgd3JpdHRlbiBiYWNrIG91dC4KLSAqIFdyaXRlQmFja0hlbHBlci5lbmQoKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RlckRlY29kZXJSZWdpc3RyeSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IF9kZWZhdWx0SW5zdGFuY2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGVyRGVjb2RlciBJTklUSUFMX0RFRkFVTFRfRU5DT0RFUiA9IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIuSU5TVEFOQ0U7Ci0JcHJvdGVjdGVkIE1hcCBlbmNvZGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIE9iamVjdCBkZWZhdWx0RW5jb2RlcktleTsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRW5jb2RlckRlY29kZXJSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRFbmNvZGVycygpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIvMi8yMDAxIDEyOjQzOjMxIEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVuY29kZXJEZWNvZGVyKEVuY29kZXJEZWNvZGVyIGVuY29kZXJEZWNvZGVyKSB7Ci0JCWVuY29kZXJzLnB1dChlbmNvZGVyRGVjb2Rlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgZW5jb2RlckRlY29kZXIpOwotCQlpZiAoZGVmYXVsdEVuY29kZXJLZXkgPT0gbnVsbCkKLQkJCWRlZmF1bHRFbmNvZGVyS2V5ID0gZW5jb2RlckRlY29kZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVyL2RlY29kZXIgYnkga2V5LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlciBnZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSB7Ci0JCWlmIChkZWZhdWx0RW5jb2RlcktleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRW5jb2RlckRlY29kZXIpIGVuY29kZXJzLmdldChkZWZhdWx0RW5jb2RlcktleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCByZWdpc3RyeSB0byB1c2UgZm9yIHJldHJpZXZpbmcgdmFsdWUgZW5jb2RlcnMgYW5kIGRlY29kZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IGdldERlZmF1bHRSZWdpc3RyeSgpIHsKLQkJaWYgKF9kZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2RlZmF1bHRJbnN0YW5jZSA9IG5ldyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIF9kZWZhdWx0SW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVyL2RlY29kZXIgYnkga2V5LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlciBnZXRFbmNvZGVyRGVjb2RlcihPYmplY3Qga2V5KSB7Ci0JCXJldHVybiAoRW5jb2RlckRlY29kZXIpIGVuY29kZXJzLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgc3RhbmRhcmQgc2V0IG9mIGVuY29kZXIvZGVjb2RlcnMuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRFbmNvZGVycygpIHsKLQkJc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKElOSVRJQUxfREVGQVVMVF9FTkNPREVSKTsKLQkJYWRkRW5jb2RlckRlY29kZXIobmV3IFhNTFZhbHVlRW5jb2RlckRlY29kZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5jb2Rlci9kZWNvZGVyIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRW5jb2RlckRlY29kZXIoT2JqZWN0IGtleSkgewotCQlpZiAoZW5jb2RlcnMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJZW5jb2RlcnMucmVtb3ZlKGtleSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZXIvZGVjb2RlciBieSBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKEVuY29kZXJEZWNvZGVyIGVuY29kZXIpIHsKLQkJZGVmYXVsdEVuY29kZXJLZXkgPSBlbmNvZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpZiAoIWVuY29kZXJzLmNvbnRhaW5zS2V5KGRlZmF1bHRFbmNvZGVyS2V5KSkgewotCQkJYWRkRW5jb2RlckRlY29kZXIoZW5jb2Rlcik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlTZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlOTUxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMDQvMDEgMTE6MjU6NTkgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEV0b29sc0NvcHlTZXNzaW9uIGV4dGVuZHMgRXRvb2xzQ29weVV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX0NPUElFRCA9IDUwMDsKLQlwcml2YXRlIEV0b29sc0NvcHlVdGlsaXR5IHBhcmVudENvcHlVdGlsaXR5OwotCXByaXZhdGUgWE1MUmVzb3VyY2UgY3VycmVudFJlc291cmNlOwotCXByaXZhdGUgWE1MUmVzb3VyY2UgY3VycmVudENvcHlSZXNvdXJjZTsKLQotCS8qKgotCSAqIEV0b29sc0NvcHlTZXNzaW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEV0b29sc0NvcHlTZXNzaW9uKEV0b29sc0NvcHlVdGlsaXR5IGFDb3B5VXRpbGl0eSkgewotCQlwYXJlbnRDb3B5VXRpbGl0eSA9IGFDb3B5VXRpbGl0eTsKLQkJc2V0UHJlc2VydmVJZHMoYUNvcHlVdGlsaXR5LnByZXNlcnZlSWRzKCkpOwotCQlzZXRDb3B5QWRhcHRlcnMoYUNvcHlVdGlsaXR5LmlzQ29weUFkYXB0ZXJzKCkpOwotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlc291cmNlcyBhbmQgUmVmT2JqZWN0cyB3aXRoaW4gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZW0gdG8KLQkgKiA8Y29kZT5hR3JvdXA8L2NvZGU+LiBOb24gY29tcG9zaXRlIHJlZmVyZW5jZXMgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBhbGwgb2JqZWN0cyBhcmUKLQkgKiBjb3BpZWQgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+LgotCSAqIAotCSAqIENvcHkgUmVzb3VyY2VzIGZpcnN0IGFuZCB0aGVuIGNvcHkgUmVmT2JqZWN0cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJaWYgKGFHcm91cCAhPSBudWxsKSB7Ci0JCQljb3B5UmVzb3VyY2VzKGFHcm91cCk7Ci0JCQljb3B5UmVmT2JqZWN0cyhhR3JvdXApOwotCQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJCWFHcm91cC5wb3N0Q29weSh0aGlzKTsKLQkJCW5vdGlmeU5ld1Jlc291cmNlc0NvcGllZChhR3JvdXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBjb250YWlubWVudENvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhpcyBtZXRob2Qgb25seSBjb3BpZXMgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gYXR0cmlidXRlcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjb3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29waWVkID0gY29udGFpbm1lbnRDb3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhlIGNvcGllZCBSZXNvdXJjZSB3aWxsIGhhdmUgYSBVUkkgZXF1YWwgdG8gPGNvZGU+bmV3VXJpPC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UgY29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJUmVzb3VyY2UgY29waWVkID0gY29udGFpbm1lbnRDb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJY29weU1vZGlmaWNhdGlvbkZsYWcoYVJlc291cmNlLCBjb3BpZWQpOwotCQlub3RpZnlOZXdSZXNvdXJjZUNvcGllZChjb3BpZWQpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU5ld1Jlc291cmNlc0NvcGllZChDb3B5R3JvdXAgZ3JvdXApIHsKLQkJTGlzdCBjb3BpZWQgPSBncm91cC5nZXRDb3BpZWRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3BpZWQuc2l6ZSgpOyBpKyspIHsKLQkJCW5vdGlmeU5ld1Jlc291cmNlQ29waWVkKChSZXNvdXJjZSkgY29waWVkLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOZXdSZXNvdXJjZUNvcGllZChSZXNvdXJjZSBjb3BpZWQpIHsKLQkJY29waWVkLmVOb3RpZnkobmV3IE5vdGlmaWNhdGlvbkltcGwoUkVTT1VSQ0VfQ09QSUVELCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYuZWNvcmUudXRpbGl0aWVzLmNvcHkuRXRvb2xzQ29weVV0aWxpdHkjcHJpbUNvcHlPYmplY3QoRU9iamVjdCwKLQkgKiAgICAgIFN0cmluZykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRU9iamVjdCBwcmltQ29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcHkgPSBzdXBlci5wcmltQ29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWNvcHlJZElmTmVjZXNzYXJ5KGFSZWZPYmplY3QsIGNvcHksIGlkU3VmZml4KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUlkSWZOZWNlc3NhcnkoRU9iamVjdCBvYmosIEVPYmplY3QgY29weSwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmICgoaWRTdWZmaXggPT0gbnVsbCAmJiAhcHJlc2VydmVJZHMpIHx8IGN1cnJlbnRSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaWQgPSBjdXJyZW50UmVzb3VyY2UuZ2V0SUQob2JqKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlkID0gaWRTdWZmaXggPT0gbnVsbCA/IGlkIDogaWQgKyBpZFN1ZmZpeDsKLQkJY3VycmVudENvcHlSZXNvdXJjZS5zZXRJRChjb3B5LCBpZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgZGVsaXZlcnkgYmFjayBvbiBmb3IgYWxsIHRoZSBjYWNoZWQgb2JqZWN0cyBhbmQgcHVzaCB0aGVtIHRvIHRoZSBwYXJlbnRDb3B5VXRpbGl0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRDb3BpZWRPYmplY3RzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAgcGFyZW50Q29waWVzID0gZ2V0UGFyZW50Q29weVV0aWxpdHkoKS5nZXRDb3BpZWRPYmplY3RzKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJRU9iamVjdCBjb3B5OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWNvcHkgPSAoRU9iamVjdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWNvcHkuZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCQlwYXJlbnRDb3BpZXMucHV0KGVudHJ5LmdldEtleSgpLCBjb3B5KTsKLQkJfQotCQljb3BpZWRPYmplY3RzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjYWNoZWQgY29weS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBzdXBlci5nZXRDb3B5KGFuT2JqZWN0KTsKLQkJaWYgKGNvcGllZCA9PSBudWxsKQotCQkJY29waWVkID0gZ2V0UGFyZW50Q29weVV0aWxpdHkoKS5nZXRDb3B5KGFuT2JqZWN0KTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wNC8wMSAxMToyODowNyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eQotCSAqLwotCXByb3RlY3RlZCBFdG9vbHNDb3B5VXRpbGl0eSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpIHsKLQkJcmV0dXJuIHBhcmVudENvcHlVdGlsaXR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBFT2JqZWN0IHRoYXQgaXMgdGhlIHNhbWUgdHlwZSBhcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBuZXdJbnN0YW5jZShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJRU9iamVjdCBuZXdUeXBlID0gc3VwZXIubmV3SW5zdGFuY2UoYVJlZk9iamVjdCk7Ci0JCW5ld1R5cGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQlyZXR1cm4gbmV3VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eSNuZXdJbnN0YW5jZShSZXNvdXJjZSwgU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBuZXdJbnN0YW5jZShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJUmVzb3VyY2UgY29weSA9IHN1cGVyLm5ld0luc3RhbmNlKGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQljdXJyZW50UmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZTsKLQkJCWN1cnJlbnRDb3B5UmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIGNvcHk7Ci0JCX0gZWxzZSB7Ci0JCQljdXJyZW50UmVzb3VyY2UgPSBudWxsOwotCQkJY3VycmVudENvcHlSZXNvdXJjZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FdG9vbHNDb3B5VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OWE3YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMy8yMDAwIDk6MTA6NTUgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEV0b29sc0NvcHlVdGlsaXR5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFTlVNTElURVJBTF9UWVBFX05BTUUgPSAiRUVudW1MaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgRWNvcmVQYWNrYWdlIHBrZyA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIGZpbmFsIEVUeXBlZEVsZW1lbnQgTUVUQUVOQU1FID0gcGtnLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JcHJvdGVjdGVkIEhhc2hNYXAgY29waWVkT2JqZWN0czsKLQlwcm90ZWN0ZWQgTGlzdCBkZWZlcnJlZFJlZmVyZW5jZUNvcGllczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVzZXJ2ZUlkcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGNvcHlBZGFwdGVycyA9IGZhbHNlOwotCXByb3RlY3RlZCBIYXNoTWFwIGNvcGllZEFkYXB0ZXJzOwotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbiBleHRlbmRzIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiB7Ci0JCXB1YmxpYyBEZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHlBY3Rpb24oRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQkJc3VwZXIoYVJlZmVyZW5jZSwgYVZhbHVlLCBhU3VmZml4LCBhQ29weUNvbnRhaW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpIHsKLQkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgZ2V0UmVmZXJlbmNlVmFsdWUoKTsKLQkJCWdldENvcHlDb250YWluZXIoKS5lU2V0KGdldFJlZmVyZW5jZSgpLCBnZXRDb3B5SWZGb3VuZCh2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHlBY3Rpb24gZXh0ZW5kcyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24gewotCQlwdWJsaWMgRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbihFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIExpc3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQkJc3VwZXIoYVJlZmVyZW5jZSwgYVZhbHVlLCBhU3VmZml4LCBhQ29weUNvbnRhaW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpIHsKLQkJCUxpc3QgY29weUxpc3QgPSAoTGlzdCkgZ2V0Q29weUNvbnRhaW5lcigpLmVHZXQoZ2V0UmVmZXJlbmNlKCkpOwotCQkJSXRlcmF0b3IgaXQgPSAoKExpc3QpIGdldFJlZmVyZW5jZVZhbHVlKCkpLml0ZXJhdG9yKCk7Ci0JCQlFT2JqZWN0IG5leHQ7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJbmV4dCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJY29weUxpc3QuYWRkKGdldENvcHlJZkZvdW5kKG5leHQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzEzLzIwMDAgOToxNDoyNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgRXRvb2xzQ29weVV0aWxpdHkoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+RGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbjwvY29kZT4gYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBkZWZlcnJlZAotCSAqIGNvcHkgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5KEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBMaXN0IGFWYWx1ZSwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCWdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkuYWRkKG5ldyBEZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5QWN0aW9uKHJlZmVyZW5jZSwgYVZhbHVlLCBpZFN1ZmZpeCwgYUNvcHlDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSA8Y29kZT5EZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHlBY3Rpb248L2NvZGU+IGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgZGVmZXJyZWQKLQkgKiBjb3B5IGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5KEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBFT2JqZWN0IGFWYWx1ZSwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCWdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkuYWRkKG5ldyBEZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHlBY3Rpb24ocmVmZXJlbmNlLCBhVmFsdWUsIGlkU3VmZml4LCBhQ29weUNvbnRhaW5lcikpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBhbiBhbHJlYWR5IGNvcGllZCBvYmplY3QgZmlyc3QuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgY29udGFpbm1lbnRDb3B5KEVPYmplY3QgYW5PYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkoYW5PYmplY3QpOwotCQlpZiAoY29waWVkID09IG51bGwpCi0JCQljb3BpZWQgPSBwcmltQ29weShhbk9iamVjdCwgaWRTdWZmaXgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBhbiBhbHJlYWR5IGNvcGllZCBvYmplY3QgZmlyc3QuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgY29udGFpbm1lbnRDb3B5T2JqZWN0KEVPYmplY3QgYW5PYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkoYW5PYmplY3QpOwotCQlpZiAoY29waWVkID09IG51bGwpCi0JCQljb3BpZWQgPSBwcmltQ29weU9iamVjdChhbk9iamVjdCwgaWRTdWZmaXgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBjb250YWlubWVudENvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCS8qIGNvcGllZCByZXNvdXJjZXMgYXJlIG5ldmVyIGNhY2hlZCAqLwotCQlyZXR1cm4gcHJpbUNvcHkoYVJlc291cmNlLCBuZXdVcmkpOwotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlc291cmNlcyBhbmQgUmVmT2JqZWN0cyB3aXRoaW4gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZW0gdG8KLQkgKiA8Y29kZT5hR3JvdXA8L2NvZGU+LiBOb24gY29tcG9zaXRlIHJlZmVyZW5jZXMgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBhbGwgb2JqZWN0cyBhcmUKLQkgKiBjb3BpZWQgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+LgotCSAqIAotCSAqIENvcHkgUmVzb3VyY2VzIGZpcnN0IGFuZCB0aGVuIGNvcHkgUmVmT2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJaWYgKGFHcm91cCAhPSBudWxsKSB7Ci0JCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEV0b29sc0NvcHlTZXNzaW9uKHRoaXMpOwotCQkJc2Vzc2lvbi5zZXRQcmVzZXJ2ZUlkcyhhR3JvdXAuZ2V0UHJlc2VydmVJZHMoKSk7Ci0JCQlzZXNzaW9uLmNvcHkoYUdyb3VwKTsKLQkJCXNlc3Npb24uZmx1c2goKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNvcHkoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCXJldHVybiBjb3B5KGFSZWZPYmplY3QsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgRXRvb2xzQ29weVNlc3Npb24odGhpcyk7Ci0JCUVPYmplY3QgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhpcyBtZXRob2Qgb25seSBjb3BpZXMgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gd2l0aCBpdHMgcHJvcGVydGllcywgbm90Ci0JICogcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjb3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgRXRvb2xzQ29weVNlc3Npb24odGhpcyk7Ci0JCUVPYmplY3QgY29waWVkID0gc2Vzc2lvbi5jb3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZXNvdXJjZTwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGUgY29waWVkIFJlc291cmNlIHdpbGwgaGF2ZSBhIFVSSSBlcXVhbCB0byA8Y29kZT5uZXdVcmk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEV0b29sc0NvcHlTZXNzaW9uKHRoaXMpOwotCQlSZXNvdXJjZSBjb3BpZWQgPSBzZXNzaW9uLmNvcHkoYVJlc291cmNlLCBuZXdVcmkpOwotCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogSWYgYW4gYXR0cmlidXRlIGlzIHNldCBhbmQgaXRzIHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBwZXJmb3JtIGNvcHkKLQkgKiA8Y29kZT5hdHRyaWJ1dGU8L2NvZGU+IHZhbHVlIGZyb20gPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gdG8gPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICogTnVsbCBpcyBhIHZhbGlkIHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dHJpYnV0ZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoIWF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKSkKLQkJCXJldHVybjsgLy9pZ25vcmUKLQkJaWYgKGF0dHJpYnV0ZS5pc01hbnkoKSkgewotCQkJTGlzdCB2YWx1ZSA9IChMaXN0KSBhUmVmT2JqZWN0LmVHZXQoYXR0cmlidXRlKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWNvcHlNYW55QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfSBlbHNlIGlmIChhUmVmT2JqZWN0LmVJc1NldChhdHRyaWJ1dGUpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBhUmVmT2JqZWN0LmVHZXQoYXR0cmlidXRlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQljb3B5U2luZ2xlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfSBlbHNlIGlmIChhdHRyaWJ1dGUgPT0gTUVUQUVOQU1FKSB7Ci0JCQkvL3NldCBuYW1lIHRvIHRoZSBJRCAodGhpcyBpcyBjb21wdXRlZCBhcyBhIGRlZmF1bHQpLCBvbmx5IGdldCBoZXJlIGlmIGlzU2V0TmFtZSBpcwotCQkJLy8gZmFsc2UuCi0JCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBhUmVmT2JqZWN0LmVHZXQoYXR0cmlidXRlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIG92ZXIgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY2VpdmVyIGFuZCBjb3B5IGVhY2ggYXR0cmlidXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlDdXJyZW50QXR0cmlidXRlcyhFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCUxpc3QgYXR0cmlidXRlcyA9IGFSZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0JCQlFQXR0cmlidXRlIHJhOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJhID0gKEVBdHRyaWJ1dGUpIGl0Lm5leHQoKTsKLQkJCQljb3B5QXR0cmlidXRlKHJhLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVjZWl2ZXIuIElmIGEgcmVmZXJlbmNlJ3MgdmFsdWUgaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYSBzZXJpZXMgb2YgdGVzdHMgYXJlIGRvbmUgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlIHdpdGggdGhlCi0JICogY29waWVkIG9iamVjdCwgPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICogCi0JICogVGVzdHM6IDEuIERvIG5vdGhpbmcgaWYgdGhlIHJlZmVyZW5jZSBlcXVhbHMgdGhlIG1ldGFFQ29udGFpbmVyIG9yIG1ldGFFQ29udGFpbnMgcmVmZXJlbmNlcy4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlDdXJyZW50UmVmZXJlbmNlcyhFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IGFSZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JCQlFUmVmZXJlbmNlIHJyOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJyID0gKEVSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCQlpZiAoc2hvdWxkQ29weVJlZmVyZW5jZShycikpCi0JCQkJCWNvcHlSZWZlcmVuY2UocnIsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgb3ZlciA8Y29kZT5hbkV4dGVudDwvY29kZT4gYW5kIGNvcHkgZWFjaCBlbGVtZW50IHRvIDxjb2RlPmNvcHlFeHRlbnQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlFeHRlbnQoRUxpc3QgYW5FeHRlbnQsIEVMaXN0IGNvcHlFeHRlbnQpIHsKLQkJSXRlcmF0b3IgaXQgPSBhbkV4dGVudC5pdGVyYXRvcigpOwotCQlFT2JqZWN0IHJlZk9iamVjdDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVmT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWNvcHlFeHRlbnQuYWRkKGNvbnRhaW5tZW50Q29weShyZWZPYmplY3QsIG51bGwpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYSBtYW55IHZhbHVlIGF0dHJpYnV0ZSB3aGljaCBpcyB0cmVhdGVkIGFzIGEgbWFueSB2YWx1ZWQgcmVmZXJlbmNlLgotCSAqIAotCSAqIFRlc3RzOgotCSAqIAotCSAqIDEuIElmIHRoZSB0eXBlIGlzIDxib2xkPm5vdCA8L2JvbGQ+IDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHNldCB0aGUgdmFsdWUgb24KLQkgKiA8Y29kZT5jb3B5UmVmPC9jb2RlPiB3aXRob3V0IG1ha2luZyBhIGNvcHkuIDIuIElmIHRoZSB0eXBlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuCi0JICogb2J0YWluIHRoZSBsaXN0IGZyb20gPGNvZGU+Y29weVJlZjwvY29kZT4gYW5kIGFkZCBhIGNvcHkgb2YgZWFjaCB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbAotCSAqIGxpc3QgdG8gaXQuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TWFueUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dHJpYnV0ZSwgTGlzdCBhVmFsdWUsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJaWYgKGF0dHJpYnV0ZS5nZXRFVHlwZSgpID09IG51bGwpCi0JCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBhVmFsdWUpOwotCQllbHNlIHsKLQkJCUxpc3QgY29weUxpc3QgPSAoTGlzdCkgY29weVJlZi5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQlJdGVyYXRvciBpdCA9IGFWYWx1ZS5pdGVyYXRvcigpOwotCQkJT2JqZWN0IG5leHQ7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAobmV4dCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCWNvcHlMaXN0LmFkZChjb250YWlubWVudENvcHkoKEVPYmplY3QpIG5leHQsIGlkU3VmZml4KSk7Ci0JCQkJZWxzZQotCQkJCQljb3B5TGlzdC5hZGQobmV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVjZWl2ZXIuIElmIGEgcmVmZXJlbmNlJ3MgdmFsdWUgaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYSBzZXJpZXMgb2YgdGVzdHMgYXJlIGRvbmUgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlIHdpdGggdGhlCi0JICogY29waWVkIG9iamVjdCwgPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICogCi0JICogVGVzdHM6IDEuIElmIHRoZSByZWZlcmVuY2UgaXMgbWFueSwgb2J0YWluIHRoZSBsaXN0IGZyb20gdGhlIHJlY2VpdmluZyBvYmplY3QgYW5kIG1ha2UgYSBjb3B5Ci0JICogb2YgZWFjaCB2YWx1ZSBpZiB0aGUgcmVmZXJlbmNlIGlzIGNvbXBvc2l0ZSBiZWZvcmUgYWRkaW5nIHRvIHRoZSBsaXN0OyBvdGhlcndpc2UsIGp1c3QgYWRkCi0JICogZWFjaCB2YWx1ZSB0byB0aGUgb2YgdGhlIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weU1hbnlSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBMaXN0IGFMaXN0LCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmICghYUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCQlMaXN0IGNvcHlMaXN0ID0gKExpc3QpIGNvcHlSZWYuZUdldChhUmVmZXJlbmNlKTsKLQkJCQlJdGVyYXRvciBpdCA9IGFMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJRU9iamVjdCB0YXJnZXRWYWx1ZTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCXRhcmdldFZhbHVlID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJY29weUxpc3QuYWRkKGNvbnRhaW5tZW50Q29weSh0YXJnZXRWYWx1ZSwgaWRTdWZmaXgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlhZGREZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5KGFSZWZlcmVuY2UsIGFMaXN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVjZWl2ZXIuIElmIGEgcmVmZXJlbmNlJ3MgdmFsdWUgaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gcGVyZm9ybSB0aGUgY29weS4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmIChhUmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IHZhbHVlID0gKExpc3QpIGFSZWZPYmplY3QuZUdldChhUmVmZXJlbmNlKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWNvcHlNYW55UmVmZXJlbmNlKGFSZWZlcmVuY2UsIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0gZWxzZSBpZiAoYVJlZk9iamVjdC5lSXNTZXQoYVJlZmVyZW5jZSkpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGFSZWZPYmplY3QuZUdldChhUmVmZXJlbmNlKTsKLQkJCWNvcHlTaW5nbGVSZWZlcmVuY2UoYVJlZmVyZW5jZSwgKEVPYmplY3QpIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCBSZWZPYmplY3RzIGZyb20gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZSBjb3B5IGJhY2sgdG8gPGNvZGU+YUdyb3VwPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmT2JqZWN0cyhDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCQlFT2JqZWN0IHJlZk9iamVjdDsKLQkJU3RyaW5nIGlkU3VmZml4OwotCQlpZiAoYUdyb3VwLnByaW1HZXRSZWZPYmplY3RzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBhR3JvdXAucHJpbUdldFJlZk9iamVjdHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJcmVmT2JqZWN0ID0gKEVPYmplY3QpIGFzc29jaWF0aW9uLmdldEtleSgpOwotCQkJCWlkU3VmZml4ID0gKFN0cmluZykgYXNzb2NpYXRpb24uZ2V0VmFsdWUoKTsKLQkJCQlpZiAoaWRTdWZmaXggPT0gbnVsbCkKLQkJCQkJaWRTdWZmaXggPSBhR3JvdXAuZ2V0RGVmYXVsdElkU3VmZml4KCk7Ci0JCQkJYUdyb3VwLmFkZENvcGllZChjb250YWlubWVudENvcHkocmVmT2JqZWN0LCBpZFN1ZmZpeCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVzb3VyY2VzIGZyb20gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZSBjb3B5IGJhY2sgdG8gPGNvZGU+YUdyb3VwPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVzb3VyY2VzKENvcHlHcm91cCBhR3JvdXApIHsKLQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247Ci0JCVJlc291cmNlIHJlc291cmNlOwotCQlTdHJpbmcgdXJpOwotCQlpZiAoYUdyb3VwLnByaW1HZXRSZXNvdXJjZXMoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGFHcm91cC5wcmltR2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbiA9IChBc3NvY2lhdGlvbikgaXQubmV4dCgpOwotCQkJCXJlc291cmNlID0gKFJlc291cmNlKSBhc3NvY2lhdGlvbi5nZXRLZXkoKTsKLQkJCQl1cmkgPSAoU3RyaW5nKSBhc3NvY2lhdGlvbi5nZXRWYWx1ZSgpOwotCQkJCVJlc291cmNlIGNvcGllZCA9IGNvbnRhaW5tZW50Q29weShyZXNvdXJjZSwgdXJpKTsKLQkJCQljb3B5TW9kaWZpY2F0aW9uRmxhZyhyZXNvdXJjZSwgY29waWVkKTsKLQkJCQlhR3JvdXAuYWRkQ29waWVkKGNvcGllZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgc2luZ2xlIHZhbHVlIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBUZXN0czoKLQkgKiAKLQkgKiAxLiBJZiBhbiBhdHRyaWJ1dGUgdHlwZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBpdCBpcyBhbiBvYmplY3QgdHlwZSBhbmQgaXQgbXVzdCBiZQotCSAqIGNvcGllZC4gRG8gbm90IGNvcHkgdGhlIHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYW4gRW51bWVyYXRpb24gdHlwZS4gMi4gSWYgYW4gYXR0cmlidXRlCi0JICogdHlwZSBpcyA8Ym9sZD5ub3QgPC9ib2xkPiA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGNvcHkgdGhlIHZhbHVlIGJlZm9yZSBzZXR0aW5nIGl0IG9uCi0JICogPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5U2luZ2xlQXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0cmlidXRlLCBPYmplY3QgYVZhbHVlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmIChhdHRyaWJ1dGUuZ2V0RVR5cGUoKSA9PSBudWxsKSB7Ci0JCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBhVmFsdWUpOwotCQl9IGVsc2UgewotCQkJLy9NT0YxMDgKLQkJCS8vIGlmIChhdHRyaWJ1dGUuaXNPYmplY3RUeXBlKCkpCi0JCQlpZiAoYXR0cmlidXRlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpCi0JCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgY29udGFpbm1lbnRDb3B5KChFT2JqZWN0KSBhVmFsdWUsIGlkU3VmZml4KSk7Ci0JCQllbHNlCi0JCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgYVZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWNlaXZlci4gSWYgYSByZWZlcmVuY2UncyB2YWx1ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBhIHNlcmllcyBvZiB0ZXN0cyBhcmUgZG9uZSBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUgd2l0aCB0aGUKLQkgKiBjb3BpZWQgb2JqZWN0LCA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KLQkgKiAKLQkgKiBUZXN0czogMS4gSWYgdGhlIHJlZmVyZW5jZSBpcyA8Ym9sZD5ub3QgPC9ib2xkPiBtYW55LCBtYWtlIGEgY29weSBvZiB0aGUgdmFsdWUgaWYgdGhlCi0JICogcmVmZXJlbmNlIGlzIGNvbXBvc2l0ZSBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUgd2l0aCA8Y29kZT5jb3B5UmVmPC9jb2RlPjsgb3RoZXJ3aXNlLCBqdXN0Ci0JICogc2V0IHRoZSB2YWx1ZSBhcyBpcy4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlTaW5nbGVSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBFT2JqZWN0IGFWYWx1ZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQkvL0V4Y2VwdGlvbmFsIGNhc2U7IHRoZSByZWxhdGlvbnNoaXAgaXMgbm90IHRoZSBjb250YWluZXIgcmVsYXRpb25zaGlwCi0JCS8vQW5kIGlzIG5vdCBuYXZpZ2FibGUgaW4gdGhlIG90aGVyIGRpcmVjdGlvbjsgZ28gYWhlYWQgYW5kIGNvcHkKLQkJaWYgKGFWYWx1ZSAhPSBhUmVmT2JqZWN0LmVDb250YWluZXIoKSB8fCBhUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpID09IG51bGwpIHsKLQkJCWlmIChhUmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKSkKLQkJCQljb3B5UmVmLmVTZXQoYVJlZmVyZW5jZSwgY29udGFpbm1lbnRDb3B5KGFWYWx1ZSwgaWRTdWZmaXgpKTsKLQkJCWVsc2UKLQkJCQlhZGREZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHkoYVJlZmVyZW5jZSwgYVZhbHVlLCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCBSZXNvdXJjZXMgYW5kIFJlZk9iamVjdHMgd2l0aGluIDxjb2RlPmFHcm91cDwvY29kZT4gYW5kIGFkZCB0aGVtIHRvCi0JICogPGNvZGU+YUdyb3VwPC9jb2RlPi4gTm9uIGNvbXBvc2l0ZSByZWZlcmVuY2VzIHdpbGwgYmUgZGVmZXJyZWQgdW50aWwgYWxsIG9iamVjdHMgYXJlCi0JICogY29waWVkIGZyb20gPGNvZGU+YUdyb3VwPC9jb2RlPi4KLQkgKiAKLQkgKiBDb3B5IFJlc291cmNlcyBmaXJzdCBhbmQgdGhlbiBjb3B5IFJlZk9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlFdG9vbHNDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCXV0aWxpdHkuY29weShhR3JvdXApOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUF0dHJpYnV0ZUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBFT2JqZWN0IGNvcHlPYmplY3QpIHsKLQkJRXRvb2xzQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQl1dGlsaXR5LmNvcHlDdXJyZW50QXR0cmlidXRlcyhhUmVmT2JqZWN0LCBudWxsLCBjb3B5T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYWxsIHNldCBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzIGJhc2VkIG9uIGNvbnRhaW5tZW50LiBUaHVzLCBpdCB3aWxsIGNvcHkgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUuIFVzZSB0aGUgaWRTdWZmaXggdG8gZGVmaW5lIHRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZwotCSAqIElEcyBvZiBjb3BpZWQgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlQ29weShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvcHkoYVJlZk9iamVjdCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRXRvb2xzQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQlyZXR1cm4gdXRpbGl0eS5jb3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IDxjb2RlPmFSZXNvdXJjZTwvY29kZT4gdXNpbmcgPGNvZGU+bmV3VXJpPC9jb2RlPiBmb3IgdGhlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZUNvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IHV0aWxpdHkgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLQkJcmV0dXJuIHV0aWxpdHkuY29weShhUmVzb3VyY2UsIG5ld1VyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKSB7Ci0JCWlmIChwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IHByaW1HZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpLml0ZXJhdG9yKCk7Ci0JCQlEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24gYWN0aW9uOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFjdGlvbiA9IChEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24pIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb24ucGVyZm9ybUFjdGlvbigpOwotCQkJfQotCQkJcHJpbUdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzEzLzIwMDAgOToxNzozNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNoTWFwCi0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5IYXNoTWFwIGdldENvcGllZE9iamVjdHMoKSB7Ci0JCWlmIChjb3BpZWRPYmplY3RzID09IG51bGwpCi0JCQljb3BpZWRPYmplY3RzID0gbmV3IEhhc2hNYXAoMjAwKTsKLQkJcmV0dXJuIGNvcGllZE9iamVjdHM7Ci0JfQotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5IYXNoTWFwIGdldENvcGllZEFkYXB0ZXJzKCkgewotCQlpZiAoY29waWVkQWRhcHRlcnMgPT0gbnVsbCkKLQkJCWNvcGllZEFkYXB0ZXJzID0gbmV3IEhhc2hNYXAoMjAwKTsKLQkJcmV0dXJuIGNvcGllZEFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNhY2hlZCBjb3B5LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldENvcHkoRU9iamVjdCBhbk9iamVjdCkgewotCQlpZiAoYW5PYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVPYmplY3QpIGdldENvcGllZE9iamVjdHMoKS5nZXQoYW5PYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNhY2hlZCBjb3B5LCBpZiBub25lLCByZXR1cm4gdGhlIGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldENvcHlJZkZvdW5kKEVPYmplY3QgYW5PYmplY3QpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBnZXRDb3B5KGFuT2JqZWN0KTsKLQkJcmV0dXJuIGNvcGllZCA9PSBudWxsID8gYW5PYmplY3QgOiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjExOjMyIEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKSB7Ci0JCWlmIChkZWZlcnJlZFJlZmVyZW5jZUNvcGllcyA9PSBudWxsKQotCQkJZGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMgPSBuZXcgQXJyYXlMaXN0KDEwMCk7Ci0JCXJldHVybiBkZWZlcnJlZFJlZmVyZW5jZUNvcGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgRU9iamVjdCB0aGF0IGlzIHRoZSBzYW1lIHR5cGUgYXMgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4uCi0JICovCi0JcHVibGljIEVPYmplY3QgbmV3SW5zdGFuY2UoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCWlmIChhUmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRVBhY2thZ2UgZXBrZyA9IChFUGFja2FnZSkgYVJlZk9iamVjdC5lQ2xhc3MoKS5lQ29udGFpbmVyKCk7Ci0JCUVGYWN0b3J5IGZhY3RvcnkgPSBlcGtnLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJRUNsYXNzIHJlZk9iaiA9IGFSZWZPYmplY3QuZUNsYXNzKCk7Ci0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZShyZWZPYmopOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBSZXNvdXJjZSB0aGF0IHVzZXMgdGhlIHNhbWUgUmVzb3VyY2VGYWN0b3J5IGFzIHRoZSBvbmUgdXNlZCBieQotCSAqIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4uIElmIDxjb2RlPm5ld1VyaTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB1c2UgdGhlIFVSSQotCSAqIGZyb20gPGNvZGU+YVJlc291cmNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbmV3SW5zdGFuY2UoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCWlmIChhUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgaW5uZXJOZXdVcmkgPSBuZXdVcmk7Ci0JCVJlc291cmNlIG5ld1Jlc291cmNlOwotCQlTdHJpbmcgb3JpZ2luYWxVcmkgPSBhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJaW5uZXJOZXdVcmkgPSBpbm5lck5ld1VyaSA9PSBudWxsID8gb3JpZ2luYWxVcmkgOiBpbm5lck5ld1VyaTsKLQotCQlSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoYVJlc291cmNlLmdldFJlc291cmNlU2V0KCkgPT0gbnVsbCkKLQkJCWZhY3RvcnkgPSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShvcmlnaW5hbFVyaSkpOwotCQllbHNlCi0JCQlmYWN0b3J5ID0gYVJlc291cmNlLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkob3JpZ2luYWxVcmkpKTsKLQotCi0JCW5ld1Jlc291cmNlID0gZmFjdG9yeS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKGlubmVyTmV3VXJpKSk7Ci0JCXJldHVybiBuZXdSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPyBEZWZhdWx0cyB0byBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZXNlcnZlSWRzKCkgewotCQlyZXR1cm4gcHJlc2VydmVJZHM7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuIElmIGFuIGlkU3VmZml4IGRvZXMgbm90IGV4aXN0LCBkbyBub3Qgc2V0IGFuIGlkIG9uIHRoZSBjb3BpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Db3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmIChhUmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRU9iamVjdCBjb3B5UmVmID0gcHJpbUNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCi0JCWNvcHlDdXJyZW50UmVmZXJlbmNlcyhhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCXJldHVybiBjb3B5UmVmOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlIGNvbnRhaW5tZW50Ci0JICogdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIElEcyBvZgotCSAqIGNvcGllZCBvYmplY3RzLiBJZiBhbiBpZFN1ZmZpeCBkb2VzIG5vdCBleGlzdCwgZG8gbm90IHNldCBhbiBpZCBvbiB0aGUgY29waWVkIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBwcmltQ29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlpZiAoYVJlZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVPYmplY3QgY29weVJlZiA9IG5ld0luc3RhbmNlKGFSZWZPYmplY3QpOwotCi0JCXJlY29yZENvcHkoYVJlZk9iamVjdCwgY29weVJlZik7Ci0JCWNvcHlDdXJyZW50QXR0cmlidXRlcyhhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCWlmIChpc0NvcHlBZGFwdGVycygpKQotCQkJY29weUFkYXB0ZXJzKGFSZWZPYmplY3QsIGNvcHlSZWYpOwotCQlyZXR1cm4gY29weVJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5QWRhcHRlcnMoRU9iamVjdCBhUmVmT2JqZWN0LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJTGlzdCBhZGFwdGVycyA9IGFSZWZPYmplY3QuZUFkYXB0ZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5nZXQoaSk7Ci0JCQljb3B5QWRhcHRlcihhUmVmT2JqZWN0LCBjb3B5UmVmLCBhZGFwdGVyKTsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUFkYXB0ZXIoRU9iamVjdCBhUmVmT2JqZWN0LCBFT2JqZWN0IGNvcHlSZWYsIEFkYXB0ZXIgYWRhcHRlcikgewotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgQ2xvbmVhYmxlUHVibGljKSkKLQkJCXJldHVybjsKLQkJQ2xvbmVhYmxlUHVibGljIGNvcHlBZGFwdGVyID0gKENsb25lYWJsZVB1YmxpYykgZ2V0Q29waWVkQWRhcHRlcnMoKS5nZXQoYWRhcHRlcik7Ci0JCWlmIChjb3B5QWRhcHRlciA9PSBudWxsKSB7Ci0JCQljb3B5QWRhcHRlciA9IChDbG9uZWFibGVQdWJsaWMpICgoQ2xvbmVhYmxlUHVibGljKSBhZGFwdGVyKS5jbG9uZSgpOwotCQkJZ2V0Q29waWVkQWRhcHRlcnMoKS5wdXQoYWRhcHRlciwgY29weUFkYXB0ZXIpOwotCQl9Ci0JCWlmIChjb3B5QWRhcHRlciAhPSBudWxsKQotCQkJY29weVJlZi5lQWRhcHRlcnMoKS5hZGQoY29weUFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYW5kIHJlZmVyZW5jZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlCi0JICogY29udGFpbm1lbnQgdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCi0JICogSURzIG9mIGNvcGllZCBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBwcmltQ29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIGNvcHlSZXNvdXJjZSA9IG5ld0luc3RhbmNlKGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJY29weUV4dGVudChhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSwgY29weVJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQlyZXR1cm4gY29weVJlc291cmNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlNb2RpZmljYXRpb25GbGFnKFJlc291cmNlIGFSZXNvdXJjZSwgUmVzb3VyY2UgY29waWVkKSB7Ci0JCWlmIChhUmVzb3VyY2UuaXNNb2RpZmllZCgpKQotCQkJY29waWVkLnNldE1vZGlmaWVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOToxMTozMiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKSB7Ci0JCXJldHVybiBkZWZlcnJlZFJlZmVyZW5jZUNvcGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvcmRDb3B5KEVPYmplY3QgYVNvdXJjZSwgRU9iamVjdCBhQ29weSkgewotCQlnZXRDb3BpZWRPYmplY3RzKCkucHV0KGFTb3VyY2UsIGFDb3B5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvcmRDb3B5KEFkYXB0ZXIgYVNvdXJjZSwgQWRhcHRlciBhQ29weSkgewotCQlnZXRDb3BpZWRBZGFwdGVycygpLnB1dChhU291cmNlLCBhQ29weSk7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSBpZCBiZSBjb3BpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbm8gc3VmZml4IGlzIHNwZWNpZmllZD8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUlkcyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZXNlcnZlSWRzID0gdmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQ29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UpIHsKLQkJcmV0dXJuIGFSZWZlcmVuY2UuaXNDaGFuZ2VhYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29weUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gY29weUFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGFkYXB0ZXJzIHNob3VsZCBiZSBjb3BpZWQgYXMgd2VsbC4gSW4gb3JkZXIgZm9yIGFuIGFkYXB0ZXIgdG8KLQkgKiBiZSBjb3BpZWQsIGl0IG11c3QgaW1wbGVtZW50IHRoZSB7QGxpbmsgQ2xvbmVhYmxlUHVibGljfWludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5QWRhcHRlcnMoYm9vbGVhbiBiKSB7Ci0JCWNvcHlBZGFwdGVycyA9IGI7Ci0JfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDYyOWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeGNlcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLklXRlRXcmFwcGVkRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGZhY3RvciBjb21tb24gY29kZSBmb3IgaW1wbGVtZW50ZXJzIG9mIElBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKLQotCS8qKgotCSAqIFV0aWxpdHkgY2xhc3M7IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKLQkgKi8KLQlwcml2YXRlIEV4Y2VwdGlvbkhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGFuZAotCSAqICAgICAgICAgICAgICAgIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KDQpOwotCQltZXNzYWdlcy5hZGQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleGNlcHRpb24uZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCXdoaWxlIChuZXN0ZWQgIT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKG5lc3RlZC5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKG5lc3RlZCBpbnN0YW5jZW9mIElXRlRXcmFwcGVkRXhjZXB0aW9uKQotCQkJCW5lc3RlZCA9ICgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIG5lc3RlZCkuZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCQllbHNlCi0JCQkJbmVzdGVkID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBtZXNzYWdlcy50b0FycmF5KG5ldyBTdHJpbmdbbWVzc2FnZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tCi0JICogCi0JICogQGV4Y2VwdGlvbiBhbmQKLQkgKiAgICAgICAgICAgICAgICBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzCi0JICogICAgICAgICAgICAgICAgb25lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gZ2V0QWxsTWVzc2FnZXMoZXhjZXB0aW9uKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyNTYpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQobWVzc2FnZXNbaV0pOwotCQkJaWYgKGkgPCBtZXNzYWdlcy5sZW5ndGggLSAxKQotCQkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXh0ZW5kZWRFY29yZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMxYzQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwuRUFkYXB0ZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRFY29yZVV0aWwgZXh0ZW5kcyBFY29yZVV0aWwgewotCXByaXZhdGUgc3RhdGljIEZpbGVOb3RGb3VuZERldGVjdG9yIEZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBOQU1FX0FUVFJJQlVURV9TVFJJTkcgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIGludGVyZmFjZSBGaWxlTm90Rm91bmREZXRlY3RvciB7Ci0JCWJvb2xlYW4gaXNGaWxlTm90Rm91bmQoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWxlTm90Rm91bmREZXRlY3RvcihGaWxlTm90Rm91bmREZXRlY3RvciBkZXRlY3RvcikgewotCQlGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9IGRldGVjdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZU5vdEZvdW5kRGV0ZWN0b3IgZ2V0RmlsZU5vdEZvdW5kRGV0ZWN0b3IoKSB7Ci0JCWlmIChGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9PSBudWxsKSB7Ci0JCQlGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9IG5ldyBGaWxlTm90Rm91bmREZXRlY3RvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbGVOb3RGb3VuZChXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQkJCQlpZiAoZ2V0SW5uZXJGaWxlTm90Rm91bmRFeGNlcHRpb24od3JhcHBlZEV4KSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBGSUxFX05PVF9GT1VORF9ERVRFQ1RPUjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBnZXRJbm5lckZpbGVOb3RGb3VuZEV4Y2VwdGlvbihXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQlpZiAod3JhcHBlZEV4LmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCXJldHVybiAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSB3cmFwcGVkRXguZXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAod3JhcHBlZEV4LmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJcmV0dXJuIGdldElubmVyRmlsZU5vdEZvdW5kRXhjZXB0aW9uKChXcmFwcGVkRXhjZXB0aW9uKSB3cmFwcGVkRXguZXhjZXB0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlU2V0T3JBZGQoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJZVNldE9yQWRkKG9iaiwgZmVhdHVyZSwgdmFsdWUsIDApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlU2V0T3JBZGQoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBuZXdJbmRleCkgewotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAobmV3SW5kZXggPj0gMCkKLQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5hZGQobmV3SW5kZXgsIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5hZGQodmFsdWUpOwotCQl9IGVsc2UgewotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVVbnNldE9yUmVtb3ZlKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwgfHwgZmVhdHVyZS5pc01hbnkoKSkKLQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLnJlbW92ZSh2YWx1ZSk7Ci0JCWVsc2UKLQkJCW9iai5lVW5zZXQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuZHNXaXRoKFVSSSBzb3VyY2VVcmksIFVSSSB0ZXN0VXJpKSB7Ci0JCS8vVE9ETyBXYWl0aW5nIG9uIG5ldyBlbWYgVVJJIEFQSQotCQlTdHJpbmdbXSBzb3VyY2VTZWdtZW50cyA9IHNvdXJjZVVyaS5zZWdtZW50cygpOwotCQlTdHJpbmdbXSB0ZXN0U2VnbWVudHMgPSB0ZXN0VXJpLnNlZ21lbnRzKCk7Ci0JCWludCBpID0gdGVzdFNlZ21lbnRzLmxlbmd0aDsKLQkJaW50IGogPSBzb3VyY2VTZWdtZW50cy5sZW5ndGg7Ci0JCWlmIChqID49IGkpIHsKLQkJCWJvb2xlYW4gdGVzdCA9IHRydWU7Ci0KLQkJCXdoaWxlICh0ZXN0ICYmIGkgPiAwKSB7Ci0JCQkJaS0tOwotCQkJCWotLTsKLQkJCQl0ZXN0ID0gdGVzdFNlZ21lbnRzW2ldLmVxdWFscyhzb3VyY2VTZWdtZW50c1tqXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGVzdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVOYW1lZEVsZW1lbnQpCi0JCQlyZXR1cm4gKChFTmFtZWRFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJTGlzdCBhbGxBdHRzID0gb2JqLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gYWxsQXR0cy5zaXplKCk7Ci0JCUVBdHRyaWJ1dGUgYXR0LCBuYW1lQXR0cmlidXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWF0dCA9IChFQXR0cmlidXRlKSBhbGxBdHRzLmdldChpKTsKLQkJCWlmIChOQU1FX0FUVFJJQlVURV9TVFJJTkcuZXF1YWxzKGF0dC5nZXROYW1lKCkpKSB7Ci0JCQkJbmFtZUF0dHJpYnV0ZSA9IGF0dDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobmFtZUF0dHJpYnV0ZSAhPSBudWxsKQotCQkJcmV0dXJuIChTdHJpbmcpIG9iai5lR2V0KG5hbWVBdHRyaWJ1dGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgbmVlZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRMb2FkaW5nVGFnKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKElzTG9hZGluZ0RldGVjdG9yLklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgbmVlZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMb2FkaW5nVGFnKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vcmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKElzTG9hZGluZ0RldGVjdG9yLklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaXMgY3VycmVudGx5IGJlaW5nIGxvYWRlZC4gVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIGZvciB0aGUKLQkgKiBJc0xvYWRpbmdEZWN0b3IgaW4gdGhlIGxpc3Qgb2YgZUFkYXB0ZXJzIG9uIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiAKLQkgKiBAc2VlIGFkZExvYWRpbmdUYWcoUmVzb3VyY2UpCi0JICogQHNlZSByZW1vdmVMb2FkaW5nVGFnKFJlc291cmNlKQotCSAqICBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFJlc291cmNlLkludGVybmFsI2lzTG9hZGluZygpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvYWRpbmcoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgPyAoKFJlc291cmNlLkludGVybmFsKXJlc291cmNlKS5pc0xvYWRpbmcoKSA6IGZhbHNlOyAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckZvckxvYWRpbmcoQWRhcHRlciB0YXJnZXRBZGFwdGVyLCBFT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlSZXNvdXJjZSByZXMgPSB0YXJnZXRPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCB8fCBpc0xvYWRpbmcocmVzKSkKLQkJCXJldHVybiBuZXcgSXNMb2FkaW5nUHJveHlBZGFwdGVyKHRhcmdldEFkYXB0ZXIsIHRhcmdldE9iamVjdCk7Ci0JCXJldHVybiB0YXJnZXRBZGFwdGVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmVSZWdpc3RlclBhY2thZ2UoU3RyaW5nIG5zUHJlZml4LCBFUGFja2FnZS5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKCFFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5jb250YWluc0tleShuc1ByZWZpeCkpCi0JCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQobnNQcmVmaXgsIGRlc2NyaXB0b3IpOwotCX0KLQkvKioKLQkgICAqIFJldHVybnMgdGhlIGFkYXB0ZXIgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIEBwYXJhbSBhbk9iamVjdCAKLQkgICAqIEBwYXJhbSBhZGFwdGVycyBsaXN0IG9mIGFkYXB0ZXJzIHRvIHNlYXJjaC4KLQkgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIGFkYXB0ZXIuCi0JICAgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZnJvbSB0aGUgbGlzdCBvciBudWxsLgotCSAgICovCi0JICBwdWJsaWMgc3RhdGljIEFkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGFuT2JqZWN0LCBMaXN0IGFkYXB0ZXJzLCBPYmplY3QgdHlwZSkgewotCi0JCSAgCU9iamVjdCBbXSBhZGFwdEFycmF5ID0gKChFQWRhcHRlckxpc3QpYWRhcHRlcnMpLmRhdGEoKTsKLQkJICAJaWYgKGFkYXB0QXJyYXkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRBcnJheVtpXTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSkgewotCQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhpcyBvYmplY3QgZnJvbSBpdCdzIGNvbnRhaW5lciwgYW5kIG1ha2UgaXQgYW5kIGFsbCBpdCdzIGNoaWxkcmVuCi0JICogcHJveGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmxvYWQoRU9iamVjdCByb290KSB7Ci0JCVJlc291cmNlIHJlcyA9IHJvb3QuZVJlc291cmNlKCk7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gcm9vdC5lQ29udGFpbmVyKCk7Ci0JCS8qIE1ha2luZyBzdXJlIHRoZSBwcm94eSBpcyBjcmVhdGVkIGZpcnN0IGJlZm9yZSB1bmxvYWRpbmcgKi8KLQkJaWYgKHJlcyAhPSBudWxsKQotCQkJYmVjb21lUHJveHkocm9vdCwgcmVzKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShyb290KTsKLQkJCWVsc2UgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gcm9vdC5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCQkJZVVuc2V0T3JSZW1vdmUoY29udGFpbmVyLCBmZWF0dXJlLCByb290KTsKLQkJCX0KLQkJCi0JfQotCi0JLyoqCi0JICogVHVybnMgdGhpcyBvYmplY3QgYW5kIGFsbCBpdCdzIGNoaWxkcmVuIHRvIHByb3hpZXMsIGFuZCByZW1vdmVzIGFkYXB0ZXJzIHByZWNvbmRpdGlvbjogVGhlCi0JICogb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBpdCdzIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWNvbWVQcm94eShFT2JqZWN0IHJvb3QsIFJlc291cmNlIHJlcykgewotCQlJdGVyYXRvciBpdGVyID0gcm9vdC5lQWxsQ29udGVudHMoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlkb0JlY29tZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpLCByZXMpOwotCQl9Ci0JCWRvQmVjb21lUHJveHkoKEludGVybmFsRU9iamVjdCkgcm9vdCwgcmVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZG9CZWNvbWVQcm94eShJbnRlcm5hbEVPYmplY3QgcCwgUmVzb3VyY2UgcmVzKSB7Ci0JCVN0cmluZyBpZCA9IHJlcy5nZXRVUklGcmFnbWVudChwKTsKLQkJcC5lU2V0UHJveHlVUkkocmVzLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCWlmIChyZXMgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgewotCQkJKChYTUxSZXNvdXJjZSkgcmVzKS5zZXRJRChwLG51bGwpOwotCQl9Ci0JCXAuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHJveHkoRU9iamVjdCByb290LCBSZXNvdXJjZSByZXMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHJvb3QuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZG9SZW1vdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSwgcmVzKTsKLQkJfQotCQlkb1JlbW92ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHJvb3QsIHJlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRvUmVtb3ZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHAsIFJlc291cmNlIHJlcykgewotCQlTdHJpbmcgaWQgPSBwLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCWlmIChyZXMgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgewotCQkJKChYTUxSZXNvdXJjZSkgcmVzKS5zZXRJRChwLCBpZCk7Ci0JCX0KLQkJcC5lU2V0UHJveHlVUkkobnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBFbnN1cmVzIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG5vdCBhIHByb3h5OyBpZiBpdCBpcywgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoZSBiYWQKLQkgKiBIUkVGLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIGRvZXMgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHRocm93cyBEYW5nbGluZ0hSRUZFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tQcm94eShFT2JqZWN0IG9iamVjdCkgdGhyb3dzIERhbmdsaW5nSFJFRkV4Y2VwdGlvbiB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCAhb2JqZWN0LmVJc1Byb3h5KCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBtc2cgPSBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuREFOR0xJTkdfSFJFRl9FUlJPUl8sIG5ldyBPYmplY3RbXXsoKEludGVybmFsRU9iamVjdCkgb2JqZWN0KS5lUHJveHlVUkkoKX0pOwotCQl0aHJvdyBuZXcgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgbzEgYW5kIG8yIGFyZSBub3QgdGhlIHNhbWUgdmFsdWVzLiBUaGlzIGltcGxlbWVudGF0aW9uIHRha2VzIGludG8gYWNjb3VudCB0aGF0Ci0JICogZWl0aGVyIHBhcmFtZXRlciBjYW4gYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbzEKLQkgKiBAcGFyYW0gbzIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbHVlQ2hhbmdlZChPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlyZXR1cm4gKG8xID09IG51bGwgXiBvMiA9PSBudWxsKSB8fCAobzEgPT0gbnVsbCB8fCAhbzEuZXF1YWxzKG8yKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjMjRkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTkwODkxNjQ4MzMzODE0MjAxTDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZhNjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9GZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS8xMC8yMDAxIDI6NDY6NTQgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgewotCXN0YXRpYyBmaW5hbCBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgREVGQVVMVCA9IG5ldyBEZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byB0aGUgdHlwZSBvZgotCSAqIEBhRmVhdHVyZS4KLQkgKi8KLQlPYmplY3QgY29udmVydFZhbHVlKE9iamVjdCBhVmFsdWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkODE3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gTW91cnJhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmQgewotCi0JLyoKLQkgKiBUaGlzIHdpbGwgY29udGFpbiB0aGUgbXVsdGktc2VsZWN0aW9uIG9mIG9iamVjdHMgdG8gZGVwbG95LiBUaGlzIHNlbGVjdGlvbiBjb3VsZCBiZSB1c2VkIHRvCi0JICogZmlsdGVyIGVsZW1lbnRzIHdpdGhpbiBhIE1vZHVsZS4gQW55IG90aGVyIHNldHVwIGNvZGUgc2hvdWxkIGJlIGRvbmUgaGVyZS4uLgotCSAqLwotCXZvaWQgaW5pdChPYmplY3RbXSBzZWxlY3Rpb24pOwotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBJQ29tbWFuZENvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZENvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0MjcxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi0vKioKLSAqIEBhdXRob3IgSm9obiBNb3VycmEKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZENvbnRleHQgewotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JRFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JRFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhMDIyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSURVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIElEVXRpbCB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHRvIGFzc2lnbiBhIHVuaXF1ZSBJRCB0byB0aGUgb2JqZWN0LiBUaGUgb2JqZWN0IG11c3QgYmUgY29udGFpbmVkIGluIGEKLQkgKiByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzaWduSUQoRU9iamVjdCBvYmplY3QpIHsKLQkJUmVzb3VyY2UgYVJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpCi0JCQlhc3NpZ25JRChvYmplY3QsIChYTUxSZXNvdXJjZSkgYVJlc291cmNlKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9yQXNzaWduSUQoRU9iamVjdCBvYmplY3QpIHsKLQkJUmVzb3VyY2UgYVJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpCi0JCQlyZXR1cm4gZ2V0T3JBc3NpZ25JRChvYmplY3QsIChYTUxSZXNvdXJjZSkgYVJlc291cmNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3JBc3NpZ25JRChFT2JqZWN0IG9iamVjdCwgWE1MUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCVN0cmluZyBpZCA9IGFSZXNvdXJjZS5nZXRJRChvYmplY3QpOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBhc3NpZ25JRChvYmplY3QsIGFSZXNvdXJjZSk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3NpZ25JRChFT2JqZWN0IG9iamVjdCwgWE1MUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QmFzZUlERm9yQXNzaWdubWVudChvYmplY3QpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBpZCA9IGVuc3VyZVVuaXF1ZUlEKGFSZXNvdXJjZSwgbmFtZSk7Ci0JCWFSZXNvdXJjZS5zZXRJRChvYmplY3QsIGlkKTsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGVuc3VyZVVuaXF1ZUlEKFhNTFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIGJhc2VJRE5hbWUpIHsKLQkJU3RyaW5nIGlubmVyQmFzZUlETmFtZSA9IGJhc2VJRE5hbWU7Ci0JCWlubmVyQmFzZUlETmFtZSArPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQkJLy9DaGFuZ2UgdG8gdXNlIHRoZSBjdXJyZW50IHRpbWUgaW5zdGVhZCBvZiBpbmNyZW1lbnRhbCBudW1iZXJzIHRvIGhlbHAKLQkJLy9zdXBwb3J0IHRlYW0gZGV2ZWxvcG1lbnQuCi0JCWxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJU3RyaW5nIGlkID0gaW5uZXJCYXNlSUROYW1lICsgY3VycmVudFRpbWU7Ci0JCXdoaWxlIChhUmVzb3VyY2UuZ2V0RU9iamVjdChpZCkgIT0gbnVsbCkgewotCQkJKytjdXJyZW50VGltZTsKLQkJCWlkID0gaW5uZXJCYXNlSUROYW1lICsgY3VycmVudFRpbWU7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEJhc2VJREZvckFzc2lnbm1lbnQoRU9iamVjdCBvYmplY3QpIHsKLQkJRUNsYXNzIG1ldGFPID0gb2JqZWN0LmVDbGFzcygpOwotCQlyZXR1cm4gbWV0YU8uZ2V0TmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGI4ZDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xODc4NTc0NDAxMDIxNTkwNTQ1TDsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxYzA2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjIxMTk0Mjg1Mzc5NjgyMzg0MEw7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwM2U2NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMzIwNzU5NzUyNzA2ODk4MDk1TDsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ0RldGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkMTE0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUKLSAqIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi0KLXB1YmxpYyBjbGFzcyBJc0xvYWRpbmdEZXRlY3RvciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgSXNMb2FkaW5nRGV0ZWN0b3IgSU5TVEFOQ0UgPSBuZXcgSXNMb2FkaW5nRGV0ZWN0b3IoKTsKLQotCXByaXZhdGUgSXNMb2FkaW5nRGV0ZWN0b3IoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JfQotCi0JcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gdGhpczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ1Byb3h5QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ1Byb3h5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJmZThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdQcm94eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJc0xvYWRpbmdQcm94eUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQlwcml2YXRlIEFkYXB0ZXIgdGFyZ2V0QWRhcHRlcjsKLQlwcml2YXRlIEVPYmplY3QgdGFyZ2V0T2JqZWN0OwotCi0JcHVibGljIElzTG9hZGluZ1Byb3h5QWRhcHRlcihBZGFwdGVyIGFUYXJnZXRBZGFwdGVyLCBFT2JqZWN0IGFUYXJnZXRPYmplY3QpIHsKLQkJdGFyZ2V0QWRhcHRlciA9IGFUYXJnZXRBZGFwdGVyOwotCQl0YXJnZXRPYmplY3QgPSBhVGFyZ2V0T2JqZWN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCS8vbGlzdGVuIGZvciB0aGUgcmVtb3ZlIG9mIHRoZSBsb2FkaW5nIGFkYXB0ZXIKLQkJCWlmIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQgJiYgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQpIHsKLQkJCQlyZW1vdmVQcm94eVN1cHBvcnQoKTsKLQkJCQlyZXNldCgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGNhY2hlUmVzb3VyY2UoKSkgewotCQkJdGFyZ2V0QWRhcHRlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXNldCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgdGhlIHJlc291cmNlIHZhcmlhYmxlIGFuZCByZXR1cm4gdHJ1ZSBpZiB3ZSByZW1vdmVkIHRoZSBwcm94eSBzdXBwb3J0LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYWNoZVJlc291cmNlKCkgewotCQlpZiAoZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGdldFRhcmdldCgpOwotCQkJcmVzb3VyY2UgPSBlT2JqLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQllT2JqLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCQlpZiAoRXh0ZW5kZWRFY29yZVV0aWwuaXNMb2FkaW5nKHJlc291cmNlKSkKLQkJCQkJcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJCWVsc2UgewotCQkJCQl0YXJnZXRPYmplY3QuZUFkYXB0ZXJzKCkuYWRkKHRhcmdldEFkYXB0ZXIpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJveHlTdXBwb3J0KCkgewotCQlnZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXRhcmdldE9iamVjdC5lQWRhcHRlcnMoKS5hZGQodGFyZ2V0QWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotCQlyZXNvdXJjZSA9IG51bGw7Ci0JCXRhcmdldEFkYXB0ZXIgPSBudWxsOwotCQl0YXJnZXRPYmplY3QgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRhNzM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyMCwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4OwotCXByb3RlY3RlZCBTdHJpbmcgbnNVUkk7Ci0KLQotCXB1YmxpYyBOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJdGhpcy5uc1VSSSA9IHVyaTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5zVVJJKCkgewotCQlyZXR1cm4gbnNVUkk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TnNVUkkoU3RyaW5nIHN0cmluZykgewotCQluc1VSSSA9IHN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHN0cmluZykgewotCQlwcmVmaXggPSBzdHJpbmc7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODg5MmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotCi0vKioKLSAqIEludGVybmFsIGNsYXNzIHVzZWQgdG8gaG9sZCBuYW1lc3BhY2VzIHBhcnNlZCBmcm9tIGFuIFhNTCBmaWxlIHVzaW5nIHRoZSB4bWxuczpwcmVmaXg9ImFVUkkiCi0gKiBzeW50YXgKLSAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIENsb25lYWJsZVB1YmxpYyB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBREFQVEVSX1RZUEUgPSBOYW1lc3BhY2VBZGFwdGVyLmNsYXNzLmdldE5hbWUoKTsKLQlwcm90ZWN0ZWQgTWFwIHByZWZpeGVzVG9OUzsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VzOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgTk9USUZJQ0FUSU9OX0ZFQVRVUkUgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCgpIHsKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm90aWZpY2F0aW9uIGV4dGVuZHMgTm90aWZpY2F0aW9uSW1wbCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBldmVudFR5cGUKLQkJICogQHBhcmFtIG9sZFZhbHVlCi0JCSAqIEBwYXJhbSBuZXdWYWx1ZQotCQkgKi8KLQkJcHVibGljIE5vdGlmaWNhdGlvbihpbnQgZXZlbnRUeXBlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoZXZlbnRUeXBlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGwjZ2V0RmVhdHVyZSgpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKCkgewotCQkJcmV0dXJuIE5PVElGSUNBVElPTl9GRUFUVVJFOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIuYWRkTmFtZXNwYWNlKHByZWZpeCwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCk7Ci0JfQotCi0JLyoqCi0JICogRmFjYWRlIG1ldGhvZCBmb3IgcmVzb2x2aW5nIHByZWZpeGVzIHRvIGFuIGFjdHVhbCBuYW1lc3BhY2UgVVJJLiBVc2VkIGZvciBvYmplY3RzIGNvbnRhaW5lZAotCSAqIGJ5IGluc3RhbmNlcyBvZiB7QGxpbmsgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2V9LiBXYWxrcyB1cCB0aGUgb2JqZWN0Ci0JICogY29udGFpbm1lbnQgcGF0aCB1bnRpbCBhIG5hbWVzcGFjZSBpcyBmb3VuZCwgb3IgcmV0dXJucyBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc29sdmVkTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgsIEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG9iajsKLQkJU3RyaW5nIG5zVVJJOwotCQl3aGlsZSAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCW5zVVJJID0gZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwocHJlZml4LCBjb250YWluZXIpOwotCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJcmV0dXJuIG5zVVJJOwotCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lc3BhY2VVUklBdFRoaXNMZXZlbChTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IG51bGwgOiBhZGFwdGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXROYW1lc3BhY2VzKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlOYW1lc3BhY2VBZGFwdGVyIGFkYXB0ZXIgPSByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihvYmopOwotCQlyZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZ2V0TmFtZXNwYWNlcygpOwotCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAoTmFtZXNwYWNlQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihvYmosIEFEQVBURVJfVFlQRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBvYmopIHsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IGNyZWF0ZUFkYXB0ZXIob2JqKSA6IGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoRU9iamVjdCBvYmopIHsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gbmV3IE5hbWVzcGFjZUFkYXB0ZXIoKTsKLQkJYWRhcHRlci5zZXRUYXJnZXQob2JqKTsKLQkJb2JqLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJTmFtZXNwYWNlIG5zID0gbmV3IE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0JCWlmIChuYW1lc3BhY2VzID09IG51bGwpCi0JCQluYW1lc3BhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJlZml4ZXNUb05TID09IG51bGwpCi0JCQlwcmVmaXhlc1RvTlMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByZWZpeGVzVG9OUy5wdXQocHJlZml4LCBucyk7Ci0JCW5hbWVzcGFjZXMuYWRkKG5zKTsKLQkJZmlyZU5vdGlmaWNhdGlvbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uQURELCBudWxsLCBucyk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgewotCQlOYW1lc3BhY2UgbnMgPSBudWxsOwotCQlpZiAocHJlZml4ZXNUb05TICE9IG51bGwpCi0JCQlucyA9IChOYW1lc3BhY2UpIHByZWZpeGVzVG9OUy5nZXQocHJlZml4KTsKLQotCQlpZiAobnMgIT0gbnVsbCkKLQkJCW5hbWVzcGFjZXMucmVtb3ZlKG5zKTsKLQkJZmlyZU5vdGlmaWNhdGlvbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uUkVNT1ZFLCBucywgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAocHJlZml4ZXNUb05TID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSkgcHJlZml4ZXNUb05TLmdldChwcmVmaXgpOwotCQlpZiAobnMgIT0gbnVsbCkKLQkJCXJldHVybiBucy5nZXROc1VSSSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIEFEQVBURVJfVFlQRS5lcXVhbHModHlwZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlcygpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZXMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5hbWVzcGFjZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVOb3RpZmljYXRpb24oaW50IHR5cGUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCXRhcmdldC5lTm90aWZ5KG5ldyBOb3RpZmljYXRpb24odHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmFtZXNwYWNlcygpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZXMgIT0gbnVsbCAmJiAhbmFtZXNwYWNlcy5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYuZWNvcmUudXRpbGl0aWVzLkNsb25lYWJsZVB1YmxpYyNjbG9uZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJTmFtZXNwYWNlQWRhcHRlciByZXN1bHQgPSBuZXcgTmFtZXNwYWNlQWRhcHRlcigpOwotCQlpZiAoaGFzTmFtZXNwYWNlcygpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlOYW1lc3BhY2UgbnMgPSAoTmFtZXNwYWNlKSBuYW1lc3BhY2VzLmdldChpKTsKLQkJCQlyZXN1bHQuYWRkTmFtZXNwYWNlKG5zLmdldFByZWZpeCgpLCBucy5nZXROc1VSSSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N0aHJ1RW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Njc3ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N0aHJ1RW5jb2RlckRlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBIHBhc3N0aHJ1IEVuY29kZXJEZWNvZGVyIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXNzdGhydUVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXJBZGFwdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhc3N0aHJ1RW5jb2RlckRlY29kZXIgSU5TVEFOQ0UgPSBuZXcgUGFzc3RocnVFbmNvZGVyRGVjb2RlcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogRW5jb2RlckRlY29kZXJBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQYXNzdGhydUVuY29kZXJEZWNvZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZENpcGhlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZENpcGhlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNzE1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRDaXBoZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFBhc3N3b3JkQ2lwaGVyVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TW10gPSB7InhvciJ9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXNbXTsKLQotCXB1YmxpYyBQYXNzd29yZENpcGhlclV0aWwoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBieXRlW10gZGVjaXBoZXIoYnl0ZSBhYnl0ZTBbXSwgU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXSkpCi0JCQlhYnl0ZTEgPSB4b3IoYWJ5dGUwKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGFieXRlMSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbigpOwotCi0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBieXRlW10gZW5jaXBoZXIoYnl0ZSBhYnl0ZTBbXSwgU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXSkpCi0JCQlhYnl0ZTEgPSB4b3IoYWJ5dGUwKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGFieXRlMSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbigpOwotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtcygpIHsKLQkJcmV0dXJuIF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHhvcihieXRlIGFieXRlMFtdKSB7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQlpZiAoYWJ5dGUwICE9IG51bGwpIHsKLQkJCWFieXRlMSA9IG5ldyBieXRlW2FieXRlMC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhYnl0ZTAubGVuZ3RoOyBpKyspCi0JCQkJYWJ5dGUxW2ldID0gKGJ5dGUpICgweDVmIF4gYWJ5dGUwW2ldKTsKLQkJfQotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXN0YXRpYyB7Ci0JCV9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXMgPSBudWxsOwotCQlpZiAoX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9PSBudWxsKQotCQkJX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9IERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNGVmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBQYXNzd29yZEVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXJBZGFwdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSAicGFzc3dvcmQtc2VjdXJpdHktY29kZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUGFzc3dvcmRFbmNvZGVyRGVjb2RlcigpIHsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgewotCQlyZXR1cm4gUGFzc3dvcmRVdGlsLnBhc3N3b3JkRGVjb2RlKHMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBQYXNzd29yZFV0aWwucGFzc3dvcmRFbmNvZGUocyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCXJldHVybiBLRVk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2YTk3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFBhc3N3b3JkVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0NPTlZFUlNJT05fQ09ERSA9ICJVVEY4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfQllURV9BUlJBWSA9IG5ldyBieXRlWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ1JZUFRPX0FMR09SSVRITTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TW107Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCQVNFNjRfRU5DT0RFX01BUFtdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQkFTRTY0X0RFQ09ERV9NQVBbXTsKLQotCXB1YmxpYyBQYXNzd29yZFV0aWwoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB0aHJvd3MgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbigpOwotCQlTdHJpbmcgczEgPSBnZXRDcnlwdG9BbGdvcml0aG0ocyk7Ci0JCWlmIChzMSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKCFpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKHMxKSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCi0JCVN0cmluZyBzMiA9IGRlY29kZV9wYXNzd29yZChyZW1vdmVDcnlwdG9BbGdvcml0aG1UYWcocyksIHMxKTsKLQkJaWYgKHMyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHMyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgdGhyb3dzIEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbmNvZGUocywgREVGQVVMVF9DUllQVE9fQUxHT1JJVEhNKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBzMSkgdGhyb3dzIEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZENyeXB0b0FsZ29yaXRobShzMSkpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24oKTsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbigpOwotCi0JCWlmIChnZXRDcnlwdG9BbGdvcml0aG0ocykgIT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbigpOwotCi0JCVN0cmluZyBzMiA9IGVuY29kZV9wYXNzd29yZChzLnRyaW0oKSwgczEudHJpbSgpKTsKLQkJaWYgKHMyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHMyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENyeXB0b0FsZ29yaXRobShTdHJpbmcgcykgewotCQlTdHJpbmcgczEgPSBudWxsOwotCQlTdHJpbmcgaW5uZXJTID0gczsKLQkJaWYgKGlubmVyUyAhPSBudWxsKSB7Ci0JCQlpbm5lclMgPSBpbm5lclMudHJpbSgpOwotCQkJaWYgKGlubmVyUy5sZW5ndGgoKSA+PSAyKSB7Ci0JCQkJaW50IGkgPSBpbm5lclMuaW5kZXhPZigieyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlpbnQgaiA9IGlubmVyUy5pbmRleE9mKCJ9IiwgKytpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaiA+IDApCi0JCQkJCQlpZiAoaSA8IGopCi0JCQkJCQkJczEgPSBpbm5lclMuc3Vic3RyaW5nKGksIGopLnRyaW0oKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzMSA9IEVNUFRZX1NUUklORzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHMxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENyeXB0b0FsZ29yaXRobVRhZyhTdHJpbmcgcykgewotCQlTdHJpbmcgczEgPSBudWxsOwotCQlTdHJpbmcgczIgPSBnZXRDcnlwdG9BbGdvcml0aG0ocyk7Ci0JCWlmIChzMiAhPSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoczIubGVuZ3RoKCkgPiAwKQotCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoczIpOwotCQkJc3RyaW5nYnVmZmVyLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCi0JCQlzMSA9IHN0cmluZ2J1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENyeXB0b0FsZ29yaXRobShTdHJpbmcgcykgewotCQlTdHJpbmcgaW5uZXJTID0gczsKLQkJaWYgKGlubmVyUyAhPSBudWxsKSB7Ci0JCQlpbm5lclMgPSBpbm5lclMudHJpbSgpOwotCQkJaWYgKGlubmVyUy5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGlubmVyUy5lcXVhbHNJZ25vcmVDYXNlKFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1tpXSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENyeXB0b0FsZ29yaXRobVRhZyhTdHJpbmcgcykgewotCQlyZXR1cm4gaXNWYWxpZENyeXB0b0FsZ29yaXRobShnZXRDcnlwdG9BbGdvcml0aG0ocykpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3N3b3JkRGVjb2RlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHMxID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczEgPT0gbnVsbCkKLQkJCXJldHVybiBzOwotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWNvZGVfcGFzc3dvcmQocmVtb3ZlQ3J5cHRvQWxnb3JpdGhtVGFnKHMpLCBzMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzc3dvcmRFbmNvZGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHBhc3N3b3JkRW5jb2RlKHMsIERFRkFVTFRfQ1JZUFRPX0FMR09SSVRITSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzc3dvcmRFbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBzMSkgewotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHMyID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczIgIT0gbnVsbCkgewotCQkJaWYgKHMyLmVxdWFsc0lnbm9yZUNhc2UoczEudHJpbSgpKSkKLQkJCQlyZXR1cm4gcy50cmltKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jb2RlX3Bhc3N3b3JkKHMudHJpbSgpLCBzMS50cmltKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUNyeXB0b0FsZ29yaXRobVRhZyhTdHJpbmcgcykgewotCQlTdHJpbmcgczEgPSBudWxsOwotCQlTdHJpbmcgaW5uZXJTID0gczsKLQkJaWYgKGlubmVyUyAhPSBudWxsKSB7Ci0JCQlpbm5lclMgPSBpbm5lclMudHJpbSgpOwotCQkJaWYgKGlubmVyUy5sZW5ndGgoKSA+PSAyKSB7Ci0JCQkJaW50IGkgPSBpbm5lclMuaW5kZXhPZigieyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlpbnQgaiA9IGlubmVyUy5pbmRleE9mKCJ9IiwgKytpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaiA+IDApCi0JCQkJCQlpZiAoKytqIDwgaW5uZXJTLmxlbmd0aCgpKQotCQkJCQkJCXMxID0gaW5uZXJTLnN1YnN0cmluZyhqKS50cmltKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJczEgPSBFTVBUWV9TVFJJTkc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gY29udmVydF90b19ieXRlcyhTdHJpbmcgcykgewotCQlieXRlIGFieXRlMFtdID0gbnVsbDsKLQkJaWYgKHMgIT0gbnVsbCkKLQkJCWlmIChzLmxlbmd0aCgpID09IDApCi0JCQkJYWJ5dGUwID0gRU1QVFlfQllURV9BUlJBWTsKLQkJCWVsc2UKLQkJCQl0cnkgewotCQkJCQlhYnl0ZTAgPSBzLmdldEJ5dGVzKFNUUklOR19DT05WRVJTSU9OX0NPREUpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdW5zdXBwb3J0ZWRlbmNvZGluZ2V4Y2VwdGlvbikgewotCQkJCQkvL2RvIG5vdGhpbmcKLQkJCQl9Ci0JCXJldHVybiBhYnl0ZTA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRfdG9fc3RyaW5nKGJ5dGUgYWJ5dGUwW10pIHsKLQkJU3RyaW5nIHMgPSBudWxsOwotCQlpZiAoYWJ5dGUwICE9IG51bGwpCi0JCQlpZiAoYWJ5dGUwLmxlbmd0aCA9PSAwKQotCQkJCXMgPSBFTVBUWV9TVFJJTkc7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJcyA9IG5ldyBTdHJpbmcoYWJ5dGUwLCBTVFJJTkdfQ09OVkVSU0lPTl9DT0RFKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVuc3VwcG9ydGVkZW5jb2RpbmdleGNlcHRpb24pIHsKLQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gY29udmVydF92aWV3YWJsZV90b19ieXRlcyhTdHJpbmcgcykgewotCQlieXRlIGFieXRlMFtdID0gbnVsbDsKLQkJaWYgKHMgIT0gbnVsbCkKLQkJCWlmIChzLmxlbmd0aCgpID09IDApCi0JCQkJYWJ5dGUwID0gRU1QVFlfQllURV9BUlJBWTsKLQkJCWVsc2UKLQkJCQl0cnkgewotCQkJCQlhYnl0ZTAgPSBiYXNlNjREZWNvZGUoY29udmVydF90b19ieXRlcyhzKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlhYnl0ZTAgPSBudWxsOwotCQkJCX0KLQkJcmV0dXJuIGFieXRlMDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYmFzZTY0RGVjb2RlKGJ5dGUgYWJ5dGUwW10pIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IGFieXRlMC5sZW5ndGg7IGFieXRlMFstLWldID09IDYxOyl7Ci0JCQkvL2RvIG5vdGhpbmcganVzdCBmaW5kaW5nIGluZGV4IG9mIDYxCi0JCX0KLQkJYnl0ZSBhYnl0ZTFbXSA9IG5ldyBieXRlWyhpICsgMSkgLSBhYnl0ZTAubGVuZ3RoIC8gNF07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgYWJ5dGUwLmxlbmd0aDsgaisrKQotCQkJYWJ5dGUwW2pdID0gQkFTRTY0X0RFQ09ERV9NQVBbYWJ5dGUwW2pdXTsKLQkJaW50IGsgPSBhYnl0ZTEubGVuZ3RoIC0gMjsKLQkJaW50IGwgPSAwOwotCQlpbnQgaTE7Ci0JCWZvciAoaTEgPSAwOyBsIDwgazsgaTEgKz0gNCkgewotCQkJYWJ5dGUxW2xdID0gKGJ5dGUpIChhYnl0ZTBbaTFdIDw8IDIgJiAweGZmIHwgYWJ5dGUwW2kxICsgMV0gPj4+IDQgJiAweDMpOwotCQkJYWJ5dGUxW2wgKyAxXSA9IChieXRlKSAoYWJ5dGUwW2kxICsgMV0gPDwgNCAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAyXSA+Pj4gMiAmIDB4Zik7Ci0JCQlhYnl0ZTFbbCArIDJdID0gKGJ5dGUpIChhYnl0ZTBbaTEgKyAyXSA8PCA2ICYgMHhmZiB8IGFieXRlMFtpMSArIDNdICYgMHgzZik7Ci0JCQlsICs9IDM7Ci0JCX0KLQkJaWYgKGwgPCBhYnl0ZTEubGVuZ3RoKSB7Ci0JCQlhYnl0ZTFbbCsrXSA9IChieXRlKSAoYWJ5dGUwW2kxXSA8PCAyICYgMHhmZiB8IGFieXRlMFtpMSArIDFdID4+PiA0ICYgMHgzKTsKLQkJCWlmIChsIDwgYWJ5dGUxLmxlbmd0aCkKLQkJCQlhYnl0ZTFbbF0gPSAoYnl0ZSkgKGFieXRlMFtpMSArIDFdIDw8IDQgJiAweGZmIHwgYWJ5dGUwW2kxICsgMl0gPj4+IDIgJiAweGYpOwotCQl9Ci0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRfdmlld2FibGVfdG9fc3RyaW5nKGJ5dGUgYWJ5dGUwW10pIHsKLQkJU3RyaW5nIHMgPSBudWxsOwotCQlpZiAoYWJ5dGUwICE9IG51bGwpCi0JCQlpZiAoYWJ5dGUwLmxlbmd0aCA9PSAwKQotCQkJCXMgPSBFTVBUWV9TVFJJTkc7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJcyA9IGNvbnZlcnRfdG9fc3RyaW5nKGJhc2U2NEVuY29kZShhYnl0ZTApKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCXMgPSBudWxsOwotCQkJCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJhc2U2NEVuY29kZShieXRlIGFieXRlMFtdKSB7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBuZXcgYnl0ZVsoKGFieXRlMC5sZW5ndGggKyAyKSAvIDMpICogNF07Ci0JCWludCBpID0gMDsKLQkJaW50IGogPSAwOwotCQlmb3IgKDsgaSA8IGFieXRlMC5sZW5ndGggLSAyOyBpICs9IDMpIHsKLQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2ldID4+PiAyICYgMHgzZl07Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpICsgMV0gPj4+IDQgJiAweGYgfCBhYnl0ZTBbaV0gPDwgNCAmIDB4M2ZdOwotCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDJdID4+PiA2ICYgMHgzIHwgYWJ5dGUwW2kgKyAxXSA8PCAyICYgMHgzZl07Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpICsgMl0gJiAweDNmXTsKLQkJfQotCQlpZiAoaSA8IGFieXRlMC5sZW5ndGgpIHsKLQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2ldID4+PiAyICYgMHgzZl07Ci0JCQlpZiAoaSA8IGFieXRlMC5sZW5ndGggLSAxKSB7Ci0JCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDFdID4+PiA0ICYgMHhmIHwgYWJ5dGUwW2ldIDw8IDQgJiAweDNmXTsKLQkJCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpICsgMV0gPDwgMiAmIDB4M2ZdOwotCQkJfSBlbHNlIHsKLQkJCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpXSA8PCA0ICYgMHgzZl07Ci0JCQl9Ci0JCX0KLQkJZm9yICg7IGogPCBhYnl0ZTEubGVuZ3RoOyBqKyspCi0JCQlhYnl0ZTFbal0gPSA2MTsKLQkJcmV0dXJuIGFieXRlMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlX3Bhc3N3b3JkKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKLQkJU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHMxLmxlbmd0aCgpID09IDApIHsKLQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQocyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgczIgPSBudWxsOwotCQkJaWYgKHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnl0ZSBhYnl0ZTBbXSA9IGNvbnZlcnRfdmlld2FibGVfdG9fYnl0ZXMocyk7Ci0JCQkJaWYgKGFieXRlMCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoYWJ5dGUwLmxlbmd0aCA+IDApIHsKLQkJCQkJYnl0ZSBhYnl0ZTFbXSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhYnl0ZTEgPSBQYXNzd29yZENpcGhlclV0aWwuZGVjaXBoZXIoYWJ5dGUwLCBzMSk7Ci0JCQkJCX0gY2F0Y2ggKEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbiBpbnZhbGlkcGFzc3dvcmRjaXBoZXJleGNlcHRpb24pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB1bnN1cHBvcnRlZGNyeXB0b2FsZ29yaXRobWV4Y2VwdGlvbikgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJaWYgKGFieXRlMSAhPSBudWxsICYmIGFieXRlMS5sZW5ndGggPiAwKQotCQkJCQkJczIgPSBjb252ZXJ0X3RvX3N0cmluZyhhYnl0ZTEpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzMiAhPSBudWxsICYmIHMyLmxlbmd0aCgpID4gMCkKLQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMyKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZV9wYXNzd29yZChTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHMxLmxlbmd0aCgpID09IDApIHsKLQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoIn0iKS5hcHBlbmQocyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoczEpLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgczIgPSBudWxsOwotCQkJaWYgKHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnl0ZSBhYnl0ZTBbXSA9IGNvbnZlcnRfdG9fYnl0ZXMocyk7Ci0JCQkJaWYgKGFieXRlMC5sZW5ndGggPiAwKSB7Ci0JCQkJCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJYWJ5dGUxID0gUGFzc3dvcmRDaXBoZXJVdGlsLmVuY2lwaGVyKGFieXRlMCwgczEpOwotCQkJCQl9IGNhdGNoIChJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24gaW52YWxpZHBhc3N3b3JkY2lwaGVyZXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gdW5zdXBwb3J0ZWRjcnlwdG9hbGdvcml0aG1leGNlcHRpb24pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChhYnl0ZTEgIT0gbnVsbCAmJiBhYnl0ZTEubGVuZ3RoID4gMCkgewotCQkJCQkJczIgPSBjb252ZXJ0X3ZpZXdhYmxlX3RvX3N0cmluZyhhYnl0ZTEpOwotCQkJCQkJaWYgKHMyID09IG51bGwpCi0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoczIgIT0gbnVsbCAmJiBzMi5sZW5ndGgoKSA+IDApCi0JCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzMik7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ2J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXN0YXRpYyB7Ci0JCVNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNUyA9IFBhc3N3b3JkQ2lwaGVyVXRpbC5nZXRTdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1zKCk7Ci0JCURFRkFVTFRfQ1JZUFRPX0FMR09SSVRITSA9IFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXTsKLQkJYnl0ZSBhYnl0ZTBbXSA9IHs2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNDMsIDQ3fTsKLQkJQkFTRTY0X0VOQ09ERV9NQVAgPSBhYnl0ZTA7Ci0JCUJBU0U2NF9ERUNPREVfTUFQID0gbmV3IGJ5dGVbMTI4XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFNjRfREVDT0RFX01BUC5sZW5ndGg7IGkrKykKLQkJCUJBU0U2NF9ERUNPREVfTUFQW2ldID0gLTE7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgQkFTRTY0X0VOQ09ERV9NQVAubGVuZ3RoOyBqKyspCi0JCQlCQVNFNjRfREVDT0RFX01BUFtCQVNFNjRfRU5DT0RFX01BUFtqXV0gPSAoYnl0ZSkgajsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1BsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0Nzc2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvciBleHRlbmRzIEVycm9yIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMzcwMTA5OTk0MDAyOTg4MzlMOwotCi0JLy9UT0RPIERlbGV0ZSBtZQotCXB1YmxpYyBQbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcigpIHsKLQkJc3VwZXIoV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3JfRVJST1JfMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljODA0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLQotcHVibGljIGNsYXNzIFJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBHTE9CQUxfREVQRU5ERU5DSUVTID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfREVQRU5ERU5DWV9UWVBFID0gIlJlc291cmNlRGVwZW5kZW5jeUFkYXB0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIE1hcCBsb2NhbERlcGVuZGVuY2llcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQljbGFzcyBSZXNvdXJjZURlcGVuZGVuY3lBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlSZXNvdXJjZSBkZXBlbmRlbnRSZXNvdXJjZTsKLQotCQlSZXNvdXJjZURlcGVuZGVuY3lBZGFwdGVyKFJlc291cmNlIGFEZXBlbmRlbnRSZXNvdXJjZSkgewotCQkJZGVwZW5kZW50UmVzb3VyY2UgPSBhRGVwZW5kZW50UmVzb3VyY2U7Ci0JCQlkZXBlbmRlbnRSZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBSRVNPVVJDRV9ERVBFTkRFTkNZX1RZUEUuZXF1YWxzKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJLy9MaXN0ZW4gZm9yIHVubG9hZHMgYW5kIHJlbW92ZXMKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChudWxsKSkgewotCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCA6Ci0JCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSAhPSBkZXBlbmRlbnRSZXNvdXJjZSAmJiBtc2cuZ2V0T2xkQm9vbGVhblZhbHVlKCkgJiYgIW1zZy5nZXROZXdCb29sZWFuVmFsdWUoKSkKLQkJCQkJCWRlcGVuZGVudFJlc291cmNlLnVubG9hZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19SRVNPVVJDRV9TRVQgOgotCQkJCQlpZiAobXNnLmdldE9sZFZhbHVlKCkgIT0gbnVsbCAmJiBtc2cuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gZGVwZW5kZW50UmVzb3VyY2UpCi0JCQkJCQkJKChSZXNvdXJjZSkgZ2V0VGFyZ2V0KCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCVJlc291cmNlU2V0IHNldCA9IGRlcGVuZGVudFJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQkJaWYgKHNldCAhPSBudWxsKQotCQkJCQkJCQlzZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGRlcGVuZGVudFJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlU2V0TGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCkKLQkJCQlwcm9jY2Vzc0FkZGVkUmVzb3VyY2UoKFJlc291cmNlU2V0KSBtc2cuZ2V0Tm90aWZpZXIoKSwgKFJlc291cmNlKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gVVJJcy4gVGhlIGZpcnN0IHBhcmFtZXRlciwgYVVSSVN0cmluZywgaXMgdGhlIG9uZSB0aGF0Ci0JICogZGVwZW5kZW50VXJpU3RyaW5nIGRlcGVuZHMgb24uCi0JICogCi0JICogQHBhcmFtIGFVcmlTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVwZW5kZW50VXJpU3RyaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRGVwZW5kZW5jeShVUkkgdGFyZ2V0VVJJLCBVUkkgZGVwZW5kZW50VVJJKSB7Ci0JCWlmICh0YXJnZXRVUkkgIT0gbnVsbCAmJiBkZXBlbmRlbnRVUkkgIT0gbnVsbCkgewotCQkJR0xPQkFMX0RFUEVOREVOQ0lFUy5wdXQoZGVwZW5kZW50VVJJLCB0YXJnZXRVUkkpOwotCQl9Ci0JfQotCi0JcHVibGljIFJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpbml0aWFsaXplKGFSZXNvdXJjZVNldCk7Ci0JfQotCi0KLQlSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3RlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJaWYgKGFSZXNvdXJjZVNldCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgUmVzb3VyY2VTZXQgY2Fubm90IGJlIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdGlhbGl6ZUxvY2FsRGVwZW5kZW5jaWVzKGFSZXNvdXJjZVNldCk7Ci0JCXNldHVwRGVwZW5kZW5jeUFkYXB0ZXJzKGFSZXNvdXJjZVNldCk7Ci0JCXNldHVwUmVzb3VyY2VTZXRMaXN0ZW5lcihhUmVzb3VyY2VTZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFJlc291cmNlU2V0TGlzdGVuZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWFSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5hZGQobmV3IFJlc291cmNlU2V0TGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlcGVuZGVuY3lBZGFwdGVycyhSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJaWYgKCFhUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGxvY2FsRGVwZW5kZW5jaWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCU1hcC5FbnRyeSBlbnRyeTsKLQkJCVVSSSBkZXBlbmRlbnRVUkksIHRhcmdldFVSSTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlkZXBlbmRlbnRVUkkgPSAoVVJJKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl0YXJnZXRVUkkgPSAoVVJJKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXNldHVwRGVwZW5kZW5jeUFkYXB0ZXIoYVJlc291cmNlU2V0LCBkZXBlbmRlbnRVUkksIHRhcmdldFVSSSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogQHBhcmFtIGRlcGVuZGVudFVSSQotCSAqIEBwYXJhbSB0YXJnZXRVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQsIFVSSSBkZXBlbmRlbnRVUkksIFVSSSB0YXJnZXRVUkkpIHsKLQkJUmVzb3VyY2UgZGVwZW5kZW50ID0gYVJlc291cmNlU2V0LmdldFJlc291cmNlKGRlcGVuZGVudFVSSSwgZmFsc2UpOwotCQlpZiAoZGVwZW5kZW50ICE9IG51bGwpCi0JCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVyKGRlcGVuZGVudCwgdGFyZ2V0VVJJLCBhUmVzb3VyY2VTZXQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwRGVwZW5kZW5jeUFkYXB0ZXIoUmVzb3VyY2UgZGVwZW5kZW50LCBVUkkgdGFyZ2V0VVJJLCBSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJUmVzb3VyY2UgdGFyZ2V0ID0gYVJlc291cmNlU2V0LmdldFJlc291cmNlKHRhcmdldFVSSSwgZmFsc2UpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQl0YXJnZXQgPSBhUmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodGFyZ2V0VVJJKTsKLQkJdGFyZ2V0LmVBZGFwdGVycygpLmFkZChuZXcgUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlcihkZXBlbmRlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxvY2FsRGVwZW5kZW5jaWVzKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gYVJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQlpbml0aWFsaXplTG9jYWxEZXBlbmRlbmNpZXMoY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxvY2FsRGVwZW5kZW5jaWVzKFVSSUNvbnZlcnRlciBhQ29udmVydGVyKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gR0xPQkFMX0RFUEVOREVOQ0lFUy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcCByZXNvbHZlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJVVJJIGtleSwgdmFsdWU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJa2V5ID0gKFVSSSkgZW50cnkuZ2V0S2V5KCk7Ci0JCQl2YWx1ZSA9IChVUkkpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlrZXkgPSBub3JtYWxpemUoa2V5LCBhQ29udmVydGVyLCByZXNvbHZlZCk7Ci0JCQl2YWx1ZSA9IG5vcm1hbGl6ZSh2YWx1ZSwgYUNvbnZlcnRlciwgcmVzb2x2ZWQpOwotCQkJbG9jYWxEZXBlbmRlbmNpZXMucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlbGF0aXZlVVJJCi0JICogQHBhcmFtIGNvbnZlcnRlcgotCSAqIEBwYXJhbSByZXNvbHZlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZShVUkkgcmVsYXRpdmVVUkksIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXIsIE1hcCByZXNvbHZlZCkgewotCQlVUkkgcmVzdWx0ID0gKFVSSSkgcmVzb2x2ZWQuZ2V0KHJlbGF0aXZlVVJJKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb252ZXJ0ZXIubm9ybWFsaXplKHJlbGF0aXZlVVJJKTsKLQkJCXJlc29sdmVkLnB1dChyZWxhdGl2ZVVSSSwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZXQKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jY2Vzc0FkZGVkUmVzb3VyY2UoUmVzb3VyY2VTZXQgc2V0LCBSZXNvdXJjZSByZXNvdXJjZSkgewotCQlVUkkgdGFyZ2V0VVJJID0gKFVSSSkgbG9jYWxEZXBlbmRlbmNpZXMuZ2V0KHJlc291cmNlLmdldFVSSSgpKTsKLQkJaWYgKHRhcmdldFVSSSAhPSBudWxsKQotCQkJc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihyZXNvdXJjZSwgdGFyZ2V0VVJJLCBzZXQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGFmNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDI2LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIFJFU09VUkNFX0lTX0xPQURJTkdfQURBUFRFUl9DTEFTUyA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5jbGFzczsKLQotICAgIHB1YmxpYyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgZmluZEFkYXB0ZXIoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0gICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBTeW5jaHJvbml6aW5nIG9uICIgKyBhUmVzb3VyY2UpOwotICAgICAgICAKLSAgICAgICAgLyogU3luY2hyb25pemUgb24gdGhlIFJlc291cmNlICh3aGljaCB3aWxsIGJlIHRoZSB0YXJnZXQgb2YgCi0gICAgICAgICAqIHRoZSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cykuCi0gICAgICAgICAqIAotICAgICAgICAgKiByZW1vdmVJc0xvYWRpbmdTdXBwb3J0KCkgd2lsbCBjb29yZGluYXRlIHdpdGggdGhpcyAKLSAgICAgICAgICogc3luY2hyb25pemF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgc3luY2hyb25pemVkKGFSZXNvdXJjZS5lQWRhcHRlcnMoKSkgewotICAgICAgICAJYWRhcHRlciA9IChSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKGFSZXNvdXJjZS5lQWRhcHRlcnMoKSwgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGFkYXB0ZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotICAgICAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0gICAgICAgIGlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlIHJlbW92ZSBvZiB0aGUgbG9hZGluZyBhZGFwdGVyCi0gICAgICAgICAgICBpZiAoaXNTZXRMb2FkZWRSZXNvdXJjZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pKSByZW1vdmVJc0xvYWRpbmdTdXBwb3J0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FpdEZvclJlc291cmNlVG9Mb2FkKCkgewotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5vdGlmaWNhdGlvbgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NldExvYWRlZFJlc291cmNlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCAmJiBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVJc0xvYWRpbmdTdXBwb3J0KCkgewotCi0gICAgICAgIC8qIFN5bmNocm9uaXplIG9uIHRoZSB0YXJnZXQgb2YgdGhlIEFkYXB0ZXIuIElmIAotICAgICAgICAgKiB0aGUgbGlzdCBvZiBhZGFwdGVycyBpcyBzZWFyY2hlZCBmb3IgYSAKLSAgICAgICAgICogUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIHVzaW5nIHRoZSAKLSAgICAgICAgICogUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKCkgQVBJLCB0aGVuCi0gICAgICAgICAqIHRoZSBhY2Nlc3MgdG8gcmVtb3ZlIHRoZSBBZGFwdGVyIHVzaW5nIHRoaXMgbWV0aG9kIAotICAgICAgICAgKiB3aWxsIGJlIGNvb3JkaW5hdGVkLiAgCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBTeW5jaHJvbml6aW5nIG9uICIgKyBnZXRUYXJnZXQoKSk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGdldFRhcmdldCgpLmVBZGFwdGVycygpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiB0eXBlID09IFJFU09VUkNFX0lTX0xPQURJTkdfQURBUFRFUl9DTEFTUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmb3JjZVJlbGVhc2UoKSB7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTMwNDk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgICAgICAKLSAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGNyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmV2aXNpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1JldmlzaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjNjdkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmV2aXNpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIFJldmlzaXQgewotCi0JLyoqCi0JICogUmV2aXNpdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXZpc2l0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXZpc2l0KCkgewotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuQ29tbWVudCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdG9EbygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmYWN0b3IoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZURlcHJlY2F0ZWRNZXRob2QoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZU1lKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXZpZXdEZXNpZ24oKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1N0cmluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmMjMwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVXRpbCB7Ci0JLyoqCi0JICogRW5oYW5jZWQgZXF1YWxpdHkgY2hlY2sgZm9yIHR3byBzdHJpbmcgcGFyYW1ldGVycywgdGhhdCB0YWtlcyBpbnRvIGNvbnNpZGVyYXRpb24gbnVsbCB2YWx1ZXMuCi0JICogSWYgYm90aCB2YWx1ZXMgYXJlIG51bGwsIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gczEKLQkgKiBAcGFyYW0gczIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0VxdWFsKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCWlmIChzMSA9PSBudWxsKQotCQkJcmV0dXJuIHMyID09IG51bGw7Ci0JCXJldHVybiBzMS5lcXVhbHMoczIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NWRiMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBUcmFuc2xhdG9yTWFuYWdlciBjbGFzcyB1c2VkIGJ5IHRoZSBUcmFuc2xhdG9yU2VydmljZSBpbiBvcmRlciB0byBkaXNjb3ZlcgotICogYW5kIGNhY2hlIGFsbCBvZiB0aGUgZXh0ZW5kZWQgVHJhbnNsYXRvcnMgdG8gYmUgdXNlZCBieSBFTUYyRE9NQWRhcHRlckltcGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yTWFuYWdlciB7Ci0JCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBUcmFuc2xhdG9yTWFuYWdlciBpbnN0YW5jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JNYW5hZ2VyIElOU1RBTkNFID0gbmV3IFRyYW5zbGF0b3JNYW5hZ2VyKCk7Ci0JCi0JLyoqCi0JICogQ2FjaGUgb2YgYWxsIHRoZSBUcmFuc2xhdG9yRGVzY3JpcHRvcnMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNldCB0cmFuc2xhdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBzdGF0aWMgZW1wdHkgYXJyYXkgdXNlZCB3aGVuIG5vIGRlc2NyaXB0b3JzIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvckRlc2NyaXB0b3JbXSBOT19FWFRFTkRFRF9UUkFOU0xBVE9SUyA9IG5ldyBUcmFuc2xhdG9yRGVzY3JpcHRvclswXTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFRyYW5zbGF0b3JNYW5hZ2VyCi0JICogQHJldHVybiBUcmFuc2xhdG9yTWFuYWdlciBJTlNUQU5DRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvck1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBUcmFuc2xhdG9yTWFuYWdlcigpIHsKLQkJbmV3IFRyYW5zbGF0b3JSZWdpc3RyeSgpLnJlYWRSZWdpc3RyeSgpOwotCX0KLQkKLQkvKioKLQkgKiBTaW1wbGUgUmVnaXN0cnkgUmVhZGVyIHVzZWQgYnkgVHJhbnNsYXRvciBNYW5hZ2VyIHRvIHJlY29nbml6ZSB0aGUgVHJhbnNsYXRvciBleHRlbnNpb25zCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUcmFuc2xhdG9yUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0JCQotCQkvKioKLQkJICogVGhlIFRyYW5zbGF0b3IgZWxlbWVudCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50LgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNMQVRPUiA9ICJ0cmFuc2xhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoqCi0JCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkJICovCi0JCXB1YmxpYyBUcmFuc2xhdG9yUmVnaXN0cnkoKSB7Ci0JCQlzdXBlcihFY29yZVV0aWxpdGllc1BsdWdpbi5JRCwgRWNvcmVVdGlsaXRpZXNQbHVnaW4uVFJBTlNMQVRPUl9FWFRFTlNUSU9OX1BPSU5UKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpZiBpdCBtYXRjaHMgdGhlIGV4cGVjdGVkIHRyYW5zbGF0b3IgZWxlbWVudCBuYW1lCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoVFJBTlNMQVRPUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJYWRkVHJhbnNsYXRvckRlc2NyaXB0b3IobmV3IFRyYW5zbGF0b3JEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZXNjcmliZXMgYSBUcmFuc2xhdG9yIGV4dGVuc2lvbiBwb2ludCBlbGVtZW50Ci0JICovCi0JcHVibGljIGNsYXNzIFRyYW5zbGF0b3JEZXNjcmlwdG9yIHsKLQkKLQkJLyoqCi0JCSAqIFF1YWxpZmllZCBjbGFzcyBuYW1lIGF0dHJpYnV0ZQotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKgotCQkgKiBUaGUgY29uZmlnIGVsZW1lbnQgZm9yIHRoaXMgRGVzY3JpcHRvcgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudDsKLQkJCi0JCS8qKgotCQkgKiB0aGUgY2FjaGVkIHF1YWxpZmllZCBjbGFzc05hbWUgdmFsdWUgb2YgdGhpcyBkZXNjcmlwdG9yCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0JCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvcgotCQkgKiBAcGFyYW0gYUNvbmZpZ0VsZW1lbnQKLQkJICovCi0JCXB1YmxpYyBUcmFuc2xhdG9yRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ0VsZW1lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQljb25maWdFbGVtZW50ID0gYUNvbmZpZ0VsZW1lbnQ7Ci0JCQljbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShDTEFTU05BTUUpOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0cmlldmUgdGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGV4dGVuZGVkIFRyYW5zbGF0b3IKLQkJICogQHJldHVybiBTdHJpbmcgY2xhc3NuYW1lCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIENyZWF0ZSB0aGUgYWN0dWFsIFRyYW5zbGF0b3IgaW5zdGFuY2UgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCQkgKiBAcmV0dXJuIFRyYW5zbGF0b3IKLQkJICovCi0JCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVRyYW5zbGF0b3IoKSB7Ci0JCQlUcmFuc2xhdG9yIGluc3RhbmNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW5zdGFuY2UgPSAoVHJhbnNsYXRvcikgY29uZmlnRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTTkFNRSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIFRyYW5zbGF0b3JEZXNjcmlwdG9yIHRvIHRoZSBjYWNoZSBvZiBkZXNjcmlwdG9yIGV4dGVuc2lvbnMuCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVHJhbnNsYXRvckRlc2NyaXB0b3IoVHJhbnNsYXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGRlc2NyaXB0b3IpOwotCQl0cmFuc2xhdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JfQotCQotCS8qKgotCSAqIEZpbmQgYWxsIHRoZSBhc3NvY2lhdGVkIFRyYW5zbGF0b3JEZXNjcmlwdG9ycyBmb3IgdGhlIFRyYXNsYXRvciBleHRlbnNpb25zIGRlZmluZWQuCi0JICogQHJldHVybiBUcmFuc2xhdG9yRGVzY3JpcHRvcltdCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10gZmluZFRyYW5zbGF0b3JzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJVHJhbnNsYXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgdHJhbnNsYXRvcnNJdHIgPSB0cmFuc2xhdG9ycy5pdGVyYXRvcigpOyB0cmFuc2xhdG9yc0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQlkZXNjcmlwdG9yID0gKFRyYW5zbGF0b3JEZXNjcmlwdG9yKSB0cmFuc2xhdG9yc0l0ci5uZXh0KCk7Ci0JCQlyZXN1bHQuYWRkKGRlc2NyaXB0b3IpOwotCQl9Ci0JCWlmIChyZXN1bHQuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBOT19FWFRFTkRFRF9UUkFOU0xBVE9SUzsKLQkJfQotCQlyZXR1cm4gKFRyYW5zbGF0b3JEZXNjcmlwdG9yW10pIHJlc3VsdC50b0FycmF5KG5ldyBUcmFuc2xhdG9yRGVzY3JpcHRvcltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxMmE3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlRyYW5zbGF0b3JNYW5hZ2VyLlRyYW5zbGF0b3JEZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHNlcnZpY2UgY2xhc3MgdG8gZGVsaXZlciBBUEkgdG8gdXNlIHRvIHJldHJpZXZlIFRyYW5zbGF0b3IgZXh0ZW5zaW9ucyBmcm9tCi0gKiB0aGUgVHJhbnNsYXRvck1hbmFnZXIgYW5kIGl0cyBSZWdpc3RyeVJlYWRlci4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zbGF0b3JTZXJ2aWNlIHsKLQotCS8qKgotCSAqIFN0YXRpYyBLZXkgdmFsdWUgcGFpciBvZiBkZXNjcmlwdG9ycyBhcyBrZXlzIGFuZCBUcmFuc2xhdG9yIGluc3RhbmNlcyBhcyB2YWx1ZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgdHJhbnNsYXRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qKgotCSAqIFN0YXRpYyBlbXB0eSBhcnJheSB1c2VkIHdoZW4gbm8gZXh0ZW5zaW9ucyBmb3VuZAotCSAqLwotCS8vIG5ldmVyIHVzZWQKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBOT19UUkFOU0xBVE9SUyA9IG5ldyBUcmFuc2xhdG9yWzBdOwotCQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgVHJhbnNsYXRvciBzZXJ2aWNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvclNlcnZpY2UgSU5TVEFOQ0UgPSBuZXcgVHJhbnNsYXRvclNlcnZpY2UoKTsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBUcmFuc2xhdG9yU2VydmljZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yU2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGV4dGVuc2lvbiBwb2ludCBUcmFuc2xhdG9yRGVzY3JpcHRvciBvYmplY3RzIGZyb20gdGhlIG1hbmFnZXIKLQkgKiBAcmV0dXJuIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvckRlc2NyaXB0b3JbXSBnZXRUcmFuc2xhdG9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBUcmFuc2xhdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmZpbmRUcmFuc2xhdG9ycygpOwotCX0KLQkKLQkvKioKLSAgICAgKiBUaGlzIHJldHJpZXZlcyB0aGUgZXh0ZW5kZWQgVHJhbnNsYXRvcnMgdXNpbmcgdGhlIGV4dGVuc2lvbiBwb2ludCBtYW5hZ2VyIGFuZCBkZXNjcmlwdG9ycwotICAgICAqIEByZXR1cm4gVHJhbnNsYXRvcltdIChOb3RlLCB0aGUgcmV0dXJuIHZhbHVlIG1heSBjb250YWluIG51bGwgZW50cmllcy4pCi0gICAgICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRUcmFuc2xhdG9ycygpIHsKLQkJVHJhbnNsYXRvckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGdldFRyYW5zbGF0b3JEZXNjcmlwdG9ycygpOwotCQlUcmFuc2xhdG9yW10gcmVzdWx0ID0gbmV3IFRyYW5zbGF0b3JbZGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJLy9UaGUgcmVzdWx0IGluZGV4IGNvdWxkIGRpZmZlciBmcm9tIHRoZSBkZXNjcmlwdG9ycyBpbmRleC4KLQkJaW50IHJlc3VsdEluZGV4ID0gMDsKLQkJZm9yIChpbnQgaT0wOyBpPGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmFuc2xhdG9yIGluc3RhbmNlID0gZ2V0VHJhbnNsYXRvcihkZXNjcmlwdG9yc1tpXSk7Ci0JCQlpZiAoaW5zdGFuY2UhPW51bGwpIHsKLQkJCQlyZXN1bHRbcmVzdWx0SW5kZXhdID0gaW5zdGFuY2U7Ci0JCQkJcmVzdWx0SW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OyAgCi0gICAgfQotCQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBleGlzdGluZyBhc3NvY2lhdGVkIFRyYW5zbGF0b3IgaW5zdGFuY2UgZm9yIHRoZSBkZXNjcmlwdG9yLCBvciBjcmVhdGUgYSBuZXcKLQkgKiBvbmUgYW5kIGNhY2hlIG9uIHRoZSBTZXQuCi0JICogCi0JICogQHBhcmFtIHRyYW5zbGF0b3JEZXNjcmlwdG9yCi0JICogQHJldHVybiBUcmFuc2xhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFRyYW5zbGF0b3IoVHJhbnNsYXRvckRlc2NyaXB0b3IgdHJhbnNsYXRvckRlc2NyaXB0b3IpIHsKLQkJVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gKFRyYW5zbGF0b3IpIHRyYW5zbGF0b3JzLmdldCh0cmFuc2xhdG9yRGVzY3JpcHRvcik7Ci0JCWlmICh0cmFuc2xhdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gdHJhbnNsYXRvcjsKLQkJCi0JCXN5bmNocm9uaXplZCAodHJhbnNsYXRvcnMpIHsKLQkJCXRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yRGVzY3JpcHRvci5jcmVhdGVUcmFuc2xhdG9yKCk7Ci0JCQlpZiAodHJhbnNsYXRvciAhPSBudWxsKQotCQkJCXRyYW5zbGF0b3JzLnB1dCh0cmFuc2xhdG9yRGVzY3JpcHRvciwgdHJhbnNsYXRvcik7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zbGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Vuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0NTliZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM1MTA0NTM3Njc2MjQxNTU5OTFMOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9XRlRVdGlsc1Jlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA2MzE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9XRlRVdGlsc1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAid2Z0dXRpbHMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERBTkdMSU5HX0hSRUZfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludGVnZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZhaWxlZF90b19jb252ZXJ0X18wX190b19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtZXJhdGlvbl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvcnRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoYXJhY3Rlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9uZ19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRG91YmxlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlcl9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZsb2F0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCeXRlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXYXJuaW5nX19Db3VsZF9ub3Rfd3JpdGVfYl9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW9mT2JqZWN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVNRjJET01BZGFwdGVySW1wbF9FUlJPUl8wOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Xcml0ZUJhY2tIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Xcml0ZUJhY2tIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwYWE0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV3JpdGVCYWNrSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBUaGlzIGNsYXNzIHdpbGwgYmUgZGVsZXRlZC4gSWYgeW91IHN0aWxsIG5lZWQgdG8gdXNlIHRoaXMgY2xhc3MsIHBsZWFzZSBjb250YWN0IHRoZQotICogICAgICAgICAgICAgV0NDTSB0ZWFtLiBBIGNsYXNzIHdoaWNoIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggRW5jb2Rlci9EZWNvZGVycyB0byBzYXZlCi0gKiAgICAgICAgICAgICByZXNvdXJjZXMgaWYgdGhleSBhcmUgbWFkZSBkaXJ0eSBieSBhdXRvbWF0aWMgZW5jb2Rpbmcgc3VwcG9ydC4gVXNhZ2UgRXhhbXBsZToKLSAqIAotICogPHByZT4KLSAqIAotICogCi0gKiAvLyBVc2UgdGhlIHN0YW5kYXJkIFdlYlNwaGVyZSBwYXNzd29yZCB2YWx1ZSBlbmNvZGVyL2RlY29kZXIuCi0gKiBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmdldERlZmF1bHRSZWdpc3RyeSgpLnNldERlZmF1bHRFbmNvZGVyRGVjb2RlcihuZXcgY29tLmlibS5lanMuc2VjdXJpdHkudXRpbC5XQVNFbmNvZGVyRGVjb2RlcigpKTsKLSAqIC8vIEJlZ2luIHRyYWNraW5nIGNoYW5nZXMuLi4KLSAqIFdyaXRlQmFja0hlbHBlci5iZWdpbigpOwotICogLy8gTG9hZCBhIHJlc291cmNlIHdoaWNoIG1heSBoYXZlIHVuLWVuY29kZWQgdmFsdWVzLi4uCi0gKiAvLyBOb3RlOiBUaGUgV0NDTSB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IHVuLWVuY29kZWQgdmFsdWVzLiAgSWYgdW5lbmNvZGVkIHZhbHVlcwotICogLy8gYXJlIGZvdW5kLCB0aGUgdmFsdWUgd2lsbCBiZSBlbmNvZGVkLCBhbmQgdGhlIHJlc291cmNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0gKiAvLyBXcml0ZUJhY2tIZWxwZXIuCi0gKiBSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5sb2FkKCZxdW90O215UmVzb3VyY2UmcXVvdDspOwotICogLy8gRW5zdXJlIHRoYXQgYW55IGNoYW5nZXMgZHVlIHRvIGVuY29kaW5nIGFyZSB3cml0dGVuIGJhY2sgb3V0LgotICogV3JpdGVCYWNrSGVscGVyLmVuZCgpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXcml0ZUJhY2tIZWxwZXIgewotCXByaXZhdGUgU2V0IGRpcnR5T2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIHRyYWNraW5nQ2hhbmdlcyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIFdyaXRlQmFja0hlbHBlciBfaW5zdGFuY2U7Ci0Jc3RhdGljIHsKLQkJLy9EZXByZWNhdGVkIGNsYXNzCi0JCVJldmlzaXQuZGVsZXRlTWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIGVuc3VyZXMgcHJvcGVyIHVzYWdlIHRocm91Z2ggc2luZ2xldG9uLgotCSAqLwotCXByaXZhdGUgV3JpdGVCYWNrSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSByZXNvdXJjZSB3aGljaCBpcyBkaXJ0eSwgYW5kIG5lZWRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpcnR5T2JqZWN0KEVPYmplY3QgZGlydHlPYmplY3QpIHsKLQkJZGlydHlPYmplY3RzLmFkZChkaXJ0eU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQmVnaW4gY29sbGVjdGluZyBvYmplY3RzIHdoaWNoIGhhdmUgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpbigpIHsKLQkJdHJhY2tpbmdDaGFuZ2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBzYXZlIGFsbCBkaXJ0eSByZXNvdXJjZXMgKGlmIHBvc3NpYmxlKSwgdGhlbiBtYXJrcyB0aGUgcmVzb3VyY2VzIGFzIG5vbi1kaXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmQoKSB7Ci0JCXNhdmVEaXJ0eVJlc291cmNlcygpOwotCQlyZXNldCgpOwotCQl0cmFja2luZ0NoYW5nZXMgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgY2hhbmdlcyB0byBtb2Ygb2JqZWN0cyBhcmUgY3VycmVudGx5IGJlaW5nIHRyYWNrZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0cmFja2luZ0NoYW5nZXM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBsaXN0IG9mIGRpcnR5IHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQkJZGlydHlPYmplY3RzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gc2F2ZSBhbGwgZGlydHkgcmVzb3VyY2VzIChpZiBwb3NzaWJsZSksIHRoZW4gbWFya3MgdGhlIHJlc291cmNlcyBhcyBub24tZGlydHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURpcnR5UmVzb3VyY2VzKCkgewotCQlTZXQgZGlydHlSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlJdGVyYXRvciBkaXJ0eU9iakl0ZXIgPSBkaXJ0eU9iamVjdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGRpcnR5T2JqSXRlci5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3QgZGlydHlPYmplY3QgPSAoRU9iamVjdCkgZGlydHlPYmpJdGVyLm5leHQoKTsKLQkJCWlmIChkaXJ0eU9iamVjdC5lUmVzb3VyY2UoKSAhPSBudWxsICYmICFkaXJ0eVJlc291cmNlcy5jb250YWlucyhkaXJ0eU9iamVjdCkpIHsKLQkJCQlkaXJ0eVJlc291cmNlcy5hZGQoZGlydHlPYmplY3QuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yIGRpcnR5SXRlciA9IGRpcnR5UmVzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChkaXJ0eUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZSBkaXJ0eVJlc291cmNlID0gKFJlc291cmNlKSBkaXJ0eUl0ZXIubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlkaXJ0eVJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2FybihkaXJ0eVJlc291cmNlLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSByZXNvdXJjZSB3aGljaCBpcyBkaXJ0eSwgYW5kIG5lZWRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV3JpdGVCYWNrSGVscGVyIHNpbmdsZXRvbigpIHsKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlfaW5zdGFuY2UgPSBuZXcgV3JpdGVCYWNrSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBXYXJuIHRoZSB1c2VyIG9mIHByb2JsZW1zIGR1cmluZyBzYXZlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHdhcm4oUmVzb3VyY2UgcmVzLCBFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0uZXJyLnByaW50bG4oV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLldhcm5pbmdfX0NvdWxkX25vdF93cml0ZV9iX1dBUk5fLCBuZXcgT2JqZWN0W117cmVzLmdldFVSSSgpfSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9YTUxWYWx1ZUVuY29kZXJEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvWE1MVmFsdWVFbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTAzNTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9YTUxWYWx1ZUVuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIEFuIFhNTCB2YWx1ZSBlc2NhcGluZyBFbmNvZGVyRGVjb2RlciBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsdWVFbmNvZGVyRGVjb2RlciBleHRlbmRzIEVuY29kZXJEZWNvZGVyQWRhcHRlciB7Ci0JLyoqCi0JICogSWRlbnRpZmllcyB0aGUgbGFzdCBwcmludGFibGUgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIHJhbmdlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZQotCSAqIGVuY29kaW5nIHVzZWQgd2l0aCB0aGlzIHNlcmlhbGl6ZXIuIEZvciA4LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIGVpdGhlciAweDdFIG9yIDB4RkYuIEZvcgotCSAqIDE2LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIDB4RkZGRi4gQ2hhcmFjdGVycyB0aGF0IGFyZSBub3QgcHJpbnRhYmxlIHdpbGwgYmUgZXNjYXBlZCB1c2luZwotCSAqIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXByaXZhdGUgaW50IF9sYXN0UHJpbnRhYmxlID0gMHg3RTsKLQlwcm90ZWN0ZWQgc3RhdGljIFhNTFZhbHVlRW5jb2RlckRlY29kZXIgX3NpbmdsZXRvbjsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkgewotCQkvLyBOT1RfSU1QTEVNRU5URUQKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgYSBzdHJpbmcgc28gaXQgbWF5IGJlIHByaW50ZWQgYXMgdGV4dCBjb250ZW50IG9yIGF0dHJpYnV0ZSB2YWx1ZS4gTm9uIHByaW50YWJsZQotCSAqIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuIFdoZXJlIHRoZSBmb3JtYXQgc3BlY2lmaWVzIGEgZGVhdWx0IGVudGl0eQotCSAqIHJlZmVyZW5jZSwgdGhhdCByZWZlcmVuY2UgaXMgdXNlZCAoZS5nLiA8dHQ+JmFtcDtsdDs8L3R0PikuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyB0byBlc2NhcGUKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nQnVmZmVyIHNidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGNoYXJSZWYgPSBudWxsOwotCQljaGFyIGNoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyArK2kpIHsKLQkJCWNoID0gdmFsdWUuY2hhckF0KGkpOwotCQkJLy8gSWYgdGhlcmUgaXMgYSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzCi0JCQkvLyBjaGFyYWN0ZXIsIHByaW50IGl0LiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgZW50aXR5Ci0JCQkvLyByZWZlcmVuY2VzIGlzIGFsbW9zdCBidXQgbm90IGlkZW50aWNhbCBiZXR3ZWVuCi0JCQkvLyBYTUwgYW5kIEhUTUwuCi0JCQljaGFyUmVmID0gZ2V0RW50aXR5UmVmKGNoKTsKLQkJCWlmIChjaGFyUmVmICE9IG51bGwpIHsKLQkJCQlzYnVmLmFwcGVuZCgnJicpOwotCQkJCXNidWYuYXBwZW5kKGNoYXJSZWYpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9IGVsc2UgaWYgKChjaCA+PSAnICcgJiYgY2ggPD0gX2xhc3RQcmludGFibGUgJiYgY2ggIT0gMHhGNykgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpIHsKLQkJCQkvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBwcmludGFibGUsIHByaW50IGFzIGNoYXJhY3RlciByZWZlcmVuY2UuCi0JCQkJLy8gTm9uIHByaW50YWJsZXMgYXJlIGJlbG93IEFTQ0lJIHNwYWNlIGJ1dCBub3QgdGFiIG9yIGxpbmUKLQkJCQkvLyB0ZXJtaW5hdG9yLCBBU0NJSSBkZWxldGUsIG9yIGFib3ZlIGEgY2VydGFpbiBVbmljb2RlIHRocmVzaG9sZC4KLQkJCQlzYnVmLmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXNidWYuYXBwZW5kKCImIyIpOy8vJE5PTi1OTFMtMSQKLQkJCQlzYnVmLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGNoKSk7Ci0JCQkJc2J1Zi5hcHBlbmQoJzsnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2J1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKF9zaW5nbGV0b24gPT0gbnVsbCkgewotCQkJX3NpbmdsZXRvbiA9IG5ldyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9zaW5nbGV0b24uZW5jb2RlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzIGNoYXJhY3RlciB2YWx1ZSwgb3IgbnVsbCBpZiBubyBzdWNoIGVudGl0eQotCSAqIGV4aXN0cy4gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIDx0dD4nJmFtcDsnPC90dD4gd2lsbCByZXR1cm4gPHR0PiImYW1wO2FtcDsiPC90dD4uCi0JICogCi0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICBDaGFyYWN0ZXIgdmFsdWUKLQkgKiBAcmV0dXJuIENoYXJhY3RlciBlbnRpdHkgbmFtZSwgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW50aXR5UmVmKGNoYXIgY2gpIHsKLQkJLy8gRW5jb2RlIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMgaW50byB0aGUgZXF1aXZhbGVudCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkJLy8gVGhlc2UgZml2ZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhbGwgWE1MIGRvY3VtZW50cy4KLQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCcgOgotCQkJCXJldHVybiAibHQiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJz4nIDoKLQkJCQlyZXR1cm4gImd0IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICciJyA6Ci0JCQkJcmV0dXJuICJxdW90IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICdcJycgOgotCQkJCXJldHVybiAiYXBvcyI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnJicgOgotCQkJCXJldHVybiAiYW1wIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL3dmdHV0aWxzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi93ZnR1dGlscy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJlMmFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL3dmdHV0aWxzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVdhcm5pbmdfX0NvdWxkX25vdF93cml0ZV9iX1dBUk5fPUlXQUUwMDA4VyBXYXJuaW5nOiBDb3VsZCBub3Qgd3JpdGUgYmFjayB7MH0KLVN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VSUk9SXz1JV0FFMDAwOUUgU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoKLUVudW1lcmF0aW9uX1VJXz1FbnVtZXJhdGlvbgotRG91YmxlX1VJXz1Eb3VibGUKLUZsb2F0X1VJXz1GbG9hdAotTG9uZ19VSV89TG9uZwotU2hvcnRfVUlfPVNob3J0Ci1Cb29sZWFuX1VJXz1Cb29sZWFuCi1JbnRlZ2VyX1VJXz1JbnRlZ2VyCi1DaGFyYWN0ZXJfVUlfPUNoYXJhY3RlcgotQnl0ZV9VSV89Qnl0ZQotRmFpbGVkX3RvX2NvbnZlcnRfXzBfX3RvX19fRVJST1JfPUlXQUUwMDE0RSBGYWlsZWQgdG8gY29udmVydCB7MH0gdG8gezF9LgotREFOR0xJTkdfSFJFRl9FUlJPUl89SVdBRTAwMDFFIFVuYWJsZSB0byByZXNvbHZlIEhSRUYgezB9LiBDaGVjayB0aGUgZGVzY3JpcHRvciBmaWxlcyBhbmQgZW5zdXJlIHRoZSBpZHMgYXJlIHZhbGlkLgotTW9mT2JqZWN0X1VJXz1Nb2ZPYmplY3RfVUlfCi1QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wPVBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yX0VSUk9SXzAKLUVNRjJET01BZGFwdGVySW1wbF9FUlJPUl8wPUVNRjJET01BZGFwdGVySW1wbF9FUlJPUl8wCi0KLVJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyX0VSUk9SXzA9SVdBRTAwMDJFIFRoZSBSZXNvdXJjZVNldCBjYW5ub3QgYmUgbnVsbC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiM2RkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qZW0vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTQ2NzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWVtZndvcmtiZW5jaGVkaXQuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZjAxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3YTRlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSNNb24gSnVuIDA4IDE1OjM1OjQ1IEVEVCAyMDA5Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlVW5jaGVja2VkRXhjZXB0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdmYTQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRU1GV29ya2JlbmNoRWRpdFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblZlbmRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQ7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OGFkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGMxY2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FTUZfUmVzb3VyY2VfRWRpdF9Nb2RlbD1FTUYgUmVzb3VyY2UgRWRpdCBNb2RlbAotRWRpdF9Nb2RlbF9FeHRlbnNpb25zPUVkaXQgTW9kZWwgRXh0ZW5zaW9ucwotQWRhcHRlcl9GYWN0b3J5X0V4dGVuc2lvbj1BZGFwdGVyIEZhY3RvcnkgRXh0ZW5zaW9uCi1Nb2RpZmllckhlbHBlckZhY3Rvcnk9TW9kaWZpZXJIZWxwZXJGYWN0b3J5Ci1wbHVnaW5OYW1lPUVNRiBXb3JrYmVuY2ggRWRpdCBQbHVnLWluCi1wbHVnaW5WZW5kb3I9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3M2I1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0TW9kZWwiIG5hbWU9IiVFTUZfUmVzb3VyY2VfRWRpdF9Nb2RlbCIgc2NoZW1hPSJzY2hlbWEvZWRpdE1vZGVsLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRNb2RlbEV4dGVuc2lvbiIgbmFtZT0iJUVkaXRfTW9kZWxfRXh0ZW5zaW9ucyIgc2NoZW1hPSJzY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFkYXB0ZXJGYWN0b3J5IiBuYW1lPSIlQWRhcHRlcl9GYWN0b3J5X0V4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvYWRhcHRlckZhY3RvcnkuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iTW9kaWZpZXJIZWxwZXJGYWN0b3J5IiBuYW1lPSIlTW9kaWZpZXJIZWxwZXJGYWN0b3J5IiBzY2hlbWE9InNjaGVtYS9tb2RpZmllckhlbHBlckZhY3RvcnkuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwuaW50ZXJuYWxXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSI+Ci0gICAgICA8ZmFjdG9yeUNsYXNzCi0gICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSI+Ci0gICAgICA8L2ZhY3RvcnlDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgIGlkPSJlbWZWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgbmFtZT0iZW1mVmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciI+Ci0gICAgICA8dmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIKLSAgICAgICAgaWQ9ImVtZlZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBoYW5kbGVyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVtZlZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBzZWxlY3Rpb25UeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIiCi0gICAgICB0eXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iCi0gICAgICBwcm9wZXJ0aWVzPSJlbWZQYWNrYWdlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVtZlBhY2thZ2VQcm9wZXJ0eVRlc3RlciI+Ci0gICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAga2V5PSJWYWxpZGF0ZUVkaXRDb250ZXh0IgotICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlZhbGlkYXRlRWRpdEhlYWRsZXNzQ29udGV4dCIKLSAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZDFkNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmVtZi53b3JrYmVuY2guZWRpdCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGUiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotCi0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Byb3BlcnR5X2ZpbGUvZW1mdG9zZWQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ0b3NlZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q4NGRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ0b3NlZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVW5leHBlY3RlZF9JT19leGNlcHRpb25fb2NjdXJyZWRfY3JlYXRpbmdfeG1sX2RvY3VtZW50XzFfRVhDXz1JV0FFMDAxN0UgVW5leHBlY3RlZCBJTyBleGNlcHRpb24gb2NjdXJyZWQgY3JlYXRpbmcgeG1sIGRvY3VtZW50Ci1FTUYyRE9NU2VkUmVuZGVyZXJfVUlfMD17MH0gc2hvdWxkIG5vdCB1c2UgYW4gT3V0cHV0U3RyZWFtIGZvciBsb2FkaW5nCi1FTUYyRE9NU2VkUmVuZGVyZXJfVUlfMT17MH0gc2hvdWxkIG5vdCB1c2UgYW4gSW5wdXRTdHJlYW0gZm9yIGxvYWRpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ3b3JrYmVuY2hlZGl0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Byb3BlcnR5X2ZpbGUvZW1md29ya2JlbmNoZWRpdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzFkMWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ3b3JrYmVuY2hlZGl0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUR5bmFtaWNBZGFwdGVyRmFjdG9yeV9FUlJPUl8wPUlXQUUwMDEwRSBBIG51bGwgRVBhY2thZ2Ugd2lsbCBub3QgYmUgdGllZCB0byBhbnkgQWRhcHRlciBGYWN0b3J5LgotQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb25fVUlfMD1UaGVyZSBhcmUgYXQgbGVhc3QgezB9IGltcHJvcGVybHkgcmVsZWFzZWQgZWRpdCBtb2RlbHMuCi1DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8xPVRoaXMgZXhjZXB0aW9uIHdhcyBnZW5lcmF0ZWQgdG8gaW5kaWNhdGUgYW4gaW52YWxpZCB1c2FnZSBvZiByZWZlcmVuY2UgY291bnRzLlxuIFR5cGljYWxseSwgdGhpcyBvY2N1cnMgb24gYXR0ZW1wdHMgdG8gb3BlbiBhbiBhbHJlYWR5IG9wZW4gYXJ0aWZhY3QgZWRpdC5cbiBNYWtlIHN1cmUgdGhlIGRpc3Bvc2UgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGRvbmUgYWNjZXNzaW5nLlxuIFBsZWFzZSBleGFtaW5lIHRoZSBzdGFjayB0cmFjZS5cbiBDbGllbnQgQWNjZXNzIEV4Y2VwdGlvbiBvZiB0eXBlIHswfSBcbgotQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMD1JV0FFMDAxMUUgS2V5IGFscmVhZHkgdXNlZCB0byBhY2Nlc3MgUmVzb3VyY2UKLUNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzE9SVdBRTAwMTJFIEtleSBoYXMgbm90IHByb3Blcmx5IGFjY2Vzc2VkIFJlc291cmNlLgotRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMD1JV0FFMDAxM0UgVGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmb3IgdGhlIEVkaXQgTW9kZWwgXCJ7MH1cIiBjb250YWlucyBhIGN5Y2xlLiBQbGVhc2UgY29ycmVjdCB0aGUgZW50cmllcyBpbiB5b3VyIHBsdWdpbi54bWwgZmlsZXMuCi1FZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8xPUlXQUUwMDE0RSBDb3VsZCBub3QgY3JlYXRlIGZhY3RvcnkgYmVjYXVzZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbC4KLUVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzI9SVdBRTAwMTVFIE5vIEVkaXRNb2RlbEZhY3RvcnkgZm9yIGtleSBcInswfVwiCi1TbmFwc2hvdF9FUlJPUl8wPUlXQUUwMDE2RSBMb2NraW5nIEluc3VyYW5jZSBTdGFjayBUcmFjZQotQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzA9SVdBRTAwMTdFIEEgcGFja2FnZVVSSSBpcyByZXF1aXJlZCBmb3IgYWxsIEFkYXB0ZXIgRmFjdG9yaWVzCi1BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3JfRVJST1JfMT1JV0FFMDAxOEUgQW4gaWQgaXMgcmVxdWlyZWQgZm9yIGFsbCBBZGFwdGVyIEZhY3Rvcmllcy4gQ2hlY2sgYWxsIGFkYXB0ZXIgZmFjdG9yaWVzIGRlZmluZWQgaW4gXCJ7MH1cIi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9Nb2R1bGVDb3JlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL01vZHVsZUNvcmUuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNmJkZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL01vZHVsZUNvcmUuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBydW50aW1lSmFyPSJ0cnVlIgotICAgIG1vZGVsTmFtZT0iUHJvamVjdE1vZHVsZSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QucHJvamVjdG1vZHVsZS5wcm92aWRlci5Nb2R1bGVDb3JlRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnByb2plY3Rtb2R1bGUucHJlc2VudGF0aW9uLk1vZHVsZUNvcmVFZGl0b3JQbHVnaW4iCi0gICAgcnVudGltZUNvbXBhdGliaWxpdHk9ImZhbHNlIj4KLSAgPGZvcmVpZ25Nb2RlbD5tb2R1bGVDb3JlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldPUktTUEFDRV9ST09UPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+RDpcd29ya1xXVFA8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iTW9kdWxlQ29yZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9Im1vZHVsZUNvcmUuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0ibW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlL3VzZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ibW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlL2NvbnN1bWVzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1vZHVsZUNvcmUuZWNvcmUjLy9VUkkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9oYW5kbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL2RlcGxveWVkTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUvcmVzb3VyY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9tb2R1bGVUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9tb2R1bGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL3NvdXJjZVBhdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UvZGVwbG95ZWRQYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL2V4Y2x1c2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL21vZHVsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vTW9kdWxlVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL01vZHVsZVR5cGUvbWV0YWRhdGFSZXNvdXJjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vTW9kdWxlVHlwZS9tb2R1bGVUeXBlSWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlQ29yZS5lY29yZSMvL1Byb2plY3RNb2R1bGVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vUHJvamVjdE1vZHVsZXMvcHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1Byb2plY3RNb2R1bGVzL3dvcmtiZW5jaE1vZHVsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVudE1vZHVsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVudE1vZHVsZS9oYW5kbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW50TW9kdWxlL2RlcGxveWVkUGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbnRNb2R1bGUvZGVwZW5kZW5jeVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuY2F0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzBmNWI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjUgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1vZHVsZUNvcmUiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbiIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInByZWZpeCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJNb2R1bGVDb3JlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAibW9kdWxlY29yZS54bWkiKSkpDQotICAgIHF1aWQgICAgICAgCSIzQTBEQjY4QjAwNDYiDQotICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjVBIg0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiZXh0Ig0KLQkgICAgcXVpZHUgICAgICAJIjM5QUE4NjY2MDE5MCIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNUIiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBleHQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCNTM0RkQwMjRDIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI1QyINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYmJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjBGQzAzQ0EiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY0Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MTA2MDEwNyIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjUiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnRibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYxNEYwMzFGIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NiINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uZXh0Ig0KLQkgICAgcXVpZHUgICAgICAJIjNBMjJFNjA4MDMwMyIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjciDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbmJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjExNTAyQTQiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY4Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ajJjYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MzJFMDM4QyIpKQ0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJXb3JrYmVuY2hNb2R1bGUiDQotCSAgICBxdWlkICAgICAgIAkiNDFFM0RGNTgwMUZBIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImhhbmRsZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFQzFENzEwMTVEIg0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGxveWVkTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMTQ3MUQwMjA4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiDQotCSAgICBxdWlkICAgICAgIAkiNDFFM0RGNjcwMDM5Ig0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvdXJjZVBhdGgiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRTNERjk3MDEyOCINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBsb3llZFBhdGgiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUVDNjQwMDI1QiINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUUzREY5RTAxMUUiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIlVSSSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIk1vZHVsZVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiNDFFQzFENTEwM0UyIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1ldGFkYXRhUmVzb3VyY2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMURGMDAyMUUiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIlVSSSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kdWxlVHlwZUlkIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMjEzNDAzNTciDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJVUkkiDQotCSAgICBxdWlkICAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUMyNzA4MDNBQyINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlByb2plY3RNb2R1bGVzIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRjU2NkRCMDI1MSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9qZWN0TmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFGNTY3RkQwMjNBIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRGVwZW5kZW50TW9kdWxlIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRjZDMjRCMDIzRCINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjQyMDE0NUYwMDFDOSINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBsb3llZFBhdGgiDQotCQkgICAgcXVpZCAgICAgICAJIjQyMDE0NUZBMDAxNSINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBlbmRlbmN5VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMzkyNDMwMTZFIg0KLQkJICAgIHR5cGUgICAgICAgCSJEZXBlbmRlbmN5VHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDIwMzk0RjUwMTg1Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRlcGVuZGVuY3lUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjQyMDM5NEY1MDE4NSINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXx1c2VzPTANCi18Y29uc3VtZXM9MQ0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlcyINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMzk5MzgwMThEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3VtZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQyMDM5QTZFMDEzOSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRTNFMTRCMDFFMyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJyZXNvdXJjZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRTNFMTREMDMxRCINCi0JCSAgICBsYWJlbCAgICAgIAkicmVzb3VyY2VzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZVJlc291cmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY2NzAwMzkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGUiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRTNFMTREMDMxRiINCi0JCSAgICBsYWJlbCAgICAgIAkibW9kdWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNTgwMUZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSINCi0JICAgIHF1aWQgICAgICAgCSI0MUVDMUQ5ODAyQzIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibW9kdWxlVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFQzFEOTkwMjQxIg0KLQkJICAgIGxhYmVsICAgICAgCSJtb2R1bGVUeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6Ok1vZHVsZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDUxMDNFMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMUQ5OTAyNDMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiDQotCSAgICBxdWlkICAgICAgIAkiNDFGNTY3MjAwMEU4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndvcmtiZW5jaE1vZHVsZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRjU2NzIxMDExMSINCi0JCSAgICBsYWJlbCAgICAgIAkid29ya2JlbmNoTW9kdWxlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpXb3JrYmVuY2hNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjU4MDFGQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRjU2NzIxMDExMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpQcm9qZWN0TW9kdWxlcyINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFGNTY2REIwMjUxIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkgICAgcXVpZCAgICAgICAJIjQyMDE0NkE1MDJFMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAxNDZBNjAyN0YiDQotCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6RGVwZW5kZW50TW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUY2QzI0QjAyM0QiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNiINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMTQ2QTYwMjgxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNTgwMUZBIikpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRTNERjA2MDIxMCINCi0JICAgIHRpdGxlICAgICAgCSJNYWluIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTEwMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6VVJJIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgMTY0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDE0NjAsIDE1ODkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJOTIwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJVUkkiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDE0NjAsIDE1MzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk5MjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgxNDYwLCAxNjUwKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJOTI1KQ0KLQkJICAgIHdpZHRoICAgICAgCTkzOA0KLQkJICAgIGhlaWdodCAgICAgCTI0Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMg0KLQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDEyNjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk4DQotCQkJbWF4X3dpZHRoICAJNTA4DQotCQkJbGFiZWwgICAgICAJDQotfFRoZSBtb2R1bGUgImhhbmRsZSIgVVJJIHdpbGwgY29udGFpbiB0aGUgc3BlY2lhbCBNb2R1bGUgcHJvdG9jb2wsIHByb2plY3QgbmFtZSwgYW5kIG1vZHVsZSBpZGVudGlmaWVyLCBhbmQgd2lsbCBiZSBmdWxseSByZXNvbHZlZCB0byBhIGZ1bGwgcGxhdGZvcm0gVVJJDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTU2OA0KLQkJICAgIGhlaWdodCAgICAgCTQzMSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5OTIsIDE3NDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg3MTQsIDE2MTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjY3MDAzOSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg3MTQsIDE2NzQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk1MzEpDQotCQkgICAgd2lkdGggICAgICAJNTc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6Ok1vZHVsZVR5cGUiIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODU2LCAxMTM2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTUwOSwgMTAzMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2OTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1vZHVsZVR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ1MTAzRTIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTUwOSwgMTA5MSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTcwMCkNCi0JCSAgICB3aWR0aCAgICAgIAk3MTINCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6UHJvamVjdE1vZHVsZXMiIEA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0MTYsIDM2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDIwNCwgMjg3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUHJvamVjdE1vZHVsZXMiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjZEQjAyNTEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoMjA0LCAzNDgpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MzEpDQotCQkgICAgd2lkdGggICAgICAJNDQyDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OkRlcGVuZGVudE1vZHVsZSIgQDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDQ4MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDE0NzAsIDM0OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3MDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlcGVuZGVudE1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRjZDMjRCMDIzRCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANg0KLQkJCWxvY2F0aW9uICAgCSgxNDcwLCA0MTApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk3MTUpDQotCQkgICAgd2lkdGggICAgICAJNzI2DQotCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSIgQDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk0NCwgNzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoNzEyLCA2NDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDY0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXb3JrYmVuY2hNb2R1bGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoNzEyLCA3MDcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0NzEpDQotCQkgICAgd2lkdGggICAgICAJNDgyDQotCQkgICAgaGVpZ2h0ICAgICAJMjM2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQwLCAxMjM1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0UxNEIwMUUzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlc291cmNlcyIgQDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDM1NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMA0KLQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJbG9jYXRpb24gICAJKDEwNzUsIDE1MDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3Jlc291cmNlcyINCi0JCQkJcGN0RGlzdCAgICAJMC43MjY3NzYNCi0JCQkJaGVpZ2h0ICAgICAJMTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQxRTNFMTREMDMxRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NDAsIDEyMzUpDQotCQkJCSg5NDAsIDE2MDEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQwLCAxMjM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTQwLCAxNjAxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJbG9jYXRpb24gICAJKDg2MSwgMTQ5NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzEwMzgzDQotCQkJCWhlaWdodCAgICAgCTc5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGUiIEAxMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ2MCwgMzU1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzDQotCQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQkJbG9jYXRpb24gICAJKDEwNDMsIDk3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbW9kdWxlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyMDgyNA0KLQkJCQloZWlnaHQgICAgIAkxMDMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDFFM0UxNEQwMzFGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk0MCwgMTIzNSkNCi0JCQkJKDk0MCwgODcwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0MCwgMTIzNSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk0MCwgODcwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJCWxvY2F0aW9uICAgCSg4NjgsIDk3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzA5MzgyDQotCQkJCWhlaWdodCAgICAgCTczDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAxNQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjM0LCA3OTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ5ODAyQzIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlVHlwZSIgQDE2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOTgsIC0xMzcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQlsb2NhdGlvbiAgIAkoMjAxMCwgOTc3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGVUeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMTU3Mw0KLQkJCQloZWlnaHQgICAgIAkxNTMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDFFQzFEOTkwMjQxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjM0LCA3OTEpDQotCQkJCSgxODU3LCA3OTEpDQotCQkJCSgxODU3LCAxMDE4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MzQsIDc5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTcsIDEwMTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTYNCi0JCQkJbG9jYXRpb24gICAJKDE4MDQsIDk3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgLTEzNykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ5OTAyNDMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNQ0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2MzQsIDc5MSkNCi0JCQkJKDExODUsIDc5MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjM0LCA3OTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg1LCA3OTEpKSkpDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDIwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBjbGllbnQgICAgIAlAMg0KLQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDY1NywgMTA0OCkNCi0JCQkoODI5LCA4NzApKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDIxDQotCQkgICAgbG9jYXRpb24gICAJKDM5OSwgNjkxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFGNTY3MjAwMEU4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndvcmtiZW5jaE1vZHVsZXMiIEAyMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzMsIDQwMykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJCWxvY2F0aW9uICAgCSg0NzYsIDc0NykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM3Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrd29ya2JlbmNoTW9kdWxlcyINCi0JCQkJcGN0RGlzdCAgICAJMC4yNTMyODkNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDFGNTY3MjEwMTExIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzOTksIDY5MSkNCi0JCQkJKDcwMywgNjkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5OSwgNjkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAzLCA2OTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0DQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43OTI3NjMNCi0JCQkJaGVpZ2h0ICAgICAJNTkNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEAyNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzMsIDQwMykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjcyMTAxMTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMQ0KLQkJCSAgICBzdXBwbGllciAgIAlANQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5OSwgNjkxKQ0KLQkJCQkoMzI1LCA2OTEpDQotCQkJCSgzMjUsIDQ2MSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTksIDY5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMyNSwgNDYxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEAyNg0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzIyLCA2MzMpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MjAxNDZBNTAyRTIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlcyIgQDI3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5MCwgLTcxMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJCWxvY2F0aW9uICAgCSgxMzY3LCA1NDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNDc1NzM2DQotCQkJCWhlaWdodCAgICAgCTcyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQyMDE0NkE2MDI3RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2DQotCQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyMiwgNjMzKQ0KLQkJCQkoMTQ2MCwgNTg5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJCWxvY2F0aW9uICAgCSgxNDI3LCA2NjIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYzNjA3Nw0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ5MCwgLTcxMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MjAxNDZBNjAyODEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNg0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzMjIsIDYzMykNCi0JCQkJKDExODUsIDY3NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDMxDQotCQkgICAgbG9jYXRpb24gICAJKDI3ODQsIDQxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCWxvY2F0aW9uICAgCSgyMzg3LCAxNjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxMA0KLQkJCW1heF93aWR0aCAgCTc1OQ0KLQkJCWxhYmVsICAgICAgCQ0KLXxUaGUgZGVwZW5kZW50IG1vZHVsZSAiaGFuZGxlIiBtdXN0IGJlIHJlc29sdmFibGUgdG8gYSBXb3JrYmVuY2hNb2R1bGUuDQotfA0KLXxUaGUgRGVwbG95ZWRQYXRoIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZWQgbW9kdWxlIGluIHRoaXMgZGVwbG95bWVudCBzdHJ1Y3R1cmUuDQotfA0KLXxUaGUgZGVwZW5kZW5jeVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgZGVwZW5kZW50IG1vZHVsZSBpcyBhc3NlbWJsZWQuDQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTgxOQ0KLQkJICAgIGhlaWdodCAgICAgCTUxMykNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6RGVwZW5kZW5jeVR5cGUiIEAzMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2MCwgOTQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMyDQotCQkJbG9jYXRpb24gICAJKDIzODcsIDg2MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlcGVuZGVuY3lUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoMjM4NywgODEwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzQ2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MjAzOTRGNTAxODUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMyDQotCQkJbG9jYXRpb24gICAJKDIzODcsIDkyMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTIzNykNCi0JCSAgICB3aWR0aCAgICAgIAkzNjQNCi0JCSAgICBoZWlnaHQgICAgIAkyOTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMzMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUA2DQotCQkgICAgc3VwcGxpZXIgICAJQDMxDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDIxODcsIDQ1NSkNCi0JCQkoMjM3NCwgNDQzKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDcyM2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kdWxlY29yZSIKLSAgICBuc1VSST0ibW9kdWxlY29yZS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtiZW5jaE1vZHVsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhhbmRsZSIgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXBsb3llZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZS9tb2R1bGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kdWxlVHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01vZHVsZVR5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kdWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXBlbmRlbnRNb2R1bGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2VQYXRoIiBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlcGxveWVkUGF0aCIgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdXNpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrYmVuY2hNb2R1bGUiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Xb3JrYmVuY2hNb2R1bGUvcmVzb3VyY2VzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZHVsZVR5cGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRhZGF0YVJlc291cmNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW9kdWxlVHlwZUlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVSSSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0TW9kdWxlcyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3ROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtiZW5jaE1vZHVsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV29ya2JlbmNoTW9kdWxlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXBlbmRlbnRNb2R1bGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYW5kbGUiIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwbG95ZWRQYXRoIiBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlcGVuZGVuY3lUeXBlIiBlVHlwZT0iIy8vRGVwZW5kZW5jeVR5cGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEZXBlbmRlbmN5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0idXNlcz0wJiN4RDsmI3hBO2NvbnN1bWVzPTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InVzZXMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnN1bWVzIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWI0YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUubWRsCisrKyAvZGV2L251bGwKQEAgLTEsODgzOSArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIklERSINCi0JICAgIHZhbHVlICAgICAgCSJJbnRlcm5hbCBFZGl0b3IiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyINCi0JICAgIHZhbHVlICAgICAgCSIiKSkNCi0gICAgcXVpZCAgICAgICAJIjNBMEIyNDc0MDI1RiINCi0gICAgZW5mb3JjZUNsb3N1cmVBdXRvTG9hZCAJRkFMU0UNCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI2QSINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDMzOSINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyNjkiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiM0EwQjI0NzQwMjdEIg0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibW9kdWxlQ29yZSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFdPUktTUEFDRV9ST09UXFxvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvblxccm9zZVxcbW9kdWxlQ29yZS5jYXQiDQotCQlxdWlkICAgICAgIAkiM0EwREI2OEIwMDQ2IikpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBhY2thZ2VWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDM2MCINCi0JCXRpdGxlICAgICAgCSJQYWNrYWdlVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAk2NTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZSIgQDENCi0JCQlsb2NhdGlvbiAgIAkoMzUyLCAzMjApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4LCAyMzYpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZUNvcmUiKQ0KLQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0EwREI2OEIwMDQ2Ig0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpDQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyN0QiDQotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQTBCMjQ3OTAzMzgiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKQ0KLQljYXRlZ29yeSAgIAkiTG9naWNhbCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiNDFFQzFDM0IwMEE0IikNCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyN0UiDQotCVByb2NzTkRldnMgCShsaXN0DQotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc0MDI5MSINCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcw0KLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJInJvc2VJZCINCi0JCXZhbHVlICAgICAgCSI3NTMxMTc1NDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIi5oIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk4KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCS0yKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjMiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNCINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI1Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlQmFja3VwRmlsZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keSINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJIEMrKyBFdmVudCBXYXRjaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTgzX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzVGFzayINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQm9keSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iDQotCQkJCXZhbHVlICAgICAgCTIwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTIxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTWl4aW4iDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFzayINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMjA5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTIxNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTIyOCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiDQotCQkJCXZhbHVlICAgICAgCTIyOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXV0byINCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluY29tcGxldGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5jb21wbGV0ZVR5cGVTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmNvbXBsZXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTm9EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJVbmtub3duRGlzY3JpbWluYW50UGFydCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiS25vd25EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJUcnVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmciDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjE3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkicHJvamVjdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld0NvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVhdWx0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByZWZldGNoU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiDQotCQkJdmFsdWUgICAgICAJNCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm9vdERvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiREJNUyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNWaWV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQZXJzaXN0VG9TZXJ2ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIktleUxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb3ciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiDQotCQkJdmFsdWUgICAgICAJIlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk0iDQotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3VuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiSUJNIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJtXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkic18iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyINCi0JCQl2YWx1ZSAgICAgIAkzKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb3RTaG93Um9zZUlERGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWQUphdmFXb3JraW5nRm9sZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5QcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVKYXZhRG9jVGFncyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUNvbnRyb2wiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDU2VsZWN0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU0NDQ29tbWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMi4wIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMS54Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicGFja2FnZSINCi0JCQkJdmFsdWUgICAgICAJNjUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjMuMF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kRGVjbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiDQotCQkJdmFsdWUgICAgICAJMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiDQotCQkJCXZhbHVlICAgICAgCTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImVudW0iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibW9kdWxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiDQotCQkJCXZhbHVlICAgICAgCTEwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiINCi0JCQkJdmFsdWUgICAgICAJMTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibWF4Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTEwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxjaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIwIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIxIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiDQotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyINCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiQmluYXJ5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJUZXh0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlWYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDbGVhckNhc2UiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSZXF1aXNpdGVQcm8iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJTb0RBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVG9wTGluayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJLTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQYWNrYWdlcyINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQnJhY2VTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjMiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCNCINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI1Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNZW1iZXJPcmRlclNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiT3JkZXIgYnkga2luZCINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCINCi0JCQkJdmFsdWUgICAgICAJNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlQmFja3VwRmlsZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb21tZW50UnVsZXNTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiUmV2ZXJzZSBlbmdpbmVlcmluZyBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgc3luY2hyb25pemUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMzIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMjMyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEZXBsb3kiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3Rpb24iDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbURpcmVjdGlvblR5cGVTZXQiIDEwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtRGlyZWN0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJImluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJImlub3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIm91dCINCi0JCQkJdmFsdWUgICAgICAJMTA0KSkpKSkpDQotCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyN0YiKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvYWRhcHRlckZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxMDBkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iYWRhcHRlckZhY3RvcnkiIG5hbWU9IkFkYXB0ZXIgRmFjdG9yeSBFeHRlbnNpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGFuIGFkYXB0ZXIgZmFjdG9yeSB3aXRoIHRoZSBkeW5hbWljIGFkYXB0ZXIgZmFjdG9yeS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0ZXJGYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJhZGFwdGVyRmFjdG9yeSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRGVmaW5lcyB0aGUgQWRhcHRlciBGYWN0b3J5IGJlaW5nIGFkZGVkLiBBbGwgYWRkZWQgQWRhcHRlciBGYWN0b3JpZXMgYXJlIHF1ZXJpYWJsZSB3aGVuZXZlciB0aGVpciBGdW5jdGlvbiBHcm91cCBhbmQgb3B0aW9uYWwgVmlld2VyIElkIGFyZSBzcGVjaWZpZWQuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlldyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBwYWNrYWdlIFVSSSB0aGF0IHlvdSBhcmUgZXh0ZW5kaW5nIChmb3IgZXhhbXBsZSAmcXVvdDtlamIueG1pJnF1b3Q7KQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIEFkYXB0ZXIgRmFjdG9yeSBleHRlbnNpb24uICBUaGlzIHdpbGwgYXNzb2NpYXRlIGl0IHdpdGggb25lIG9yIG1vcmUgZnVuY3Rpb24gZ3JvdXBzIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBncm91cCBwYXR0ZXJucy4gIEZ1bmN0aW9uIEdyb3VwcyBhbGxvdyBDb250ZW50IGFuZCBBY3Rpb25zIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gR2VuZXJhbGx5LCB0aGV5IGFyZSB1c2VkIGJ5IHZlbmRvcnMgd2hvIHdpc2ggdG8gYWRkIGZ1bmN0aW9uYWxpdHkgc3BlY2lmaWMgdG8gdGhlaXIgcHJvZHVjdHMsIGUuZy4gSjJFRSBBcHBsaWNhdGlvbiBTZXJ2ZXJzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbkdyb3VwSUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCB2aWV3ZXIgSWQgd2hpY2ggd2lsbCBsaW1pdCB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZGVmaW5lZCBBZGFwdGVyIEZhY3RvcnkgdG8gdGhlIGdpdmVuIHZpZXdlciBpZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWwuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NDNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWwuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgaWQ9ImVkaXRNb2RlbCIgbmFtZT0iRU1GIFJlc291cmNlIEVkaXQgTW9kZWwiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRWRpdCBtb2RlbHMgcHJvdmlkZSBhIGZyYW1ld29yayBmb3IgbWFuYWdpbmcgYSBzZXQgb2YgRU1GIHJlc291cmNlcyB3aXRoaW4gYSB1bml0IG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSB3b3Jrc3BhY2Ugb3BlcmF0aW9uIG1heSBhZmZlY3QgYSBjaGFuZ2UgdG8gbXVsdGlwbGUgRU1GIHJlc291cmNlcy4gRWRpdCBtb2RlbHMgcHJvdmlkZSBiYXNpYyBzZXJ2aWNlcyBzdWNoIGFzIGxvYWRzLCBzYXZlcyAod2hlbiBuZWNlc3NhcnkpLCBhbmQgdmFsaWRhdGUgZWRpdCBmb3IgdGhlIG1hbmFnZWQgcmVzb3VyY2VzLiAgRWRpdCBtb2RlbHMgYXJlIHJlZmVyZW5jZSBjb3VudGVkLCB0aGVyZWZvcmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYW4gZWRpdCBtb2RlbCBjYW4gYmUgc2hhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgb3BlcmF0aW9uIG9yIGVkaXRvci4gIEJ5IGRlY2xhcmluZyBhbiBlZGl0IG1vZGVsLCBhIHBsdWdpbiBwcm92aWRlciBlbmFibGVzIG90aGVyIGNvbXBvbmVudHMgdG8gY29udHJpYnV0ZSByZXNvdXJjZXMgdG8gYmUgbWFuYWdlZCBieSB0aGF0IGVkaXQgbW9kZWwuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0TW9kZWwiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVkaXRNb2RlbCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGZvciBhbiBlZGl0IG1vZGVsIHRvIGJlIHVzZWQgaW4gdGhlIHdvcmtzcGFjZS4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0TW9kZWxSZXNvdXJjZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlZGl0TW9kZWxJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZWRpdCBtb2RlbC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeUNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyB1c2VkIGZvciB0aGlzIGVkaXQgbW9kZWwuICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5Jmx0Oy9jb2RlJmd0Oy4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsIHRoZW4gYSBnZW5lcmljICZsdDtjb2RlJmd0O0VkaXRNb2RlbCZsdDsvY29kZSZndDsgaXMgY3JlYXRlZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9hZFVua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5IiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50TW9kZWxJRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVkaXRNb2RlbFJlc291cmNlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGlzIGFuIGluZGl2aWR1YWwgY29udHJpYnV0aW9uIG9mIGEgcmVzb3VyY2UgdG8gdGhlIGVkaXQgbW9kZWwuICBJZiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mIHRoZSBzYW1lIFVSSSBpcyByZWdpc3RlcmVkIGFnYWluc3QgYW4gZWRpdCBtb2RlbCBpZCwgdGhlIHJlc291cmNlIGlzIHN0aWxsIG9ubHkgbG9hZGVkIG9uY2UuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29udGFpbmVyIGZyb20gd2hpY2ggRU1GIHJlc291cmNlcyBhcmUgbG9hZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvbG9hZCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEluZGljYXRvciB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUgYXV0b2xvYWRlZCB3aGVuIHRoZSBlZGl0IG1vZGVsIGlzIGNyZWF0ZWQsIG9yIHdoZW4gYW4gSUZpbGUgY29ycmVzcG9uZGluZyB0byB0aGlzIHJlc291cmNlIGlzIGFkZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotICAgDQotICAgPGVsZW1lbnQgbmFtZT0icmVzb3VyY2VFeHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgYWxsb3dzIHJlZ2lzdHJhdGlvbiBvZiBmaWxlcyBmb3IgYXV0b2xvYWRpbmcgYWNjb3JkaW5nIHRvIGZpbGUgZXh0ZW5zaW9uLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZmlsZSBleHRlbnNpb24gaXRzZWxmICgmcXVvdDtteXhtaSZxdW90OykNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIGlkPSZxdW90O2VkaXRNb2RlbC5hY21lLnBhcmVudCZxdW90Ow0KLSAgICAgICAgIG5hbWU9JnF1b3Q7QWNtZSBQYXJlbnQgRWRpdCBNb2RlbCZxdW90Ow0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbCZxdW90OyZndDsNCi0gICAgICAmbHQ7ZWRpdE1vZGVsDQotICAgICAgICAgICAgZWRpdE1vZGVsSUQ9JnF1b3Q7Y29tLmFjbWUuYWNtZXByby5wYXJlbnQuZWRpdE1vZGVsJnF1b3Q7DQotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkmcXVvdDsmZ3Q7DQotICAgICAgICAmbHQ7ZWRpdE1vZGVsUmVzb3VyY2UgVVJJPSZxdW90O0RJUi9yZXNvdXJjZTAueG1sJnF1b3Q7LyZndDsNCi0gICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMS54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICZsdDsvZWRpdE1vZGVsJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLQ0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBpZD0mcXVvdDtlZGl0TW9kZWwuYWNtZS5jaGlsZCZxdW90Ow0KLSAgICAgICAgIG5hbWU9JnF1b3Q7QWNtZSBDaGlsZCBFZGl0IE1vZGVsJnF1b3Q7DQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtlZGl0TW9kZWwNCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvLmNoaWxkLmVkaXRNb2RlbCZxdW90Ow0KLSAgICAgICAgICAgIGZhY3RvcnlDbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5JnF1b3Q7DQotICAgICAgICAgICAgcGFyZW50TW9kZWxJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvLnBhcmVudC5lZGl0TW9kZWwmcXVvdDsmZ3Q7DQotICAgICAgICAmbHQ7ZWRpdE1vZGVsUmVzb3VyY2UgVVJJPSZxdW90O0RJUi9yZXNvdXJjZTIueG1sJnF1b3Q7LyZndDsNCi0gICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMy54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICZsdDsvZWRpdE1vZGVsJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIEVkaXQgTW9kZWxzIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0Jmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2VkaXRNb2RlbEV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNmQyYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIGlkPSJlZGl0TW9kZWxFeHRlbnNpb24iIG5hbWU9IkVkaXQgTW9kZWwgRXh0ZW5zaW9ucyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgRWRpdCBNb2RlbCBFeHRlbnNpb24gYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gY29udHJpYnV0ZSBleHBlY3RlZCByZXNvdXJjZXMgdG8gRWRpdCBNb2RlbHMuIFRoZSBmdW5jdGlvbkdyb3VwSUQgYWxsb3dzIHVzZXJzIHRvIHNlbGVjdCB3aGljaCBleHRlbnNpb25zIHRoZXkgY2hvb3NlIHRvIGhhdmUgZW5hYmxlZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJlZGl0TW9kZWwuZXhzZCIvPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbEV4dGVuc2lvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdE1vZGVsRXh0ZW5zaW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFZGl0IG1vZGVsIGV4dGVuc2lvbnMgYWxsb3cgY29tcG9uZW50cyB0byBjb250cmlidXRlIGtub3duIHJlc291cmNlIFVSSXMgdG8gYW4gZWRpdCBtb2RlbC4gIFdoZW5ldmVyIGFuIGVkaXQgbW9kZWwgaXMgbG9hZGVkLCB0aGUgcmVzb3VyY2VzIHdpbGwgYXV0b21hdGljYWxseSBiZSBsb2FkZWQgYW5kIG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwuICBDaGFuZ2VzIHRvIHRoZSByZXNvdXJjZXMgd2lsbCBiZSB0cmFja2VkIGFuZCBzYXZlZCBkdXJpbmcgb3BlcmF0aW9ucyBvciBlZGl0b3Igc2F2ZXMuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdE1vZGVsUmVzb3VyY2UiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZWRpdE1vZGVsSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgZWRpdCBtb2RlbCBiZWluZyBleHRlbmRlZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbi4gIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgZnVuY3Rpb24gZ3JvdXAgcGF0dGVybiBiaW5kaW5nLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsRXh0ZW5zaW9uJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtlZGl0TW9kZWxFeHRlbnNpb24NCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0mcXVvdDtvcmcuc2FtcGxlLmluaGVyaXRhbmNlLnBhcmVudC5lZGl0TW9kZWwmcXVvdDsNCi0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9JnF1b3Q7b3JnLnNhbXBsZS5ncm91cCZxdW90OyZndDsNCi0gICAgICAgICAmbHQ7ZWRpdE1vZGVsUmVzb3VyY2UgVVJJPSZxdW90O0RJUi9leHRlbnNpb24wLnhtbCZxdW90Oy8mZ3Q7DQotICAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvZXh0ZW5zaW9uMS54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICZsdDsvZWRpdE1vZGVsRXh0ZW5zaW9uJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvbW9kaWZpZXJIZWxwZXJGYWN0b3J5LmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9tb2RpZmllckhlbHBlckZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjMDdkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9tb2RpZmllckhlbHBlckZhY3RvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgaWQ9Ik1vZGlmaWVySGVscGVyRmFjdG9yeSIgbmFtZT0iTW9kaWZpZXIgSGVscGVyIEZhY3RvcnkiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgaXMgdXNlZCB0byByZWdpc3RlciBmb3IgdGhlIG1vZGVsIG1vZGlmaWVycy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFja2FnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InBhY2thZ2UiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0eXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InR5cGUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmZWF0dXJlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmZWF0dXJlIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0NvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9Db21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWUwY2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0NvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsIGV4dGVuZHMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbCBpbXBsZW1lbnRzIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyKSB7Ci0JCXN1cGVyKGFuSW5wdXRDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhQ29udGFpbmVyCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhQ29udGFpbmVyLCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKSB7Ci0JCXN1cGVyKGFDb250YWluZXIsIGFTeW5jaHJvbml6ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCi0JICogQHBhcmFtIGFuT3V0cHV0Q29udGFpbmVyCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lciwgSUNvbnRhaW5lciBhbk91dHB1dENvbnRhaW5lcikgewotCQlzdXBlcihhbklucHV0Q29udGFpbmVyLCBhbk91dHB1dENvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIsIElDb250YWluZXIgYW5PdXRwdXRDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJc3VwZXIoYW5JbnB1dENvbnRhaW5lciwgYW5PdXRwdXRDb250YWluZXIsIGFTeW5jaHJvbml6ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMueG1pLmhlbHBlcnMuQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciNkZU5vcm1hbGl6ZShVUkkpCi0JICovCi0JcHVibGljIFVSSSBkZU5vcm1hbGl6ZShVUkkgdXJpKSB7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKLQkJCUlGaWxlIGFGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UGxhdGZvcm1GaWxlKHVyaSk7Ci0JCQlpZiAoYUZpbGUgIT0gbnVsbCkgewotCQkJCUlQcm9qZWN0IGZpbGVQcm9qZWN0ID0gYUZpbGUuZ2V0UHJvamVjdCgpOwotCQkJCS8vSWYgaXQgaXMgbm90IGluIHRoZSBzYW1lIHByb2plY3QgdGhlbiBqdXN0IHJldHVybiB0aGUgVVJJIGFzIGlzLgotCQkJCWlmIChyZXNvdXJjZVNldFN5bmNocm9uaXplci5nZXRQcm9qZWN0KCkgPT0gZmlsZVByb2plY3QpCi0JCQkJCXJldHVybiBnZXRDb250YWluZXJSZWxhdGl2ZVVSSShhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0R5bmFtaWNHcm93dGhNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRHluYW1pY0dyb3d0aE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTlhNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRHluYW1pY0dyb3d0aE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLQotcHVibGljIGNsYXNzIER5bmFtaWNHcm93dGhNb2RlbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fT1BUSU1BTF9TSVpFID0gMTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVNT1JZX1RIUkVTSEhPTEQgPSAxMDA7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElDRUFCTEVfQ0hBTkdFID0gNTsKLQkKLQkKLQkvKiBTdG9yZXMgYSBGSUZPIGxpc3Qgb2YgdGhlIEtleSB0eXBlcyAoSVBhdGgpKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpOwotCQotCS8qIFdlIHVzZSBhbiBpbnRbXSBhcyB0aGUgdmFsdWUgc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNyZWF0aW5nIEludGVnZXIgb2JqZWN0cyAqLwotCXByaXZhdGUgZmluYWwgTWFwLyogPElQYXRoLCBpbnRbXT4gKi8gdW5pcXVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JCi0JLyoqCi0JICogSW5qZWN0IHRoZSBrZXkgaW50byB0aGUgRHluYW1pY0dyb3d0aE1vZGVsLiBNYXkgb3IgbWF5IG5vdCBhZmZlY3QgdGhlIAotCSAqIGR5bmFtaWMgc2l6ZS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBpbmplY3QgaW50byB0aGUgbW9kZWwKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wdGltYWwgc2l6ZSBjaGFuZ2VkIGdyZWF0aGVyIHRoYW4ge0B2YWx1ZSBOT1RJQ0VBQkxFX0NIQU5HRX0gYXMgYSByZXN1bHQgb2YgdGhlIGluamVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaW5qZWN0S2V5KElQYXRoIGtleSkgewotCQkKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IGdldE9wdGltYWxTaXplKCk7Ci0JCQotCQlpbnRbXSBjb3VudCA9IG51bGw7Ci0JCWlmKCAoY291bnQgPSAoaW50W10pIHVuaXF1ZXNNYXAuZ2V0KGtleSkpICE9IG51bGwgKSB7Ci0JCQkvKiBpbmNyZW1lbnQgdGhlIGNvdW50ICovCi0JCQkrK2NvdW50WzBdOwotCQl9IGVsc2UgewotCQkJLyogaW5zZXJ0IHRoZSBmaXJzdCBjb3VudCAqLwotCQkJdW5pcXVlc01hcC5wdXQoa2V5LCBjb3VudCA9IG5ldyBpbnRbXSB7IDEgfSApOwotCQl9Ci0JCQotCQlpZiggcXVldWUuc2l6ZSgpID09IE1FTU9SWV9USFJFU0hIT0xEICkgewotCQkJCi0JCQkvKiB0YWtlIHRoZSBvbGRlc3QgdmFsdWUgb2ZmIHRoZSBxdWV1ZSAqLwotCQkJSVBhdGggb2xkZXN0S2V5ID0gKElQYXRoKSBxdWV1ZS5yZW1vdmUoMCk7Ci0JCQkKLQkJCS8qIGRldGVybWluZSBpZiBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBvbGRlc3Qga2V5IGlzIHN0aWxsIGluIHRoZSBxdWV1ZSAqLwotCQkJY291bnQgPSAoaW50W10pIHVuaXF1ZXNNYXAuZ2V0KG9sZGVzdEtleSk7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGNvdW50KTsKLQkJCQotCQkJLyogUmVkdWNlIHRoZSBjb3VudCAqLwotCQkJY291bnRbMF0gLT0gMTsKLQkJCi0JCQkvKiBDb3VudCBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUgKi8KLQkJCUFzc2VydC5pc1RydWUoY291bnRbMF0gPj0gMCk7Ci0JCQkKLQkJCi0JCQkvKiBUaGlzIHVuaXF1ZSBrZXkgaXMgbm8gbG9uZ2VyIGluIHRoZSBxdWV1ZSovCi0JCQlpZihjb3VudFswXSA9PSAwKSB7Ci0JCQkJdW5pcXVlc01hcC5yZW1vdmUob2xkZXN0S2V5KTsKLQkJCX0KLQkJCQotCQkJCi0JCQkKLQkJfQotCQkvKiBBZGQgdGhlIG5ld0tleSB0byBlbmQgb2YgdGhlIGxpc3QqLwotCQlxdWV1ZS5hZGQoa2V5KTsKLQkJCi0JCXJldHVybiBNYXRoLmFicyggb3JpZ2luYWxTaXplIC0gZ2V0T3B0aW1hbFNpemUoKSApID4gTk9USUNFQUJMRV9DSEFOR0U7Ci0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIG9wdGltYWwgc2l6ZSBpcyBhbiBpbnRlZ2VyIGZyb20gW3tAdmFsdWUgI01JTklNVU1fT1BUSU1BTF9TSVpFfSwge0B2YWx1ZSAjTUVNT1JZX1RIUkVTSEhPTER9XS4gCi0JICogCi0JICogQHJldHVybiB0aGUgb3B0aW1hbCBzaXplIGZvciB0aGUgTFJVIENhY2hlLiAgCi0JICovCi0JcHVibGljIGludCBnZXRPcHRpbWFsU2l6ZSgpIHsJCQotCQlyZXR1cm4gdW5pcXVlc01hcC5zaXplKCkgPiBNSU5JTVVNX09QVElNQUxfU0laRSA/IHVuaXF1ZXNNYXAuc2l6ZSgpIDogTUlOSU1VTV9PUFRJTUFMX1NJWkU7Ci0JfQotCi19CQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTYxZjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLklTeW5jaHJvbml6ZXJFeHRlbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVkaXRNb2RlbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLlByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaENvbnRleHQgZXh0ZW5kcyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBpbXBsZW1lbnRzIElTeW5jaHJvbml6ZXJFeHRlbmRlciB7Ci0KLQlwcml2YXRlIE1hcCByZWFkT25seU1vZGVscyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgZWRpdGFibGVNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgcmVzb3VyY2VTZXRMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5ID0gZmFsc2U7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXN1cGVyKGFQcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQjaW5pdGlhbGl6ZVJlc291cmNlU2V0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlzdXBlci5pbml0aWFsaXplUmVzb3VyY2VTZXQoYVJlc291cmNlU2V0KTsKLQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSByZWcgPSBuZXcgRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCgpOwotCQlyZWcuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIGZhY3RvcnkpOwotCQkvLyBhZGQgeG1pIGJlY2F1c2Ugb3RoZXIgcGx1Z2lucyBhcmUgcmVnaXN0ZXJpbmcgaXQgZ2xvYmFsbHkKLQkJcmVnLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieG1pIiwgZmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQKLQkJYVJlc291cmNlU2V0LnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KHJlZyk7Ci0JCWFSZXNvdXJjZVNldC5nZXRTeW5jaHJvbml6ZXIoKS5hZGRFeHRlbmRlcih0aGlzKTsgLy8gYWRkZWQgc28gd2UgY2FuIGJlIGluZm9ybWVkIG9mIGNsb3NlcwotCQkvLyB0byB0aGUgcHJvamVjdC4KLQkJc3RhcnRMaXN0ZW5pbmdUb1Jlc291cmNlU2V0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVJRChlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IGhhdmUgYW4gaW50ZW50IHRvIG1vZGlmeSBhIHBhcnRpY3VsYXIKLQkgKiByZXNvdXJjZS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQotCSAqIHRoaXMgbWV0aG9kIGlmIHlvdSBoYXZlIHRoZSBpbnRlbnQgdG8gbW9kaWZ5LgotCSAqIAotCSAqIEBzZWUgSjJFRUVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEV4aXN0aW5nRWRpdE1vZGVsKGVkaXRNb2RlbElELCBwYXJhbXMsIGZhbHNlKTsKLQkJaWYgKG51bGwgPT0gZWRpdE1vZGVsKSB7Ci0JCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQkJY2FjaGVFZGl0TW9kZWwoZWRpdE1vZGVsLCBwYXJhbXMpOwotCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGVkaXRNb2RlbC5pc0Rpc3Bvc2VkKCkgfHwgZWRpdE1vZGVsLmlzRGlzcG9zaW5nKCkpIHsKLQkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQkJCQljYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIHBhcmFtcyk7Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGVkaXRNb2RlbCkgewotCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgQVBJIHRoYXQgY2xpZW50cyBzaG91bGQgdXNlIHdoZW4gdGhleSB3YW50IHRvIHJlYWQgYSBncm91cCBvZiByZXNvdXJjZXMgdGhhdCBhcmUKLQkgKiBub3JtYWxseSBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIHdpdGgKLQkgKiAKLQkgKiBAYUtleS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQotCSAqICAgICAgICB0aGlzIG1ldGhvZC4gWW91IG11c3QgY2FsbCByZWxlYXNlRWRpdE1vZGVsKC4uLikgd2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGVkaXQKLQkgKiAgICAgICAgbW9kZWwuCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgT2JqZWN0IGFjY2Vzc29yS2V5LCBNYXAgcGFyYW1zKSB7Ci0JCXRyeSB7Ci0JCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gZ2V0RXhpc3RpbmdFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIHBhcmFtcywgdHJ1ZSk7Ci0JCQlpZiAobnVsbCA9PSBlZGl0TW9kZWwpIHsKLQkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQkJCWNhY2hlRWRpdE1vZGVsKGVkaXRNb2RlbCwgcGFyYW1zKTsKLQkJCQkJRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuZ2V0SW5zdGFuY2UoKS5hY2Nlc3MoZWRpdE1vZGVsKTsKLQkJCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZWRpdE1vZGVsLmlzRGlzcG9zZWQoKSB8fCBlZGl0TW9kZWwuaXNEaXNwb3NpbmcoKSkgewotCQkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCQkJCQljYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIHBhcmFtcyk7Ci0JCQkJfQotCQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQkJCUVkaXRNb2RlbExlYXN0VXNlZENhY2hlLmdldEluc3RhbmNlKCkuYWNjZXNzKGVkaXRNb2RlbCk7Ci0JCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlZGl0TW9kZWw7Ci0JCX0gZmluYWxseSB7Ci0JCQlFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5nZXRJbnN0YW5jZSgpLm9wdGltaXplTFJVU2l6ZUlmTmVjZXNzYXJ5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IGhhdmUgYW4gaW50ZW50IHRvIG1vZGlmeSBhIHBhcnRpY3VsYXIKLQkgKiByZXNvdXJjZS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQotCSAqIHRoaXMgbWV0aG9kIGlmIHlvdSBoYXZlIHRoZSBpbnRlbnQgdG8gbW9kaWZ5LgotCSAqIAotCSAqIEBzZWUgSjJFRUVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBhY2Nlc3NvcktleSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgQVBJIHRoYXQgY2xpZW50cyBzaG91bGQgdXNlIHdoZW4gdGhleSB3YW50IHRvIHJlYWQgYSBncm91cCBvZiByZXNvdXJjZXMgdGhhdCBhcmUKLQkgKiBub3JtYWxseSBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIHdpdGgKLQkgKiAKLQkgKiBAYUtleS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQotCSAqICAgICAgICB0aGlzIG1ldGhvZC4gWW91IG11c3QgY2FsbCByZWxlYXNlRWRpdE1vZGVsKC4uLikgd2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGVkaXQKLQkgKiAgICAgICAgbW9kZWwuCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBhY2Nlc3NvcktleSwgbnVsbCk7Ci0JfQotCi0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RXhpc3RpbmdFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zLCBib29sZWFuIGlzUmVhZE9ubHkpIHsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAocmVhZE9ubHlNb2RlbHMpIHsKLQkJCWlmIChpc1JlYWRPbmx5KSB7Ci0JCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcmVhZE9ubHlNb2RlbHMuZ2V0KGdldENhY2hlSUQoZWRpdE1vZGVsSUQsIHBhcmFtcykpOwotCQkJfSBlbHNlIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7Ci0JCQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRhYmxlTW9kZWxzLmdldChnZXRDYWNoZUlEKGVkaXRNb2RlbElELCBwYXJhbXMpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHJlYWQtb25seSBKMkVFRWRpdE1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRCwgdGhpcywgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIEoyRUVFZGl0TW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSUQsIHRoaXMsIHBhcmFtcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDEyOjI1OjM5IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWNoZUVkaXRNb2RlbChFZGl0TW9kZWwgZWRpdE1vZGVsLCBNYXAgcGFyYW1zKSB7Ci0JCWVkaXRNb2RlbC5zZXRQYXJhbXMocGFyYW1zKTsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJaWYgKGVkaXRNb2RlbC5pc1JlYWRPbmx5KCkpCi0JCQkJcmVhZE9ubHlNb2RlbHMucHV0KGdldENhY2hlSUQoZWRpdE1vZGVsLmdldEVkaXRNb2RlbElEKCksIHBhcmFtcyksIGVkaXRNb2RlbCk7Ci0JCQllbHNlCi0JCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCQllZGl0YWJsZU1vZGVscy5wdXQoZ2V0Q2FjaGVJRChlZGl0TW9kZWwuZ2V0RWRpdE1vZGVsSUQoKSwgcGFyYW1zKSwgZWRpdE1vZGVsKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkQWxsRWRpdE1vZGVscygpIHsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCUNvbGxlY3Rpb24gcmVhZE9ubHkgPSByZWFkT25seU1vZGVscy52YWx1ZXMoKTsKLQkJCQlFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUFsbENhY2hlZChyZWFkT25seSk7Ci0JCQkJZGlzY2FyZE1vZGVscyhyZWFkT25seSk7Ci0JCQkJZGlzY2FyZE1vZGVscyhlZGl0YWJsZU1vZGVscy52YWx1ZXMoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNjYXJkTW9kZWxzKENvbGxlY3Rpb24gZWRpdE1vZGVscykgewotCQlpZiAoZWRpdE1vZGVscyAhPSBudWxsICYmICFlZGl0TW9kZWxzLmlzRW1wdHkoKSkgewotCQkJLy8gTWFrZSBhIGNvcHkgZm9yIHNhZmV0eSBhZ2FpbnN0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQlJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QoZWRpdE1vZGVscykuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkoKEVkaXRNb2RlbCkgaXQubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TW9kZWwoRWRpdE1vZGVsIGVkaXRNb2RlbCwgYm9vbGVhbiByZWFkT25seSkgewotCQkvLyBUaGUgYmVzdCB3YXkgd291bGQgYmUgdG8gcmVjb21wdXRlIHRoZSBjYWNoZSBpZCwgYnV0IHdlIGRvbid0IGNhcmUKLQkJLy8gYmVjYXVzZSB0aGUgZWRpdCBtb2RlbCBzaG91bGQgb25seSBiZSBjYWNoZWQgb25jZSBhbnl3YXkKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJaWYgKHJlYWRPbmx5KQotCQkJCXJlYWRPbmx5TW9kZWxzLnZhbHVlcygpLnJlbW92ZShlZGl0TW9kZWwpOwotCQkJZWxzZQotCQkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKLQkJCQkJZWRpdGFibGVNb2RlbHMudmFsdWVzKCkucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RWRpdE1vZGVscyhFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCWlmIChhbkV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3QgYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN5bmNocm9uaXplZCAocmVhZE9ubHlNb2RlbHMpIHsKLQkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKLQkJCQlhTGlzdC5hZGRBbGwocmVhZE9ubHlNb2RlbHMudmFsdWVzKCkpOwotCQkJCWFMaXN0LmFkZEFsbChlZGl0YWJsZU1vZGVscy52YWx1ZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgYUxpc3QuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQllZGl0TW9kZWwucmVzb3VyY2VDaGFuZ2VkKGFuRXZlbnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkTm90aWZ5RWRpdE1vZGVscygpIHsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCXJldHVybiAhdGhpcy5yZWFkT25seU1vZGVscy5pc0VtcHR5KCkgfHwgIXRoaXMuZWRpdGFibGVNb2RlbHMuaXNFbXB0eSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgZ2V0UmVzb3VyY2VTZXRMaXN0ZW5lcigpIHsKLQkJaWYgKHJlc291cmNlU2V0TGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJlc291cmNlU2V0TGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VTZXRMaXN0ZW5lcigpOwotCQlyZXR1cm4gcmVzb3VyY2VTZXRMaXN0ZW5lcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBSZXNvdXJjZVNldExpc3RlbmVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQkvKgotCQkgKiBAc2VlIEFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClOb3RpZmllciwKLQkJICogICAgICBpbnQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRU9iamVjdCwgT2JqZWN0LCBPYmplY3QsIGludCkpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQkJCWFkZGVkUmVzb3VyY2UoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQkJCXJlbW92ZWRSZXNvdXJjZSgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOgotCQkJCQlyZW1vdmVkUmVzb3VyY2VzKChMaXN0KSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgYWRkZWRSZXNvdXJjZShSZXNvdXJjZSBhZGRlZFJlc291cmNlKSB7Ci0JCWlmIChkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSAmJiAoYWRkZWRSZXNvdXJjZSAhPSBudWxsKSAmJiAoYWRkZWRSZXNvdXJjZSBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkpCi0JCQkoKENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkgYWRkZWRSZXNvdXJjZSkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCWlmIChzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LkFEREVEX1JFU09VUkNFLCBudWxsKTsKLQkJCWV2ZW50LmFkZFJlc291cmNlKGFkZGVkUmVzb3VyY2UpOwotCQkJbm90aWZ5RWRpdE1vZGVscyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgYWxsIGVkaXRNb2RlbHMgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkUmVzb3VyY2UoUmVzb3VyY2UgcmVtb3ZlZFJlc291cmNlKSB7Ci0JCWlmIChzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIG51bGwpOwotCQkJZXZlbnQuYWRkUmVzb3VyY2UocmVtb3ZlZFJlc291cmNlKTsKLQkJCW5vdGlmeUVkaXRNb2RlbHMoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlZFJlc291cmNlcyhMaXN0IHJlbW92ZWRSZXNvdXJjZXMpIHsKLQkJaWYgKHNob3VsZE5vdGlmeUVkaXRNb2RlbHMoKSkgewotCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSwgbnVsbCk7Ci0JCQlldmVudC5hZGRSZXNvdXJjZXMocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQlub3RpZnlFZGl0TW9kZWxzKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0TGlzdGVuaW5nVG9SZXNvdXJjZVNldCgpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHNldCAhPSBudWxsKQotCQkJc2V0LmVBZGFwdGVycygpLmFkZChnZXRSZXNvdXJjZVNldExpc3RlbmVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyI3Byb2plY3RDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCS8vIGRlZmF1bHQgbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyI3Byb2plY3RDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoKSB7Ci0JCWRpc2NhcmRBbGxFZGl0TW9kZWxzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZSNjcmVhdGVVUklDb252ZXJ0ZXIob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY3JlYXRlVVJJQ29udmVydGVyKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChnZXRQcm9qZWN0KCksIGFSZXNvdXJjZVNldC5nZXRTeW5jaHJvbml6ZXIoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dGVtcHQgdG8gY3JlYXRlIHJlc291cmNlIHNldCB3aXRoIG51bGwgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwocHJvamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZSNkZWxldGVGaWxlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWxldGVGaWxlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5kZWxldGVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZXgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkoKSB7Ci0JCXJldHVybiBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkKLQkgKiAgICAgICAgICAgIFRoZSBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkoYm9vbGVhbiBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSkgewotCQl0aGlzLmRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5ID0gZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDU0YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyNSwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICovCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVtZndvcmtiZW5jaGVkaXQiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb25fVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNuYXBzaG90X0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5X0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VkaXRNb2RlbExlYXN0VXNlZENhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDFjYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gY2FjaGUgdGhlIHJlY2VudGx5IHVzZWQgZWRpdCBtb2RlbHMuICBMb2FkaW5nIGFuZCB1bmxvYWRpbmcgb2YgZWRpdCBtb2RlbHMgY2FuIGJlCi0gKiBjb3N0bHksIGVzcGVjaWFsbHkgaWYgb3BlcmF0aW9ucyBhbmQvb3IgcG9zdCBvcGVyYXRpb25zIGhhdmUgYSBuZWVkIHRvIHJlbG9hZCB0aGUgc2FtZSBlZGl0IG1vZGVsIHJlcGVhdGVkbHkuCi0gKiBUaGlzIHdpbGwgYWxsb3cgdGhvc2UgcmVwZWF0ZWRseSB1c2VkIGVkaXQgbW9kZWxzIHRvIGJlIGNhY2hlZCwgdGhlcmVieSBpbXByb3ZpbmcgcGVyZm9ybWFuY2UuICBCeSBkZXNpZ24sIHRoZQotICogZWRpdCBtb2RlbHMgbG9hZCByZXNvdXJjZXMgYW5kIHRoZXNlIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIG1lbW9yeSwgc28gd2UgZG9uJ3Qgd2FudCB0byBjYWNoZSBldmVyeSBlZGl0Ci0gKiBtb2RlbCBhY2Nlc3NlZCwgc28gdGhpcyBpcyBhIGxlYXN0IHVzZWQgY2FjaGUgbWVjaGFuaXNtLCB3aGVyZSB0aGUgbWF4IHNpemUgaXMgMTAuICBJZiBhbiBlZGl0IG1vZGVsIGlzIHVzZWQKLSAqIGl0IGlzIHB1dCB0byB0aGUgYmFjayBvZiB0aGUgc3RhY2ssIGFuZCBuZXcgZWRpdCBtb2RlbHMgYWNjZXNzZWQgYXJlIHB1dCB0byB0aGUgYmFjayBvZiB0aGUgc3RhY2ssIHNvIHRoYXQgdGhlCi0gKiB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBmaXJzdCBlZGl0IG1vZGVsIGRpc3Bvc2VkIHdoZW4gdGhlIGNhY2hlIGlzIGhpZ2hlciB0aGFuIHRoZSB0aHJlc2hob2xkLgotICoKLSAqLwotcHVibGljIGNsYXNzIEVkaXRNb2RlbExlYXN0VXNlZENhY2hlIHsKLQkKLQkvKioKLQkgKiBQcm92aWRlIGEgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVkaXRNb2RlbExlYXN0VXNlZENhY2hlIElOU1RBTkNFID0gbmV3IEVkaXRNb2RlbExlYXN0VXNlZENhY2hlKCk7CQotCQotCS8qKgotCSAqIFRoZSB0aHJlc2hvbGQsIG9yIG1vc3QgZWRpdCBtb2RlbHMgd2Ugd2lsbCBrZWVwIG9wZW4gYXQgYSB0aW1lIGlzIDEwLiAgVGhpcyBpcyBsb3cgZW5vdWdoIHRvIG5vdAotCSAqIG92ZXJ3aGVsbSB3b3JrYmVuY2ggbWVtb3J5IGFuZCBoaWdoIGVub3VnaCB0byBhaWQgaW4gb3BlcmF0aW9ucyB3aGljaCBjb250aW51YWxseSByZWxvYWQgMy00IAotCSAqIGVkaXQgbW9kZWxzLgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCB0aHJlc2hob2xkID0gMTA7Ci0JCi0JLyoqCi0JICogIEEgTEhTIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGUgb3JkZXIgb2YgdGhlIGl0ZW1zIGlzIG1haW50YWluZWQuIE90aGVyCi0JICogU2V0IGltcGxlbWVudGF0aW9ucyAoSGFzaFNldCwgVHJlZVNldCkgZG8gbm90IHByZXNlcnZlIHRoZSBvcmRlci4gVGhpcyAKLQkgKiBpcyBjcml0aWNhbCB0byB0aGUgaW1wbGVtZW50YXRpb24uIERPIE5PVCBDSEFOR0UgVEhJUy4gCi0JICovCi0JcHJpdmF0ZSBMaW5rZWRIYXNoU2V0IGxydSA9IG5ldyBMaW5rZWRIYXNoU2V0KHRocmVzaGhvbGQpOwotCQotCS8qKgotCSAqIEFjY2Vzc29yIGZvciB0aGUgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgSU5TVEFOQ0UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSBJTlNUQU5DRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgbHJ1IHRoYXQgYXJlIGNvbnRhaW5lZAotCSAqIGluIDxjb2RlPmFDb2xsZWN0aW9uPC9jb2RlPi4gIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlCi0JICogRWRpdE1vZGVscyBpbiB0aGUgYUNvbGxlY3Rpb24gd2lsbCBiZSBkaXNjYXJkZWQgYW5kIGl0Ci0JICogd2lsbCBub3QgYXR0ZW1wdCB0byBkZWNyZW1lbXQgaXRzIHJlZmVyZW5jZSBjb3VudC4KLQkgKiBAcGFyYW0gYUNvbGxlY3Rpb24gLSBBIHtAbGluayBDb2xsZWN0aW9ufSBvZiB7QGxpbmsgRWRpdE1vZGVsfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxDYWNoZWQoQ29sbGVjdGlvbiBhQ29sbGVjdGlvbikgewotCQlpZiAoYUNvbGxlY3Rpb24gIT0gbnVsbCkgeyAKLQkJCWxydS5yZW1vdmVBbGwoYUNvbGxlY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4ge0BsaW5rIEVkaXRNb2RlbH0gaXMgYmVpbmcgYWNjZXNzZWQgc28gd2Ugd2lsbCB3YW50Ci0JICogdG8gdXBkYXRlIHRoZSBscnUgYW5kIGFjY2VzcyB0aGUgZWRpdE1vZGVsIHdoaWNoIHdpbGwgaG9sZAotCSAqIGEgcmVmZXJlbmNlIGNvdW50LgotCSAqIEBwYXJhbSBlZGl0TW9kZWwgLSBUaGUge0BsaW5rIEVkaXRNb2RlbH0gdGhhdCB3ZSB3YW50IHRvIHBsYWNlCi0JICogCWluIHRoZSBsZWFzdCB1c2VkIGNhY2hlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VzcyhFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWJvb2xlYW4gc2hvdWxkQWNjZXNzID0gdHJ1ZTsKLQkJc3luY2hyb25pemVkIChscnUpIHsKLQkJCWlmIChscnUuY29udGFpbnMoZWRpdE1vZGVsKSkgewotCQkJCW1vdmVUb0VuZChlZGl0TW9kZWwpOwotCQkJCXNob3VsZEFjY2VzcyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChzaG91bGRBY2Nlc3MpIHsKLQkJCWVkaXRNb2RlbC5hY2Nlc3ModGhpcyk7Ci0JCQlzeW5jaHJvbml6ZWQgKGxydSkgewotCQkJCWxydS5hZGQoZWRpdE1vZGVsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB3ZSBoaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBscnUgdGhlbiByZW1vdmUgdGhlIGZpcnN0IG9uZQotCSAqIGFuZCByZWxlYXNlIGFjY2Vzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvcHRpbWl6ZUxSVVNpemVJZk5lY2Vzc2FyeSgpIHsKLQkJRWRpdE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCi0JCXN5bmNocm9uaXplZCAobHJ1KSB7Ci0JCQlpZiAobHJ1LnNpemUoKSA+IHRocmVzaGhvbGQpIHsKLQkJCQkvLyByZW1vdmUgb2xkZXN0IGVsZW1lbnQgYW5kIHJlbGVhc2UgdGhlIGVkaXQgbW9kZWwuCi0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBscnUuaXRlcmF0b3IoKTsKLQkJCQltb2RlbCA9IChFZGl0TW9kZWwpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQlscnUucmVtb3ZlKG1vZGVsKTsJCi0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChtb2RlbCAhPSBudWxsKQotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBlZGl0TW9kZWwgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAKLQkgKiBAcGFyYW0gZWRpdE1vZGVsIC0tIEVkaXRNb2RlbCB0byBiZSBtb3ZlZAotCSAqLwotCXByaXZhdGUgdm9pZCBtb3ZlVG9FbmQoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlscnUucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCWxydS5hZGQoZWRpdE1vZGVsKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1OTQwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBFbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAocmVjZWl2ZXIgPT0gbnVsbCB8fCAhKHJlY2VpdmVyIGluc3RhbmNlb2YgRU9iamVjdCkgfHwgZXhwZWN0ZWRWYWx1ZSA9PSBudWxsIHx8ICEoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgcmVjZWl2ZXI7Ci0JCVN0cmluZyBlbWZQYWNrYWdlID0gKFN0cmluZylleHBlY3RlZFZhbHVlOwotCQlyZXR1cm4gZW1mUGFja2FnZS5lcXVhbHMoZU9iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpLmdldE5zVVJJKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mVmFsaWRhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlZhbGlkYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjQyYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mVmFsaWRhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyOwotCi0KLS8qKgotICogRW1mIHZhbGlkYXRpb24gZXh0ZW5zaW9uIGZvciB2YWxhZGl0ZW1lbnVhY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVtZlZhbGlkYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25UeXBlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVtZlZhbGlkYXRpb25IYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0QmFzZVZhbGlkYXRpb25UeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRCYXNlVmFsaWRhdGlvblR5cGUoT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHNlbGVjdGlvbjsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzb3VyY2UpOwotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNnZXRWYWxpZGF0aW9uVHlwZVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uVHlwZVN0cmluZygpIHsKLQkJcmV0dXJuIHZhbGlkYXRpb25UeXBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uVHlwZVN0cmluZyhTdHJpbmcgdmFsaWRhdGlvblR5cGUpIHsKLQkJdGhpcy52YWxpZGF0aW9uVHlwZSA9IHZhbGlkYXRpb25UeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1Bhc3N0aHJ1UmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1Bhc3N0aHJ1UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwNGI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9QYXNzdGhydVJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLQotLyoqCi0gKiBUaGlzIFJlc291cmNlU2V0IGlzIHRvIGJlIHVzZWQgYnkgcGx1Z2lucyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGluZyB0byBhIGNhY2hlZCBSZXNvdXJjZVNldCB0aGF0Ci0gKiBhbHdheXMgbG9hZHMgcmVsYXRpdmUgdG8gdGhlIFdvcmtiZW5jaC4gVGhpcyBSZXNvdXJjZVNldCB3aWxsIGRpcmVjdCB0aGUgbG9hZHMgdG8gdGhlIGFwcHJvcHJpYXRlCi0gKiBQcm9qZWN0IFJlc291cmNlU2V0LiBJdCB3aWxsIG9ubHkgbG9hZCBpbiB0aGlzIFJlc291cmNlU2V0IGlmIGl0IHdhcyB1bmFibGUgdG8gbG9hZCB2aWEgdGhlCi0gKiBXb3Jrc3BhY2UuCi0gKiAKLSAqIElmIHlvdSBzZXQgd2FudCB0byB1c2VkIHRoaXMgUmVzb3VyY2VTZXQgc28gdGhhdCB0aGUgbG9hZGVkIHJlc291cmNlcyBhcmUgaXNvbGF0ZWQgZnJvbSBldmVyeW9uZQotICogZWxzZSwgeW91IHNob3VsZCB1c2UgdGhlCi0gKiAKLSAqIEBsaW5rIFBhc3N0aHJ1UmVzb3VyY2VTZXQoSVByb2plY3QpIGNvbnN0cnVjdG9yLiBUaGlzIHdpbGwgbG9hZCBhbGwgcmVzb3VyY2VzIGxvY2FsbHkgYW5kIGl0IHdpbGwKLSAqICAgICAgIG5vdCBkZWxlZ2F0ZSB0byBhbm90aGVyIFByb2plY3RSZXNvdXJjZVNldC4gVGhpcyB3b3VsZCBiZSBlcXVpdmFsZW50IHRvIGNyZWF0aW5nIGEKLSAqICAgICAgIFByb2plY3RSZXNvdXJjZVNldCB3aXRob3V0IHNldHRpbmcgYW55IGhhbmRsZXJzLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUGFzc3RocnVSZXNvdXJjZVNldCBleHRlbmRzIFByb2plY3RSZXNvdXJjZVNldEltcGwgewotCXByb3RlY3RlZCBib29sZWFuIGlzSXNvbGF0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBjbGFzcyBQYXNzdGhydVJlc291cmNlc0VMaXN0IGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsLlJlc291cmNlc0VMaXN0IHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjUwNDIwNzA3MDI0NDYyNzk4MEw7Ci0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQoKChSZXNvdXJjZSkgb2JqZWN0KS5nZXRVUkkoKSk7Ci0JCQlpZiAoc2V0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZXMoKS5hZGQoKFJlc291cmNlKW9iamVjdCk7Ci0KLQkJCXJldHVybiBzdXBlci5hZGQob2JqZWN0KTsKLQkJfQotCi0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlJdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCVJlc291cmNlIHJlczsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyZXMgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlpZiAoIVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5jYWNoZVJlc291cmNlKHJlcykpCi0JCQkJCXN1cGVyLmFkZChyZXMpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUGFzc3RocnVSZXNvdXJjZVNldCgpIHsKLQkJaXNJc29sYXRlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBSZXNvdXJjZVNldCBpc29sYXRlZCBmcm9tIHRoZQotCSAqIGFjdHVhbCBjYWNoZWQgUHJvamVjdFJlc291cmNTZXQgZm9yIHRoZSBwYXNzZWQgSVByb2plY3QuCi0JICovCi0JcHVibGljIFBhc3N0aHJ1UmVzb3VyY2VTZXQoSVByb2plY3QgcHJvamVjdCkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlpc0lzb2xhdGVkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lzb2xhdGVkKCkgewotCQlyZXR1cm4gaXNJc29sYXRlZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXN1bHQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZENyZWF0ZVJlc291cmNlKFVSSSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZGVtYW5kQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXN1bHQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlKHVyaSk7IC8vV2UgZG8gd2FudCB0byBjYWxsIHN1cGVyLmNyZWF0ZVJlc291cmNlIGFuZCBub3QKLQkJLy8gZGVtYW5kQ3JlYXRlUmVzb3VyY2UKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChpc0lzb2xhdGVkKQotCQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJlc291cmNlcyA9IG5ldyBQYXNzdGhydVJlc291cmNlc0VMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbCNjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSB1cmkpIHsKLQkJaWYgKCFpc0lzb2xhdGVkKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKHVyaSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsI2dldFJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJIHVyaSkgewotCQlpZiAoIWlzSXNvbGF0ZWQpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnModXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGwjZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkksIGJvb2xlYW4pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoIWlzSXNvbGF0ZWQpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdEZyb21IYW5kbGVycyh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NGFmOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3MgUkVGRVJFTkNFRF9SRVNfQ0xBU1MgPSBSZWZlcmVuY2VkUmVzb3VyY2UuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBGaWxlQWRhcHRlcigpOwotCQkJYWRhcHRlci5zZXRUYXJnZXQodGFyZ2V0KTsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIGludGVybmFsIGFuZCBpcyB1c2VkIHRvIHN0b3JlIHN0YXRlIG9uIHRoZSByZXNvdXJjZSwgc3BlY2lmaWNhbGx5LCBhIGNhY2hlZAotCSAqIHJlZmVyZW5jZSB0byB0aGUgSUZpbGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgQURBUFRFUl9LRVkgPSBGaWxlQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgZGVsYXkgPSAzMDsKLQkJcHJpdmF0ZSBJRmlsZSBmaWxlOwotCQlwcml2YXRlIGxvbmcgc3luY2hyb25pemF0aW9uU3RhbXA7Ci0JCXByb3RlY3RlZCBSZXNvdXJjZVNldCBwcmV2aW91c1Jlc291cmNlU2V0OwotCQlwcml2YXRlIElMb2NrIHNhdmVMb2NrOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX05PVF9MT0FERUQgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX0lOQUNDRVNTSUJMRSA9IC0xOwotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gQURBUFRFUl9LRVkuZXF1YWxzKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogVXBkYXRlIHRoZSBzeW5jaHJvbml6YXRpb24gc3RhbXAgd2hlcmUgYXBwcm9wcmlhdGUKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChudWxsKSkgewotCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCA6Ci0JCQkJCWlmIChnZXRSZXNvdXJjZSgpLmlzTG9hZGVkKCkpCi0JCQkJCQloYW5kbGVMb2FkZWQoKTsKLQkJCQkJZWxzZQotCQkJCQkJaGFuZGxlVW5sb2FkZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBSZWZlcmVuY2VkUmVzb3VyY2UuUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRToKLQkgICAgICAgICAgICAgICAgaGFuZGxlQWJvdXRUb1NhdmUoKTsKLQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgICAgY2FzZSBSZWZlcmVuY2VkUmVzb3VyY2UuUkVTT1VSQ0VfV0FTX1NBVkVEOgotCSAgICAgICAgICAgICAgICBoYW5kbGVTYXZlZCgpOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgICAgICBjYXNlIFJlZmVyZW5jZWRSZXNvdXJjZS5SRVNPVVJDRV9TQVZFX0ZBSUxFRDoKLQkgICAgICAgICAgICAgICAgaGFuZGxlU2F2ZUZhaWxlZCgpOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19VUkkgOgotCQkJCQloYW5kbGVVUklDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKCkgewotICAgICAgICAgICAgcmVsZWFzZVNhdmVMb2NrKCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBYm91dFRvU2F2ZSgpIHsKLSAgICAgICAgICAgIGFxdWlyZVNhdmVMb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYXF1aXJlU2F2ZUxvY2soKSB7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZU5hbWU6ICIgKyBnZXRGaWxlKCkuZ2V0TmFtZSgpICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFxdWlyZWRTYXZlTG9jazogIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXB0aCIgKyBnZXRTYXZlTG9jaygpLmdldERlcHRoKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlOiIrZ2V0U2F2ZUxvY2soKS5oYXNoQ29kZSgpKTsKLS8vICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIGdldFNhdmVMb2NrKCkuYWNxdWlyZSgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYXF1aXJlU2F2ZUxvY2sobG9uZyBkZWxheSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFxdWlyZWRTYXZlTG9jayB3aXRoIGRlbGF5OiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlcHRoIiArIGdldFNhdmVMb2NrKCkuZ2V0RGVwdGgoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFuY2U6IitnZXRTYXZlTG9jaygpLmhhc2hDb2RlKCkpOwotLy8gICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZ2V0U2F2ZUxvY2soKS5hY3F1aXJlKGRlbGF5KTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VTYXZlTG9jaygpIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlbGVhc2VkU2F2ZUxvY2s6ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVwdGgiICsgZ2V0U2F2ZUxvY2soKS5nZXREZXB0aCgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnN0YW5jZToiK2dldFNhdmVMb2NrKCkuaGFzaENvZGUoKSk7Ci0vLyAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBnZXRTYXZlTG9jaygpLnJlbGVhc2UoKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJTG9jayBnZXRTYXZlTG9jaygpIHsKLSAgICAgICAgICAgIGlmIChzYXZlTG9jayA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNhdmVMb2NrID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLSAgICAgICAgICAgIHJldHVybiBzYXZlTG9jazsKLSAgICAgICAgfQotCi0JCS8qKgotCQkgKiAgCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgaGFuZGxlVVJJQ2hhbmdlZCgpIHsKLQkJCWZpbGUgPSBudWxsOwotCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX05PVF9MT0FERUQ7Ci0JCX0KLQotCQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCS8vRmlyc3QgdGVzdCB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlc2V0IHRoZSBmaWxlLgotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAoIWZpbGUuaXNBY2Nlc3NpYmxlKCkgfHwgcHJldmlvdXNSZXNvdXJjZVNldCAhPSBnZXRSZXNvdXJjZVNldCgpKSkgewotCQkJCWZpbGUgPSBudWxsOwotCQkJCXN5bmNocm9uaXphdGlvblN0YW1wID0gRklMRV9OT1RfTE9BREVEOwotCQkJfQotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkoZ2V0VVJJKCkpKSB7Ci0JCQkJCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUoZ2V0VVJJKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vd2Ugc2hvdWxkIG5vdCBiZSBoZXJlIGFueW1vcmUuCi0JCQkJCWZpbGUgPSBpbnRlcm5hbEdldEZpbGUoZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJCWlmKG51bGwhPSBmaWxlICYmICFmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX0lOQUNDRVNTSUJMRTsKLQkJCQl9Ci0JCQkJcHJldmlvdXNSZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBzeW5jaHJvbml6YXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gbAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U3luY2hyb25pemF0aW9uU3RhbXAobG9uZyBsKSB7Ci0JCQlzeW5jaHJvbml6YXRpb25TdGFtcCA9IGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjaXNDb25zaXN0ZW50KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQ29uc2lzdGVudCgpIHsKLQkJCS8vVGhpcyBjaGVja3MgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSByZXNvdXJjZSBoYXNuJ3QgZmluaXNoZWQgc2F2aW5nIGZvIHRoZSBmaXJzdCB0aW1lCi0JCQlpZighZ2V0UmVzb3VyY2UoKS5pc0xvYWRlZCgpKQotCQkJCXJldHVybiB0cnVlOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaGFzTG9ja2VkID0gYXF1aXJlU2F2ZUxvY2soZGVsYXkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIGlmIChnZXRGaWxlKCkgPT0gbnVsbCB8fCAhZ2V0RmlsZSgpLmlzQWNjZXNzaWJsZSgpKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWdldEZpbGUoKS5pc1N5bmNocm9uaXplZChJRmlsZS5ERVBUSF9aRVJPKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN5bmNocm9uaXphdGlvblN0YW1wID09IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChnZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTG9ja2VkKQotICAgICAgICAgICAgICAgICAgICByZWxlYXNlU2F2ZUxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotCQlwdWJsaWMgdm9pZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCQkJc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGdldEZpbGUoKSkpOwotCQl9Ci0KLQkJcHVibGljIFJlZmVyZW5jZWRSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJCXJldHVybiAoUmVmZXJlbmNlZFJlc291cmNlKSB0YXJnZXQ7Ci0JCX0KLQotCQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJCXJldHVybiB0YXJnZXQgPT0gbnVsbCA/IG51bGwgOiBnZXRSZXNvdXJjZSgpLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQkJcmV0dXJuIHRhcmdldCA9PSBudWxsID8gbnVsbCA6IGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZVVubG9hZGVkKCkgewotCQkJZmlsZSA9IG51bGw7Ci0JCQlzeW5jaHJvbml6YXRpb25TdGFtcCA9IEZJTEVfTk9UX0xPQURFRDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUxvYWRlZCgpIHsKLQkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVkKCkgewotCQkJY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgpOwotCQkJcmVsZWFzZVNhdmVMb2NrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB0byBiZSB1c2VkIGJ5IHRoZSBwbHVnaW4gb25seQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZUZpbGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKCFmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCkgewotCQkJUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmFkZEdsb2JhbEFkYXB0ZXJGYWN0b3J5KG5ldyBGaWxlQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVBZGFwdGVyIGdldEZpbGVBZGFwdGVyKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IChGaWxlQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyZXMsIEZpbGVBZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IGNyZWF0ZUZpbGVBZGFwdGVyKHJlcykgOiBhZGFwdGVyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVBZGFwdGVyIGNyZWF0ZUZpbGVBZGFwdGVyKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBGaWxlQWRhcHRlcigpOwotCQlhZGFwdGVyLnNldFRhcmdldChyZXMpOwotCQlyZXMuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgSUZpbGUgZm9yIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLiBUaGlzIG1heSByZXR1cm4gbnVsbCBpZiB0aGUKLQkgKiByZXNvdXJjZSBkb2VzIG5vdCBiZWxvbmcgdG8gYSBQcm9qZWN0UmVzb3VyY2VTZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlcyk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlcyk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBGaWxlQWRhcHRlci5GSUxFX05PVF9MT0FERUQgOiBhZGFwdGVyLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN5bmhyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlcywgbG9uZyBzdGFtcCkgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIuc2V0U3luY2hyb25pemF0aW9uU3RhbXAoc3RhbXApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnNpc3RlbnQoUmVmZXJlbmNlZFJlc291cmNlIHJlcykgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKLQkJcmV0dXJuIGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzQ29uc2lzdGVudCgpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSByCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlZlJlc291cmNlKSB7Ci0JCWlmIChyZWZSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVmUmVzb3VyY2UpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgPD0gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEKQotCQkJCWFkYXB0ZXIuc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlZlJlc291cmNlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBSRUZFUkVOQ0VEX1JFU19DTEFTUy5pc0luc3RhbmNlKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZWZlcmVuY2VkUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlc291cmNlKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IEZpbGVBZGFwdGVyLkZJTEVfTk9UX0xPQURFRCA6IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChhZGFwdGVyLmdldEZpbGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEOwotCQlpZighZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQlyZXR1cm4gRmlsZUFkYXB0ZXIuRklMRV9JTkFDQ0VTU0lCTEU7Ci0JCX0KLQkJbG9uZyBjdXJyZW50U3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCUlQYXRoIHBhdGggPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCQlyZXR1cm4gcGF0aC50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJcmV0dXJuIGN1cnJlbnRTdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElGaWxlIHRoYXQgY3VycmVudGx5IGNvcnJlc3BvbmRzIHRvIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChpc1JlZmVyZW5jZWRSZXNvdXJjZShhUmVzb3VyY2UpKQotCQkJCXJldHVybiBnZXRGaWxlKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gaW50ZXJuYWxHZXRGaWxlKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVJlc291cmNlIG1vZlJlc291cmNlID0gb2JqLmVSZXNvdXJjZSgpOwotCQlpZiAobW9mUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RmlsZShtb2ZSZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9yIGxvYWQgYSBjYWNoZWQgUmVzb3VyY2Ugb3IgY3JlYXRlIG9uZSBpZiBpdCBpcyBub3QgZm91bmQuIEEgV3JhcHBlZEV4Y2VwdGlvbiB3aWxsIG9ubHkKLQkgKiBiZSB0aHJvd24gaWYgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBleGlzdHMgYnV0IGl0IGZhaWxlZCB0byBsb2FkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0T3JDcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCBzZXQpIHRocm93cyBXcmFwcGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsgLy90aGlzIHdpbGwgY3JlYXRlIHRoZSByZXNvdXJjZSBubyBtYXR0ZXIgd2hhdAotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5nZXRGaWxlTm90Rm91bmREZXRlY3RvcigpLmlzRmlsZU5vdEZvdW5kKGUpKQotCQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzU2FtZVByb2plY3QoUmVzb3VyY2UgcmVzb3VyY2VBLCBSZXNvdXJjZSByZXNvdXJjZUIpIHsKLQkJSVByb2plY3QgcEEsIHBCOwotCQlwQSA9IGdldFByb2plY3QocmVzb3VyY2VBKTsKLQkJcEIgPSBnZXRQcm9qZWN0KHJlc291cmNlQik7Ci0JCWlmIChwQSAhPSBudWxsICYmIHBCICE9IG51bGwpCi0JCQlyZXR1cm4gcEEuZXF1YWxzKHBCKTsKLQkJLy9vdGhlcndpc2Ugd2UgZG8gbm90IGhhdmUgZW5vdWdoIGluZm8gdG8gZGV0ZXJtaW5lIGZhbHNlIHNvIHdlIG11c3QgcmV0dXJuIHRydWUKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlIHJlcykgewotCQlJUHJvamVjdCBwcm9qID0gZ2V0UHJvamVjdChyZXMuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChwcm9qID09IG51bGwpIHsKLQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXByb2ogPSBmaWxlLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gcHJvajsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGJ5IGNsaWVudHMuIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSBjbGllbnRzIHRoYXQgYWxzbyBjYWxsCi0JICogZ2V0RmlsZSguLi4pLiBUaGlzIGlzIHRvIGF2b2lkIGVuZGxlc3MgbG9vcHMuCi0JICogCi0JICogQHNlZSBnZXRGaWxlKFJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSUZpbGUgaW50ZXJuYWxHZXRGaWxlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RmlsZShhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSwgYVJlc291cmNlLmdldFVSSSgpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElGaWxlIGdldEZpbGUoUmVzb3VyY2VTZXQgc2V0LCBVUkkgdXJpKSB7Ci0JCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUodXJpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOwotCQkJCWlmICghdXJpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKQotCQkJCQlyZXR1cm4gZ2V0UGxhdGZvcm1GaWxlKGNvbnZlcnRlZFVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKLQkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldFBsYXRmb3JtRmlsZShVUkkgdXJpKSB7Ci0JCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOwotCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShJUHJvamVjdCBwcm9qZWN0LCBVUkkgdXJpKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHByb2plY3QpOwotCQlyZXR1cm4gZ2V0RmlsZShzZXQsIHVyaSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHNhdmUgPGNvZGU+YVJlc291cmNlPC9jb2RlPiB3aXRoaW4gdGhlIElQcm9qZWN0Ci0JICogdGhhdCBpdCBpcyBjdXJyZW50bHkgcmVzaWRpbmcgYnV0IHlvdSBkbyBub3Qgd2FudCB0byBzYXZlIGl0IGluIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbi4KLQkgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBhcGkgdG8gc2F2ZSBhIFJlc291cmNlIHRvIGFuIGV4aXN0aW5nIGZpbGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBhcGkgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIHJlc291cmNlIHdpdGggdGhlIGFic29sdXRlCi0JICogICAgICAgICAgICAgcGF0aCAocGxhdGZvcm06L3Jlc291cmNlLy4uLikuIFVwb24gc2F2ZSwgdGhlIGZpbGUgd2lsbCBiZSBzYXZlZCB0byB0aGlzCi0JICogICAgICAgICAgICAgbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVSZXNvdXJjZVRvRmlsZShSZXNvdXJjZSBhUmVzb3VyY2UsIElGaWxlIGFGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNhdmVSZXNvdXJjZVRvRmlsZShhUmVzb3VyY2UsIGFGaWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gc2F2ZSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IHdpdGhpbiB0aGUgSVByb2plY3QKLQkgKiB0aGF0IGl0IGlzIGN1cnJlbnRseSByZXNpZGluZyBidXQgeW91IGRvIG5vdCB3YW50IHRvIHNhdmUgaXQgaW4gdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uLgotCSAqIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGFwaSB0byBzYXZlIGEgUmVzb3VyY2UgdG8gYW4gZXhpc3RpbmcgZmlsZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGFwaSBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFlvdSBzaG91bGQgY3JlYXRlIGEgcmVzb3VyY2Ugd2l0aCB0aGUgYWJzb2x1dGUKLQkgKiAgICAgICAgICAgICBwYXRoIChwbGF0Zm9ybTovcmVzb3VyY2UvLi4uKS4gVXBvbiBzYXZlLCB0aGUgZmlsZSB3aWxsIGJlIHNhdmVkIHRvIHRoaXMKLQkgKiAgICAgICAgICAgICBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZVJlc291cmNlVG9GaWxlKFJlc291cmNlIGFSZXNvdXJjZSwgSUZpbGUgYUZpbGUsIE1hcCBzYXZlT3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBhRmlsZSAhPSBudWxsICYmICFhRmlsZS5leGlzdHMoKSkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gYVJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCQlVUklDb252ZXJ0ZXIgY29udiA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlpZiAoY29udiAhPSBudWxsICYmIGNvbnYgaW5zdGFuY2VvZiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIHsKLQkJCQkJV29ya2JlbmNoVVJJQ29udmVydGVyIHdiQ29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGNvbnY7Ci0JCQkJCVN0cmluZyB1cmkgPSBhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCQkJSVBhdGggcmVzUGF0aCwgZmlsZVBhdGg7Ci0JCQkJCXJlc1BhdGggPSBuZXcgUGF0aCh1cmkpOwotCQkJCQlmaWxlUGF0aCA9IGFGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQkJaW50IHJlc0NvdW50LCBmaWxlQ291bnQ7Ci0JCQkJCXJlc0NvdW50ID0gcmVzUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJZmlsZUNvdW50ID0gZmlsZVBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJCWlmIChyZXNDb3VudCA8PSBmaWxlQ291bnQpIHsKLQkJCQkJCWZpbGVQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhmaWxlQ291bnQgLSByZXNDb3VudCk7Ci0JCQkJCQlpZiAocmVzUGF0aC5lcXVhbHMoZmlsZVBhdGgpKSB7Ci0JCQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gd2JDb252LmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS50b1N0cmluZygpKSk7Ci0JCQkJCQkJaWYgKG9zICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWFSZXNvdXJjZS5zYXZlKG9zLCBzYXZlT3B0aW9ucyk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQlvcy5jbG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRlbGV0ZUZpbGUoSUZpbGUgYUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUuZXhpc3RzKCkpCi0JCQlhRmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlCi0JICogCi0JICogQGFSZXNvdXJjZSBpbiB0aGUgV29ya2JlbmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJZGVsZXRlRmlsZShnZXRGaWxlKGFSZXNvdXJjZSkpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY5YjRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjYsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlVVJJID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgdmlld0lEcyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgbG9hZE9yZGVyOwotCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMDsKLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0KLQkJcGFja2FnZVVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuUEFDS0FHRV9VUkkpOwotCQlpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuSUQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhY2thZ2VVUkksIEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzApOwotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCBFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8xLCBuZXcgT2JqZWN0W117ZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKX0pKTsKLQotCQlyZWFkVmlld0lEcygpOwotCQl0aGlzLmxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoJ1snKTsKLQkJc2IuYXBwZW5kKHBhY2thZ2VVUkkpOwotCQlzYi5hcHBlbmQoIixwIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGdldFByaW9yaXR5KCkpOwotCQlpZiAodmlld0lEcyAhPSBudWxsICYmICF2aWV3SURzLmlzRW1wdHkoKSkgewotCQkJc2IuYXBwZW5kKCc6Jyk7Ci0JCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSB2aWV3SURzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoIWZpcnN0KQotCQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKCddJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkVmlld0lEcygpIHsKLQkJdmlld0lEcyA9IG5ldyBIYXNoU2V0KDMpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5WSUVXKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHZpZXdJRCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXZpZXdJRCA9IGNoaWxkcmVuW2ldLmdldEF0dHJpYnV0ZShBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LklEKTsKLQkJCWlmICh2aWV3SUQgIT0gbnVsbCkKLQkJCQl2aWV3SURzLmFkZCh2aWV3SUQpOwotCQl9Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUluc3RhbmNlKCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5DTEFTU19OQU1FKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlVVJJKCkgewotCQlyZXR1cm4gcGFja2FnZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFZpZXdJRHMoKSB7Ci0JCXJldHVybiB2aWV3SURzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhTdHJpbmcgdmlld0lEKSB7Ci0JCXJldHVybiB2aWV3SURzLmlzRW1wdHkoKSB8fCB2aWV3SURzLmNvbnRhaW5zKHZpZXdJRCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzID09IG8pCi0JCQlyZXR1cm4gMDsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gMTsKLQkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBvOwotCi0JCWludCBwQ29tcGFyZSA9IGdldFByaW9yaXR5KCkgLSBkZXNjLmdldFByaW9yaXR5KCk7Ci0JCWlmIChwQ29tcGFyZSAhPSAwKQotCQkJLy9XZSBoYXZlIHJldmVyc2UgdGhlIHNvcnRpbmcgb2YgdGhlIHByaW9yaXR5IGZvciB0aGUgYWRhcHRlciBmYWN0b3JpZXMKLQkJCXJldHVybiAtcENvbXBhcmU7Ci0KLQkJLy9UaGUgZ3JvdXAgaXMgdGhlIHNhbWUgLSBpbiB0aGlzIGNhc2UgdGhlIG9uZSBmb3IgYSBzcGVjaWZpYyB2aWV3IGhhcyBwcmVjZWRlbmNlIG92ZXIKLQkJLy9hIGdlbmVyaWMgb25lCi0JCWVsc2UgaWYgKHZpZXdJRHMgIT0gbnVsbCAmJiAhdmlld0lEcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yI2dldElEKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRPcmRlci4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2U0YmEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfRkFDVE9SWSA9ICJhZGFwdGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfVVJJID0gInBhY2thZ2VVUkkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVcgPSAidmlldyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZGVzY3JpcHRvck1hcCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkFEQVBURVJfRkFDVE9SWV9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0b3JzKEVQYWNrYWdlIHBrZywgU3RyaW5nIHZpZXdJRCkgewotCQlDb2xsZWN0aW9uIGFsbCA9IGdldERlc2NyaXB0b3JzKHBrZyk7Ci0JCWlmIChhbGwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBhbGwuaXRlcmF0b3IoKTsKLQkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSBudWxsOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoYWxsLnNpemUoKSk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlc2MuYXBwbGllc1RvKHZpZXdJRCkpCi0JCQkJcmVzdWx0LmFkZChkZXNjKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldERlc2NyaXB0b3JzKEVQYWNrYWdlIHJlZ2lzdGVyZWRQYWNrYWdlKSB7Ci0JCXJldHVybiAoQ29sbGVjdGlvbikgZ2V0RGVzY3JpcHRvck1hcCgpLmdldChyZWdpc3RlcmVkUGFja2FnZS5nZXROc1VSSSgpKTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXREZXNjcmlwdG9yTWFwKCkgewotCQlpZiAoZGVzY3JpcHRvck1hcCA9PSBudWxsKQotCQkJZGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBkZXNjcmlwdG9yTWFwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoQURBUFRFUl9GQUNUT1JZKSkgewotCQkJCUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCQltYXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKHJlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1hcERlc2NyaXB0b3IoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJU3RyaW5nIHVyaSA9IGRlc2NyaXB0b3IuZ2V0UGFja2FnZVVSSSgpOwotCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzID0gKENvbGxlY3Rpb24pIGdldERlc2NyaXB0b3JNYXAoKS5nZXQodXJpKTsKLQkJaWYgKGRlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JzID0gbmV3IFRyZWVTZXQoKTsKLQkJCWdldERlc2NyaXB0b3JNYXAoKS5wdXQodXJpLCBkZXNjcmlwdG9ycyk7Ci0JCX0KLQkJZGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaW5zdGFuY2UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DaGlsZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2hpbGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZTIzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DaGlsZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgODo1Nzo1NiBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2hpbGRDb21tYW5kIGV4dGVuZHMgRWRpdE1vZGVsQ29tbWFuZCB7Ci0JcHJpdmF0ZSBQYXJlbnRDb21tYW5kIHBhcmVudDsKLQlwcml2YXRlIEVkaXRNb2RlbFJldHJpZXZlciBtb2RlbFJldHJpZXZlcjsKLQotCXB1YmxpYyBDaGlsZENvbW1hbmQoUGFyZW50Q29tbWFuZCBwYXJlbnRDbWQsIENvbW1hbmQgdGFyZ2V0Q21kLCBFZGl0TW9kZWxSZXRyaWV2ZXIgcmV0cmlldmVyKSB7Ci0JCXN1cGVyKHRhcmdldENtZCk7Ci0JCXBhcmVudCA9IHBhcmVudENtZDsKLQkJbW9kZWxSZXRyaWV2ZXIgPSByZXRyaWV2ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy9kb2VzIG5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlSW5Nb2RlbChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgY21kKSB7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOwotCQl0cnkgewotCQkJbW9kZWwuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDk6MzU6MzYgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RWRpdE1vZGVsS2V5KCkgewotCQlyZXR1cm4gbW9kZWxSZXRyaWV2ZXIuZ2V0RWRpdE1vZGVsSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA5OjM1OjM2IEFNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guUGFyZW50Q29tbWFuZAotCSAqLwotCXB1YmxpYyBQYXJlbnRDb21tYW5kIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlyZWRvSW5Nb2RlbCgpOwotCQlnZXRQYXJlbnQoKS5yZWRvRnJvbSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWRvSW5Nb2RlbCgpIHsKLQkJRWRpdE1vZGVsIG1vZGVsID0gbW9kZWxSZXRyaWV2ZXIuZ2V0RWRpdE1vZGVsRm9yV3JpdGUodGhpcyk7Ci0JCXRyeSB7Ci0JCQlnZXRUYXJnZXQoKS5yZWRvKCk7Ci0JCQltb2RlbC5zYXZlSWZOZWNlc3NhcnkodGhpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdW5kb0luTW9kZWwoKTsKLQkJZ2V0UGFyZW50KCkudW5kb0Zyb20odGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5kb0luTW9kZWwoKSB7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOwotCQl0cnkgewotCQkJZ2V0VGFyZ2V0KCkudW5kbygpOwotCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0YmMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCA2LCAyMDAzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRBY2Nlc3NSZWdpc3RyeSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV2Vha0hhc2hNYXAgcmVnaXN0cnkgPSBuZXcgV2Vha0hhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgZmluYWwgU2V0IGJhc2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJaWYgKGlzU3RhYmxlKCkpIHsKLQkJCWlmICghcmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpKSB7Ci0JCQkJU25hcHNob3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3QoKTsKLQkJCQl0aGlzLnJlZ2lzdHJ5LnB1dChhY2Nlc3NvcktleSwgc25hcHNob3QpOwotCQkJCXRoaXMuYmFzZVNldC5hZGQoc25hcHNob3QpOwotCi0JCQl9IGVsc2UKLQkJCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wLCBhY2Nlc3NvcktleSk7Ci0KLQkJfSBlbHNlCi0JCQljb21wbGFpbigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCS8qCi0JCSAqIEVycm9yIGNvbmRpdGlvbjogU29tZSBvbmUgaGFzIGJlZW4gbmF1Z2h0eSBhbmQgbm90IHJlbGVhc2VkIHRoZSByZXNvdXJjZQotCQkgKi8KLQkJaWYgKHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpICYmIGlzU3RhYmxlKCkpIHsKLQkJCVNuYXBzaG90IHNuYXBzaG90ID0gKFNuYXBzaG90KSB0aGlzLnJlZ2lzdHJ5LnJlbW92ZShhY2Nlc3NvcktleSk7Ci0JCQl0aGlzLmJhc2VTZXQucmVtb3ZlKHNuYXBzaG90KTsKLQkJfSBlbHNlCi0JCQljb21wbGFpbihhY2Nlc3NvcktleSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFzc2VydEFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJaWYgKCFpc0NsaWVudEFjY2Vzc2luZyhhY2Nlc3NvcktleSkpCi0JCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMSIpLCBhY2Nlc3NvcktleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDbGllbnRBY2Nlc3NpbmcoT2JqZWN0IGNsaWVudCkgewotCQlib29sZWFuIHJlc3VsdCA9IHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoY2xpZW50KTsKLQkJaWYgKCFpc1N0YWJsZSgpKQotCQkJY29tcGxhaW4oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBbnlDbGllbnRBY2Nlc3NpbmcoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5yZWdpc3RyeS5zaXplKCkgPiAwOwotCQlpZiAoIWlzU3RhYmxlKCkpCi0JCQljb21wbGFpbigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1N0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVNldC5zaXplKCkgPT0gdGhpcy5yZWdpc3RyeS5zaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29tcGxhaW4oKSB7Ci0JCWNvbXBsYWluKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbXBsYWluKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlpZiAoIWlzU3RhYmxlKCkpCi0JCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24odGhpcy5yZWdpc3RyeSwgdGhpcy5iYXNlU2V0KTsKLQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzEiKSwgYWNjZXNzb3JLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5OiBbIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgoaXNTdGFibGUoKSkgPyAiU1RBQkxFIiA6ICJPVVQgT0YgU1lOQyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmVzdWx0LmFwcGVuZCgiXTogUmVmZXJlbmNlIENvdW50ID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0aGlzLnNpemUoKSk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5yZWdpc3RyeS5zaXplKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzQyYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMiwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKLQotCi0vKioKLSAqIFRoZSBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbiBhY2NlcHRzIGEgV2Vha0hhc2hTZXQgcmVnaXN0cnkgYW5kIGEgU2V0IG9mIGFsbCBTbmFwc2hvdHMgdGhhdAotICogc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiB0aGUgcmVnaXN0cnkuIEl0IHdpbGwgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IHNldCBkaWZmZXJlbmNlIGluIG9yZGVyIHRvCi0gKiBkZXRlcm1pbmUgd2hpY2ggU25hcHNob3RzIGV4aXN0IGluIHRoZSBiYXNlU2V0IGJ1dCBub3QgaW4gdGhlIHJlZ2lzdHJ5LgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTAxNjgyNzAyMjI4OTM3NzI5Mkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFOR0xJTkdfUkVGRVJFTkNFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0FDQ0VTU19LRVkgPSAyOwotCXByaXZhdGUgV2Vha0hhc2hNYXAgcmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgU2V0IGJhc2VTZXQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsKLQlwcml2YXRlIGludCB0eXBlID0gVU5LTk9XTjsKLQotCXB1YmxpYyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihXZWFrSGFzaE1hcCByZWdpc3RyeSwgU2V0IGJhc2VTZXQpIHsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl0aGlzLmJhc2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCQl0aGlzLmJhc2VTZXQuYWRkQWxsKGJhc2VTZXQpOwotCQl0aGlzLnR5cGUgPSBEQU5HTElOR19SRUZFUkVOQ0U7Ci0JfQotCi0JcHVibGljIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKFN0cmluZyBtc2csIE9iamVjdCBrZXkpIHsKLQkJc3VwZXIobXNnICsgIiA6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMudHlwZSA9IElOVkFMSURfQUNDRVNTX0tFWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsKLQotCQlzLnByaW50bG4odG9TdHJpbmcoKSk7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQotCQlpZiAodGhpcy5yZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlTbmFwc2hvdCBzbmFwc2hvdCA9IG51bGw7Ci0JCQlpZiAoIXByb2Nlc3NlZCkgewotCQkJCU9iamVjdCBrZXkgPSBudWxsOwotCQkJCUl0ZXJhdG9yIGtleUl0ZXJhdG9yID0gdGhpcy5yZWdpc3RyeS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJa2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOwotCQkJCQlzbmFwc2hvdCA9IChTbmFwc2hvdCkgdGhpcy5yZWdpc3RyeS5nZXQoa2V5KTsKLQkJCQkJdGhpcy5iYXNlU2V0LnJlbW92ZShzbmFwc2hvdCk7Ci0JCQkJfQotCQkJCXByb2Nlc3NlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzLnByaW50bG4oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoYmFzZVNldC5zaXplKCkpLnRvU3RyaW5nKCl9KSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgcG9zc2libGVDdWxwcml0c0l0ciA9IGJhc2VTZXQuaXRlcmF0b3IoKTsgcG9zc2libGVDdWxwcml0c0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJc25hcHNob3QgPSAoU25hcHNob3QpIHBvc3NpYmxlQ3VscHJpdHNJdHIubmV4dCgpOwotCQkJCXNuYXBzaG90LnByaW50U3RhY2tUcmFjZShzKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBzKSB7Ci0KLQkJcy5wcmludGxuKHRvU3RyaW5nKCkpOwotCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCWlmICh0aGlzLnJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCVNuYXBzaG90IHNuYXBzaG90ID0gbnVsbDsKLQkJCWlmICghcHJvY2Vzc2VkKSB7Ci0JCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQkJSXRlcmF0b3Iga2V5SXRlcmF0b3IgPSB0aGlzLnJlZ2lzdHJ5LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlrZXkgPSBrZXlJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXNuYXBzaG90ID0gKFNuYXBzaG90KSB0aGlzLnJlZ2lzdHJ5LmdldChrZXkpOwotCQkJCQl0aGlzLmJhc2VTZXQucmVtb3ZlKHNuYXBzaG90KTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc2VkID0gdHJ1ZTsKLQkJCX0KLQkJCXMucHJpbnRsbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiIiwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKGJhc2VTZXQuc2l6ZSgpKS50b1N0cmluZygpfSkpOyAvLyROT04tTkxTLTEkCi0KLQkJCWZvciAoSXRlcmF0b3IgcG9zc2libGVDdWxwcml0c0l0ciA9IGJhc2VTZXQuaXRlcmF0b3IoKTsgcG9zc2libGVDdWxwcml0c0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJc25hcHNob3QgPSAoU25hcHNob3QpIHBvc3NpYmxlQ3VscHJpdHNJdHIubmV4dCgpOwotCQkJCXNuYXBzaG90LnByaW50U3RhY2tUcmFjZShzKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgREFOR0xJTkdfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gIkRBTkdMSU5HX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSU5WQUxJRF9BQ0NFU1NfS0VZIDoKLQkJCQlyZXR1cm4gIklOVkFMSURfQUNDRVNTX0tFWSI7IC8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8xLCBuZXcgT2JqZWN0W117Z2V0VHlwZSgpfSkpOwotCQkvLwkJaWYgKHRoaXMuYmFkUmVmZXJlbmNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkvLwkJCXJlc3VsdC5hcHBlbmQoIlRoZSBpbnZhbGlkIGFjY2VzcyBvY2N1cnJlZCBzb21ld2hlcmUgaW4gdGhlIGZvbGxvd2luZyBzdGFjawotCQkvLyB0cmFjZS4iKS5hcHBlbmQoIlxuIik7Ci0JCS8vCQkJcmVzdWx0LmFwcGVuZCh0aGlzLmJhZFJlZmVyZW5jZUxvY2F0aW9uLmdldFN0YWNrVHJhY2VTdHJpbmcoKSk7Ci0JCS8vCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oInRlc3QgbWVzc2FnZSIsICItc29tZWtleW9iai0iKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTElORUJSRUFLIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihuZXcgV2Vha0hhc2hNYXAoKSwgbmV3IEhhc2hTZXQoKSkudG9TdHJpbmcoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTElORUJSRUFLIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKCJ0ZXN0IG1lc3NhZ2UiLCAiLXNvbWVrZXlvYmotIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxJTkVCUkVBSyIpOyAvLyROT04tTkxTLTEkCi0JCW5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihuZXcgV2Vha0hhc2hNYXAoKSwgbmV3IEhhc2hTZXQoKSkucHJpbnRTdGFja1RyYWNlKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODUzYTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5Mb2NrTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSUVNRkNvbnRleHRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSBleHRlbmRzIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IHsKLQkKLQkKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgcHJpbUNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0KGFQcm9qZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgY3JlYXRlU3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgTG9ja01hbmFnZXIgbG9ja01hbmFnZXIgPSBuZXcgTG9ja01hbmFnZXIoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBwcm9qZWN0TG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIElMb2NrIGdldFByb2plY3RMb2NrT2JqZWN0KElQcm9qZWN0IGFQcm9qZWN0KXsKLQkJaWYobnVsbCA9PSBhUHJvamVjdCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJbnRlZ2VyIGhhc2hDb2RlID0gbmV3IEludGVnZXIoYVByb2plY3QuaGFzaENvZGUoKSk7Ci0JCXN5bmNocm9uaXplZCAocHJvamVjdExvY2tzKSB7Ci0JCQlJTG9jayBsb2NrID0gKElMb2NrKXByb2plY3RMb2Nrcy5nZXQoaGFzaENvZGUpOwotCQkJaWYobG9jayA9PSBudWxsKXsKLQkJCQlsb2NrID0gbG9ja01hbmFnZXIubmV3TG9jaygpOwotCQkJCXByb2plY3RMb2Nrcy5wdXQoaGFzaENvZGUsIGxvY2spOwotCQkJfQotCQkJcmV0dXJuIGxvY2s7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJSUxvY2sgbG9jayA9IGdldFByb2plY3RMb2NrT2JqZWN0KGFQcm9qZWN0KTsKLQkJdHJ5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVFTUZDb250ZXh0KGFQcm9qZWN0LCBjb250cmlidXRvcik7Ci0JCX0gZmluYWxseXsKLQkJCWlmKG51bGwgIT0gbG9jayl7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldENhY2hlZEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJSUxvY2sgbG9jayA9IGdldFByb2plY3RMb2NrT2JqZWN0KGFQcm9qZWN0KTsKLQkJdHJ5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRDYWNoZWRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQkJfSBmaW5hbGx5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGIwODU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxOCwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkNvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxFeHRlbnNpb24gZXh0ZW5kcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFIgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBlZGl0TW9kZWxJRCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlc291cmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0KLQlwdWJsaWMgRWRpdE1vZGVsRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSURfQVRUUik7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKCJJbmNvcnJlY3QgdXNhZ2Ugb2YgZWRpdE1vZGVsRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludC4gIEVsZW1lbnQgbXVzdCBjb250YWluIGlkIGF0dHJpYnV0ZS4gIFBsdWdpbjogIiArIGdldFBsdWdpbklkKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQllZGl0TW9kZWxJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LkVESVRfTU9ERUxfSURfQVRUUik7Ci0JCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWRpdE1vZGVsUmVzb3VyY2VzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFZGl0TW9kZWxSZXNvdXJjZS5FRElUX01PREVMX1JFU09VUkNFX0VMRU1FTlQpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGVkaXRNb2RlbFJlc291cmNlcy5sZW5ndGg7IGorKykKLQkJCXJlc291cmNlcy5hZGQobmV3IEVkaXRNb2RlbFJlc291cmNlKGVkaXRNb2RlbFJlc291cmNlc1tqXSwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0TW9kZWxJRCgpIHsKLQkJcmV0dXJuIGVkaXRNb2RlbElEOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyZmJjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotY2xhc3MgRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0VYVF9FTEVNRU5UID0gImVkaXRNb2RlbEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEX0FUVFIgPSAiZWRpdE1vZGVsSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfSURfQVRUUiA9ICJmdW5jdGlvbkdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgTWFwIGV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5KCkgewotCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkVESVRfTU9ERUxfRVhURU5TSU9OX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gZXh0ZW5zaW9uc0J5SUQgPSBudWxsOwotCQlFZGl0TW9kZWxFeHRlbnNpb24gZWRpdE1vZGVsRXh0ZW5zaW9uID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFRElUX01PREVMX0VYVF9FTEVNRU5UKSkgewotCQkJZWRpdE1vZGVsRXh0ZW5zaW9uID0gbmV3IEVkaXRNb2RlbEV4dGVuc2lvbihlbGVtZW50KTsKLQkJCWV4dGVuc2lvbnNCeUlEID0gKENvbGxlY3Rpb24pIGdldEV4dGVuc2lvbnMoKS5nZXQoZWRpdE1vZGVsRXh0ZW5zaW9uLmdldEVkaXRNb2RlbElEKCkpOwotCQkJaWYgKGV4dGVuc2lvbnNCeUlEID09IG51bGwpIHsKLQkJCQlleHRlbnNpb25zQnlJRCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlnZXRFeHRlbnNpb25zKCkucHV0KGVkaXRNb2RlbEV4dGVuc2lvbi5nZXRFZGl0TW9kZWxJRCgpLCBleHRlbnNpb25zQnlJRCk7Ci0JCQl9Ci0JCQlleHRlbnNpb25zQnlJRC5hZGQoZWRpdE1vZGVsRXh0ZW5zaW9uKTsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChleHRlbnNpb25zID09IG51bGwpCi0JCQlleHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbFJlc291cmNlcyhPYmplY3QgZWRpdE1vZGVsSUQpIHsKLQkJLy9UT0RPIC0gQ2FjaGUgdGhlIHJlc291cmNlcwotCQlDb2xsZWN0aW9uIGVkaXRNb2RlbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBlZGl0TW9kZWxFeHRlbnNpb25zID0gKENvbGxlY3Rpb24pIGdldEV4dGVuc2lvbnMoKS5nZXQoZWRpdE1vZGVsSUQpOwotCi0JCWlmIChlZGl0TW9kZWxFeHRlbnNpb25zID09IG51bGwgfHwgZWRpdE1vZGVsRXh0ZW5zaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlJdGVyYXRvciBpdHIgPSBlZGl0TW9kZWxFeHRlbnNpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0TW9kZWxFeHRlbnNpb24gZXh0ID0gKEVkaXRNb2RlbEV4dGVuc2lvbikgaXRyLm5leHQoKTsKLQkJCWVkaXRNb2RlbFJlc291cmNlcy5hZGRBbGwoZXh0LmdldFJlc291cmNlcygpKTsKLQkJfQotCQlyZXR1cm4gKCFlZGl0TW9kZWxFeHRlbnNpb25zLmlzRW1wdHkoKSkgPyBlZGl0TW9kZWxSZXNvdXJjZXMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzdmZmE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLklFZGl0TW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBFZGl0TW9kZWxSZWdpc3RyeSBJTlNUQU5DRSA9ICBuZXcgRWRpdE1vZGVsUmVnaXN0cnkoKTsKLQotCXByaXZhdGUgZmluYWwgTWFwIGZhY3RvcnlDb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9FTEVNRU5UID0gImVkaXRNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTiA9ICJyZXNvdXJjZUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRF9BVFRSID0gImVkaXRNb2RlbElEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1NfQVRUUiA9ICJmYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX01PREVMX0FUVFIgPSAicGFyZW50TW9kZWxJRCI7IC8vJE5PTi1OTFMtMSQKLQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1VOS05PV05fUkVTT1VSQ0VTX0FUVFIgPSAibG9hZFVua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbFJlZ2lzdHJ5KCkgewotCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkVESVRfTU9ERUxfRkFDVE9SSUVTX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFZGl0TW9kZWxSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYoaXNJbml0aWFsaXplZCgpKSAKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJc3luY2hyb25pemVkKElOU1RBTkNFKSB7Ci0JCQlpZighaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJfQotCQl9IAotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvKgotCQkgKiBUaGUgRWRpdE1vZGVsIEV4dGVuc2lvbiBQb2ludCBkZWZpbmVzIENvbmZpZ3VyYXRpb24gZWxlbWVudHMgbmFtZWQgImVkaXRNb2RlbCIgd2l0aAotCQkgKiBhdHRyaWJ1dGVzICJlZGl0TW9kZWxJRCIgYW5kICJmYWN0b3J5Q2xhc3MiCi0JCSAqLwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVESVRfTU9ERUxfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyBlZGl0TW9kZWxJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVESVRfTU9ERUxfSURfQVRUUik7Ci0JCQlpZiAoZWRpdE1vZGVsSUQgIT0gbnVsbCkgewotCQkJCXRoaXMuZmFjdG9yeUNvbmZpZ3VyYXRpb25zLnB1dChlZGl0TW9kZWxJRCwgbmV3IEVkaXRNb2RlbEluZm8oZWRpdE1vZGVsSUQsIGVsZW1lbnQpKTsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlJRWRpdE1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RWRpdE1vZGVsRmFjdG9yeUJ5S2V5KGVkaXRNb2RlbElEKTsKLQkJcmV0dXJuIGZhY3RvcnkuZ2V0Q2FjaGVJRChlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZhY3RvcnlCeUtleShlZGl0TW9kZWxJRCkuY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRCwgY29udGV4dCwgcGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoZWRpdE1vZGVsSUQpLmNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBjb250ZXh0LCBwYXJhbXMpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBuZXcgVHJlZVNldCgpOwotCi0JCUVkaXRNb2RlbEluZm8gbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7Ci0KLQkJU3RyaW5nIHBhcmVudE1vZGVsSUQgPSBudWxsOwotCQlNYXAgdmlzaXRlZEVkaXRNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCQkvKiBjb2xsZWN0IHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgcGFyZW50cyAqLwotCQl3aGlsZSAobmV4dEVkaXRNb2RlbEluZm8gIT0gbnVsbCAmJiAocGFyZW50TW9kZWxJRCA9IG5leHRFZGl0TW9kZWxJbmZvLmdldFBhcmVudE1vZGVsSUQoKSkgIT0gbnVsbCkgewotCQkJaWYgKHZpc2l0ZWRFZGl0TW9kZWxzLmNvbnRhaW5zS2V5KHBhcmVudE1vZGVsSUQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5FZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8wLCBuZXcgT2JqZWN0W117ZWRpdE1vZGVsSUR9KSk7Ci0JCQl2aXNpdGVkRWRpdE1vZGVscy5wdXQocGFyZW50TW9kZWxJRCwgbnVsbCk7Ci0JCQlyZXNvdXJjZXMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbFJlc291cmNlcyhwYXJlbnRNb2RlbElEKSk7Ci0JCQluZXh0RWRpdE1vZGVsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKHBhcmVudE1vZGVsSUQpOwotCQl9Ci0KLQkJLyogR2V0IHRoZSByZXNvdXJjZXMgZm9yIHRoZSBhY3R1YWwgZWRpdCBtb2RlbCBpZCAqLwotCQlyZXNvdXJjZXMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbFJlc291cmNlcyhlZGl0TW9kZWxJRCkpOwotCi0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbEV4dGVuc2lvbnMoU3RyaW5nIGVkaXRNb2RlbElEKSB7IAotCQlDb2xsZWN0aW9uIGV4dGVuc2lvbnMgPSBuZXcgVHJlZVNldCgpOwotCQkKLQkJRWRpdE1vZGVsSW5mbyBuZXh0RWRpdE1vZGVsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKGVkaXRNb2RlbElEKTsKLQotCQlTdHJpbmcgcGFyZW50TW9kZWxJRCA9IG51bGw7Ci0JCU1hcCB2aXNpdGVkRWRpdE1vZGVscyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8qIGNvbGxlY3QgdGhlIHJlc291cmNlcyBmcm9tIHRoZSBwYXJlbnRzICovCi0JCXdoaWxlKG5leHRFZGl0TW9kZWxJbmZvICE9IG51bGwgJiYgKHBhcmVudE1vZGVsSUQgPSBuZXh0RWRpdE1vZGVsSW5mby5nZXRQYXJlbnRNb2RlbElEKCkpICE9IG51bGwpIHsKLQkJCWlmKHZpc2l0ZWRFZGl0TW9kZWxzLmNvbnRhaW5zS2V5KHBhcmVudE1vZGVsSUQpKSAKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMCxuZXcgT2JqZWN0IFtdIHtlZGl0TW9kZWxJRH0pKTsgCi0JCQl2aXNpdGVkRWRpdE1vZGVscy5wdXQocGFyZW50TW9kZWxJRCwgbnVsbCk7Ci0JCQlleHRlbnNpb25zLmFkZEFsbChnZXRBbGxFZGl0TW9kZWxFeHRlbnNpb25zKHBhcmVudE1vZGVsSUQpKTsKLQkJCW5leHRFZGl0TW9kZWxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQocGFyZW50TW9kZWxJRCk7Ci0JCX0KLQkJCi0JCS8qIEdldCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgYWN0dWFsIGVkaXQgbW9kZWwgaWQgKi8KLQkJZXh0ZW5zaW9ucy5hZGRBbGwoZ2V0QWxsRWRpdE1vZGVsRXh0ZW5zaW9ucyhlZGl0TW9kZWxJRCkpOwotCQkKLQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JfQotCQotCXB1YmxpYyBJRWRpdE1vZGVsRmFjdG9yeSBmaW5kRWRpdE1vZGVsRmFjdG9yeUJ5S2V5KE9iamVjdCBlZGl0TW9kZWxJRCkgewotCQlJRWRpdE1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJRWRpdE1vZGVsSW5mbyBlZGl0TWRsSW5mbyA9IChFZGl0TW9kZWxJbmZvKSBmYWN0b3J5Q29uZmlndXJhdGlvbnMuZ2V0KGVkaXRNb2RlbElEKTsKLQkJaWYgKGVkaXRNZGxJbmZvICE9IG51bGwpCi0JCQlmYWN0b3J5ID0gZWRpdE1kbEluZm8uZ2V0RWRpdE1vZGVsRmFjdG9yeSgpOwotCQlyZXR1cm4gZmFjdG9yeTsgCi0JfQotCQotCXB1YmxpYyBJRWRpdE1vZGVsRmFjdG9yeSBmaW5kRWRpdE1vZGVsRmFjdG9yeUJ5UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChmYWNldGVkUHJvamVjdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3Iga2V5cyA9IGZhY3RvcnlDb25maWd1cmF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHQoKTsKLQkJCWlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgoU3RyaW5nKWtleSk7Ci0JCQkJCWlmIChwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KSkKLQkJCQkJCXJldHVybiBmaW5kRWRpdE1vZGVsRmFjdG9yeUJ5S2V5KGtleSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRBbGxFZGl0TW9kZWxSZXNvdXJjZXMoU3RyaW5nIGVkaXRNb2RlbElEKSB7Ci0JCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXNvdXJjZXMuYWRkQWxsKGdldExvY2FsRWRpdE1vZGVsUmVzb3VyY2VzKGVkaXRNb2RlbElEKSk7Ci0JCXJlc291cmNlcy5hZGRBbGwoZ2V0RXh0ZW5kZWRFZGl0TW9kZWxSZXNvdXJjZXMoZWRpdE1vZGVsSUQpKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0QWxsRWRpdE1vZGVsRXh0ZW5zaW9ucyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc291cmNlcy5hZGRBbGwoZ2V0TG9jYWxFZGl0TW9kZWxFeHRlbnNpb25zKGVkaXRNb2RlbElEKSk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0TG9jYWxFZGl0TW9kZWxSZXNvdXJjZXMoU3RyaW5nIGVkaXRNb2RlbElEKSB7IAotCQlFZGl0TW9kZWxJbmZvIGVkaXRNZGxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoZWRpdE1vZGVsSUQpOwotICAJCXJldHVybiAoZWRpdE1kbEluZm8gIT0gbnVsbCkgPyBlZGl0TWRsSW5mby5nZXRFZGl0TW9kZWxSZXNvdXJjZXMoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7IAotCX0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRMb2NhbEVkaXRNb2RlbEV4dGVuc2lvbnMoU3RyaW5nIGVkaXRNb2RlbElEKSB7IAotCQlFZGl0TW9kZWxJbmZvIGVkaXRNZGxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoZWRpdE1vZGVsSUQpOwotICAJCXJldHVybiAoZWRpdE1kbEluZm8gIT0gbnVsbCkgPyBlZGl0TWRsSW5mby5nZXRFZGl0TW9kZWxFeHRlbnNpb25zKCkgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOyAKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRFeHRlbmRlZEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKLQkJcmV0dXJuIEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGVkaXRNb2RlbElEKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsS2V5Ci0JICogICAgICAgICAgICB0aGUgZWRpdE1vZGVsSUQgb2YgYSBnaXZlbiBFZGl0TW9kZWxGYWN0b3J5IGRlZmluZWQgaW4gdGhlIEV4dGVuc2lvbiBQb2ludAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBJRWRpdE1vZGVsRmFjdG9yeSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBnaXZlbiBJRC4KLQkgKiBAcmV0dXJuIHRoZSBFZGl0TW9kZWxGYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIEVkaXRNb2RlbElECi0JICovCi0JcHJvdGVjdGVkIElFZGl0TW9kZWxGYWN0b3J5IGdldEVkaXRNb2RlbEZhY3RvcnlCeUtleShPYmplY3QgZWRpdE1vZGVsSUQpIHsKLQkJSUVkaXRNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCUVkaXRNb2RlbEluZm8gZWRpdE1kbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7Ci0JCWlmIChlZGl0TWRsSW5mbyAhPSBudWxsKQotCQkJZmFjdG9yeSA9IGVkaXRNZGxJbmZvLmdldEVkaXRNb2RlbEZhY3RvcnkoKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzIsIG5ldyBPYmplY3RbXXtlZGl0TW9kZWxJRH0pKTsKLQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0JCi0JLyoqCi0gICAgICogQHBhcmFtIGVkaXRNb2RlbElECi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBFZGl0TW9kZWxJbmZvIGdldEVkaXRNb2RlbEluZm9CeUlkKE9iamVjdCBlZGl0TW9kZWxJRCkgewotICAgICAgICB3YWl0Rm9ySW5pdGlhbGl6YXRpb25JZk5lY2Vzc2FyeSgpOwotICAgICAgICByZXR1cm4gKEVkaXRNb2RlbEluZm8pIGZhY3RvcnlDb25maWd1cmF0aW9ucy5nZXQoZWRpdE1vZGVsSUQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJZiB3ZSBhcmUgbm90IGluaXRpYWxpemVkLCBibG9jayB1bnRpbCB0aGUgSU5TVEFOQ0UgaXMgcmVsZWFzZWQgKCBmcm9tIGdldEluc3RhbmNlKCkpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JJbml0aWFsaXphdGlvbklmTmVjZXNzYXJ5KCkgewotICAgICAgICAvKiBXZSBvbmx5IG5lZWQgdG8gYWNxdWlyZSB0aGUgc2VtYXBob3JlIChJTlNUQU5DRSksIHdlIGRvIG5vdCBuZWVkIAotICAgICAgICAgKiB0byBleGVjdXRlIGFueXRoaW5nIGluIHRoaXMgYmxvY2suIElmIHRoZSBSZWdpc3RyeSBpcyBub3QgaW5pdGFpbGl6ZWQsCi0gICAgICAgICAqIHRoZW4gaXQgd2lsbCBibG9jayB1bnRpbCB0aGUgc2VtYXBob3JlIGlzIHJlbGVhc2VkIChmcm9tIGdldEluc3RhbmNlKCkpLAotICAgICAgICAgKiBhbmQgdGhlbiByZWxlYXNlIGl0IGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuIAotICAgICAgICAgKi8KLQkJaWYoIWlzSW5pdGlhbGl6ZWQoKSkgCi0JCSAgICBzeW5jaHJvbml6ZWQoSU5TVEFOQ0UpIHsgfQotICAgIH0KLQotCXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxJbmZvIHsKLQotCQlwcml2YXRlIFN0cmluZyBlZGl0TW9kZWxJRCA9IG51bGw7Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50ID0gbnVsbDsKLQotCQlwcml2YXRlIElFZGl0TW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlwcml2YXRlIExpc3QgZWRpdE1vZGVsUmVzb3VyY2VzID0gbnVsbDsKLQkJcHJpdmF0ZSBMaXN0IGVkaXRNb2RlbEV4dGVuc2lvbnMgPSBudWxsOwotCi0JCXByaXZhdGUgU3RyaW5nIHBhcmVudE1vZGVsSUQgPSBudWxsOwotCi0JCXByaXZhdGUgU3RyaW5nIHRvc3RyaW5nQ2FjaGUgPSBudWxsOwotCi0JCXB1YmxpYyBFZGl0TW9kZWxJbmZvKFN0cmluZyBlZGl0TW9kZWxJRCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0KLQkJCXRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkJCXRoaXMuZWRpdE1vZGVsSUQgPSBlZGl0TW9kZWxJRDsKLQkJCXRoaXMucGFyZW50TW9kZWxJRCA9IHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFBBUkVOVF9NT0RFTF9BVFRSKTsKLQkJfQotCi0KLQkJcHVibGljIExpc3QgZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKCkgewotCQkJLyogdGhpcyBtZXRob2QgaXMgZ3VhcmRlZCAqLwotCQkJaW5pdGlhbGl6ZVJlc291cmNlcygpOwotCQkJcmV0dXJuIGVkaXRNb2RlbFJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyBJRWRpdE1vZGVsRmFjdG9yeSBnZXRFZGl0TW9kZWxGYWN0b3J5KCkgewotLy8JCQkgRG8gbm90IGJsb2NrIGlmIHRoZSBmYWN0b3J5IGlzIG5vdCBudWxsCi0JCQlpZiAodGhpcy5mYWN0b3J5ID09IG51bGwpIHsKLQkJCSAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkgICAgICAvLyBhbm90aGVyIHRocmVhZCBjb3VsZCBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIGZhY3RvcnkKLQkJCSAgICAgIC8vIHdoaWxlIHRoaXMgdGhyZWFkIHdhcyB3YWl0aW5nIHRvIGVudGVyIHRoZSBzeW5jIGJsb2NrCi0JCQkgICAgICBpZih0aGlzLmZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlpZiAodGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXRoaXMuZmFjdG9yeSA9IChJRWRpdE1vZGVsRmFjdG9yeSkgdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEZBQ1RPUllfQ0xBU1NfQVRUUik7Ci0JCQkJCQkJQm9vbGVhbiB2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZih0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZShMT0FEX1VOS05PV05fUkVTT1VSQ0VTX0FUVFIpKTsKLQkJCQkJCQl0aGlzLmZhY3Rvcnkuc2V0TG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQkJZGlzY2FyZENvbmZpZ3VyYXRpb25FbGVtZW50SWZOZWNlc3NhcnkoKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMSk7Ci0JCQkJCX0KLQkJCSAgICAgIH0KLQkJCSAgICB9Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5mYWN0b3J5OwotCQl9Ci0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VzKCkgewotCi0JCQlpZiAoZWRpdE1vZGVsUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotCi0JCQkJCWVkaXRNb2RlbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZXNvdXJjZXMgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRDaGlsZHJlbihFZGl0TW9kZWxSZXNvdXJjZS5FRElUX01PREVMX1JFU09VUkNFX0VMRU1FTlQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZXNFeHRlbnNpb25zID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT04pOwotCQkJCQkvLyBzZXQgdGhlIGNvbmZpZ3VyYXRpb25FbGVtZW50IHRvIG51bGwtIGtlZXBzIGNvZGUgZnJvbSByZWVudGVyaW5nCi0JCQkJCWRpc2NhcmRDb25maWd1cmF0aW9uRWxlbWVudElmTmVjZXNzYXJ5KCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQllZGl0TW9kZWxSZXNvdXJjZXMuYWRkKG5ldyBFZGl0TW9kZWxSZXNvdXJjZShyZXNvdXJjZXNbal0pKTsKLQkJCQkJfQotCQkJCQlpZiAocmVzRXh0ZW5zaW9ucyA9PSBudWxsIHx8IHJlc0V4dGVuc2lvbnMubGVuZ3RoID09IDApIHsKLQkJCQkJCWVkaXRNb2RlbEV4dGVuc2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNFeHRlbnNpb25zW2ldLmdldEF0dHJpYnV0ZShFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTl9OQU1FKTsKLQkJCQkJCQllZGl0TW9kZWxFeHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWRpdE1vZGVsUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQkJZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRpc2NhcmRDb25maWd1cmF0aW9uRWxlbWVudElmTmVjZXNzYXJ5KCkgewotCQkJaWYgKHRoaXMuZWRpdE1vZGVsUmVzb3VyY2VzICE9IG51bGwgJiYgdGhpcy5mYWN0b3J5ICE9IG51bGwpCi0JCQkJdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCA9IG51bGw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmICh0b3N0cmluZ0NhY2hlID09IG51bGwpCi0JCQkJdG9zdHJpbmdDYWNoZSA9ICJFZGl0TW9kZWxJRDogeyIgKyB0aGlzLmVkaXRNb2RlbElEICsgIn0sIFBhcmVudCBNb2RlbCBJRCB7IiArIHRoaXMucGFyZW50TW9kZWxJRCArICJ9LCBDb25maWd1cmF0aW9uIEVsZW1lbnQ6IFsiICsgdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTQkCi0JCQlyZXR1cm4gdG9zdHJpbmdDYWNoZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudE1vZGVsSUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE1vZGVsSUQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50TW9kZWxJRDsKLQkJfQotCQkKLQkJcHVibGljIExpc3QgZ2V0RWRpdE1vZGVsRXh0ZW5zaW9ucygpIHsKLQkJCS8qIHRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgKi8KLQkJCWluaXRpYWxpemVSZXNvdXJjZXMoKTsKLQkJCXJldHVybiBlZGl0TW9kZWxFeHRlbnNpb25zOwotCQl9Ci0KLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbml0aWFsaXplZC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIGluaXRpYWxpemVkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVnaXN0ZXJlZEVkaXRNb2RlbElEcygpIHsKLQkJcmV0dXJuIChTdHJpbmdbXSkgZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tmYWN0b3J5Q29uZmlndXJhdGlvbnMua2V5U2V0KCkuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjk5YmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgNSwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yOwotCi0KLQotcHVibGljIGNsYXNzIEVkaXRNb2RlbFJlc291cmNlIGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1VSSV9BVFRSID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0xPQURfQVRUUiA9ICJhdXRvbG9hZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VMRU1FTlQgPSAiZWRpdE1vZGVsUmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9hZE9yZGVyQ291bnRlciA9IDE7Ci0JcHJpdmF0ZSBVUkkgdXJpOwotCXByaXZhdGUgYm9vbGVhbiBhdXRvbG9hZCA9IGZhbHNlOwotCS8vSW5kaWNhdGVzIGlmIHRoaXMgd2FzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgZWRpdCBtb2RlbCwKLQkvL2FzIG9wcG9zZWQgdG8gYW4gZXh0ZW5zaW9uCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29yZSA9IHRydWU7Ci0KLQlwcml2YXRlIFN0cmluZyBleHRlbnNpb25JRDsKLQotCXByaXZhdGUgaW50IGxvYWRPcmRlcjsKLQotCXB1YmxpYyBFZGl0TW9kZWxSZXNvdXJjZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50KTsKLQkJU3RyaW5nIHN0clVyaSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVESVRfTU9ERUxfVVJJX0FUVFIpOwotCQlpZiAoc3RyVXJpICE9IG51bGwpCi0JCQlFZGl0TW9kZWxSZXNvdXJjZS50aGlzLnVyaSA9IFVSSS5jcmVhdGVVUkkoc3RyVXJpKTsKLQotCQlTdHJpbmcgc3RyTG9hZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFVVE9fTE9BRF9BVFRSKTsKLQkJaWYgKHN0ckxvYWQgIT0gbnVsbCkKLQkJCWF1dG9sb2FkID0gQm9vbGVhbi52YWx1ZU9mKHN0ckxvYWQpLmJvb2xlYW5WYWx1ZSgpOwotCQlsb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbFJlc291cmNlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZXh0ZW5zaW9uSUQpIHsKLQkJdGhpcyhlbGVtZW50KTsKLQkJdGhpcy5leHRlbnNpb25JRCA9IGV4dGVuc2lvbklEOwotCQlpc0NvcmUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9Mb2FkKCkgewotCQlyZXR1cm4gYXV0b2xvYWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBleHRlbnNpb25JRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciNnZXRQcmlvcml0eSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJaWYgKGlzQ29yZSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJpb3JpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gd2hldGhlciB0aGlzIHJlc291cmNlIGlzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgZWRpdCBtb2RlbCBkZWZpbml0aW9uIGFzIG9wcG9zZWQgdG8gYW4KLQkgKiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvcmUoKSB7Ci0JCXJldHVybiBpc0NvcmU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgRWRpdE1vZGVsUmVzb3VyY2UpKQotCQkJcmV0dXJuIDE7Ci0JCUVkaXRNb2RlbFJlc291cmNlIHJlcyA9IChFZGl0TW9kZWxSZXNvdXJjZSkgbzsKLQkJaW50IHZhbHVlID0gZ2V0UHJpb3JpdHkoKSAtIHJlcy5nZXRQcmlvcml0eSgpOwotCQlpZiAodmFsdWUgPT0gMCkKLQkJCXJldHVybiBsb2FkT3JkZXIgLSByZXMubG9hZE9yZGVyOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2FkT3JkZXIuCi0JICovCi0JcHVibGljIGludCBnZXRMb2FkT3JkZXIoKSB7Ci0JCXJldHVybiBsb2FkT3JkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJldHJpZXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZiOGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsUmV0cmlldmVyIHsKLQlwcml2YXRlIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFN0cmluZyBlZGl0TW9kZWxJRDsKLQlwcml2YXRlIE1hcCBlZGl0TW9kZWxQYXJtczsKLQotCS8qKgotCSAqIEVkaXRNb2RlbFJldHJpZXZlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWxSZXRyaWV2ZXIoRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZWRpdE1vZGVsS2V5LCBNYXAgcGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJZWRpdE1vZGVsSUQgPSBlZGl0TW9kZWxLZXk7Ci0JCWVkaXRNb2RlbFBhcm1zID0gcGFybXM7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZXR1cm4gY29udGV4dC5nZXRFZGl0TW9kZWxGb3JSZWFkKGdldEVkaXRNb2RlbElEKCksIGFjY2Vzc29yS2V5LCBlZGl0TW9kZWxQYXJtcyk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGNvbnRleHQuZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZ2V0RWRpdE1vZGVsSUQoKSwgYWNjZXNzb3JLZXksIGVkaXRNb2RlbFBhcm1zKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRNb2RlbElEKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsSUQ7Ci0JfQotCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0V4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM5MTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAzLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcmllcwotCSAqLwotCXB1YmxpYyBFeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yaWVzCi0JICovCi0JcHVibGljIEV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb2xsZWN0aW9uIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoKLQkgKiBvdmVycm9kZSBmcm9tIHRoZSBzdXBlciBjbGFzcywgY2hhbmdlZCBub3QgdG8gY2hlY2sgc3VwZXJ0eXBlcyBvZiB0aGUgRU9iamVjdCwgYmVjYXVzZSB0aGF0Ci0JICogd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBEeW5hbWljQWRhcHRlckZhY3RvcnkKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKLQkJCUVDbGFzcyBlQ2xhc3MgPSBlT2JqZWN0LmVDbGFzcygpOwotCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCQlDb2xsZWN0aW9uIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXR5cGVzLmFkZChlUGFja2FnZSk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQl0eXBlcy5hZGQodHlwZSk7Ci0JCQkJfQotCQkJCS8qIHdoZW4gYW4gZXJyb3Igb2NjdXJzLCByZW1vdmUgdGhlIGRlbGVnYXRlIGFuZCB0cnkgYWdhaW4gKi8KLQkJCQlib29sZWFuIGF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKLQkJCQl3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgYXR0ZW1wdEFkYXB0QWdhaW4pIHsKLQkJCQkJYXR0ZW1wdEFkYXB0QWdhaW4gPSBmYWxzZTsKLQkJCQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlcyh0eXBlcyk7Ci0JCQkJCWlmIChkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVzdWx0ID0gZGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IocmUpOwotCQkJCQkJCWFkYXB0ZXJGYWN0b3JpZXMucmVtb3ZlKGRlbGVnYXRlQWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGFkYXB0KHRhcmdldCwgdHlwZSwgbmV3IEhhc2hTZXQoKSwgdGFyZ2V0LmdldENsYXNzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0ludmVydGVkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9JbnZlcnRlZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyNWE3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0ludmVydGVkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgODo1ODoyNCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSW52ZXJ0ZWRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIHsKLQlwdWJsaWMgSW52ZXJ0ZWRDb21tYW5kKENvbW1hbmQgdGFyZ2V0Q29tbWFuZCkgewotCQlzdXBlcih0YXJnZXRDb21tYW5kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuY2FuVW5kbygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKS5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy9kb2VzIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBnZXRFZGl0TW9kZWxDb21tYW5kIG1ldGhvZCBjb21tZW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFZGl0TW9kZWxDb21tYW5kIGdldEVkaXRNb2RlbENvbW1hbmQoKSB7Ci0JCXJldHVybiAoKEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCkgZ2V0VGFyZ2V0KCkpLmdldEVkaXRNb2RlbENvbW1hbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGludmVyc2lvbkRlcHRoKCkgewotCQlpZiAoZ2V0RWRpdE1vZGVsQ29tbWFuZCgpID09IGdldFRhcmdldCgpKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAoKEludmVydGVkQ29tbWFuZCkgZ2V0VGFyZ2V0KCkpLmludmVyc2lvbkRlcHRoKCkgKyAxOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxQcmVmaXgoKSB7Ci0JCXJldHVybiBpbnZlcnNpb25EZXB0aCgpICUgMiA9PSAxID8gIlVuZG8gIiA6ICJSZWRvICI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlnZXRUYXJnZXQoKS51bmRvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZ2V0VGFyZ2V0KCkucmVkbygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUGFyZW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9QYXJlbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODhjYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9QYXJlbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uQ29tcG9zZWRFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbENvbW1hbmQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDg6NTc6MzggQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFBhcmVudENvbW1hbmQgZXh0ZW5kcyBFZGl0TW9kZWxDb21tYW5kIHsKLQlwcml2YXRlIExpc3QgY2hpbGRyZW47Ci0JcHJpdmF0ZSBDb21wb3NlZEVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IGFmZmVjdGVkTW9kZWxzOwotCi0JcHVibGljIFBhcmVudENvbW1hbmQoQ29tbWFuZCB0YXJnZXRDb21tYW5kLCBDb21wb3NlZEVkaXRNb2RlbCBhbkVkaXRNb2RlbCkgewotCQlzdXBlcih0YXJnZXRDb21tYW5kKTsKLQkJZWRpdE1vZGVsID0gYW5FZGl0TW9kZWw7Ci0JCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuY2FuRXhlY3V0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVBZmZlY3RlZE1vZGVscygpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gbnVsbDsKLQkJTGlzdCBlZGl0TW9kZWxzID0gZ2V0RWRpdE1vZGVsKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJSXRlcmF0b3IgaXQgPSBjb21wdXRlQWZmZWN0ZWRSZXNvdXJjZVNldHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlzZXQgPSAoUmVzb3VyY2VTZXQpIGl0Lm5leHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVscy5zaXplKCk7IGkrKykgewotCQkJCUVkaXRNb2RlbCBtb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRNb2RlbHMuZ2V0KGkpOwotCQkJCWlmIChtb2RlbC5nZXRSZXNvdXJjZVNldCgpID09IHNldCkgewotCQkJCQlnZXRBZmZlY3RlZE1vZGVscygpLmFkZChuZXcgRWRpdE1vZGVsUmV0cmlldmVyKG1vZGVsLmdldEVtZkNvbnRleHQoKSwgbW9kZWwuZ2V0RWRpdE1vZGVsSUQoKSwgbW9kZWwuZ2V0UGFyYW1zKCkpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFNldCBjb21wdXRlQWZmZWN0ZWRSZXNvdXJjZVNldHMoKSB7Ci0JCUl0ZXJhdG9yIG9iamVjdHMgPSBnZXRUYXJnZXQoKS5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOwotCQlTZXQgcmVzb3VyY2VTZXRzID0gbmV3IEhhc2hTZXQoKTsKLQkJT2JqZWN0IG8gPSBudWxsOwotCQlFT2JqZWN0IHJlZiA9IG51bGw7Ci0JCVJlc291cmNlU2V0IHNldCA9IG51bGw7Ci0JCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgewotCQkJbyA9IG9iamVjdHMubmV4dCgpOwotCQkJaWYgKCEobyBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJCWNvbnRpbnVlOwotCQkJcmVmID0gKEVPYmplY3QpIG87Ci0JCQlpZiAocmVmLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlzZXQgPSByZWYuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZiAoc2V0ICE9IG51bGwpCi0JCQkJCXJlc291cmNlU2V0cy5hZGQoc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VTZXRzOwotCX0KLQotCXByb3RlY3RlZCBDaGlsZENvbW1hbmQgY3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRNb2RlbFJldHJpZXZlciByZXRyaWV2ZXIpIHsKLQkJcmV0dXJuIG5ldyBDaGlsZENvbW1hbmQodGhpcywgZ2V0VGFyZ2V0KCksIHJldHJpZXZlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZ2V0VGFyZ2V0KCkuZXhlY3V0ZSgpOwotCQljb21wdXRlQWZmZWN0ZWRNb2RlbHMoKTsKLQkJcHVzaENoaWxkcmVuRm9yRXhlY3V0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVJbk1vZGVsKEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBjbWQpIHsKLQkJZ2V0RWRpdE1vZGVsKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEFmZmVjdGVkTW9kZWxzKCkgewotCQlpZiAoYWZmZWN0ZWRNb2RlbHMgPT0gbnVsbCkKLQkJCWFmZmVjdGVkTW9kZWxzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJcmV0dXJuIGFmZmVjdGVkTW9kZWxzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2VkRWRpdE1vZGVsIGdldEVkaXRNb2RlbCgpIHsKLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZlcnRDaGlsZHJlbigpIHsKLQkJaW52ZXJ0Q2hpbGRyZW5FeGNlcHQoKENoaWxkQ29tbWFuZCkgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW52ZXJ0Q2hpbGRyZW5FeGNlcHQoQ2hpbGRDb21tYW5kIGNhbGxlcikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlDaGlsZENvbW1hbmQgY2hpbGRDbWQgPSAoQ2hpbGRDb21tYW5kKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoY2FsbGVyID09IG51bGwgfHwgY2hpbGRDbWQgIT0gY2FsbGVyKQotCQkJCWNoaWxkQ21kLmludmVydEFuZFB1c2goKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludmVydEZyb20oQ2hpbGRDb21tYW5kIGNhbGxlcikgewotCQlpbnZlcnRBbmRQdXNoKCk7Ci0JCWludmVydENoaWxkcmVuRXhjZXB0KGNhbGxlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENoaWxkcmVuRm9yRXhlY3V0ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRBZmZlY3RlZE1vZGVscygpLnNpemUoKTsgaSsrKSB7Ci0JCQlFZGl0TW9kZWxSZXRyaWV2ZXIgcmV0cmlldmVyID0gKEVkaXRNb2RlbFJldHJpZXZlcikgZ2V0QWZmZWN0ZWRNb2RlbHMoKS5nZXQoaSk7Ci0JCQlDaGlsZENvbW1hbmQgY29tbWFuZCA9IGNyZWF0ZUNoaWxkQ29tbWFuZChyZXRyaWV2ZXIpOwotCQkJZ2V0Q2hpbGRyZW4oKS5hZGQoY29tbWFuZCk7Ci0JCQljb21tYW5kLmV4ZWN1dGVJbk1vZGVsKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZ2V0VGFyZ2V0KCkucmVkbygpOwotCQlpbnZlcnRDaGlsZHJlbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG9Gcm9tKENoaWxkQ29tbWFuZCBjaGlsZCkgewotCQlpbnZlcnRGcm9tKGNoaWxkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlnZXRUYXJnZXQoKS51bmRvKCk7Ci0JCWludmVydENoaWxkcmVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kb0Zyb20oQ2hpbGRDb21tYW5kIGNoaWxkKSB7Ci0JCWludmVydEZyb20oY2hpbGQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1JlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZjNzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgcmVhZG9ubHkgdmVyc2lvbiBvZiB0aGUgZWRpdG1vZGVsIGFjY2VzcyByZWdpc3RyeSwgb25seSB1c2VzIGEgd2VhayBoYXNoIGRpY3Rpb25hcnksCi0gKiBhbmQgYmVjYXVzZSB0aGUgYWNjZXNzIGlzIHJlYWQgb25seSwgaXMgbGVzcyBjb25jZXJuZWQgd2l0aCB0aW1pbmcgb2YgYWNjZXNzL3JlbGVhc2UsIGFuZCB3aWxsIGJlCi0gKiBjbGVhbmVkIHVwIG9uIGdhcmJhZ2UgY29sbGVjdGlvbiBpZiBuZWVkZWQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkgZXh0ZW5kcyBDbGllbnRBY2Nlc3NSZWdpc3RyeSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zS2V5KGFjY2Vzc29yS2V5KSkgewotCQkJdGhpcy5yZWdpc3RyeS5wdXQoYWNjZXNzb3JLZXksIG51bGwpOwotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzAsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQotCQkvKgotCQkgKiBFcnJvciBjb25kaXRpb246IFNvbWUgb25lIGhhcyBiZWVuIG5hdWdodHkgYW5kIG5vdCByZWxlYXNlZCB0aGUgcmVzb3VyY2UKLQkJICovCi0JCWlmICh0aGlzLnJlZ2lzdHJ5LmNvbnRhaW5zS2V5KGFjY2Vzc29yS2V5KSkgewotCQkJdGhpcy5yZWdpc3RyeS5yZW1vdmUoYWNjZXNzb3JLZXkpOwotCQl9IGVsc2UKLQkJCWNvbXBsYWluKGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb21wbGFpbihPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQotCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMSIpLCBhY2Nlc3NvcktleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvU25hcHNob3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvU25hcHNob3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4MWEzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1NuYXBzaG90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDMsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotCi0KLS8qKgotICogVGhlIFNuYXBzaG90IGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIGNhbGwgc3RhY2sgdHJhY2Ugb2YgYW55IG1ldGhvZCB0aGF0IGFjY2Vzc2VzIGEgUmVzb3VyY2UuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgU25hcHNob3QgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MDQxNDg4MDAwNjQyNzU3MzQ3TDsKLQotCXB1YmxpYyBTbmFwc2hvdCgpIHsKLQkJc3VwZXIoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5TbmFwc2hvdF9FUlJPUl8wKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YWNrVHJhY2VTdHJpbmcoKSB7Ci0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShwcmludFdyaXRlcik7Ci0JCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1dyYXBwaW5nQ29tbWFuZFN0YWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1dyYXBwaW5nQ29tbWFuZFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNThkNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9XcmFwcGluZ0NvbW1hbmRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkNvbXBvc2VkRWRpdE1vZGVsOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA5OjMxOjAyIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXcmFwcGluZ0NvbW1hbmRTdGFjayBleHRlbmRzIEJhc2ljQ29tbWFuZFN0YWNrIHsKLQlwcml2YXRlIENvbXBvc2VkRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQotCS8qKgotCSAqIFdyYXBwaW5nQ29tbWFuZFN0YWNrIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdyYXBwaW5nQ29tbWFuZFN0YWNrKENvbXBvc2VkRWRpdE1vZGVsIGFuRWRpdE1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWVkaXRNb2RlbCA9IGFuRWRpdE1vZGVsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCVBhcmVudENvbW1hbmQgcGFyZW50ID0gbmV3IFBhcmVudENvbW1hbmQoY29tbWFuZCwgZWRpdE1vZGVsKTsKLQkJc3VwZXIuZXhlY3V0ZShwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0Fic3RyYWN0RWRpdE1vZGVsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDYxZTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0Fic3RyYWN0RWRpdE1vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuSW52ZXJ0ZWRDb21tYW5kOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgQ29tbWFuZCB0YXJnZXQ7Ci0JcHJpdmF0ZSBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgb3duZXI7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQoQ29tbWFuZCB0YXJnZXRDb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRhcmdldCA9IHRhcmdldENvbW1hbmQ7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IEVkaXRNb2RlbENvbW1hbmQgZ2V0RWRpdE1vZGVsQ29tbWFuZCgpOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBnZXRPdXRlcm1vc3RDb21tYW5kKCkgewotCQlyZXR1cm4gb3duZXIgPT0gbnVsbCA/IHRoaXMgOiBvd25lci5nZXRPdXRlcm1vc3RDb21tYW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnZlcnRlZCBjb21tYW5kIG9uIHRoZSBvdXRlcm1vc3QgY29tbWFuZAotCSAqLwotCXB1YmxpYyBJbnZlcnRlZENvbW1hbmQgaW52ZXJ0ZWQoKSB7Ci0JCUFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBvdXRlciA9IGdldE91dGVybW9zdENvbW1hbmQoKTsKLQkJSW52ZXJ0ZWRDb21tYW5kIGNtZCA9IG5ldyBJbnZlcnRlZENvbW1hbmQob3V0ZXIpOwotCQlvdXRlci5zZXRPd25lcihjbWQpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyKEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBvd25lckNvbW1hbmQpIHsKLQkJb3duZXIgPSBvd25lckNvbW1hbmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkQWNjZXNzb3JLZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkQWNjZXNzb3JLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjOThlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEFjY2Vzc29yS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NlZEFjY2Vzc29yS2V5IHsKLQotCXByaXZhdGUgT2JqZWN0IGFjY2Vzc29yS2V5ID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBhZGRvbktleSA9IG51bGw7Ci0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zZWRBY2Nlc3NvcktleSBnZXRDb21wb3NlZEFjY2Vzc29yS2V5KE9iamVjdCBhY2Nlc3NvcktleSwgQ29tcG9zZWRFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCUNvbXBvc2VkQWNjZXNzb3JLZXkgbmV3S2V5ID0gbmV3IENvbXBvc2VkQWNjZXNzb3JLZXkoYWNjZXNzb3JLZXksIGVkaXRNb2RlbCk7Ci0JCWVkaXRNb2RlbC5jYWNoZUFjY2Vzc29yS2V5KG5ld0tleSk7Ci0JCXJldHVybiBuZXdLZXk7Ci0JfQotCi0KLQlwcml2YXRlIENvbXBvc2VkQWNjZXNzb3JLZXkoT2JqZWN0IGFjY2Vzc29yS2V5LCBPYmplY3QgYWRkb25LZXkpIHsKLQkJdGhpcy5hY2Nlc3NvcktleSA9IGFjY2Vzc29yS2V5OwotCQl0aGlzLmFkZG9uS2V5ID0gYWRkb25LZXk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAob3RoZXIgPT0gbnVsbCB8fCAhKG90aGVyIGluc3RhbmNlb2YgQ29tcG9zZWRBY2Nlc3NvcktleSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbXBvc2VkQWNjZXNzb3JLZXkgb3RoZXJLZXkgPSAoQ29tcG9zZWRBY2Nlc3NvcktleSkgb3RoZXI7Ci0KLQkJcmV0dXJuIGFjY2Vzc29yS2V5LmVxdWFscyhvdGhlcktleS5hY2Nlc3NvcktleSkgJiYgYWRkb25LZXkuZXF1YWxzKG90aGVyS2V5LmFkZG9uS2V5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBhY2Nlc3NvcktleS5oYXNoQ29kZSgpIF4gYWRkb25LZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkRWRpdE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEVkaXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2I0ZWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkRWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LldyYXBwaW5nQ29tbWFuZFN0YWNrOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA4OjI2OjMyIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NlZEVkaXRNb2RlbCBleHRlbmRzIEVkaXRNb2RlbCBpbXBsZW1lbnRzIEVkaXRNb2RlbExpc3RlbmVyIHsKLQotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgY2hpbGRyZW5NYXAgPSBudWxsOwotCXByaXZhdGUgTGlzdCBjYWNoZWRLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ29tcG9zZWRFZGl0TW9kZWwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoZWRpdE1vZGVsSUQsIGNvbnRleHQsIGZhbHNlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNoaWxkcmVuSWZOZWNlc3NhcnkoQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdLZXkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWNoZUFjY2Vzc29yS2V5KENvbXBvc2VkQWNjZXNzb3JLZXkgbmV3S2V5KSB7Ci0JCWlmICghY2FjaGVkS2V5cy5jb250YWlucyhuZXdLZXkpKQotCQkJY2FjaGVkS2V5cy5hZGQobmV3S2V5KTsKLQl9Ci0KLQkvLyBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyAgVGhlIG9ubHkgZGlmZiBzZWVtcyB0byBiZSBpdCBkb2Vzbid0IHJlbGVhc2UgcmVzb3VyY2VzCi0vLwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotLy8JCWRpc3Bvc2luZyA9IHRydWU7Ci0vLwkJaWYgKGNvbW1hbmRTdGFjayAhPSBudWxsKQotLy8JCQljb21tYW5kU3RhY2sucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIodGhpcyk7Ci0vLwkJaWYgKGhhc0xpc3RlbmVycygpKQotLy8JCQlub3RpZnlMaXN0ZW5lcnMobmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFLCB0aGlzKSk7Ci0vLwkJcmVsZWFzZVByZWxvYWRSZXNvdXJjZXMoKTsKLS8vCQlyZWxlYXNlSWRlbnRpZmllcnMoKTsKLS8vCQllbWZDb250ZXh0ID0gbnVsbDsgCi0vLwkJcmVzb3VyY2VzID0gbnVsbDsKLS8vCQlkaXNwb3NpbmcgPSBmYWxzZTsKLS8vCQlwcm9qZWN0ID0gbnVsbDsKLS8vCQljYWNoZWRLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JfQotCi0JcHVibGljIEVkaXRNb2RlbC5SZWZlcmVuY2UgYWRkQ2hpbGQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGFkZENoaWxkKGVkaXRNb2RlbElELCBwYXJhbXMsIENvbXBvc2VkQWNjZXNzb3JLZXkuZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgdGhpcykpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwuUmVmZXJlbmNlIGFkZENoaWxkKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcywgQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5KSB7Ci0KLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVtZkNvbnRleHQoKS5nZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgY29tcG9zZWRBY2Nlc3NvcktleSwgcGFyYW1zKTsKLQkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCi0JCWdldENoaWxkcmVuTWFwKCkucHV0KGVkaXRNb2RlbC5nZXRSZWZlcmVuY2UoKSwgZWRpdE1vZGVsKTsKLQkJZ2V0Q2hpbGRyZW4oKS5hZGQoZWRpdE1vZGVsKTsKLQotCQlyZXR1cm4gZWRpdE1vZGVsLmdldFJlZmVyZW5jZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKEVkaXRNb2RlbC5SZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5ID0gQ29tcG9zZWRBY2Nlc3NvcktleS5nZXRDb21wb3NlZEFjY2Vzc29yS2V5KGFjY2Vzc29yS2V5LCB0aGlzKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGdldENoaWxkcmVuTWFwKCkucmVtb3ZlKHJlZmVyZW5jZSk7Ci0JCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3MoY29tcG9zZWRBY2Nlc3NvcktleSk7Ci0JCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQlnZXRDaGlsZHJlbigpLnJlbW92ZShlZGl0TW9kZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENvbnRhaW5lZFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbk1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRDb250YWluZWRFZGl0TW9kZWwoRWRpdE1vZGVsLlJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJcmV0dXJuIChFZGl0TW9kZWwpIGdldENoaWxkcmVuTWFwKCkuZ2V0KHJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDb21tYW5kU3RhY2suCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJhc2ljQ29tbWFuZFN0YWNrIGNyZWF0ZUNvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBXcmFwcGluZ0NvbW1hbmRTdGFjayh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkIGFsbCBldmVudHMgdG8gdGhlIGxpc3RlbmVycyBmb3IgdGhpcyBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQlpZiAoaGFzTGlzdGVuZXJzKCkpCi0JCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlTZXQgYVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgbW9kZWxzID0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCUVkaXRNb2RlbCBjaGlsZCA9IChFZGl0TW9kZWwpIG1vZGVscy5nZXQoaSk7Ci0JCQlhU2V0LmFkZEFsbChjaGlsZC5nZXRBZmZlY3RlZEZpbGVzKCkpOwotCQl9Ci0JCXJldHVybiBhU2V0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRDaGlsZHJlbk1hcCgpIHsKLQkJaWYgKGNoaWxkcmVuTWFwID09IG51bGwpCi0JCQljaGlsZHJlbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBjaGlsZHJlbk1hcDsKLQl9Ci0KLQkvKioKLQkgKiBQYXNzIGFsb25nIHRvIGNoaWxkcmVuLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7Ci0JCQllZGl0TW9kZWwuaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgc2F2ZSBpcyBuZWVkZWQgb24gdGhlIENvbW1hbmRTdGFjawotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUl0ZXJhdG9yIGVkaXRNb2RlbHMgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlZGl0TW9kZWxzLmhhc05leHQoKSkgewotCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRNb2RlbHMubmV4dCgpOwotCQkJaWYgKGVkaXRNb2RlbC5pc0RpcnR5KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIHNhdmUgaXMgbmVlZGVkIG9uIHRoZSBDb21tYW5kU3RhY2sKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJSXRlcmF0b3IgZWRpdE1vZGVscyA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVkaXRNb2RlbHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgZWRpdE1vZGVscy5uZXh0KCk7Ci0JCQlpZiAoZWRpdE1vZGVsLmlzSW50ZXJyZXN0ZWRJblJlc291cmNlKGFSZXNvdXJjZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW1TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCi0JCQkoKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSkpLnByaW1TYXZlKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgb25seSBpbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGNoaWxkcmVuIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgeW91Ci0JICoga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlDb21wb3NlZEFjY2Vzc29yS2V5IGNvbXBvc2VkQWNjZXNzb3JLZXkgPSBDb21wb3NlZEFjY2Vzc29yS2V5LmdldENvbXBvc2VkQWNjZXNzb3JLZXkoYWNjZXNzb3JLZXksIHRoaXMpOwotCQlpZiAoZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMCkgewotCQkJY3JlYXRlQ2hpbGRyZW5JZk5lY2Vzc2FyeShjb21wb3NlZEFjY2Vzc29yS2V5KTsKLQkJfSBlbHNlIHsKLQotCQkJTGlzdCB0ZW1wY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQlFZGl0TW9kZWwgbW9kZWwgPSAoRWRpdE1vZGVsKSB0ZW1wY2hpbGRyZW4uZ2V0KGkpOwotCQkJCW1vZGVsLmFjY2Vzcyhjb21wb3NlZEFjY2Vzc29yS2V5KTsKLQkJCX0KLQkJfQotCQkvLyByZW1vdmluZyBmb3IgZGVmZWN0IDE5NzgsIGNoaWxkcmVuIHNob3VsZCBkbyBhbGwgdGhlIGFjY2Vzc2luZwotCQlzdXBlci5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGVhY2ggY2xpZW50IHdoZW4gdGhleSBhcmUgZmluaXNoZWQgd29ya2luZyB3aXRoIHRoZQotCSAqIEVkaXRNb2RlbC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZWxlYXNlQWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlMaXN0IHRlbXBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCUNvbXBvc2VkQWNjZXNzb3JLZXkgY29tcG9zZWRBY2Nlc3NvcktleSA9IENvbXBvc2VkQWNjZXNzb3JLZXkuZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgdGhpcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlFZGl0TW9kZWwgbW9kZWwgPSAoRWRpdE1vZGVsKSB0ZW1wY2hpbGRyZW4uZ2V0KGkpOwotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyhjb21wb3NlZEFjY2Vzc29yS2V5KTsKLQkJfQotCQlyZW1vdmVLZXlGcm9tQ2FjaGUoY29tcG9zZWRBY2Nlc3NvcktleSk7Ci0JCS8vIFJlbW92aW5nIHRoaXMgY2FsbC4uLiBDaGlsZHJlbiBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgYWxsIHJlbGVhc2luZyBkZWZlY3QgMTk3OAotCQlzdXBlci5yZWxlYXNlQWNjZXNzKGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVLZXlGcm9tQ2FjaGUoQ29tcG9zZWRBY2Nlc3NvcktleSBrZXkpIHsKLQkJY2FjaGVkS2V5cy5yZW1vdmUoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBvbmUgc2hvdWxkIHNhdmUsIHRoZXkgYWxsIHNob3VsZCBzYXZlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoKSB7Ci0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoZWRpdE1vZGVsLnNob3VsZFNhdmUoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSWYgb25lIHNob3VsZCBzYXZlLCB0aGV5IGFsbCBzaG91bGQgc2F2ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBsaXN0LmdldChpKTsKLQkJCWlmIChlZGl0TW9kZWwuc2hvdWxkU2F2ZShvcGVyYXRpb25IYW5kbGVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLndvcmtiZW5jaC5FZGl0TW9kZWwjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7Ci0JCQlMaXN0IGZpbGVzID0gZWRpdE1vZGVsLmdldE5vblJlc291cmNlRmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbChmaWxlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvdW5kaW5nQ29tbWFuZFN0YWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3VuZGluZ0NvbW1hbmRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODhhODg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvdW5kaW5nQ29tbWFuZFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUaGlzIGNsYXNzIGRvZXMgbm90IGFjdHVhbGx5IGV4ZWN1dGUgYW55IGNvbW1hbmRzLiBJdCBtZXJlbHkgZ2F0aGVycyB0aGUgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQKLSAqIGFuZCBjb21wb3VuZHMgdGhlbSBzbyB0aGF0IHRoZXkgY2FuIGJlIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGFjdHVhbENvbW1hbmRTdGFjay4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvdW5kaW5nQ29tbWFuZFN0YWNrIGltcGxlbWVudHMgQ29tbWFuZFN0YWNrIHsKLQlwcml2YXRlIENvbW1hbmRTdGFjayBhY3R1YWxDb21tYW5kU3RhY2s7Ci0JcHJpdmF0ZSBDb21tYW5kIGNvbXBvdW5kQ29tbWFuZDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29tcG91bmRpbmdDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGFjdHVhbENvbW1hbmRTdGFjaykgewotCQl0aGlzLmFjdHVhbENvbW1hbmRTdGFjayA9IGFjdHVhbENvbW1hbmRTdGFjazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjZXhlY3V0ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAoY29tcG91bmRDb21tYW5kID09IG51bGwpCi0JCQljb21wb3VuZENvbW1hbmQgPSBjb21tYW5kOwotCQllbHNlCi0JCQljb21wb3VuZENvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUV4ZWN1dGlvbigpIHsKLQkJaWYgKGNvbXBvdW5kQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWFjdHVhbENvbW1hbmRTdGFjay5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjY2FuVW5kbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkvL2RlZmF1bHQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjY2FuUmVkbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNnZXRVbmRvQ29tbWFuZCgpCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNnZXRSZWRvQ29tbWFuZCgpCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNnZXRNb3N0UmVjZW50Q29tbWFuZCgpCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0TW9zdFJlY2VudENvbW1hbmQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvL3JlZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQkvL2ZsdXNoCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2FkZENvbW1hbmRTdGFja0xpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihDb21tYW5kU3RhY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RlZmF1bHQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjcmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKENvbW1hbmRTdGFja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZGVmYXVsdAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0R5bmFtaWNBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRHluYW1pY0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTA1MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRHluYW1pY0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSwgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciwgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnkgTlVMTF9GQUNUT1JZID0gbmV3IEFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCi0JcHJpdmF0ZSBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdmlld0lEOwotCi0JLy9FYWNoIG9mIHRoZSB0d28gbWFwcyBiZWxvdyBhcmUga2V5ZWQgYnkgdGhlIHByb2plY3QKLQlwcml2YXRlIE1hcCBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlOwotCi0JcHJpdmF0ZSBNYXAgYWRhcHRlckZhY3Rvcmllc0J5VHlwZTsKLQotCXByaXZhdGUgU2V0IGFsbEZhY3RvcmllczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIElDaGFuZ2VOb3RpZmllcn0KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNwZWN0aW5nQWN0aXZpdGllcyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTk9fUFJPSkVDVCA9ICJOT19QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHVibGljIER5bmFtaWNBZGFwdGVyRmFjdG9yeShTdHJpbmcgdmlld0lELCBib29sZWFuIHJlc3BlY3RBY3RpdmllcykgewotCQl0aGlzLnZpZXdJRCA9IHZpZXdJRDsKLQkJdGhpcy5yZXNwZWN0aW5nQWN0aXZpdGllcyA9IHJlc3BlY3RBY3RpdmllczsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBEeW5hbWljQWRhcHRlckZhY3RvcnkoU3RyaW5nIHZpZXdJRCkgewotCQl0aGlzLnZpZXdJRCA9IHZpZXdJRDsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlID0gbmV3IEhhc2hNYXAoKTsKLQkJYWRhcHRlckZhY3Rvcmllc0J5VHlwZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFsbEZhY3RvcmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeUZvclR5cGUodHlwZSkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJldHVybiBnZXRGYWN0b3J5Rm9yVHlwZSgoRU9iamVjdCkgdHlwZSk7Ci0KLQkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHR5cGUpOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCWFQcm9qZWN0ID0gTk9fUFJPSkVDVDsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEV4aXN0aW5nRmFjdG9yeUZvclR5cGUoYVByb2plY3QsIHR5cGUpOwotCQlpZiAoZmFjdG9yeSA9PSBOVUxMX0ZBQ1RPUlkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JUeXBlKGFQcm9qZWN0LCB0eXBlKTsKLQotCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgdHlwZSwgTlVMTF9GQUNUT1JZKTsKLQkJCWVsc2UKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgdHlwZSwgZmFjdG9yeSk7Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBwLCBPYmplY3QgdHlwZSkgewotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5nZXQodHlwZSk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgZmFjdG9yeSB3YXMgbm90IGNhY2hlZCBieSB0eXBlLCBzbyB3ZSB3aWxsIHNlYXJjaCB0aGUgY2FjaGUgb2YgZmFjdG9yaWVzIGZvciB0aGUgcHJvamVjdAotCSAqIGFuZCBzZWUgaWYgaXQgY2FuIGJlIGZvdW5kIHRoZXJlCi0JICovCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBmaW5kRmFjdG9yeUZvclR5cGUoT2JqZWN0IHByb2plY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWFwIGFNYXAgPSAoTWFwKSBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlLmdldChwcm9qZWN0KTsKLQkJaWYgKGFNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJdGVyYXRvciBpdGVyID0gYU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZSkpCi0JCQkJcmV0dXJuIGZhY3Rvcnk7Ci0JCX0KLQotCQkvLyBhZGFwdCB0aGUgcmVzb3VyY2UgdG8gaXRzIGNvbnRlbnRzCi0JCWlmIChnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclR5cGUoRU9iamVjdCBvYmopIHsKLQkJRUNsYXNzIGVDbGFzcyA9IG9iai5lQ2xhc3MoKTsKLQkJaWYgKGVDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG9iaik7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJYVByb2plY3QgPSBOT19QUk9KRUNUOwotCQlBZGFwdGVyRmFjdG9yeSByZXN1bHQgPSBnZXRGYWN0b3J5Rm9yUGFja2FnZShhUHJvamVjdCwgZVBhY2thZ2UpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJU2V0IGZhaWxlZFBhY2thZ2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJZmFpbGVkUGFja2FnZVNldC5hZGQoZVBhY2thZ2UpOwotCQkJSXRlcmF0b3Igc3VwZXJ0eXBlcyA9IGVDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoc3VwZXJ0eXBlcy5oYXNOZXh0KCkpIHsKLQkJCQllQ2xhc3MgPSAoRUNsYXNzKSBzdXBlcnR5cGVzLm5leHQoKTsKLQkJCQlpZiAoZUNsYXNzICE9IG51bGwpIHsKLQkJCQkJZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCQkJaWYgKGZhaWxlZFBhY2thZ2VTZXQuYWRkKGVQYWNrYWdlKSkgewotCQkJCQkJcmVzdWx0ID0gZ2V0RmFjdG9yeUZvclBhY2thZ2UoYVByb2plY3QsIGVQYWNrYWdlKTsKLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclBhY2thZ2UoT2JqZWN0IGFQcm9qZWN0LCBFUGFja2FnZSBhUGFja2FnZSkgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBhUGFja2FnZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JQYWNrYWdlKGFQcm9qZWN0LCBhUGFja2FnZSk7Ci0JCWlmIChmYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KGFQcm9qZWN0LCBhUGFja2FnZSk7Ci0KLQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UsIE5VTExfRkFDVE9SWSk7Ci0JCQkJZWxzZQotCQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UsIGZhY3RvcnkpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IocmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclR5cGVzKE9iamVjdCBwLCBMaXN0IHR5cGVzKSB7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRSZXNvdXJjZVR5cGVzKHR5cGVzKTsKLQotCQlJdGVyYXRvciBmYWN0b3JpZXMgPSBhTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoZmFjdG9yaWVzLmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLm5leHQoKTsKLQkJCWlmIChpc0ZhY3RvcnlGb3JBbGxUeXBlcyhmYWN0b3J5LCB0eXBlcykpIHsKLQkJCQlyZXR1cm4gZmFjdG9yeTsKLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdFJlc291cmNlVHlwZXMoTGlzdCB0eXBlcykgewotCQkvLyAgICAgIGFkYXB0IHRoZSByZXNvdXJjZSB0byBpdHMgY29udGVudHMKLQkJaWYgKGlzRmFjdG9yeUZvckFsbFR5cGVzKGdldFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwgdHlwZXMpKQotCQkJcmV0dXJuIGdldFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZhY3RvcnlGb3JUeXBlcyhPYmplY3QgcCwgTGlzdCB0eXBlcykgewotCQlNYXAgYU1hcCA9IChNYXApIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBmYWN0b3JpZXMgPSBhTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoZmFjdG9yaWVzLmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLm5leHQoKTsKLQkJCWlmIChpc0ZhY3RvcnlGb3JBbGxUeXBlcyhmYWN0b3J5LCB0eXBlcykpIHsKLQkJCQlhTWFwLnJlbW92ZShmYWN0b3J5KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmFjdG9yeUZvckFsbFR5cGVzKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIExpc3QgdHlwZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykgewotCQkJaWYgKCFmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZXMuZ2V0KGkpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RXhpc3RpbmdGYWN0b3J5Rm9yUGFja2FnZShPYmplY3QgcCwgRVBhY2thZ2UgYVBhY2thZ2UpIHsKLQkJaWYgKHAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNYXAgYU1hcCA9IChNYXApIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQWRhcHRlckZhY3RvcnkpIGFNYXAuZ2V0KGFQYWNrYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlckZhY3RvcnkoT2JqZWN0IHAsIEVQYWNrYWdlIGFQYWNrYWdlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlNYXAgYU1hcCA9IGdldE9yQ3JlYXRlTWFwKHAsIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UpOwotCi0JCWFNYXAucHV0KGFQYWNrYWdlLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybjsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpIHsKLQkJCSgoSUNoYW5nZU5vdGlmaWVyKSBhZGFwdGVyRmFjdG9yeSkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYWxsRmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0T3JDcmVhdGVNYXAoT2JqZWN0IHAsIE1hcCBjb250YWluZXIpIHsKLQkJTWFwIGFNYXAgPSAoTWFwKSBjb250YWluZXIuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKSB7Ci0JCQlhTWFwID0gbmV3IEhhc2hNYXAoMTApOwotCQkJY29udGFpbmVyLnB1dChwLCBhTWFwKTsKLQkJfQotCQlyZXR1cm4gYU1hcDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlckZhY3RvcnkoT2JqZWN0IHAsIE9iamVjdCB0eXBlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlNYXAgYU1hcCA9IGdldE9yQ3JlYXRlTWFwKHAsIGFkYXB0ZXJGYWN0b3JpZXNCeVR5cGUpOwotCQlhTWFwLnB1dCh0eXBlLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybjsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpIHsKLQkJCSgoSUNoYW5nZU5vdGlmaWVyKSBhZGFwdGVyRmFjdG9yeSkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYWxsRmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHRhcmdldDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vdGlmaWVyKSB7Ci0JCQlhZGFwdGVyID0gYWRhcHQoKE5vdGlmaWVyKSB0YXJnZXQsIHR5cGUpOwotCQl9Ci0KLQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXN1bHQgPSBhZGFwdCgoRU9iamVjdCkgdGFyZ2V0LCB0eXBlKTsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgcCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0YXJnZXQpOwotCQkJaWYgKHAgPT0gbnVsbCkKLQkJCQlwID0gTk9fUFJPSkVDVDsKLQkJCXJlc3VsdCA9IGFkYXB0KHAsIHRhcmdldCwgdHlwZSwgbmV3IEhhc2hTZXQoKSwgdGFyZ2V0LmdldENsYXNzKCkpOwotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KEVPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCi0JCUVDbGFzcyBlQ2xhc3MgPSB0YXJnZXQuZUNsYXNzKCk7Ci0JCWlmIChlQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVQYWNrYWdlIGVQYWNrYWdlID0gZUNsYXNzLmdldEVQYWNrYWdlKCk7Ci0JCUFkYXB0ZXIgcmVzdWx0ID0gYWRhcHQodGFyZ2V0LCBlUGFja2FnZSwgdHlwZSk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlTZXQgZmFpbGVkUGFja2FnZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmYWlsZWRQYWNrYWdlU2V0LmFkZChlUGFja2FnZSk7Ci0JCQlJdGVyYXRvciBzdXBlcnR5cGVzID0gZUNsYXNzLmdldEVBbGxTdXBlclR5cGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChzdXBlcnR5cGVzLmhhc05leHQoKSkgewotCQkJCWVDbGFzcyA9IChFQ2xhc3MpIHN1cGVydHlwZXMubmV4dCgpOwotCQkJCWlmIChlQ2xhc3MgIT0gbnVsbCkgewotCQkJCQllUGFja2FnZSA9IGVDbGFzcy5nZXRFUGFja2FnZSgpOwotCQkJCQlpZiAoZmFpbGVkUGFja2FnZVNldC5hZGQoZVBhY2thZ2UpKSB7Ci0JCQkJCQlyZXN1bHQgPSBhZGFwdCh0YXJnZXQsIGVQYWNrYWdlLCB0eXBlKTsKLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBhZGFwdChFT2JqZWN0IHRhcmdldCwgRVBhY2thZ2UgZVBhY2thZ2UsIE9iamVjdCB0eXBlKSB7Ci0JCU9iamVjdCBhUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0YXJnZXQpOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCWFQcm9qZWN0ID0gTk9fUFJPSkVDVDsKLQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXRGYWN0b3J5Rm9yUGFja2FnZShhUHJvamVjdCwgZVBhY2thZ2UpOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQ29kZSBib3Jyb3dlZCBmcm9tIHtAbGluayBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5fQotCSAqICAKLQkgKi8KLQlwcml2YXRlIEFkYXB0ZXIgYWRhcHQoT2JqZWN0IHAsIE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUsIENvbGxlY3Rpb24gZmFpbGVkUGFja2FnZXMsIENsYXNzIGphdmFDbGFzcykgewotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQWRhcHRlciByZXN1bHQgPSBudWxsOwotCi0JCVBhY2thZ2UgamF2YVBhY2thZ2UgPSBqYXZhQ2xhc3MuZ2V0UGFja2FnZSgpOwotCQlpZiAoZmFpbGVkUGFja2FnZXMuYWRkKGphdmFQYWNrYWdlKSkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQl0eXBlcy5hZGQoamF2YVBhY2thZ2UpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXR5cGVzLmFkZCh0eXBlKTsKLQkJCX0KLQotCQkJLyogd2hlbiBhbiBlcnJvciBvY2N1cnMsIHJlbW92ZSB0aGUgZGVsZWdhdGUgYW5kIHRyeSBhZ2FpbiAqLwotCQkJYm9vbGVhbiBhdHRlbXB0QWRhcHRBZ2FpbiA9IHRydWU7Ci0JCQl3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgYXR0ZW1wdEFkYXB0QWdhaW4pIHsKLQkJCQlhdHRlbXB0QWRhcHRBZ2FpbiA9IGZhbHNlOwotCi0JCQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlcyhwLCB0eXBlcyk7Ci0JCQkJaWYgKGRlbGVnYXRlQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0ID0gZGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKHJlKTsKLQkJCQkJCXJlbW92ZUZhY3RvcnlGb3JUeXBlcyhwLCB0eXBlcyk7Ci0JCQkJCQlhdHRlbXB0QWRhcHRBZ2FpbiA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCUNsYXNzIHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGFkYXB0KHAsIHRhcmdldCwgdHlwZSwgZmFpbGVkUGFja2FnZXMsIGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOwotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gamF2YUNsYXNzLmdldEludGVyZmFjZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyArK2kpIHsKLQkJCQkJcmVzdWx0ID0gYWRhcHQocCwgdGFyZ2V0LCB0eXBlLCBmYWlsZWRQYWNrYWdlcywgaW50ZXJmYWNlc1tpXSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeUZvclR5cGUodGFyZ2V0KTsKLQotCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJcmV0dXJuIGZhY3RvcnkuYWRhcHROZXcodGFyZ2V0LCB0eXBlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHRBbGxOZXcoTm90aWZpZXIgdGFyZ2V0KSB7Ci0KLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlKHRhcmdldCk7Ci0KLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCWZhY3RvcnkuYWRhcHRBbGxOZXcodGFyZ2V0KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZChub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZShub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKGNoYW5nZU5vdGlmaWVyID09IG51bGwgfHwgY2hhbmdlTm90aWZpZXIuaXNFbXB0eSgpIHx8IGNoYW5nZU5vdGlmaWVyLmdldCgwKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhbGxGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWZhY3RvcnkgPSBpdGVyLm5leHQoKTsKLQkJCWRpc3Bvc2VGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gZ2V0RW5hYmxlbWVudElkZW50aWZpZXJzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCSgoSUVuYWJsZW1lbnRJZGVudGlmaWVyKSBpdHIubmV4dCgpKS5yZW1vdmVJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJaWYgKHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkKLQkJCXJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VGYWN0b3J5KE9iamVjdCBmYWN0b3J5KSB7Ci0JCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCSgoSURpc3Bvc2FibGUpIGZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy9Gb3dhcmQgdGhlIG5vdGlmaWNhdGlvbiBvbiB0byBhbGwgbXkgbGlzdGVuZXJzCi0JCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWRhcHRlckZhY3RvcmllcyhPYmplY3QgcHJvamVjdCkgewotCQlhZGFwdGVyRmFjdG9yaWVzQnlUeXBlLnJlbW92ZShwcm9qZWN0KTsKLQkJTWFwIGFNYXAgPSAoTWFwKSBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlLnJlbW92ZShwcm9qZWN0KTsKLQkJaWYgKGFNYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBmYWN0b3JpZXMgPSBhTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCU9iamVjdCBhZGFwdGVyRmFjdG9yeTsKLQkJd2hpbGUgKGZhY3Rvcmllcy5oYXNOZXh0KCkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yaWVzLm5leHQoKTsKLQkJCWFsbEZhY3Rvcmllcy5yZW1vdmUoYWRhcHRlckZhY3RvcnkpOwotCQkJZGlzcG9zZUZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeShPYmplY3QgcHJvamVjdCwgRVBhY2thZ2UgZVBhY2thZ2UpIHsKLQkJaWYgKGVQYWNrYWdlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRHluYW1pY0FkYXB0ZXJGYWN0b3J5X0VSUk9SXzApOwotCi0JCXJldHVybiBjcmVhdGVBZGFwdGVyRmFjdG9yeShwcm9qZWN0LCBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvcnMoZVBhY2thZ2UsIHZpZXdJRCkpOwotCi0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeShPYmplY3QgcHJvamVjdCwgTGlzdCBkZXNjcmlwdG9ycykgewotCQlpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCB8fCBkZXNjcmlwdG9ycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlBZGFwdGVyRmFjdG9yeSBmYWN0ID0gbnVsbDsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBudWxsOwotCQlBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYyA9IG51bGw7Ci0JCWlmIChkZXNjcmlwdG9ycy5zaXplKCkgPT0gMSkgewotCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldCgwKTsKLQkJCWlkZW50aWZpZXIgPSBnZXRJZGVudGlmaWVyKHByb2plY3QsIGRlc2MpOwotCQkJYWRkTGlzdGVuZXJJZk5lY2Vzc2FyeShpZGVudGlmaWVyKTsKLQkJCWlmIChwcm9qZWN0LmVxdWFscyhOT19QUk9KRUNUKSB8fCAoaWRlbnRpZmllciAhPSBudWxsICYmIGlkZW50aWZpZXIuaXNFbmFibGVkKCkpKQotCQkJCXJldHVybiBkZXNjLmNyZWF0ZUluc3RhbmNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoZGVzY3JpcHRvcnMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgewotCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldChpKTsKLQkJCWlkZW50aWZpZXIgPSBnZXRJZGVudGlmaWVyKHByb2plY3QsIGRlc2MpOwotCQkJYWRkTGlzdGVuZXJJZk5lY2Vzc2FyeShpZGVudGlmaWVyKTsKLQkJCWlmIChwcm9qZWN0LmVxdWFscyhOT19QUk9KRUNUKSB8fCAoaWRlbnRpZmllciAhPSBudWxsICYmIGlkZW50aWZpZXIuaXNFbmFibGVkKCkpKSB7Ci0JCQkJZmFjdCA9IGRlc2MuY3JlYXRlSW5zdGFuY2UoKTsKLQkJCQlpZiAoZmFjdCAhPSBudWxsKQotCQkJCQlmYWN0b3JpZXMuYWRkKGZhY3QpOwotCQkJfQotCQl9Ci0JCWlmIChmYWN0b3JpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIG5ldyBFeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBkZXNjCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUVuYWJsZW1lbnRJZGVudGlmaWVyIGdldElkZW50aWZpZXIoT2JqZWN0IHByb2plY3QsIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjKSB7Ci0JCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKLQkJaWYgKGlzUmVzcGVjdGluZ0FjdGl2aXRpZXMoKSAmJiBwcm9qZWN0IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlpZGVudGlmaWVyID0gSUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZGVzYy5nZXRJRCgpLCAoSVByb2plY3QpIHByb2plY3QpOwotCQllbHNlIGlmIChwcm9qZWN0IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlpZGVudGlmaWVyID0gRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcihkZXNjLmdldElEKCksIChJUHJvamVjdCkgcHJvamVjdCk7Ci0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZXNwZWN0aW5nQWN0aXZpdGllcygpIHsKLQkJcmV0dXJuIHJlc3BlY3RpbmdBY3Rpdml0aWVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVySWZOZWNlc3NhcnkoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIpIHsKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWRlbnRpZmllci5hZGRJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCWdldEVuYWJsZW1lbnRJZGVudGlmaWVycygpLmFkZChpZGVudGlmaWVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpc3RlbmluZ1RvKElFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBnZXRFbmFibGVtZW50SWRlbnRpZmllcnMoKS5jb250YWlucyhpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuYWJsZW1lbnRJZGVudGlmaWVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2V0IGdldEVuYWJsZW1lbnRJZGVudGlmaWVycygpIHsKLQkJaWYgKGVuYWJsZW1lbnRJZGVudGlmaWVycyA9PSBudWxsKQotCQkJZW5hYmxlbWVudElkZW50aWZpZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJcmV0dXJuIGVuYWJsZW1lbnRJZGVudGlmaWVyczsKLQl9Ci0KLQlwcml2YXRlIFNldCBlbmFibGVtZW50SWRlbnRpZmllcnM7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyI2lkZW50aWZpZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaWRlbnRpZmllckNoYW5nZWQoRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBpZGVudGlmaWVyRXZlbnQpIHsKLQkJaWYgKGlkZW50aWZpZXJFdmVudC5oYXNFbmFibGVkQ2hhbmdlZCgpIHx8IGlkZW50aWZpZXJFdmVudC5oYXNGdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZCgpKSB7Ci0JCQlPYmplY3QgcHJvamVjdCA9ICgoRW5hYmxlbWVudElkZW50aWZpZXIpIGlkZW50aWZpZXJFdmVudC5nZXRJZGVudGlmaWVyKCkpLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlyZW1vdmVBZGFwdGVyRmFjdG9yaWVzKHByb2plY3QpOwotCQkJCS8qCi0JCQkJICogZmluYWwgTm90aWZpZXIgbm90aWZpZXIgPSAoTm90aWZpZXIpIGdldENhY2hlZFJvb3RzKCkuZ2V0KHByb2plY3QpOwotCQkJCSAqLwotCQkJCS8qIGZvcmNlIGEgdmlld2VyIHJlZnJlc2ggKi8KLQkJCQlub3RpZnlDaGFuZ2VkKG5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5BREQsIG51bGwsIG51bGwpIHsKLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXROb3RpZmllcigpCi0JCQkJCSAqLwotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJCQkJCXJldHVybiBudWxsOyAvLyBub3RpZmllcjsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJLyogZWxzZSByZXBsYWNlIGVudGlyZSBzdHJ1Y3R1cmUgKi8KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCXJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWFiMzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VNRldvcmtiZW5jaEVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlBhc3N0aHJ1UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS5sYW5nLlRocm93YWJsZTsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vdGhlIElEIGZvciB0aGlzIHBsdWdpbiAoYWRkZWQgYXV0b21hdGljYWxseSBieSBsb2dnaW5nIHF1aWNrZml4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9GQUNUT1JJRVNfRVhURU5TSU9OX1BPSU5UID0gImVkaXRNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0VYVEVOU0lPTl9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiZWRpdE1vZGVsRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfRkFDVE9SWV9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiYWRhcHRlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luIHBsdWdpbjsgCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUV4dGVuZGVkRWNvcmVVdGlsLnNldEZpbGVOb3RGb3VuZERldGVjdG9yKG5ldyBFeHRlbmRlZEVjb3JlVXRpbC5GaWxlTm90Rm91bmREZXRlY3RvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRmlsZU5vdEZvdW5kKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1Jlc291cmNlTm90Rm91bmQod3JhcHBlZEV4KSB8fCB3cmFwcGVkRXguZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0JCQl9Ci0JCX0pOwotCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pbml0aWFsaXplRmlsZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVJc29sYXRlZFJlc291cmNlU2V0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBQYXNzdGhydVJlc291cmNlU2V0KHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlV29ya3NwYWNlUGFzc3RocnVSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIG5ldyBQYXNzdGhydVJlc291cmNlU2V0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBleGNlcHRpb24uZ2V0U3RhdHVzKCkgKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyhjcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBtZXNzYWdlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSkpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDVhMjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVNhdmVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlSGFuZGxlckhlYWRsZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlSGFuZGxlclJlZ2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLklXRlRXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklPcGVyYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkNsaWVudEFjY2Vzc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRWRpdE1vZGVsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5FZGl0TW9kZWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LlJlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBFZGl0TW9kZWwgaW1wbGVtZW50cyBDb21tYW5kU3RhY2tMaXN0ZW5lciwgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIsIFJlc291cmNlU3RhdGVWYWxpZGF0b3IsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIE1hcCBwYXJhbXM7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWRpdE1vZGVsSUQ7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlYWRPbmx5OwotCS8vIFRoZXNlIGFyZSB0aGUgY3VycmVudCByZXNvdXJjZSB1cmlzIHdlIG5lZWQgdG8gdHJhY2sKLQlwcm90ZWN0ZWQgTGlzdCBrbm93blJlc291cmNlVXJpczsKLQkvLyBUaGVzZSBhcmUgdGhlIGN1cnJlbnQgcmVzb3VyY2UgZXh0ZW5zaW9ucyB0byB0cmFjawotCXByb3RlY3RlZCBMaXN0IGtub3duUmVzb3VyY2VFeHRlbnNpb25zOwotCS8vIFRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGtub3duIHJlc291cmNlIHVyaXMsIHdoaWNoIHdlIGhhdmUgcmVxdWVzdGVkIGJlIGF1dG9sb2FkZWQKLQlwcm90ZWN0ZWQgTGlzdCBwcmVsb2FkUmVzb3VyY2VVcmlzOwotCS8vIFRoaXMgaXMgYSBtYXAgb2YgaWRlbnRpZmllcnMgdG8gcmVzb3VyY2VzIHRoYXQgd2UgbmVlZCB0byBsaXN0ZW4gdG8gaW4gb3JkZXIgdG8gbGlzdGVuIGZvcgotCS8vIHVwZGF0ZXMgdG8gdGhlIGVkaXQgbW9kZWwgcmVzb3VyY2VzCi0JcHJvdGVjdGVkIE1hcCByZXNvdXJjZUlkZW50aWZpZXJzOwotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbEV2ZW50IGRpcnR5TW9kZWxFdmVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcG9zaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFJlc291cmNlU3RhdGVWYWxpZGF0b3Igc3RhdGVWYWxpZGF0b3I7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXM7Ci0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVyKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXZlcnRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZXM7Ci0JcHJpdmF0ZSBDbGllbnRBY2Nlc3NSZWdpc3RyeSByZWdpc3RyeTsKLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dCBlbWZDb250ZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQlwcml2YXRlIFJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb247Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAoIWlzRGlzcG9zaW5nKCkgJiYgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQgJiYgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChudWxsKSA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEKSB7Ci0JCQkJcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbm90aWZpY2F0aW9uLmdldE9sZEJvb2xlYW5WYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0TmV3Qm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiByZWFkT25seSkgewotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRU1GIGNvbnRleHQgY2FuJ3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZWRpdE1vZGVsSUQgPSBlZGl0TW9kZWxJRDsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCQlpZiAocmVhZE9ubHkpCi0JCQl0aGlzLnJlZ2lzdHJ5ID0gbmV3IFJlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkoKTsKLQkJZWxzZQotCQkJdGhpcy5yZWdpc3RyeSA9IG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeSgpOwotCQl0aGlzLmVtZkNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLnByb2plY3QgPSBjb250ZXh0LmdldFByb2plY3QoKTsKLQkJaW5pdGlhbGl6ZUtub3duUmVzb3VyY2VVcmlzKCk7Ci0JCXByb2Nlc3NMb2FkZWRSZXNvdXJjZXMoKTsKLQkJcHJvY2Vzc1ByZWxvYWRSZXNvdXJjZXMoKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJlYWRPbmx5LCBib29sZWFuIGFjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KSB7Ci0JCXRoaXMoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHJlYWRPbmx5KTsKLQkJdGhpcy5hY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyA9IGFjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gZWRpdE1vZGVsSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRNb2RlbElEKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsSUQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NpbmcoKSB7Ci0JCXJldHVybiBkaXNwb3Npbmc7Ci0JfQotCi0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGJlIG1hZGUKLQkgKiBmaW5hbCBpbiB0aGUgbmV4dCByZWxlYXNlLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBkb0Rpc3Bvc2UoKSBhcwotCSAqIG5lY2Vzc2FyeSB0byBkaXNwb3NlIGFueSBhZGRpdGlvbmFsIGFydGlmYWN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJaWYgKGRpc3Bvc2luZyB8fCBkaXNwb3NlZCkKLQkJCQlyZXR1cm47Ci0JCQlkaXNwb3NpbmcgPSB0cnVlOwotCQkKLQkJCWlmIChoYXNMaXN0ZW5lcnMoKSkKLQkJCQlub3RpZnlMaXN0ZW5lcnMobmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFLCB0aGlzKSk7Ci0JCQkKLQkJCXJlbGVhc2VSZXNvdXJjZXMoKTsKLQotCQkJaWYgKGNvbW1hbmRTdGFjayAhPSBudWxsKQotCQkJCWNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcih0aGlzKTsKLQkJCWlmIChnZXRFbWZDb250ZXh0KCkgIT0gbnVsbCkKLQkJCQlnZXRFbWZDb250ZXh0KCkucmVtb3ZlRWRpdE1vZGVsKHRoaXMsIGlzUmVhZE9ubHkoKSk7Ci0JCQlyZWxlYXNlUHJlbG9hZFJlc291cmNlcygpOwotCQkJcmVsZWFzZUlkZW50aWZpZXJzKCk7Ci0JCQlkb0Rpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5sb2dFcnJvcihyZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbWZDb250ZXh0ID0gbnVsbDsKLQkJCXJlc291cmNlcyA9IG51bGw7Ci0JCQlwcm9qZWN0ID0gbnVsbDsKLQkJCWRpc3Bvc2VkID0gdHJ1ZTsKLQkJCWRpc3Bvc2luZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VJZGVudGlmaWVycygpIHsKLQkJaWYgKHJlc291cmNlSWRlbnRpZmllcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXRlciA9IHJlc291cmNlSWRlbnRpZmllcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlkZW50aWZpZXIgPSAoSUVuYWJsZW1lbnRJZGVudGlmaWVyKSBpdGVyLm5leHQoKTsKLQkJCWlkZW50aWZpZXIucmVtb3ZlSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBnZXRSZXNvdXJjZVNldFN5bmNocm9uaXplcigpIHsKLQkJaWYgKGVtZkNvbnRleHQgPT0gbnVsbCB8fCAhZW1mQ29udGV4dC5oYXNSZXNvdXJjZVNldCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUHJlbG9hZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRSZXNvdXJjZVNldFN5bmNocm9uaXplcigpOwotCQlpZiAoc3luYyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWxvYWRSZXNvdXJjZVVyaXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlVUkkgdXJpID0gKFVSSSkgcHJlbG9hZFJlc291cmNlVXJpcy5nZXQoaSk7Ci0JCQkJc3luYy5kaXNhYmxlQXV0b2xvYWQodXJpKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwga25vd25SZXNvdXJjZUV4dGVuc2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgZXh0ID0gKFN0cmluZykga25vd25SZXNvdXJjZUV4dGVuc2lvbnMuZ2V0KGkpOwotCQkJCXN5bmMuZGlzYWJsZUF1dG9sb2FkKGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKiAqKiBCRUdJTiBDb21tYW5kIFN0YWNrIE1hbmlwdWxhdGlvbiAqKiogKi8KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCBCYXNpY0NvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCUJhc2ljQ29tbWFuZFN0YWNrIHN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0JCXJldHVybiBzdGFjazsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSB7QGxpbmtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrfSdzIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoamF2YS51dGlsLkV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCWlmIChkaXJ0eU1vZGVsRXZlbnQgPT0gbnVsbCkKLQkJCWRpcnR5TW9kZWxFdmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5ESVJUWSwgdGhpcyk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkKLQkJCW5vdGlmeUxpc3RlbmVycyhkaXJ0eU1vZGVsRXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEZsdXNoIHRoZSBDb21tYW5kcyBmcm9tIHRoZSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2hDb21tYW5kU3RhY2soKSB7Ci0JCWdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCWdldENvbW1hbmRTdGFjaygpLnNhdmVJc0RvbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwdWJsaWMgQmFzaWNDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlpZiAoY29tbWFuZFN0YWNrID09IG51bGwpIHsKLQkJCWNvbW1hbmRTdGFjayA9IGNyZWF0ZUNvbW1hbmRTdGFjaygpOwotCQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kU3RhY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gIWxpc3RlbmVycy5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqICoqIEVORCBDb21tYW5kIFN0YWNrIE1hbmlwdWxhdGlvbiAqKiogKi8KLQotCS8qKiAqKiBCRUdJTiBMaXN0ZW5lcnMgKioqICovCi0KLQkvKioKLQkgKiBBZGQKLQkgKiAKLQkgKiBAYUxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsKQotCQkJbGlzdGVuZXJzLmFkZChhTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YKLQkgKiAKLQkgKiBAYW5FdmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQkKLQkJTm90aWZ5UnVubmVyIG5vdGlmaWVyID0gbmV3IE5vdGlmeVJ1bm5lcihhbkV2ZW50KTsgCi0JCQotCQlPYmplY3RbXSBub3RpZnlMaXN0ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOyAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlub3RpZmllci5zZXRMaXN0ZW5lciggKEVkaXRNb2RlbExpc3RlbmVyKSBub3RpZnlMaXN0W2ldICk7Ci0JCQlTYWZlUnVubmVyLnJ1bihub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUKLQkgKiAKLQkgKiBAYUxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUxpc3RlbmVyKEVkaXRNb2RlbExpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKiAqKiBFTkQgTGlzdGVuZXJzICoqKiAqLwotCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUZpbGVFZGl0YWJsZShJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYUZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuc2V0UmVhZE9ubHkoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2YgSUZpbGU7IGFueSByZWFkLW9ubHkgZmlsZXMgdGhhdCB3aWxsIGJlIHRvdWNoZWQgaWYgdGhpcyBlZGl0IG1vZGVsCi0JICogICAgICAgICBzYXZlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlYWRPbmx5QWZmZWN0ZWRGaWxlcygpIHsKLQkJSXRlcmF0b3IgYWZmZWN0ZWQgPSBnZXRBZmZlY3RlZEZpbGVzKCkuaXRlcmF0b3IoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChhZmZlY3RlZC5oYXNOZXh0KCkpIHsKLQkJCUlGaWxlIGFGaWxlID0gKElGaWxlKSBhZmZlY3RlZC5uZXh0KCk7Ci0JCQlpZiAoYUZpbGUuaXNSZWFkT25seSgpKQotCQkJCXJlc3VsdC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqICoqIEJFR0lOIFNhdmUgSGFuZGxlcnMgKioqICovCi0KLQlwcm90ZWN0ZWQgSVNhdmVIYW5kbGVyIGdldFNhdmVIYW5kbGVyKCkgewotCQlyZXR1cm4gU2F2ZUhhbmRsZXJSZWdpc3Rlci5nZXRTYXZlSGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgc2F2ZUlmTmVjZXNzYXJ5IG9yCi0JICogc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdCBkZXRlcm1pbmVzIG5vdCB0byBzYXZlLiBUaGlzIHByb3ZpZGVzIHN1YmNsYXNzZXMgd2l0aCBhbgotCSAqIG9wcG9ydHVuaXR5IHRvIGRvIHNvbWUgb3RoZXIgYWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlzYXZlKG51bGwsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yIHsKLQkJLy8gc2F2ZQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHtAbGluayAjcHJpbVNhdmV9Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlhc3NlcnRQZXJtaXNzaW9uVG9TYXZlKGFjY2Vzc29yS2V5KTsKLQkJZ2V0U2F2ZUhhbmRsZXIoKS5hY2Nlc3MoKTsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQkJcHJpbVNhdmUoYU1vbml0b3IpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5TYXZlT3BlcmF0aW9uKHJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5oYW5kbGVTYXZlRmFpbGVkKGV4LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGV4KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFNhdmVIYW5kbGVyKCkucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQgKGkuZS4sIG5vIG90aGVyIHJlZmVyZW5jZXMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJc2F2ZUlmTmVjZXNzYXJ5KG51bGwsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBiZSBzYXZlZCAoaS5lLiwgbm8gb3RoZXIgcmVmZXJlbmNlcykuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmIChzaG91bGRTYXZlKCkpCi0JCQlzYXZlKG1vbml0b3IsIGFjY2Vzc29yS2V5KTsKLQkJZWxzZQotCQkJaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgaWYgbmVjZXNzYXJ5LiBJZiB0eXBpY2FsbHkgYSBzYXZlIHdvdWxkIG5vdCBvY2N1ciBiZWNhdXNlIHRoaXMgZWRpdCBtb2RlbCBpcwotCSAqIHNoYXJlZCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB1c2luZyB0aGUKLQkgKiAKLQkgKiBAb3BlcmF0aW9uSGFuZGxlci4gSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIHRoZSBlbnRpcmUgZWRpdCBtb2RlbAotCSAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQobnVsbCwgb3BlcmF0aW9uSGFuZGxlciwgYWNjZXNzb3JLZXkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSBpZiBuZWNlc3NhcnkuIElmIHR5cGljYWxseSBhIHNhdmUgd291bGQgbm90IG9jY3VyIGJlY2F1c2UgdGhpcyBlZGl0IG1vZGVsIGlzCi0JICogc2hhcmVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHVzaW5nIHRoZQotCSAqIAotCSAqIEBvcGVyYXRpb25IYW5kbGVyLiBJZiB0aGUgcHJvbXB0IHJldHVybnMgdHJ1ZSAodGhlIHVzZXIgd2FudHMgdG8gc2F2ZSkgdGhlIGVudGlyZSBlZGl0IG1vZGVsCi0JICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2F2ZWQuIFlvdSBtYXkgcGFzcyBpbiBhIGJvb2xlYW4gPGNvZGU+d2FzRGlydHk8L2NvZGU+IHRvCi0JICogICAgICAgICAgICAgICAgICAgIGluZGljYXRlIHdoZXRoZXIgdGhpcyBlZGl0IG1vZGVsIHdhcyBkaXJ0eSBwcmlvciB0byBtYWtpbmcgYW55IGNoYW5nZXMgYW5kCi0JICogICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhpcyBtZXRob2QuIHtAbGluayBFZGl0TW9kZWwjaXNEaXJ0eSgpfQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgYm9vbGVhbiB3YXNEaXJ0eSwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQobnVsbCwgb3BlcmF0aW9uSGFuZGxlciwgd2FzRGlydHksIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgaWYgbmVjZXNzYXJ5LiBJZiB0eXBpY2FsbHkgYSBzYXZlIHdvdWxkIG5vdCBvY2N1ciBiZWNhdXNlIHRoaXMgZWRpdCBtb2RlbCBpcwotCSAqIHNoYXJlZCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB1c2luZyB0aGUKLQkgKiAKLQkgKiBAb3BlcmF0aW9uSGFuZGxlci4gSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIHRoZSBlbnRpcmUgZWRpdCBtb2RlbAotCSAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChtb25pdG9yLCBvcGVyYXRpb25IYW5kbGVyLCB0cnVlLCBhY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IGlmIG5lY2Vzc2FyeS4gSWYgdHlwaWNhbGx5IGEgc2F2ZSB3b3VsZCBub3Qgb2NjdXIgYmVjYXVzZSB0aGlzIGVkaXQgbW9kZWwgaXMKLQkgKiBzaGFyZWQsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgdGhlCi0JICogCi0JICogQG9wZXJhdGlvbkhhbmRsZXIuIElmIHRoZSBwcm9tcHQgcmV0dXJucyB0cnVlICh0aGUgdXNlciB3YW50cyB0byBzYXZlKSB0aGUgZW50aXJlIGVkaXQgbW9kZWwKLQkgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzYXZlZC4gWW91IG1heSBwYXNzIGluIGEgYm9vbGVhbiA8Y29kZT53YXNEaXJ0eTwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGUgd2hldGhlciB0aGlzIGVkaXQgbW9kZWwgd2FzIGRpcnR5IHByaW9yIHRvIG1ha2luZyBhbnkgY2hhbmdlcyBhbmQKLQkgKiAgICAgICAgICAgICAgICAgICAgY2FsbGluZyB0aGlzIG1ldGhvZC4ge0BsaW5rIEVkaXRNb2RlbCNpc0RpcnR5KCl9Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHksIE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCWlmIChzaG91bGRTYXZlKG9wZXJhdGlvbkhhbmRsZXIsIHdhc0RpcnR5KSkKLQkJCXNhdmUobW9uaXRvciwgYWNjZXNzb3JLZXkpOwotCQllbHNlCi0JCQloYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFBlcm1pc3Npb25Ub1NhdmUoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKQotCQkJcmVnaXN0cnkuYXNzZXJ0QWNjZXNzKGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5TYXZlT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHkpIHsKLQkJcmV0dXJuICF3YXNEaXJ0eSA/IHNob3VsZFNhdmUoKSA6IHNob3VsZFNhdmUob3BlcmF0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHVyaSBmb3IKLQkgKiAKLQkgKiBAYVJlc291cmNlIGlzIG9uZSBvZiB0aGUga25vd24gcmVzb3VyY2UgdXJpcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGlzSW50ZXJyZXN0ZWRJblJlc291cmNlVXJpKGFSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUmVzb3VyY2VVcmkoVVJJIHJlc1VSSSkgewotCQlVUkkgdXJpOwotCQlMaXN0IHVyaVN0cmluZ3MgPSBnZXRLbm93blJlc291cmNlVXJpcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaVN0cmluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCXVyaSA9IChVUkkpIHVyaVN0cmluZ3MuZ2V0KGkpOwotCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmVuZHNXaXRoKHJlc1VSSSwgdXJpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhbmQgYWRkIFVSSXMgKHR5cGUgVVJJKSBvZiBrbm93biByZXNvdXJjZXMuIFlvdSBtdXN0IGFkZCByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgcmVmZXJlbmNlcyB0byBvdGhlciBrbm93biByZXNvdXJjZXMgZmlyc3Qgc28gdGhleSB3aWxsIGJlIHJlbGVhc2VkIGZpcnN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVLbm93blJlc291cmNlVXJpcygpIHsKLQkJa25vd25SZXNvdXJjZVVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByZWxvYWRSZXNvdXJjZVVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVkaXRNb2RlbFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gZWRpdE1vZGVsUmVzb3VyY2VzID0gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFZGl0TW9kZWxSZXNvdXJjZXMoZ2V0RWRpdE1vZGVsSUQoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBlZGl0TW9kZWxSZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZXMgPSAoRWRpdE1vZGVsUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJYWRkRWRpdE1vZGVsUmVzb3VyY2UocmVzKTsKLQkJfQotCQlDb2xsZWN0aW9uIHJlc291cmNlRXh0ZW5zaW9ucyA9IEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWRpdE1vZGVsRXh0ZW5zaW9ucyhnZXRFZGl0TW9kZWxJRCgpKTsKLQkJLyogYnVnIDE3MDY5MCAtIGluaXRpYWxpemUga25vd25SZXNvdXJjZUV4dGVuc2lvbnMgaWYgbmVjZXNzYXJ5LCBhbmQgY2hhbmdlIHJlZmVyZW5jZSBmcm9tIGl0ZXIgdG8gaXQgKi8KLQkJaWYgKGtub3duUmVzb3VyY2VFeHRlbnNpb25zID09IG51bGwpCi0JCXsKLQkJCWtub3duUmVzb3VyY2VFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmICghcmVzb3VyY2VFeHRlbnNpb25zLmlzRW1wdHkoKSkKLQkJewotCQkJa25vd25SZXNvdXJjZUV4dGVuc2lvbnMuYWRkQWxsKHJlc291cmNlRXh0ZW5zaW9ucyk7Ci0JCQlJdGVyYXRvciBpdCA9IHJlc291cmNlRXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlzeW5jLmVuYWJsZUF1dG9sb2FkKGl0Lm5leHQoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFZGl0TW9kZWxSZXNvdXJjZShFZGl0TW9kZWxSZXNvdXJjZSByZXMpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzLmlzQ29yZSgpKSB7Ci0JCQkJZW5hYmxlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gcmVzLmdldEVuYWJsZW1lbnRJZGVudGlmaWVyKGdldFByb2plY3QoKSk7Ci0JCQkJcmVnaXN0ZXJJbnRlcmVzdChpZGVudGlmaWVyLCByZXMpOwotCQkJCWVuYWJsZWQgPSBpZGVudGlmaWVyLmlzRW5hYmxlZCgpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ1dhcm5pbmcocmUpOwotCQl9Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOwotCQkJa25vd25SZXNvdXJjZVVyaXMuYWRkKHVyaSk7Ci0JCQlpZiAocmVzLmlzQXV0b0xvYWQoKSkgewotCQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQkJc3luYy5lbmFibGVBdXRvbG9hZCh1cmkpOwotCQkJCXByZWxvYWRSZXNvdXJjZVVyaXMuYWRkKHVyaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW50ZXJlc3QoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIsIEVkaXRNb2RlbFJlc291cmNlIHJlcykgewotCQlnZXRFZGl0TW9kZWxSZXNvdXJjZXMoaWRlbnRpZmllcikuYWRkKHJlcyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEVkaXRNb2RlbFJlc291cmNlcyhJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgewotCQlpZiAocmVzb3VyY2VJZGVudGlmaWVycyA9PSBudWxsKQotCQkJcmVzb3VyY2VJZGVudGlmaWVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgdFJlc291cmNlcyA9IChMaXN0KSByZXNvdXJjZUlkZW50aWZpZXJzLmdldChpZGVudGlmaWVyKTsKLQkJaWYgKHRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJdFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCQlyZXNvdXJjZUlkZW50aWZpZXJzLnB1dChpZGVudGlmaWVyLCB0UmVzb3VyY2VzKTsKLQkJCWlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB0UmVzb3VyY2VzOwotCX0KLQotCi0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0S25vd25SZXNvdXJjZVVyaXMoKSB7Ci0JCWlmIChrbm93blJlc291cmNlVXJpcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUtub3duUmVzb3VyY2VVcmlzKCk7Ci0KLQkJcmV0dXJuIGtub3duUmVzb3VyY2VVcmlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gcmVnaXN0cnkuc2l6ZSgpID4gMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2NhY2hlTm9uUmVzb3VyY2VWYWxpZGF0ZVN0YXRlKExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdGF0ZVZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yCi0JICovCi0JcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgZ2V0U3RhdGVWYWxpZGF0b3IoKSB7Ci0JCWlmIChzdGF0ZVZhbGlkYXRvciA9PSBudWxsKQotCQkJc3RhdGVWYWxpZGF0b3IgPSBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpOwotCQlyZXR1cm4gc3RhdGVWYWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNyZWF0ZVN0YXRlVmFsaWRhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcgotCSAqLwotCXByaXZhdGUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tBY3RpdmF0aW9uKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2xvc3RBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5sb3N0QWN0aXZhdGlvbihwcmVzZW50ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciN2YWxpZGF0ZVN0YXRlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJlc2VudGVyID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkudmFsaWRhdGVTdGF0ZShwcmVzZW50ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciNjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tTYXZlKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrUmVhZE9ubHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrUmVhZE9ubHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlU2V0IGZyb20gdGhlIE5hdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCi0JCQlyZXNvdXJjZVNldCA9IGdldEVtZkNvbnRleHQoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWlmICghaXNSZXZlcnRpbmcgJiYgIWRpc3Bvc2luZyAmJiBoYXNMaXN0ZW5lcnMoKSkgewotCQkJaW50IGV2ZW50Q29kZSA9IG5ld1ZhbHVlID8gRWRpdE1vZGVsRXZlbnQuTE9BREVEX1JFU09VUkNFIDogRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0U7Ci0JCQlFZGl0TW9kZWxFdmVudCBldnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoZXZlbnRDb2RlLCB0aGlzKTsKLQkJCWV2dC5hZGRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIGFVcmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UoYVVyaSk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldE9yQ3JlYXRlUmVzb3VyY2UoYVVyaSwgZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCXByb2Nlc3NSZXNvdXJjZShyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKSB7Ci0JCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKSB7Ci0JCQkJYWNjZXNzKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCQkJLy8gV2UgbmVlZCBhIGJldHRlciB3YXkgdG8gcGFzcyB0aGlzIHRocm91Z2ggdGhlIHNhdmUgb3B0aW9ucyBpbnN0ZWFkLgotCQkJCS8vIFdlIGFsc28gbmVlZCB0byBtYWtlIHRoaXMgZHluYW1pYyBiYXNlZCBvbiB0aGUgcHJvamVjdCB0YXJnZXQKLQkJCQkoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCX0gZWxzZSBpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSB7Ci0JCQkJKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIGFSZXNvdXJjZSkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCQl9Ci0KLQkJCWFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZXNvdXJjZSBmb3IKLQkgKiAKLQkgKiBAYVVyaS4KLQkgKi8KLQkvLyBUT0RPIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHdpbGwgb25seSB1c2UgdGhlIGxhc3Qgc2VnbWVudCB3aGVuIGxvb2tpbmcgZm9yIGEgcmVzb3VyY2UuCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlKExpc3QgdFJlc291cmNlcywgVVJJIGFVcmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmVuZHNXaXRoKHJlc291cmNlLmdldFVSSSgpLCBhVXJpKSkKLQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcHJvY2Vzc1Jlc291cmNlKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEdldCBhIGNhY2hlZCBSZXNvdXJjZSwgZWl0aGVyIGxvY2FsIG9yIGluIHRoZSBSZXNvdXJjZVNldCwgYmVmb3JlIGNyZWF0aW5nIGEgUmVzb3VyY2UuIFRoaXMKLQkgKiBhcGkgaGFuZGxlcyB0aGUgY2FzZSB0aGF0IHRoZSBSZXNvdXJjZSBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgYSBkZW1hbmQgbG9hZCB0aGF0IGZhaWxlZC4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZSh1cmksIGdldFJlc291cmNlU2V0KCkpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgotCSAqIAotCSAqIEBhVXJpLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRBbmRMb2FkTG9jYWxSZXNvdXJjZShVUkkgYVVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExvY2FsUmVzb3VyY2UoYVVyaSk7Ci0JCWlmIChudWxsICE9IHJlc291cmNlICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsgLy8gcmVsb2FkIGl0Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgotCSAqIAotCSAqIEBhVXJpLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRMb2NhbFJlc291cmNlKFVSSSBhVXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSwgYVVyaSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgUmVhZE9ubHkgRWRpdE1vZGVsIG9yIGlmIHdlIHNob3VsZCBvbmx5IGFjY2VzcyB1bmtub3duIFVSSXMgYXMKLQkgKiBSZWFkT25seS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2Nlc3NGb3JSZWFkKFJlZmVyZW5jZWRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGlzUmVhZE9ubHkoKSB8fCAoYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMgJiYgIWlzSW50ZXJyZXN0ZWRJblJlc291cmNlKGFSZXNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIChpLmUuLCBubyBvdGhlciByZWZlcmVuY2VzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQlpbnQgY29kZSA9IGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCk7Ci0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogewotCQkJCWlmICghaXNSZXZlcnRpbmcgJiYgaGFzUmVzb3VyY2VSZWZlcmVuY2UoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpKQotCQkJCQlyZW1vdmVSZXNvdXJjZXMoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5BRERFRF9SRVNPVVJDRSA6Ci0JCQkJaWYgKCFwcm9jZXNzUmVzb3VyY2VzSWZJbnRlcnJlc3RlZChhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSkpCi0JCQkJCXJldHVybjsKLQkJfQotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCWFuRXZlbnQuc2V0RWRpdE1vZGVsKHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYVJlc291cmNlIGlzIHJlZmVyZW5jZWQgYnkgbWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb3VyY2VSZWZlcmVuY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYW55IFJlc291cmNlIGluIHRoZSBsaXN0IG9mCi0JICogCi0JICogQHJlc291cmNlcyBpcyByZWZlcmVuY2VkIGJ5IG1lLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1Jlc291cmNlUmVmZXJlbmNlKExpc3QgdFJlc291cmNlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChoYXNSZXNvdXJjZVJlZmVyZW5jZSgoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgUmVzb3VyY2Ugb2JqZWN0cyBpbgotCSAqIAotCSAqIEBhTGlzdC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gb25lIG9yIG1vcmUgUmVzb3VyY2Ugb2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQotCSAqICAgICAgICAgUmVzb3VyY2VTZXQgd2l0aG91dCB0aGUgcmVmZXJlbmNlIGNvdW50IGdvaW5nIHRvIHplcm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VzKExpc3QgYUxpc3QpIHsKLQkJUmVzb3VyY2UgcmVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGFMaXN0LmdldChpKTsKLQkJCWlmIChyZW1vdmVSZXNvdXJjZShyZXMpICYmIHJlcyBpbnN0YW5jZW9mIFJlZmVyZW5jZWRSZXNvdXJjZSkKLQkJCQlyZW1vdmVkUmVzb3VyY2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCByZW1vdmVkUmVzb3VyY2UoUmVmZXJlbmNlZFJlc291cmNlIHJlZmVyZW5jZWRSZXNvdXJjZSkgewotCQlpZiAoIWlzUmVhZE9ubHkoKSAmJiByZWZlcmVuY2VkUmVzb3VyY2Uud2FzUmV2ZXJ0ZWQoKSkgewotCQkJaXNSZXZlcnRpbmcgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlyZXZlcnRlZChyZWZlcmVuY2VkUmVzb3VyY2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpc1JldmVydGluZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXMgPSBnZXRMb2NhbFJlc291cmNlKHVyaSk7Ci0JCXJldHVybiByZW1vdmVSZXNvdXJjZShyZXMpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlhUmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHBvc3QgcHJvY2VzcyBhIHJlbW92ZWQgUmVmZXJlbmNlZFJlc291cmNlLgotCSAqIAotCSAqIEBzZWUgSjJFRUVkaXRNb2RlbCNyZXZlcnRBbGxSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJldmVydGVkKFJlZmVyZW5jZWRSZXNvdXJjZSByZXZlcnRlZFJlc291cmNlKSB7Ci0JCXJldmVydEFsbFJlc291cmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldmVydEFsbFJlc291cmNlcygpIHsKLQkJTGlzdCBzb21lUmVzb3VyY2VzID0gZ2V0U29ydGVkUmVzb3VyY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc29tZVJlc291cmNlcy5zaXplKCk7IGkrKykKLQkJCSgoUmVzb3VyY2UpIHNvbWVSZXNvdXJjZXMuZ2V0KGkpKS51bmxvYWQoKTsKLQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlQWxsKHNvbWVSZXNvdXJjZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbWVSZXNvdXJjZXMuc2l6ZSgpOyBpKyspCi0JCQkoKFJlc291cmNlKSBzb21lUmVzb3VyY2VzLmdldChpKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ3JvdXAgdGhlIHJlc291cmNlcyBieSBYTUkgZmlyc3QsIHRoZW4gWE1MCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U29ydGVkUmVzb3VyY2VzKCkgewotCi0JCUxpc3QgdGhlUmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWludCBzaXplID0gdGhlUmVzb3VyY2VzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlSZXNvdXJjZVtdIHNvcnRlZCA9IG5ldyBSZXNvdXJjZVtzaXplXTsKLQkJaW50IHhtbEluc2VydFBvcyA9IHNpemUgLSAxOwotCQlpbnQgeG1pSW5zZXJ0UG9zID0gMDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgdGhlUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UpCi0JCQkJc29ydGVkW3htbEluc2VydFBvcy0tXSA9IHJlczsKLQkJCWVsc2UKLQkJCQlzb3J0ZWRbeG1pSW5zZXJ0UG9zKytdID0gcmVzOwotCQl9Ci0KLQkJcmV0dXJuIEFycmF5cy5hc0xpc3Qoc29ydGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIFJlc291cmNlcyB0aGF0IHdlIGFyZSBpbnRlcnJlc3RlZCBpbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUmVzb3VyY2VzSWZJbnRlcnJlc3RlZChMaXN0IHNvbWVSZXNvdXJjZXMpIHsKLQkJaW50IHNpemUgPSBzb21lUmVzb3VyY2VzLnNpemUoKTsKLQkJUmVzb3VyY2UgcmVzOwotCQlib29sZWFuIHByb2Nlc3NlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSBzb21lUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmICgocmVzICE9IG51bGwpICYmIChpc0ludGVycmVzdGVkSW5SZXNvdXJjZShyZXMpKSkgewotCQkJCXByb2Nlc3NSZXNvdXJjZShyZXMpOwotCQkJCXByb2Nlc3NlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NlZDsKLQl9Ci0KLQlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dCBnZXRFbWZDb250ZXh0KCkgewotCQlpZiAoaXNEaXNwb3NlZCgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRWRpdCBNb2RlbCBhbHJlYWR5IGRpc3Bvc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVtZkNvbnRleHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVNRiBjb250ZXh0IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW1mQ29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gZGlzcG9zZWQ7Ci0JfQotCi0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIEVNRldvcmtiZW5jaENvbnRleHQuCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZWdpc3RyeS5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCX0KLQotCS8qKgotCSAqIEFjY2VzcwotCSAqIAotCSAqIEBhUmVzb3VyY2UgZm9yIHJlYWQgb3Igd3JpdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXNzKFJlZmVyZW5jZWRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKHNob3VsZEFjY2Vzc0ZvclJlYWQoYVJlc291cmNlKSkKLQkJCWFSZXNvdXJjZS5hY2Nlc3NGb3JSZWFkKCk7Ci0JCWVsc2UKLQkJCWFSZXNvdXJjZS5hY2Nlc3NGb3JXcml0ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBlYWNoIGNsaWVudCB3aGVuIHRoZXkgYXJlIGZpbmlzaGVkIHdvcmtpbmcgd2l0aCB0aGUKLQkgKiBFZGl0TW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQotCQlyZWdpc3RyeS5yZWxlYXNlKGFjY2Vzc29yS2V5KTsKLQotCQlpZiAoIWlzRGlzcG9zaW5nKCkpIHsKLQkJCWJvb2xlYW4gc2hvdWxkRGlzcG9zZSA9IGZhbHNlOwotCQkJc2hvdWxkRGlzcG9zZSA9IHJlZ2lzdHJ5LnNpemUoKSA9PSAwOwotCQkJaWYgKHNob3VsZERpc3Bvc2UpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0KLQkJcmVtb3ZlUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIGFSZXNvdXJjZSBpbnN0YW5jZW9mIFJlZmVyZW5jZWRSZXNvdXJjZSkKLQkJCXJlbGVhc2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoUmVmZXJlbmNlZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJYVJlc291cmNlLnJlbGVhc2VGcm9tUmVhZCgpOwotCQllbHNlCi0JCQlhUmVzb3VyY2UucmVsZWFzZUZyb21Xcml0ZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUmVzb3VyY2VzKCkgewotCQlMaXN0IHRSZXNvdXJjZXMgPSBnZXRTb3J0ZWRSZXNvdXJjZXMoKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVsZWFzZShyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsIHx8IHJlc291cmNlcyA9PSBudWxsIHx8ICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKQotCQkJcmV0dXJuOwotCQlnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkuYWRkKGFSZXNvdXJjZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpIHsKLQkJaWYgKHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24gPT0gbnVsbCkKLQkJCXJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24gPSBuZXcgQXJyYXlMaXN0KDUpOwotCQlyZXR1cm4gcmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbjsKLQl9Ci0KLQotCi0JLyoqCi0JICogUmVtb3ZlIG15IHJlZmVyZW5jZSB0byBhUmVzb3VyY2UsIHJlbW92ZSBpdCBmcm9tIHRoZSBSZXNvdXJjZVNldCwgYW5kIGRlbGV0ZSBpdHMgZmlsZSBmcm9tCi0JICogdGhlIFdvcmtiZW5jaC4gVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgY3VycmVudGx5IGEgcmVmZXJlbmNlIHRvCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltRGVsZXRlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChwcmltRmx1c2hSZXNvdXJjZShhUmVzb3VyY2UpKSB7Ci0JCQl0cnkgewotCQkJCWdldEVtZkNvbnRleHQoKS5kZWxldGVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KLQkJCX0KLQkJCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIHRoaXMpOwotCQkJCWV2ZW50LmFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBteSByZWZlcmVuY2UgdG8gYVJlc291cmNlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgUmVzb3VyY2VTZXQuCi0JICovCi0JcHVibGljIHZvaWQgZmx1c2hSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKHByaW1GbHVzaFJlc291cmNlKGFSZXNvdXJjZSkpIHsKLQkJCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIHRoaXMpOwotCQkJCWV2ZW50LmFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJU2V0IGFTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IG1vZlJlc291cmNlcyA9IGdldFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZlJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgYVJlc291cmNlID0gKFJlc291cmNlKSBtb2ZSZXNvdXJjZXMuZ2V0KGkpOwotCQkJSUZpbGUgb3V0cHV0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShhUmVzb3VyY2UpOwotCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJCWFTZXQuYWRkKG91dHB1dCk7Ci0JCX0KLQkJcmV0dXJuIGFTZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgcmVzZXRLbm93blJlc291cmNlVXJpcygpIHsKLQotCQlpbml0aWFsaXplS25vd25SZXNvdXJjZVVyaXMoKTsKLQotCQlyZXR1cm4ga25vd25SZXNvdXJjZVVyaXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6MTQ6MjYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCg1KTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VVUklzKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VVUklzKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VVUklzKGJvb2xlYW4gb25seURpcnR5KSB7Ci0JCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQlpbnQgZGlydHlDb3VudCA9IDA7Ci0JCVN0cmluZ1tdIHVyaXMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJUmVzb3VyY2UgcmVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoIW9ubHlEaXJ0eSkKLQkJCQl1cmlzW2ldID0gcmVzLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQllbHNlIGlmIChyZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQkJdXJpc1tpXSA9IHJlcy5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJCWRpcnR5Q291bnQrKzsKLQkJCX0KLQkJfQotCQlpZiAob25seURpcnR5ICYmIGRpcnR5Q291bnQgPiAwKSB7Ci0JCQlTdHJpbmdbXSBkaXJ0eSA9IG5ldyBTdHJpbmdbZGlydHlDb3VudF07Ci0JCQlpbnQgaiA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodXJpc1tpXSAhPSBudWxsKSB7Ci0JCQkJCWRpcnR5W2pdID0gdXJpc1tpXTsKLQkJCQkJaisrOwotCQkJCX0KLQkJCX0KLQkJCXVyaXMgPSBkaXJ0eTsKLQkJfQotCQlyZXR1cm4gdXJpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBleHRlbnQgb2YgdGhlIHJlc291cmNlOyBsb2dzIGFuIGVycm9yIGFuZCByZXR1cm5zIG51bGwgaWYKLQkgKiB0aGUgZXh0ZW50IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldFJvb3QoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCUVMaXN0IGV4dGVudCA9IGFSZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQlpZiAoZXh0ZW50LnNpemUoKSA8IDEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBleHRlbnQuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgZmFpbHVyZSBvZgotCSAqIAotCSAqIEBhUmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChSZXNvdXJjZSBhUmVzb3VyY2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCWFSZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJaWYgKGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShlKSAmJiBzaG91bGRTYXZlUmVhZE9ubHkoYVJlc291cmNlKSkKLQkJCXNhdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQllbHNlCi0JCQlwcmltSGFuZGxlU2F2ZUZhaWxlZChhUmVzb3VyY2UsIGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBvZiBteSByZXNvdXJjZXMgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbnlSZXNvdXJjZURpcnR5KCkgewotCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoKChSZXNvdXJjZSkgbGlzdC5nZXQoaSkpLmlzTW9kaWZpZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBzYXZlIGlzIG5lZWRlZCBvbiB0aGUgQ29tbWFuZFN0YWNrCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGlzQW55UmVzb3VyY2VEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuIFNhdmVIYW5kbGVySGVhZGxlc3MuaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB5b3UgY2FuIG9ubHkgcmVhZCB0aGUgcmVzb3VyY2VzIGFuZCBub3Qgd3JpdGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHlGYWlsdXJlKEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUmVhZE9ubHlSZXNvdXJjZSgpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCQlJRmlsZSBmaWxlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlyZXMgPSAoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpOwotCQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzUmVhZE9ubHkoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZVJlc291cmNlKFVSSSkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlUmVzb3VyY2UoU3RyaW5nIGFVcmkpIHsKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoYVVyaSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBvZiBteSByZXNvdXJjZXMgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIG9uZSBhbmQgaXQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNUb1NhdmUoKSB7Ci0JCXJldHVybiAhaXNTaGFyZWQoKSAmJiBpc0RpcnR5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG15IHJlZmVyZW5jZSB0byBhUmVzb3VyY2UgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBSZXNvdXJjZVNldC4gUmV0dXJuIHRydWUgaWYgYVJlc291cmNlCi0JICogd2FzIHJlbW92ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUZsdXNoUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBoYXNSZXNvdXJjZVJlZmVyZW5jZShhUmVzb3VyY2UpKSB7Ci0JCQlyZW1vdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJcmVtb3ZlUmVzb3VyY2VTZXRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgZmFpbHVyZSBvZgotCSAqIAotCSAqIEBhUmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUhhbmRsZVNhdmVGYWlsZWQoUmVzb3VyY2UgYVJlc291cmNlLCBFeGNlcHRpb24gZSkgewotCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGUpOwotCQlFeGNlcHRpb24gbmVzdGVkID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBJV0ZUV3JhcHBlZEV4Y2VwdGlvbikKLQkJCW5lc3RlZCA9ICgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIGUpLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQllbHNlCi0JCQluZXN0ZWQgPSBlOwotCi0JCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX2Vycm9yX29jY3VycmVkX3doaWxlX3NhX0VSUk9SXyIpLCBuZXN0ZWQpOyAvLyROT04tTkxTLTEkID0gIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZy4iCi0JfQotCi0JLyoqCi0JICogUHJvbXB0IGZvciBhIHNhdmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0VG9TYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKLQkJaWYgKG9wZXJhdGlvbkhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9wZXJhdGlvbkhhbmRsZXIuY2FuQ29udGludWUoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2ZvbGxvd2luZ19yZXNvdXJjZXNfbmVfVUlfIiksIGdldFJlc291cmNlVVJJcyh0cnVlKSk7IC8vJE5PTi1OTFMtMSQgPSAiVGhlIGZvbGxvd2luZyByZXNvdXJjZXMgbmVlZCB0byBiZSBzYXZlZCBidXQgYXJlIGN1cnJlbnRseSBzaGFyZWQsIGRvIHlvdSB3YW50IHRvIHNhdmUgbm93PyIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGlzUmVhZE9ubHkoKSkKLQkJCXJldHVybjsgLy8gZG8gbm90aGluZwotCQlkZWxldGVSZXNvdXJjZXNJZk5lY2Vzc2FyeSgpOwotCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJaWYgKGdldFJlc291cmNlcygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsgLy8gbm90aGluZyB0byBzYXZlCi0JCUxpc3QgbG9jYWxSZXNvdXJjZXMgPSBnZXRTb3J0ZWRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGxvY2FsUmVzb3VyY2VzLmdldChpKTsKLQkJCXNhdmVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCX0KLQkJZ2V0Q29tbWFuZFN0YWNrKCkuc2F2ZUlzRG9uZSgpOwotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlNBVkUsIHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlc291cmNlc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbiA9PSBudWxsIHx8IHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24uc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0JCVJlc291cmNlIGRlYWRyZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldFJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24oKS5zaXplKCk7IGkrKykgewotCQkJZGVhZHJlcyA9IChSZXNvdXJjZSkgZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpLmdldChpKTsKLQkJCXByaW1EZWxldGVSZXNvdXJjZShkZWFkcmVzKTsKLQotCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGRlYWRyZXMpOwotCQkJZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpLnJlbW92ZShkZWFkcmVzKTsKLQkJfQotCX0KLQotCi0KLQkvKioKLQkgKiBTYXZlCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhUmVzb3VyY2UuaXNNb2RpZmllZCgpKQotCQkJYVJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHJlc291cmNlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKCkgewotCQlMaXN0IGxvYWRlZCA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmICghbG9hZGVkLmlzRW1wdHkoKSkKLQkJCXByb2Nlc3NSZXNvdXJjZXNJZkludGVycmVzdGVkKGxvYWRlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQcmVsb2FkUmVzb3VyY2VzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWxvYWRSZXNvdXJjZVVyaXMuc2l6ZSgpOyBpKyspIHsKLQkJCVVSSSB1cmkgPSAoVVJJKSBwcmVsb2FkUmVzb3VyY2VVcmlzLmdldChpKTsKLQkJCWdldFJlc291cmNlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYVJlc291cmNlIGZyb20gbXkgUmVzb3VyY2VTZXQuIFJldHVybiB0cnVlIGlmIGFSZXNvdXJjZSB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZVNldFJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlhUmVzb3VyY2UuZVNldERlbGl2ZXIoZmFsc2UpOwotCQlhUmVzb3VyY2UudW5sb2FkKCk7Ci0JCWFSZXNvdXJjZS5lU2V0RGVsaXZlcih0cnVlKTsKLQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlwcmltU2F2ZVJlc291cmNlKHJlc291cmNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZVNhdmVGYWlsZWQocmVzb3VyY2UsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZSgpIHsKLQkJcmV0dXJuICFpc1JlYWRPbmx5KCkgJiYgIWlzU2hhcmVkKCk7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyKSB7Ci0JCXJldHVybiBzaG91bGRTYXZlKCkgfHwgcHJvbXB0VG9TYXZlKG9wZXJhdGlvbkhhbmRsZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmVSZWFkT25seShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGFSZXNvdXJjZSk7Ci0JCWlmIChhRmlsZSA9PSBudWxsIHx8ICFhRmlsZS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGdldFNhdmVIYW5kbGVyKCkuc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIGtub3duIHJlc291cmNlIFVSSXMgdG8gYmUgbG9hZGVkIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGZvcmNlTG9hZEtub3duUmVzb3VyY2VzKCkgewotCQlMaXN0IHVyaXMgPSBnZXRLbm93blJlc291cmNlVXJpcygpOwotCQlVUkkgdXJpID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLnNpemUoKTsgaSsrKSB7Ci0JCQl1cmkgPSAoVVJJKSB1cmlzLmdldChpKTsKLQkJCWdldFJlc291cmNlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4geW91IHdhbnQgdG8gZXh0ZW5kIHRoaXMgZWRpdCBtb2RlbCB0byBoYW5kbGUgYSByZXNvdXJjZQotCSAqIHdpdGggYSBVUkkgZXF1YWwgdG8gPGNvZGU+YVJlbGF0aXZlVVJJPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYW5hZ2VFeHRlbnNpb25SZXNvdXJjZVVSSShTdHJpbmcgYVJlbGF0aXZlVVJJKSB7Ci0JCWlmIChhUmVsYXRpdmVVUkkgIT0gbnVsbCAmJiBhUmVsYXRpdmVVUkkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhUmVsYXRpdmVVUkkpOwotCQkJaWYgKCFpc0ludGVycmVzdGVkSW5SZXNvdXJjZVVyaSh1cmkpKSB7Ci0JCQkJZ2V0S25vd25SZXNvdXJjZVVyaXMoKS5hZGQodXJpKTsKLQkJCQkvLyBQcm9jZXNzIHRoZSByZXNvdXJjZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4KLQkJCQl0cnkgewotCQkJCQlSZXNvdXJjZSByZXMgPSBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2UodXJpKTsKLQkJCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCQkJcHJvY2Vzc1Jlc291cmNlKHJlcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgY2FjaGVkIFJlc291cmNlIG9yIHRyeSB0byBsb2FkIHRoZSBSZXNvdXJjZSBwcmlvciB0byBjcmVhdGluZyBhIFJlc291cmNlLiBUaGlzIGFwaQotCSAqIGhhbmRsZXMgdGhlIGNhc2UgdGhhdCB0aGUgUmVzb3VyY2UgbWF5IGJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBsb2FkLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcygpIHsKLQkJcmV0dXJuIGFjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzOwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGlzIGFwaSB0byBpbmRpY2F0ZSB0aGF0IHlvdSB3YW50IGFsbCB1bmtub3duIFJlc291cmNlcyB0byBiZSBhY2Nlc3NlZCBmb3IgUmVhZE9ubHkuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyhib29sZWFuIGIpIHsKLQkJYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMgPSBiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJYnVmZmVyLmFwcGVuZCgiIFIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCIgVyA9ICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoZ2V0UmVnaXN0cnkoKS5zaXplKCkpOwotCQlidWZmZXIuYXBwZW5kKCJbSUQ6IFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRFZGl0TW9kZWxJRCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgS25vd24gUmVzb3VyY2VzOiBbIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCB1cmlzID0gZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKLQkJaWYgKHVyaXMgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8ICh1cmlzLnNpemUoKSAtIDEpOyBpKyspCi0JCQkJYnVmZmVyLmFwcGVuZCh1cmlzLmdldChpKSArICIsICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHVyaXMuZ2V0KGkpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIm5vbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJYnVmZmVyLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZSgpOwotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xpZW50QWNjZXNzUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUmVmZXJlbmNlIHsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIHRvc3RyaW5nID0gbnVsbDsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlpZiAodG9zdHJpbmcgPT0gbnVsbCkgewotCQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCJFZGl0TW9kZWwuUmVmZXJlbmNlIFsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoInsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoZ2V0RWRpdE1vZGVsSUQoKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgifSB7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJCXJlc3VsdC5hcHBlbmQoIn1dIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0b3N0cmluZyA9IHJlc3VsdC50b1N0cmluZygpOwotCQkJfQotCQkJcmV0dXJuIHRvc3RyaW5nOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIC0gYnkgZGVmYXVsdCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCByb290IG9iamVjdCBmcm9tIHRoZSBmaXJzdAotCSAqIHJlc291cmNlIHJlZmVyZW5jZWQgYnkgdGhlIGtub3duIHJlc291cmNlIFVSSXMgZm9yIHRoaXMgRWRpdE1vZGVsCi0JICogCi0JICogQHJldHVybiBhbiBFT2JqZWN0IG9yIE51bGwKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0UHJpbWFyeVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCB8fCByZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSAtIGJ5IGRlZmF1bHQgdGhpcyB3aWxsIHJldHVybiB0aGUgZmlyc3QgcmVzb3VyY2UgcmVmZXJlbmNlZCBieSB0aGUKLQkgKiBrbm93biByZXNvdXJjZSBVUklzIGZvciB0aGlzIEVkaXRNb2RlbAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UHJpbWFyeVJlc291cmNlKCkgewotCQlpZiAoa25vd25SZXNvdXJjZVVyaXMgPT0gbnVsbCkKLQkJCWdldEtub3duUmVzb3VyY2VVcmlzKCk7Ci0JCWlmIChrbm93blJlc291cmNlVXJpcyA9PSBudWxsIHx8IGtub3duUmVzb3VyY2VVcmlzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVVSSSB1cmkgPSAoVVJJKSBrbm93blJlc291cmNlVXJpcy5nZXQoMCk7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSh1cmkpOwotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyI2lkZW50aWZpZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaWRlbnRpZmllckNoYW5nZWQoRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBldnQpIHsKLQkJaWYgKGV2dC5oYXNFbmFibGVkQ2hhbmdlZCgpKSB7Ci0JCQlFZGl0TW9kZWxFdmVudCBlZGl0TW9kZWxFdmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5LTk9XTl9SRVNPVVJDRVNfQUJPVVRfVE9fQ0hBTkdFLCB0aGlzKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhlZGl0TW9kZWxFdmVudCk7Ci0JCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWQgPSBldnQuZ2V0SWRlbnRpZmllcigpOwotCQkJaWYgKGlkLmlzRW5hYmxlZCgpKQotCQkJCWFkZEtub3duUmVzb3VyY2VzKGlkKTsKLQkJCWVsc2UKLQkJCQlyZW1vdmVLbm93blJlc291cmNlcyhpZCk7Ci0JCQllZGl0TW9kZWxFdmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5LTk9XTl9SRVNPVVJDRVNfQ0hBTkdFRCwgdGhpcyk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZWRpdE1vZGVsRXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUtub3duUmVzb3VyY2VzKElFbmFibGVtZW50SWRlbnRpZmllciBpZCkgewotCQlMaXN0IGVkaXRNb2RlbFJlc291cmNlcyA9IGdldEVkaXRNb2RlbFJlc291cmNlcyhpZCk7Ci0JCUVkaXRNb2RlbFJlc291cmNlIGVkaXRNb2RlbFJlc291cmNlID0gbnVsbDsKLQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRSZXNvdXJjZVNldFN5bmNocm9uaXplcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRNb2RlbFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsUmVzb3VyY2UgPSAoRWRpdE1vZGVsUmVzb3VyY2UpIGVkaXRNb2RlbFJlc291cmNlcy5nZXQoaSk7Ci0JCQlpZiAoZWRpdE1vZGVsUmVzb3VyY2UuaXNBdXRvTG9hZCgpICYmIHN5bmMgIT0gbnVsbCkgewotCQkJCXN5bmMuZGlzYWJsZUF1dG9sb2FkKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJCQlwcmVsb2FkUmVzb3VyY2VVcmlzLnJlbW92ZShlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQl9Ci0JCQlrbm93blJlc291cmNlVXJpcy5yZW1vdmUoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJcmVtb3ZlUmVzb3VyY2UoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQl9Ci0KLQl9Ci0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZEtub3duUmVzb3VyY2VzKElFbmFibGVtZW50SWRlbnRpZmllciBpZCkgewotCQlMaXN0IGVkaXRNb2RlbFJlc291cmNlcyA9IGdldEVkaXRNb2RlbFJlc291cmNlcyhpZCk7Ci0JCUVkaXRNb2RlbFJlc291cmNlIGVkaXRNb2RlbFJlc291cmNlID0gbnVsbDsKLQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRSZXNvdXJjZVNldFN5bmNocm9uaXplcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRNb2RlbFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsUmVzb3VyY2UgPSAoRWRpdE1vZGVsUmVzb3VyY2UpIGVkaXRNb2RlbFJlc291cmNlcy5nZXQoaSk7Ci0JCQlpZiAoZWRpdE1vZGVsUmVzb3VyY2UuaXNBdXRvTG9hZCgpICYmIHN5bmMgIT0gbnVsbCkgewotCQkJCXN5bmMuZW5hYmxlQXV0b2xvYWQoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCXByZWxvYWRSZXNvdXJjZVVyaXMuYWRkKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJCQlnZXRSZXNvdXJjZShlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQl9Ci0JCQlrbm93blJlc291cmNlVXJpcy5hZGQoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyYW1zLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UGFyYW1zKCkgewotCQlyZXR1cm4gcGFyYW1zOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbXMgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtcyhNYXAgcGFyYW1zKSB7Ci0JCXRoaXMucGFyYW1zID0gcGFyYW1zOwotCX0KLQkKLQlwdWJsaWMgY2xhc3MgTm90aWZ5UnVubmVyIGltcGxlbWVudHMgSVNhZmVSdW5uYWJsZSB7IAotCQkKLQkJcHJpdmF0ZSBmaW5hbCBFZGl0TW9kZWxFdmVudCBldmVudDsKLQkJcHJpdmF0ZSBFZGl0TW9kZWxMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJCi0JCXB1YmxpYyBOb3RpZnlSdW5uZXIoRWRpdE1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoZXZlbnQpOwotCQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQl9Ci0JCQotCQkKLQkJcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoRWRpdE1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7IAotCQkJRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5JRCwgMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJaWYobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlsaXN0ZW5lci5lZGl0TW9kZWxDaGFuZ2VkKGV2ZW50KTsgCi0JCX0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc2NjM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgODo1NzowMCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWRpdE1vZGVsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIEVkaXRNb2RlbENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbENvbW1hbmQoQ29tbWFuZCB0YXJnZXRDb21tYW5kKSB7Ci0JCXN1cGVyKHRhcmdldENvbW1hbmQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKS5jYW5VbmRvKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZXhlY3V0ZUluTW9kZWwoQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIGNtZCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWRpdE1vZGVsQ29tbWFuZCBnZXRFZGl0TW9kZWxDb21tYW5kKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnZlcnRBbmRQdXNoKCkgewotCQlleGVjdXRlSW5Nb2RlbCh0aGlzLmludmVydGVkKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwYTg0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIEVkaXRNb2RlbEV2ZW50IHsKLQkvL1RoZXNlIGFyZSB0aGUgZXZlbnQgY29kZXMuCi0KLQkvLyBVc2VkIHdoZW4gdGhlIGVkaXQgbW9kZWwgaXMgc2F2ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRSA9IDE7Ci0JLy8gVXNlZCB3aGVuIHRoZSBjb21tYW5kIHN0YWNrIGJlY29tZXMgZGlydHkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSVFkgPSAyOwotCS8vIFVzZWQgd2hlbiBhIHJlZmVyZW5jZWQgcmVzb3VyY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBSZXNvdXJjZVNldC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEX1JFU09VUkNFID0gMzsKLQkvLyBVc2VkIHdoZW4gYSByZWZlcmVuY2VkIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZSBSZXNvdXJjZVNldC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERFRF9SRVNPVVJDRSA9IDQ7Ci0JLy8gVXNlZCB3aGVuIHRoZSBlZGl0IG1vZGVsIGlzIGRpc3Bvc2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX0RJU1BPU0UgPSA1OwotCS8vIFVzZWQgd2hlbiBhIFJlc291cmNlIGlzIGxvYWRlZCBvciB0aGUgZmlyc3Qgb2JqZWN0Ci0JLy8gaXMgYWRkZWQgdG8gdGhlIGNvbnRlbnRzIHdoZW4gY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FERURfUkVTT1VSQ0UgPSA2OwotCS8vIFVzZWQgd2hlbiBhIFJlc291cmNlIGlzIHVubG9hZGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOTE9BREVEX1JFU09VUkNFID0gNzsKLQkvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdCBvZiBrbm93biByZXNvdXJjZXMgbWFuYWdlZCBieSB0aGUgZWRpdCBtb2RlbCBpcyBhYm91dCB0byBjaGFuZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTk9XTl9SRVNPVVJDRVNfQUJPVVRfVE9fQ0hBTkdFID0gODsKLQkvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdCBvZiBrbm93biByZXNvdXJjZXMgbWFuYWdlZCBieSB0aGUgZWRpdCBtb2RlbCBoYXMgY2hhbmdlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtOT1dOX1JFU09VUkNFU19DSEFOR0VEID0gOTsKLQotCXByaXZhdGUgaW50IGV2ZW50Q29kZTsKLQlwcml2YXRlIEVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IGNoYW5nZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEyLzIwMDEgMjo0Njo1OSBQTSkKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsRXZlbnQoaW50IGFuRXZlbnRDb2RlLCBFZGl0TW9kZWwgbW9kZWwpIHsKLQkJc2V0RXZlbnRDb2RlKGFuRXZlbnRDb2RlKTsKLQkJc2V0RWRpdE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJZ2V0Q2hhbmdlZFJlc291cmNlcygpLmFkZChhUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlcyhDb2xsZWN0aW9uIHNvbWVSZXNvdXJjZXMpIHsKLQkJaWYgKHNvbWVSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCWdldENoYW5nZWRSZXNvdXJjZXMoKS5hZGRBbGwoc29tZVJlc291cmNlcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NDMgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQlpZiAoY2hhbmdlZFJlc291cmNlcyA9PSBudWxsKQotCQkJY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjEvMDEgOTowMTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUud29ya2JlbmNoLkVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTIvMjAwMSAyOjQ2OjQzIFBNKQotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFdmVudENvZGUoKSB7Ci0JCXJldHVybiBldmVudENvZGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NDMgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0NoYW5nZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlZFJlc291cmNlcyhqYXZhLnV0aWwuTGlzdCBuZXdDaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCWNoYW5nZWRSZXNvdXJjZXMgPSBuZXdDaGFuZ2VkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIxLzAxIDk6MDE6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0VkaXRNb2RlbAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guRWRpdE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdE1vZGVsKEVkaXRNb2RlbCBuZXdFZGl0TW9kZWwpIHsKLQkJZWRpdE1vZGVsID0gbmV3RWRpdE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTIvMjAwMSAyOjQ2OjQzIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFdmVudENvZGUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV2ZW50Q29kZShpbnQgbmV3RXZlbnRDb2RlKSB7Ci0JCWV2ZW50Q29kZSA9IG5ld0V2ZW50Q29kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdiYmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotIAotcHVibGljIGNsYXNzIEVkaXRNb2RlbEZhY3RvcnkgaW1wbGVtZW50cyBJRWRpdE1vZGVsRmFjdG9yeSB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSA9IHRydWU7Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIGNvbnRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBjb250ZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG5ldyBFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHRydWUpOwotCQllZGl0TW9kZWwuc2V0QWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMobG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSk7Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbmV3IEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgZmFsc2UpOwotCQllZGl0TW9kZWwuc2V0QWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMobG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSk7Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gZWRpdE1vZGVsSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5JRWRpdE1vZGVsRmFjdG9yeSNzZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seShib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMubG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvYWRLbm93blJlc291cmNlc0FzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZmU5ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgNDo0NToxMyBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVkaXRNb2RlbExpc3RlbmVyIHsKLQkvKioKLQkgKiBBbiBldmVudCBvY3VycmVkIG9uIHRoZSBKMkVFRWRpdE1vZGVsLgotCSAqLwotCXZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxOYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbE5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODBhODg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbE5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWRpdE1vZGVsTmF0dXJlIGV4dGVuZHMgRU1GTmF0dXJlIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVkaXRNb2RlbE5hdHVyZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbEtleSwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbEtleSwgYWNjZXNzb3JLZXksIG51bGwpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbEtleSwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxLZXksIGFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbEtleSwgT2JqZWN0IGFjY2Vzc29yS2V5LCBNYXAgcGFyYW1zKSB7Ci0JCUVkaXRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCi0JCQlyZXN1bHQgPSBnZXRFbWZDb250ZXh0KCkuZ2V0RWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxLZXksIGFjY2Vzc29yS2V5LCBwYXJhbXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbEtleSwgT2JqZWN0IGFjY2Vzc29yS2V5LCBNYXAgcGFyYW1zKSB7Ci0JCUVkaXRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCi0JCQlyZXN1bHQgPSBnZXRFbWZDb250ZXh0KCkuZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsS2V5LCBhY2Nlc3NvcktleSwgcGFyYW1zKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dCBnZXRFbWZDb250ZXh0KCkgewotCQlyZXR1cm4gKEVNRldvcmtiZW5jaENvbnRleHQpIGdldEVtZkNvbnRleHRCYXNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9JRWRpdE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vSUVkaXRNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczMjA5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9JRWRpdE1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElFZGl0TW9kZWxGYWN0b3J5IHsKLQotCXB1YmxpYyBhYnN0cmFjdCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpOwotCi0JcHVibGljIGFic3RyYWN0IEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpOwotCi0JcHVibGljIHZvaWQgc2V0TG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seShib29sZWFuIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0xvb3NlQ29tcG9zZWRFZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0xvb3NlQ29tcG9zZWRFZGl0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhNWY4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Mb29zZUNvbXBvc2VkRWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMb29zZUNvbXBvc2VkRWRpdE1vZGVsIGV4dGVuZHMgQ29tcG9zZWRFZGl0TW9kZWwgewotCi0JcHVibGljIExvb3NlQ29tcG9zZWRFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoZWRpdE1vZGVsSUQsIGNvbnRleHQpOwotCi0JfQotCi0JcHVibGljIEVkaXRNb2RlbC5SZWZlcmVuY2UgYWRkQ2hpbGQoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlnZXRDaGlsZHJlbigpLmFkZChlZGl0TW9kZWwpOwotCQlSZWZlcmVuY2UgcmVmID0gZWRpdE1vZGVsLmdldFJlZmVyZW5jZSgpOwotCQlnZXRDaGlsZHJlbk1hcCgpLnB1dChyZWYsIGVkaXRNb2RlbCk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlnZXRDaGlsZHJlbigpLnJlbW92ZShlZGl0TW9kZWwpOwotCQlnZXRDaGlsZHJlbk1hcCgpLnJlbW92ZShlZGl0TW9kZWwuZ2V0UmVmZXJlbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RlbE1vZGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RlbE1vZGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYjliNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kZWxNb2RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjQwOjM1IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbE1vZGlmaWVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX1BBVFRFUk4gPSAiU2V0IHswfSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1BBVFRFUk4gPSAiQWRkIHswfSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX1BBVFRFUk4gPSAiUmVtb3ZlIHswfSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01NQU5EX0xBQkVMID0gIkNvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0JcHJpdmF0ZSBMaXN0IGhlbHBlcnM7Ci0JcHJpdmF0ZSBMaXN0IGV4dGVuZGVkSGVscGVyczsKLQlwcm90ZWN0ZWQgTGlzdCBhZGRpdGlvbmFsQ29tbWFuZHM7Ci0JcHJvdGVjdGVkIGludCBzdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMVUVfQ0hBTkdFID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9DSEFOR0UgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMjsKLQotCS8qKgotCSAqIEoyRUVNb2RlbE1vZGlmaWVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGVsTW9kaWZpZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRU1vZGVsTW9kaWZpZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYURvbWFpbgotCSAqICAgICAgICAgICAgRWRpdGluZ0RvbWFpbgotCSAqLwotCXB1YmxpYyBNb2RlbE1vZGlmaWVyKEVkaXRpbmdEb21haW4gYURvbWFpbikgewotCQlzZXRFZGl0aW5nRG9tYWluKGFEb21haW4pOwotCX0KLQotCS8qKgotCSAqIEFkZAotCSAqIAotCSAqIEBhSGVscGVyIHRvIHRoZSBsaXN0IG9mIGhlbHBlciB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscGVyKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKGFIZWxwZXIgIT0gbnVsbCAmJiAhZ2V0SGVscGVycygpLmNvbnRhaW5zKGFIZWxwZXIpKQotCQkJZ2V0SGVscGVycygpLmFkZChhSGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRBZGRpdGlvbmFsQ29tbWFuZChDb21tYW5kIGFDb21tYW5kKSB7Ci0JCWlmIChhQ29tbWFuZCAhPSBudWxsICYmICFnZXRBZGRpdGlvbmFsQ29tbWFuZHMoKS5jb250YWlucyhhQ29tbWFuZCkpCi0JCQlhZGRpdGlvbmFsQ29tbWFuZHMuYWRkKGFDb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1vZGlmaWVyIGNhbiBjcmVhdGUgYSBjb21tYW5kIHRoYXQgd2lsbCBwZXJmb3JtIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGVDb21tYW5kKCkgewotCQlyZXR1cm4gZ2V0RWRpdGluZ0RvbWFpbigpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGludCBleGVjdXRlV2l0aFN0YXR1cygpIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGUoKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdGF0dXMgPSAtMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhpcyBtb2RpZmllciB1c2luZyB0aGUgcmVjb3JkaW5nIG1lY2hhbmlzbSBvZiB0aGUgU3RydWN0ZWRUZXh0VW5kb01hbmFnZXIuIElmIHRoaXMKLQkgKiBtb2RpZmllciBjYW5ub3QgcmVjb3JkLCB0cnkgdG8gZXhlY3V0ZSB1c2luZyB0aGUgQ29tbWFuZFN0YWNrIChpZiBpdCBjYW4gZXhlY3V0ZSBjb21tYW5kcykuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4ZWN1dGlvbiB3YXMgYXR0ZW1wdGVkLgotCSAqIAotCSAqIEBzZWUgY2FuRXhlY3V0ZUNvbW1hbmQoKQotCSAqIEBzZWUgY2FuUmVjb3JkKCkKLQkgKiBAc2VlIHJ1bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWFkZEhlbHBlcihhSGVscGVyKTsKLQkJcmV0dXJuIGV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoaXMgbW9kaWZpZXIgdXNpbmcgdGhlIHJlY29yZGluZyBtZWNoYW5pc20gb2YgdGhlIFN0cnVjdGVkVGV4dFVuZG9NYW5hZ2VyLiBJZiB0aGlzCi0JICogbW9kaWZpZXIgY2Fubm90IHJlY29yZCwgdHJ5IHRvIGV4ZWN1dGUgdXNpbmcgdGhlIENvbW1hbmRTdGFjayAoaWYgaXQgY2FuIGV4ZWN1dGUgY29tbWFuZHMpLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBleGVjdXRpb24gd2FzIGF0dGVtcHRlZC4KLQkgKiAKLQkgKiBAc2VlIGNhbkV4ZWN1dGVDb21tYW5kKCkKLQkgKiBAc2VlIGNhblJlY29yZCgpCi0JICogQHNlZSBydW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoTGlzdCBzb21lSGVscGVycykgewotCQlzZXRIZWxwZXJzKHNvbWVIZWxwZXJzKTsKLQkJcmV0dXJuIGV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoaXMgbW9kaWZpZXIgYnkgY3JlYXRpbmcgYSBDb21tYW5kIHRoYXQgaXMgZXhlY3V0ZWQgb24gdGhlIENvbW1hbmRTdGFjay4gSWYgdGhpcwotCSAqIG1vZGlmaWVyIGNhbm5vdCBleGVjdXRlIGNvbW1hbmRzLCB0aGUgZXhlY3V0aW9uIHdpbGwgbm90IHRha2UgcGxhY2UuIFJldHVybiB0cnVlIGlmIHRoZQotCSAqIGV4ZWN1dGlvbiB3YXMgYXR0ZW1wdGVkLgotCSAqIAotCSAqIEBzZWUgY2FuRXhlY3V0ZUNvbW1hbmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChjYW5FeGVjdXRlQ29tbWFuZCgpKSB7Ci0JCQl0cnkgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQoKTsKLQkJCQlyZXN1bHQgPSBjb21tYW5kICE9IG51bGw7Ci0JCQkJaWYgKHJlc3VsdCkgewotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJcmVsZWFzZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc2V0U3RhdHVzKEVSUk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlpZiAoZ2V0RWRpdGluZ0RvbWFpbigpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RWRpdGluZ0RvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAyOjUzOjE3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gRWRpdGluZ0RvbWFpbgotCSAqLwotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSA4OjQ2OjM1IEFNKQotCSAqIAotCSAqIEByZXR1cm4gSjJFRU1vZGlmaWVySGVscGVyCi0JICovCi0JcHVibGljIE1vZGlmaWVySGVscGVyIGdldEZpcnN0SGVscGVyKCkgewotCQlpZiAoaGVscGVycyAhPSBudWxsICYmIGdldEhlbHBlcnMoKS5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChNb2RpZmllckhlbHBlcikgZ2V0SGVscGVycygpLmdldCgwKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDg6NDY6MzUgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRIZWxwZXJzKCkgewotCQlpZiAoaGVscGVycyA9PSBudWxsKQotCQkJaGVscGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGhlbHBlcnM7Ci0JfQotCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEFkZGl0aW9uYWxDb21tYW5kcygpIHsKLQkJaWYgKGFkZGl0aW9uYWxDb21tYW5kcyA9PSBudWxsKQotCQkJYWRkaXRpb25hbENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gYWRkaXRpb25hbENvbW1hbmRzOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgYWxsIG1vZGVsIGFydGlmYWN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKCkgewotCQlzZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQlzZXRIZWxwZXJzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDI6NTM6MTcgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0VkaXRpbmdEb21haW4KLQkgKiAgICAgICAgICAgIEVkaXRpbmdEb21haW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0aW5nRG9tYWluKEVkaXRpbmdEb21haW4gbmV3RWRpdGluZ0RvbWFpbikgewotCQllZGl0aW5nRG9tYWluID0gbmV3RWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgODo0NjozNSBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SGVscGVycwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXJzKGphdmEudXRpbC5MaXN0IG5ld0hlbHBlcnMpIHsKLQkJaGVscGVycyA9IG5ld0hlbHBlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXNDb2RlKSB7Ci0JCWlmIChzdGF0dXNDb2RlID4gc3RhdHVzKQotCQkJc3RhdHVzID0gc3RhdHVzQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gQWRkQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGFIZWxwZXIpOwotCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQlpZiAodmFsdWVDaGFuZ2VkKGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlLCBmYWxzZSkpIHsKLQkJCWNvbW1hbmQgPSBBZGRDb21tYW5kLmNyZWF0ZShnZXRFZGl0aW5nRG9tYWluKCksIGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlKTsKLQkJCSgoQWJzdHJhY3RDb21tYW5kKSBjb21tYW5kKS5zZXRMYWJlbChjcmVhdGVDb21tYW5kTGFiZWwoQUREX1BBVFRFUk4sIGFIZWxwZXIuZ2V0RmVhdHVyZSgpKSk7Ci0JCQlzZXRTdGF0dXMoVkFMVUVfQ0hBTkdFKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1cyhOT19WQUxVRV9DSEFOR0UpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gbnVsbC4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKCkgewotCQlDb21tYW5kIGNoYWluZWRDb21tYW5kID0gY3JlYXRlQ29tbWFuZChudWxsLCBnZXRIZWxwZXJzKCkpOwotCQlpZiAobnVsbCA9PSBjaGFpbmVkQ29tbWFuZCAmJiBhZGRpdGlvbmFsQ29tbWFuZHMgIT0gbnVsbCAmJiBhZGRpdGlvbmFsQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlzZXRTdGF0dXMoRVJST1IpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY2hhaW5lZENvbW1hbmQgPSBhcHBlbmRBZGRpdGlvbmFsQ29tbWFuZHMoY2hhaW5lZENvbW1hbmQpOwotCQlyZXR1cm4gY2hhaW5lZENvbW1hbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb21tYW5kIGNoYWluZWRDb21tYW5kLCBMaXN0IGhlbHBlcnNBcmcpIHsKLQkJQ29tbWFuZCBpbm5lckNoYWluZWRDb21tYW5kID0gY2hhaW5lZENvbW1hbmQ7Ci0JCWlmIChudWxsID09IGV4dGVuZGVkSGVscGVycykgewotCQkJZXh0ZW5kZWRIZWxwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJaWYgKCFoZWxwZXJzQXJnLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXQgPSBoZWxwZXJzQXJnLml0ZXJhdG9yKCk7Ci0JCQlDb21tYW5kIG5leHRDb21tYW5kID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQluZXh0Q29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQoKE1vZGlmaWVySGVscGVyKSBpdC5uZXh0KCkpOwotCQkJCWlmIChpbm5lckNoYWluZWRDb21tYW5kID09IG51bGwpCi0JCQkJCWlubmVyQ2hhaW5lZENvbW1hbmQgPSBuZXh0Q29tbWFuZDsKLQkJCQllbHNlIGlmIChuZXh0Q29tbWFuZCAhPSBudWxsKQotCQkJCQlpbm5lckNoYWluZWRDb21tYW5kID0gaW5uZXJDaGFpbmVkQ29tbWFuZC5jaGFpbihuZXh0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFleHRlbmRlZEhlbHBlcnMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGNvcHkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljb3B5LmFkZEFsbChleHRlbmRlZEhlbHBlcnMpOwotCQkJZXh0ZW5kZWRIZWxwZXJzLmNsZWFyKCk7Ci0JCQlpbm5lckNoYWluZWRDb21tYW5kID0gY3JlYXRlQ29tbWFuZChpbm5lckNoYWluZWRDb21tYW5kLCBjb3B5KTsKLQkJfQotCQlyZXR1cm4gaW5uZXJDaGFpbmVkQ29tbWFuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBhcHBlbmRBZGRpdGlvbmFsQ29tbWFuZHMoQ29tbWFuZCBjaGFpbmVkQ29tbWFuZCkgewotCQlDb21tYW5kIGlubmVyQ2hhaW5lZENvbW1hbmQgPSBjaGFpbmVkQ29tbWFuZDsKLQkJaWYgKGFkZGl0aW9uYWxDb21tYW5kcyAhPSBudWxsICYmICFhZGRpdGlvbmFsQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlDb21tYW5kIGNvbW1hbmQ7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxDb21tYW5kcy5zaXplKCk7IGkrKykgewotCQkJCWNvbW1hbmQgPSAoQ29tbWFuZCkgYWRkaXRpb25hbENvbW1hbmRzLmdldChpKTsKLQkJCQlpZiAoaW5uZXJDaGFpbmVkQ29tbWFuZCA9PSBudWxsKQotCQkJCQlpbm5lckNoYWluZWRDb21tYW5kID0gY29tbWFuZDsKLQkJCQllbHNlCi0JCQkJCWlubmVyQ2hhaW5lZENvbW1hbmQgPSBpbm5lckNoYWluZWRDb21tYW5kLmNoYWluKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbm5lckNoYWluZWRDb21tYW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbW1hbmQgY29tbWFuZDEsIGNvbW1hbmQyOwotCQlNb2RpZmllckhlbHBlciBvd25lckhlbHBlciA9IGFIZWxwZXIuZ2V0T3duZXJIZWxwZXIoKTsKLQkJaWYgKGFIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpICYmIG93bmVySGVscGVyICE9IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy93ZSBhcmUgdW5zZXR0aW5nIGEgdmFsdWUgb24gYW4gb3duZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBzbyBkbyBub3QKLQkJLy8gY3JlYXRlIHRoZSBvd25lcgotCQljb21tYW5kMSA9IGNyZWF0ZUNvbW1hbmQob3duZXJIZWxwZXIpOwotCQljb21tYW5kMiA9IHByaW1DcmVhdGVDb21tYW5kKGFIZWxwZXIpOwotCi0JCWlmIChjb21tYW5kMSAhPSBudWxsKSB7Ci0JCQlpZiAoY29tbWFuZDIgPT0gbnVsbCkKLQkJCQljb21tYW5kMiA9IGNvbW1hbmQxOwotCQkJZWxzZQotCQkJCWNvbW1hbmQyID0gY29tbWFuZDIuY2hhaW4oY29tbWFuZDEpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUNvbW1hbmRMYWJlbChTdHJpbmcgYVBhdHRlcm4sIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCVN0cmluZyByZXBsYWNlbWVudCA9IGZlYXR1cmUgPT0gbnVsbCA/IERFRkFVTFRfQ09NTUFORF9MQUJFTCA6IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGFQYXR0ZXJuLCBuZXcgT2JqZWN0W117cmVwbGFjZW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4gVGhlIGRlZmF1bHQgaXMgdG8gcmV0dXJuIG51bGwuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTWFueUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpCi0JCQlyZXR1cm4gY3JlYXRlUmVtb3ZlQ29tbWFuZChhSGVscGVyKTsKLQkJcmV0dXJuIGNyZWF0ZUFkZENvbW1hbmQoYUhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlT2JqZWN0RnJvbUhlbHBlcihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCXJldHVybiBhSGVscGVyLmNyZWF0ZU5ld09iamVjdEZyb21GZWF0dXJlKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogVXNlZCB0byByZW1vdmUgYW4gb2JqZWN0IG9uIHVuc2V0LiAgTWFrZXMgdGhlIG9iamVjdCBhIHByb3h5ICAKLQkgKiBvbiBleGVjdXRlIGFuZCByZWRvIGNvbW1hbmRzLiAgVW5kbyB3aWxsIHJlbW92ZSB0aGUgcHJveHkuCi0JICovCi0JcHVibGljIGNsYXNzIFByb3h5V3JhcHBpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQkJcHJvdGVjdGVkIENvbW1hbmQgYmFzZUNvbW1hbmQgPSBudWxsOwotCQlwcm90ZWN0ZWQgRU9iamVjdCBlT2JqZWN0ID0gbnVsbDsKLQkJcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlwdWJsaWMgUHJveHlXcmFwcGluZ0NvbW1hbmQoQ29tbWFuZCBiYXNlQ29tbWFuZCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCQl0aGlzLmJhc2VDb21tYW5kID0gYmFzZUNvbW1hbmQ7Ci0JCQl0aGlzLmVPYmplY3QgPSBlT2JqZWN0OwotCQkJdGhpcy5yZXNvdXJjZSA9IGVPYmplY3QuZVJlc291cmNlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJRXh0ZW5kZWRFY29yZVV0aWwuYmVjb21lUHJveHkoZU9iamVjdCwgcmVzb3VyY2UpOwotCQkJYmFzZUNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCQlyZXR1cm4gYmFzZUNvbW1hbmQuY2FuVW5kbygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQliYXNlQ29tbWFuZC51bmRvKCk7Ci0JCQlFeHRlbmRlZEVjb3JlVXRpbC5yZW1vdmVQcm94eShlT2JqZWN0LCByZXNvdXJjZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkJRXh0ZW5kZWRFY29yZVV0aWwuYmVjb21lUHJveHkoZU9iamVjdCwgcmVzb3VyY2UpOwotCQkJYmFzZUNvbW1hbmQucmVkbygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCQlyZXR1cm4gYmFzZUNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5nZXRMYWJlbCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gYmFzZUNvbW1hbmQuZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJYmFzZUNvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUmVtb3ZlIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZShhSGVscGVyKTsKLQkJQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhSGVscGVyLmdldEZlYXR1cmUoKTsKLQkJaWYgKHZhbHVlQ2hhbmdlZChhSGVscGVyLmdldE93bmVyKCksIGZlYXR1cmUsIHZhbHVlLCB0cnVlKSkgewotCQkJaWYgKGlzVmFsdWVFcXVhbChhSGVscGVyLCB2YWx1ZSkpIHsKLQkJCQljb21tYW5kID0gUmVtb3ZlQ29tbWFuZC5jcmVhdGUoZ2V0RWRpdGluZ0RvbWFpbigpLCBhSGVscGVyLmdldE93bmVyKCksIGZlYXR1cmUsIChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbW1hbmQgPSBSZW1vdmVDb21tYW5kLmNyZWF0ZShnZXRFZGl0aW5nRG9tYWluKCksIGFIZWxwZXIuZ2V0T3duZXIoKSwgZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQkJKChBYnN0cmFjdENvbW1hbmQpIGNvbW1hbmQpLnNldExhYmVsKGNyZWF0ZUNvbW1hbmRMYWJlbChSRU1PVkVfUEFUVEVSTiwgZmVhdHVyZSkpOwotCQkJc2V0U3RhdHVzKFZBTFVFX0NIQU5HRSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRTdGF0dXMoTk9fVkFMVUVfQ0hBTkdFKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUVxdWFsKE1vZGlmaWVySGVscGVyIGFIZWxwZXIsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gYUhlbHBlci5nZXRPd25lcigpLmVHZXQoYUhlbHBlci5nZXRGZWF0dXJlKCkpID09IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFNldENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVNpbmdsZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZShhSGVscGVyKTsKLQkJQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQkJaWYgKHZhbHVlQ2hhbmdlZChhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSwgYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpKSB7Ci0JCQljb21tYW5kID0gU2V0Q29tbWFuZC5jcmVhdGUoZ2V0RWRpdGluZ0RvbWFpbigpLCBhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSk7Ci0JCQkoKEFic3RyYWN0Q29tbWFuZCkgY29tbWFuZCkuc2V0TGFiZWwoY3JlYXRlQ29tbWFuZExhYmVsKFNFVF9QQVRURVJOLCBhSGVscGVyLmdldEZlYXR1cmUoKSkpOwotCQkJc2V0U3RhdHVzKFZBTFVFX0NIQU5HRSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRTdGF0dXMoTk9fVkFMVUVfQ0hBTkdFKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbHVlRnJvbUhlbHBlcihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCUVPYmplY3QgbmV3T2JqZWN0ID0gY3JlYXRlT2JqZWN0RnJvbUhlbHBlcihhSGVscGVyKTsKLQkJc2V0TmV3T2JqZWN0QXR0cmlidXRlcyhuZXdPYmplY3QsIGFIZWxwZXIpOwotCQlyZXR1cm4gbmV3T2JqZWN0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGVudW1WYWx1ZUNoYW5nZWQoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCWlmICghYW5PYmplY3QuZUlzU2V0KGFGZWF0dXJlKSkKLQkJCXJldHVybiB0cnVlOwotCQlFbnVtZXJhdG9yIGV4aXN0aW5nRW51bWVyYXRvciA9IChFbnVtZXJhdG9yKSBhbk9iamVjdC5lR2V0KGFGZWF0dXJlKTsKLQkJRW51bWVyYXRvciBuZXdFbnVtZXJhdG9yID0gZ2V0RW51bWVyYXRvcihhRmVhdHVyZSwgYVZhbHVlKTsKLQkJcmV0dXJuIGV4aXN0aW5nRW51bWVyYXRvciAhPSBuZXdFbnVtZXJhdG9yOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRvciBnZXRFbnVtZXJhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgRW51bWVyYXRvcikKLQkJCXJldHVybiAoRW51bWVyYXRvcikgYVZhbHVlOwotCQlFRW51bSBhbkVudW0gPSAoRUVudW0pIGFGZWF0dXJlLmdldEVUeXBlKCk7Ci0JCUVFbnVtTGl0ZXJhbCBsaXRlcmFsID0gbnVsbDsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCWxpdGVyYWwgPSBhbkVudW0uZ2V0RUVudW1MaXRlcmFsKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCWVsc2UgaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlsaXRlcmFsID0gYW5FbnVtLmdldEVFbnVtTGl0ZXJhbCgoKEludGVnZXIpIGFWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCWlmIChsaXRlcmFsICE9IG51bGwpCi0JCQlyZXR1cm4gbGl0ZXJhbC5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKGFIZWxwZXIubXVzdENyZWF0ZVZhbHVlKCkpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZVZhbHVlRnJvbUhlbHBlcihhSGVscGVyKTsKLQkJCWFIZWxwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JCXJldHVybiBhSGVscGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFueVZhbHVlQ2hhbmdlZChFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gaXNVbnNldCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgYW5PYmplY3QuZUdldChhRmVhdHVyZSk7Ci0JCWlmIChpc1Vuc2V0KQotCQkJcmV0dXJuIGxpc3QuY29udGFpbnMoYVZhbHVlKSB8fCAobGlzdCA9PSBhVmFsdWUgJiYgIWxpc3QuaXNFbXB0eSgpKTsKLQkJcmV0dXJuICFsaXN0LmNvbnRhaW5zKGFWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suIFRoZSBkZWZhdWx0IGlzIHRvIHJldHVybiBudWxsLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIHByaW1DcmVhdGVDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gZG9DcmVhdGVDb21tYW5kKGFIZWxwZXIpOwotCQlpZiAoYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGFIZWxwZXIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QgJiYgISgoRU9iamVjdCkgdmFsdWUpLmVJc1Byb3h5KCkpIHsKLQkJCQljb21tYW5kID0gbmV3IFByb3h5V3JhcHBpbmdDb21tYW5kKGNvbW1hbmQsIChFT2JqZWN0KSB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZG9DcmVhdGVDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKCFhSGVscGVyLmlzQ29tcGxldGUoKSkgewotCQkJc2V0U3RhdHVzKEVSUk9SKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0JCWlmIChhSGVscGVyLmdldEZlYXR1cmUoKS5pc01hbnkoKSkKLQkJCWNvbW1hbmQgPSBjcmVhdGVNYW55Q29tbWFuZChhSGVscGVyKTsKLQkJZWxzZQotCQkJY29tbWFuZCA9IGNyZWF0ZVNpbmdsZUNvbW1hbmQoYUhlbHBlcik7Ci0KLQkJaWYgKG51bGwgIT0gY29tbWFuZCkgewotCQkJTGlzdCBsb2NhbEhlbHBlcnMgPSBNb2RpZmllckhlbHBlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGVscGVycyhhSGVscGVyKTsKLQkJCWlmIChudWxsICE9IGxvY2FsSGVscGVycykgewotCQkJCWV4dGVuZGVkSGVscGVycy5hZGRBbGwobG9jYWxIZWxwZXJzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQotCX0KLQotCS8qKgotCSAqIFJ1biB1c2luZwotCSAqIAotCSAqIEBhSGVscGVyLiBUaGlzIHdpbGwgc2V0IGEgTU9GIGF0dGlidXRlIHZhbHVlIHRvIHRoZSBvd25lciBvZiB0aGUgaGVscGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlci5pc0NvbXBsZXRlKCkpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGFIZWxwZXIpOwotCQkJaWYgKHZhbHVlQ2hhbmdlZChhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSwgYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpKQotCQkJCXNldE9iamVjdEF0dHJpYnV0ZShhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSwgYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBhcmUgdXNpbmcKLQkgKiByZWNvcmRhYmxlIGNvbW1hbmRzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHVwZGF0ZSB0aGUgTU9GIG1vZGVsIGRpcmVjdGx5LgotCSAqIEFueSBtb2RpZmljYXRpb24gd2lsbCBiZSByZWNvcmRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICghZ2V0SGVscGVycygpLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXQgPSBnZXRIZWxwZXJzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpCi0JCQkJcnVuKChNb2RpZmllckhlbHBlcikgaXQubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJ1biB1c2luZwotCSAqIAotCSAqIEBhSGVscGVyJ3Mgb3duZXJIZWxwZXIgZmlyc3QgYmVmb3JlIHJ1bm5pbmcgd2l0aAotCSAqIEBhSGVscGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1bihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWlmIChhSGVscGVyICE9IG51bGwpIHsKLQkJCXJ1bihhSGVscGVyLmdldE93bmVySGVscGVyKCkpOwotCQkJcHJpbVJ1bihhSGVscGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5ld09iamVjdEF0dHJpYnV0ZXMoRU9iamVjdCBhbk9iamVjdCwgTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlIYXNoTWFwIGF0dHJpYnV0ZXMgPSBhSGVscGVyLmdldEF0dHJpYnV0ZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCQkJdmFsdWUgPSBhdHRyaWJ1dGVzLmdldChmZWF0dXJlKTsKLQkJCXNldE9iamVjdEF0dHJpYnV0ZShhbk9iamVjdCwgZmVhdHVyZSwgdmFsdWUsIGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdEF0dHJpYnV0ZShFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSkgewotCQlpZiAoYUZlYXR1cmUuaXNNYW55KCkpCi0JCQlzZXRPYmplY3RNYW55QXR0cmlidXRlKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlLCBzaG91bGRVbnNldFZhbHVlKTsKLQkJZWxzZQotCQkJc2V0T2JqZWN0U2luZ2xlQXR0cmlidXRlKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlLCBzaG91bGRVbnNldFZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RFbnVtQXR0cmlidXRlKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgewotCQlFbnVtZXJhdG9yIGVudW1lcmF0b3IgPSBnZXRFbnVtZXJhdG9yKGFGZWF0dXJlLCBhVmFsdWUpOwotCQlhbk9iamVjdC5lU2V0KGFGZWF0dXJlLCBlbnVtZXJhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RNYW55QXR0cmlidXRlKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlKSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBhbk9iamVjdC5lR2V0KGFGZWF0dXJlKTsKLQkJaWYgKHNob3VsZFVuc2V0VmFsdWUpCi0JCQlsaXN0LnJlbW92ZShhVmFsdWUpOwotCQllbHNlCi0JCQlsaXN0LmFkZChhVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFNpbmdsZUF0dHJpYnV0ZShFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSkgewotCQlpZiAoc2hvdWxkVW5zZXRWYWx1ZSkKLQkJCWFuT2JqZWN0LmVVbnNldChhRmVhdHVyZSk7Ci0JCWVsc2UgaWYgKGFGZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFRW51bSkKLQkJCXNldE9iamVjdEVudW1BdHRyaWJ1dGUoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUpOwotCQllbHNlCi0JCQlhbk9iamVjdC5lU2V0KGFGZWF0dXJlLCBhVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNpbmdsZVZhbHVlQ2hhbmdlZChFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gaXNVbnNldCkgewotCQlpZiAoYUZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVFbnVtKQotCQkJcmV0dXJuIGVudW1WYWx1ZUNoYW5nZWQoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUpOwotCi0JCU9iamVjdCBleGlzdGluZ1ZhbHVlID0gYW5PYmplY3QuZUdldChhRmVhdHVyZSk7Ci0JCWlmIChleGlzdGluZ1ZhbHVlID09IG51bGwgJiYgYVZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChleGlzdGluZ1ZhbHVlICE9IG51bGwgJiYgIWV4aXN0aW5nVmFsdWUuZXF1YWxzKGFWYWx1ZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGFWYWx1ZSAhPSBudWxsICYmICFhVmFsdWUuZXF1YWxzKGV4aXN0aW5nVmFsdWUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZUNoYW5nZWQoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlLCBib29sZWFuIGlzVW5zZXQpIHsKLQkJaWYgKGFGZWF0dXJlLmlzTWFueSgpKQotCQkJcmV0dXJuIG1hbnlWYWx1ZUNoYW5nZWQoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUsIGlzVW5zZXQpOwotCQlyZXR1cm4gc2luZ2xlVmFsdWVDaGFuZ2VkKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlLCBpc1Vuc2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhYmM4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkZlYXR1cmVWYWx1ZUNvbnZlcnRlcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyMzozNiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTW9kaWZpZXJIZWxwZXIgewotCi0JcHJpdmF0ZSBFT2JqZWN0IG93bmVyOwotCXByaXZhdGUgTW9kaWZpZXJIZWxwZXIgb3duZXJIZWxwZXI7Ci0JcHJpdmF0ZSBPd25lclByb3ZpZGVyIG93bmVyUHJvdmlkZXI7Ci0JcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQlwcml2YXRlIEhhc2hNYXAgYXR0cmlidXRlczsKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlWFNJVHlwZU5hbWU7Ci0JcHJpdmF0ZSBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgZmVhdHVyZVZhbHVlQ29udmVydGVyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NFVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1VOU0VUID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQk9USCA9IDI7Ci0KLQkvKioKLQkgKiBKMkVFTW9kaWZpZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRU1vZGlmaWVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGlmaWVySGVscGVyKEVPYmplY3QgYW5Pd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCXNldE93bmVyKGFuT3duZXIpOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQkJc2V0VmFsdWUoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFTW9kaWZpZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIoTW9kaWZpZXJIZWxwZXIgYW5Pd25lckhlbHBlciwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCXNldE93bmVySGVscGVyKGFuT3duZXJIZWxwZXIpOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQkJc2V0VmFsdWUoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFTW9kaWZpZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIoT3duZXJQcm92aWRlciBhbk93bmVyUHJvdmlkZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgewotCQlzZXRPd25lclByb3ZpZGVyKGFuT3duZXJQcm92aWRlcik7Ci0JCXNldEZlYXR1cmUoYUZlYXR1cmUpOwotCQlzZXRWYWx1ZShhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaE1hcAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFGZWF0dXJlICE9IG51bGwgJiYgYVZhbHVlICE9IG51bGwpCi0JCQlnZXRBdHRyaWJ1dGVzKCkucHV0KGFGZWF0dXJlLCBhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVZhbHVlQ29udmVydGVyKCkuY29udmVydFZhbHVlKG5ld1ZhbHVlLCBnZXRGZWF0dXJlKCkpOwotCX0KLQotCS8vQ2FsbGluZyB0aGlzIHdpbGwgY2F1c2UgdGhlIHZhbHVlIHRvIGJlIHJlbW92ZWQgb3IgdW5zZXQgZnJvbSB0aGUgb3duZXIuCi0JcHVibGljIHZvaWQgZG9VbnNldFZhbHVlKCkgewotCQlzaG91bGRVbnNldFZhbHVlID0gdHJ1ZTsKLQkJaWYgKHZhbHVlICE9IFNldENvbW1hbmQuVU5TRVRfVkFMVUUgJiYgZmVhdHVyZSAhPSBudWxsICYmICFmZWF0dXJlLmlzTWFueSgpKQotCQkJcHJpbVNldFZhbHVlKFNldENvbW1hbmQuVU5TRVRfVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaE1hcAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuSGFzaE1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBFUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gKChFQ2xhc3NJbXBsKSBnZXRGZWF0dXJlVHlwZSgpKS5nZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRGZWF0dXJlVHlwZSgpIHsKLQkJcmV0dXJuIGdldEZlYXR1cmUoKS5nZXRFVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvMTAvMjAwMSA0OjUxOjU4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS5jb21tYW5kcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVZhbHVlQ29udmVydGVyIGdldEZlYXR1cmVWYWx1ZUNvbnZlcnRlcigpIHsKLQkJaWYgKGZlYXR1cmVWYWx1ZUNvbnZlcnRlciA9PSBudWxsKQotCQkJZmVhdHVyZVZhbHVlQ29udmVydGVyID0gRmVhdHVyZVZhbHVlQ29udmVydGVyLkRFRkFVTFQ7Ci0JCXJldHVybiBmZWF0dXJlVmFsdWVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3VmFsdWVUeXBlTmFtZSgpIHsKLQkJaWYgKGdldFZhbHVlWFNJVHlwZU5hbWUoKSAhPSBudWxsICYmIGdldFZhbHVlWFNJVHlwZU5hbWUoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gZ2V0VmFsdWVYU0lUeXBlTmFtZSgpOwotCQlyZXR1cm4gKCgoRUNsYXNzKSBnZXRGZWF0dXJlVHlwZSgpKS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBnZXRPd25lcigpIHsKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCU93bmVyUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRPd25lclByb3ZpZGVyKCk7Ci0JCQlFT2JqZWN0IHByb3ZpZGVyT3duZXIgPSBudWxsOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQkJcHJvdmlkZXJPd25lciA9IHByb3ZpZGVyLmdldE93bmVyKCk7Ci0JCQlpZiAocHJvdmlkZXJPd25lciA9PSBudWxsICYmIGdldE93bmVySGVscGVyKCkgIT0gbnVsbCkKLQkJCQlwcm92aWRlck93bmVyID0gKEVPYmplY3QpIGdldE93bmVySGVscGVyKCkuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiBwcm92aWRlck93bmVyOwotCQl9Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzgvMjAwMSAyOjQ3OjU0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS5jb21tYW5kcy5KMkVFTW9kaWZpZXJIZWxwZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIgZ2V0T3duZXJIZWxwZXIoKSB7Ci0JCWlmIChvd25lckhlbHBlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0T3duZXJQcm92aWRlcigpICE9IG51bGwgJiYgZ2V0T3duZXJQcm92aWRlcigpLmdldE93bmVyKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0T3duZXJQcm92aWRlcigpLmdldE93bmVySGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG93bmVySGVscGVyOwotCX0KLQotCXB1YmxpYyBNb2RpZmllckhlbHBlciBwcmltR2V0T3duZXJIZWxwZXIoKSB7Ci0JCXJldHVybiBvd25lckhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzE4LzIwMDEgMTozMToxNCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUudWkuSjJFRU93bmVyUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgT3duZXJQcm92aWRlciBnZXRPd25lclByb3ZpZGVyKCkgewotCQlyZXR1cm4gb3duZXJQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDM6Mzk6MzEgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWVYU0lUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHZhbHVlWFNJVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IGNhbGxlZCBmcm9tIHRoZSBKMkVFTW9kZWxNb2RpZmllciBiZWZvcmUgZXhlY3V0aW5nIHNvIGl0IGlzIG5vdAotCSAqIG5lY2Vzc2FyeSB0byBjYWxsIGl0IGRpcmVjdGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaWYgKGdldE93bmVySGVscGVyKCkgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldE93bmVySGVscGVyKCkuaXNDb21wbGV0ZSgpOwotCQlpZiAoIW11c3RDcmVhdGVWYWx1ZSgpKQotCQkJcmVzdWx0ID0gZ2V0VmFsdWUoKSAhPSBudWxsIHx8IHNob3VsZFVuc2V0VmFsdWUoKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gZ2V0RmVhdHVyZVR5cGUoKSAhPSBudWxsOwotCQlyZXR1cm4gcmVzdWx0ICYmIGdldEZlYXR1cmUoKSAhPSBudWxsICYmIChnZXRPd25lcigpICE9IG51bGwgfHwgZ2V0T3duZXJIZWxwZXIoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtdXN0Q3JlYXRlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZSgpID09IG51bGwgJiYgZ2V0RmVhdHVyZSgpICE9IG51bGwgJiYgIXNob3VsZFVuc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmVhdHVyZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdGZWF0dXJlKSB7Ci0JCWZlYXR1cmUgPSBuZXdGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvMTAvMjAwMSA0OjUxOjU4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdGZWF0dXJlVmFsdWVDb252ZXJ0ZXIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbWFuZHMuRmVhdHVyZVZhbHVlQ29udmVydGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVZhbHVlQ29udmVydGVyKEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBuZXdGZWF0dXJlVmFsdWVDb252ZXJ0ZXIpIHsKLQkJZmVhdHVyZVZhbHVlQ29udmVydGVyID0gbmV3RmVhdHVyZVZhbHVlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld093bmVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IG5ld093bmVyKSB7Ci0JCW93bmVyID0gbmV3T3duZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC84LzIwMDEgMjo0Nzo1NCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T3duZXJIZWxwZXIKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbWFuZHMuSjJFRU1vZGlmaWVySGVscGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJIZWxwZXIoTW9kaWZpZXJIZWxwZXIgbmV3T3duZXJIZWxwZXIpIHsKLQkJb3duZXJIZWxwZXIgPSBuZXdPd25lckhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzE4LzIwMDEgMTozMToxNCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T3duZXJQcm92aWRlcgotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuajJlZS51aS5KMkVFT3duZXJQcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyUHJvdmlkZXIoT3duZXJQcm92aWRlciBuZXdPd25lclByb3ZpZGVyKSB7Ci0JCW93bmVyUHJvdmlkZXIgPSBuZXdPd25lclByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgewotCQl0cnkgewotCQkJcHJpbVNldFZhbHVlKGNvbnZlcnRWYWx1ZShuZXdWYWx1ZSkpOwotCQl9IGNhdGNoIChGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGZlYXR1cmVFeGNlcHRpb24pIHsKLQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZmVhdHVyZUV4Y2VwdGlvbik7Ci0JCQlwcmltU2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcmVhdCBhbiBlbXB0eSBTdHJpbmcgYXMgYSBudWxsIHZhbHVlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUZyb21XaWRnZXQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCU9iamVjdCBkYXRhID0gbmV3VmFsdWU7Ci0JCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmIG5ld1ZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlkYXRhID0gbnVsbDsKLQkJc2V0VmFsdWUoZGF0YSk7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlkb1Vuc2V0VmFsdWUoKTsKLQkJZWxzZQotCQkJc2hvdWxkVW5zZXRWYWx1ZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSAzOjM5OjMxIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZVhTSVR5cGVOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVYU0lUeXBlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld1ZhbHVlWFNJVHlwZU5hbWUpIHsKLQkJdmFsdWVYU0lUeXBlTmFtZSA9IG5ld1ZhbHVlWFNJVHlwZU5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHNob3VsZFVuc2V0VmFsdWU7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTmV3T2JqZWN0RnJvbUZlYXR1cmUoKSB7Ci0JCUVDbGFzcyBtZXRhQ2xhc3MgPSAoRUNsYXNzKSBnZXRQYWNrYWdlKCkuZ2V0RUNsYXNzaWZpZXIoZ2V0TmV3VmFsdWVUeXBlTmFtZSgpKTsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5jcmVhdGUobWV0YUNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckNoYWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyQ2hhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzYxNDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyQ2hhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotCi0KLS8qKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZmllckhlbHBlckNoYWluZXIgewotCi0JTW9kaWZpZXJIZWxwZXIgaGVscGVyOwotCi0JcHVibGljIE1vZGlmaWVySGVscGVyQ2hhaW5lcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRU9iamVjdCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWhlbHBlciA9IG5ldyBNb2RpZmllckhlbHBlcigpOwotCi0JCWlmIChvd25lciAhPSBudWxsKQotCQkJaGVscGVyLnNldE93bmVyKG93bmVyKTsKLQotCQloZWxwZXIuc2V0RmVhdHVyZShmZWF0dXJlKTsKLQotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCWhlbHBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyQmFzZWRPblR5cGUoT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQloZWxwZXIuc2V0T3duZXIoKEVPYmplY3QpIG93bmVyKTsKLQkJZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBNb2RpZmllckhlbHBlcikKLQkJCWhlbHBlci5zZXRPd25lckhlbHBlcigoTW9kaWZpZXJIZWxwZXIpIG93bmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0MWE2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI3LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kaWZpZXJIZWxwZXJGYWN0b3J5IHsKLQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VIZWxwZXIKLQkgKiBAcGFyYW0gYWN0aW9uRmxhZwotCSAqIEByZXR1cm4KLQkgKi8KLQlNb2RpZmllckhlbHBlciBnZXRIZWxwZXIoTW9kaWZpZXJIZWxwZXIgYmFzZUhlbHBlciwgaW50IGFjdGlvbkZsYWcpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNzhiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyNywgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0KLSAqIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZmllckhlbHBlclJlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlQgPSAiTW9kaWZpZXJIZWxwZXJGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gInBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkUgPSAiZmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BQ1RJT04gPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FDVElPTl9TRVQgPSAic2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FDVElPTl9VTlNFVCA9ICJ1bnNldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BQ1RJT05fQk9USCA9ICJib3RoIjsgLy9kZWZhdWx0IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBNb2RpZmllckhlbHBlclJlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQkvLyBIYXNodGFibGUgbWFwcGluZyBmZWF0dXJlcyB0byBhIGxpc3Qgb2YgRmFjdG9yeUhvbGRlcnMKLQlwcml2YXRlIEhhc2h0YWJsZSBmZWF0dXJlSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIEhhc2h0YWJsZSBmYWN0b3J5SGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgY2xhc3MgRmFjdG9yeUhvbGRlciB7Ci0JCXByaXZhdGUgaW50IGFjdGlvblR5cGU7Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkJcHVibGljIEZhY3RvcnlIb2xkZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGludCBhY3Rpb25UeXBlKSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkJdGhpcy5hY3Rpb25UeXBlID0gYWN0aW9uVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBNb2RpZmllckhlbHBlckZhY3RvcnkgZ2V0RmFjdG9yeShpbnQgYWN0aW9uVHlwZUFyZykgewotCQkJaWYgKHRoaXMuYWN0aW9uVHlwZSA9PSBhY3Rpb25UeXBlQXJnIHx8IHRoaXMuYWN0aW9uVHlwZSA9PSBNb2RpZmllckhlbHBlci5BQ1RJT05fQk9USCkgewotCQkJCVN0cmluZyBoYXNoS2V5ID0gZ2V0RmFjdG9yeUhhc2goZWxlbWVudCk7Ci0JCQkJTW9kaWZpZXJIZWxwZXJGYWN0b3J5IGZhY3RvcnkgPSAoTW9kaWZpZXJIZWxwZXJGYWN0b3J5KSBmYWN0b3J5SGFzaC5nZXQoaGFzaEtleSk7Ci0JCQkJaWYgKG51bGwgPT0gZmFjdG9yeSkgewotCQkJCQl0cnkgewotCQkJCQkJZmFjdG9yeSA9IChNb2RpZmllckhlbHBlckZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihGQUNUT1JZX0NMQVNTKTsKLQkJCQkJCWZhY3RvcnlIYXNoLnB1dChoYXNoS2V5LCBmYWN0b3J5KTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWN0b3J5OwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChzdXBlci5lcXVhbHMob2JqKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJRmFjdG9yeUhvbGRlciBob2xkZXIgPSAoRmFjdG9yeUhvbGRlcikgb2JqOwotCQkJcmV0dXJuIGdldEZhY3RvcnlIYXNoKGVsZW1lbnQpLmVxdWFscyhnZXRGYWN0b3J5SGFzaChob2xkZXIuZWxlbWVudCkpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpICsgZ2V0RmFjdG9yeUhhc2goZWxlbWVudCkuaGFzaENvZGUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTW9kaWZpZXJIZWxwZXJSZWdpc3RyeSgpIHsKLQkJcmVhZEV4dGVuc2lvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbnMoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlQpOwotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcmVhZEZhY3RvcnkoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRGYWN0b3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoRkFDVE9SWV9DTEFTUyk7Ci0JCWlmIChudWxsID09IGZhY3RvcnlDbGFzc05hbWUpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgRkFDVE9SWV9DTEFTUyArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcGFja2FnZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKFBBQ0tBR0UpOwotCQlpZiAocGFja2FnZXMubGVuZ3RoID09IDApIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgUEFDS0FHRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYWNrYWdlcy5sZW5ndGg7IGorKykgewotCQkJcmVhZFBhY2thZ2UoZWxlbWVudCwgcGFja2FnZXNbal0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRQYWNrYWdlKElDb25maWd1cmF0aW9uRWxlbWVudCBmYWN0b3J5RWxlbWVudCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHBhY2thZ2VVUkkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQQUNLQUdFX1VSSSk7Ci0JCWlmIChudWxsID09IHBhY2thZ2VVUkkpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgUEFDS0FHRV9VUkkgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQl9Ci0JCUVQYWNrYWdlIGVQYWNrYWdlID0gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UocGFja2FnZVVSSSk7Ci0JCWlmIChudWxsID09IGVQYWNrYWdlKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCBQQUNLQUdFICsgIiAiICsgcGFja2FnZVVSSSArICIgY2FuIG5vdCBiZSBmb3VuZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdHlwZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKFRZUEUpOwotCQlpZiAodHlwZXMubGVuZ3RoID09IDApIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgVFlQRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJcmVhZFR5cGUoZmFjdG9yeUVsZW1lbnQsIGVQYWNrYWdlLCB0eXBlc1tpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZFR5cGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZhY3RvcnlFbGVtZW50LCBFUGFja2FnZSBlUGFja2FnZSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCWlmIChudWxsID09IHR5cGVOYW1lKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIE5BTUUgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQl9Ci0JCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIodHlwZU5hbWUpOwotCQlpZiAobnVsbCA9PSBlQ2xhc3NpZmllcikgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgVFlQRSArICIgIiArIHR5cGVOYW1lICsgIiBjYW4gbm90IGJlIGZvdW5kIGluICIgKyBQQUNLQUdFICsgIiAiICsgZVBhY2thZ2UuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXJldHVybjsKLQkJfQotCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZUNsYXNzaWZpZXI7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZlYXR1cmVzID0gZWxlbWVudC5nZXRDaGlsZHJlbihGRUFUVVJFKTsKLQkJaWYgKGZlYXR1cmVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIEZFQVRVUkUgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlYWRGZWF0dXJlKGZhY3RvcnlFbGVtZW50LCBlQ2xhc3MsIGZlYXR1cmVzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRmVhdHVyZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZmFjdG9yeUVsZW1lbnQsIEVDbGFzcyBlQ2xhc3MsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBmZWF0dXJlTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKE5BTUUpOwotCQlpZiAobnVsbCA9PSBmZWF0dXJlTmFtZSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBOQU1FICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgYWN0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoRkVBVFVSRV9BQ1RJT04pOwotCQlpZiAobnVsbCA9PSBhY3Rpb24pIHsKLQkJCWFjdGlvbiA9IEZFQVRVUkVfQUNUSU9OX0JPVEg7Ci0JCX0KLQkJaW50IGFjdGlvblR5cGUgPSAtMTsKLQkJaWYgKGFjdGlvbi5lcXVhbHNJZ25vcmVDYXNlKEZFQVRVUkVfQUNUSU9OX0JPVEgpKSB7Ci0JCQlhY3Rpb25UeXBlID0gTW9kaWZpZXJIZWxwZXIuQUNUSU9OX0JPVEg7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uLmVxdWFsc0lnbm9yZUNhc2UoRkVBVFVSRV9BQ1RJT05fU0VUKSkgewotCQkJYWN0aW9uVHlwZSA9IE1vZGlmaWVySGVscGVyLkFDVElPTl9TRVQ7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uLmVxdWFsc0lnbm9yZUNhc2UoRkVBVFVSRV9BQ1RJT05fVU5TRVQpKSB7Ci0JCQlhY3Rpb25UeXBlID0gTW9kaWZpZXJIZWxwZXIuQUNUSU9OX1VOU0VUOwotCQl9Ci0JCWlmIChhY3Rpb25UeXBlID09IC0xKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiSW52YWxpZCAiICsgRkVBVFVSRV9BQ1RJT04gKyAiPSIgKyBhY3Rpb24gKyAiIGRlZmluZWQuICBWYWxpZCB2YWx1ZXMgYXJlOiAiICsgRkVBVFVSRV9BQ1RJT05fQk9USCArICIsICIgKyBGRUFUVVJFX0FDVElPTl9TRVQgKyAiLCBvciAiICsgRkVBVFVSRV9BQ1RJT05fVU5TRVQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCXJldHVybjsKLQkJfQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0JCUVMaXN0IGFsbEZlYXR1cmVzID0gZUNsYXNzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRlbXBGZWF0dXJlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxGZWF0dXJlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAobnVsbCA9PSBmZWF0dXJlICYmIGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdGVtcEZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodGVtcEZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlmZWF0dXJlID0gdGVtcEZlYXR1cmU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgRkVBVFVSRSArICIgIiArIGZlYXR1cmVOYW1lICsgIiBjYW4gbm90IGJlIGZvdW5kIGluICIgKyBUWVBFICsgIiAiICsgZUNsYXNzLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdCBmYWN0b3J5SG9sZGVyTGlzdCA9IChMaXN0KSBmZWF0dXJlSGFzaC5nZXQoZmVhdHVyZSk7Ci0JCWlmIChudWxsID09IGZhY3RvcnlIb2xkZXJMaXN0KSB7Ci0JCQlmYWN0b3J5SG9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZlYXR1cmVIYXNoLnB1dChmZWF0dXJlLCBmYWN0b3J5SG9sZGVyTGlzdCk7Ci0JCX0KLQkJRmFjdG9yeUhvbGRlciBmYWN0b3J5SG9sZGVyID0gbmV3IEZhY3RvcnlIb2xkZXIoZmFjdG9yeUVsZW1lbnQsIGFjdGlvblR5cGUpOwotCQlpZiAoZmFjdG9yeUhvbGRlckxpc3QuY29udGFpbnMoZmFjdG9yeUhvbGRlcikpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJEdXBsaWNhdGUiICsgRkVBVFVSRSArICI6IiArIGZlYXR1cmVOYW1lICsgIiBkZWZpbmVkIGZvciAiICsgRkFDVE9SWV9DTEFTUyArICI6IiArIGZhY3RvcnlFbGVtZW50LmdldEF0dHJpYnV0ZShGQUNUT1JZX0NMQVNTKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCXJldHVybjsKLQkJfQotCQlmYWN0b3J5SG9sZGVyTGlzdC5hZGQoZmFjdG9yeUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmFjdG9yeUhhc2goSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZhY3RvcnlFbGVtZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5RWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSArIGZhY3RvcnlFbGVtZW50LmdldEF0dHJpYnV0ZShGQUNUT1JZX0NMQVNTKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiUGx1Z2luICIgKyBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCkgKyAiLCBleHRlbnNpb24gIiArIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGlmaWVySGVscGVyUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChudWxsID09IElOU1RBTkNFKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBNb2RpZmllckhlbHBlclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYSBsaXN0IG9mIE1vZGlmaWVySGVscGVycwotCSAqIAotCSAqIEBwYXJhbSBiYXNlSGVscGVyCi0JICogQHBhcmFtIGFjdGlvbkZsYWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0SGVscGVycyhNb2RpZmllckhlbHBlciBiYXNlSGVscGVyKSB7Ci0JCWludCBhY3Rpb25GbGFnID0gYmFzZUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkgPyBNb2RpZmllckhlbHBlci5BQ1RJT05fVU5TRVQgOiBNb2RpZmllckhlbHBlci5BQ1RJT05fU0VUOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGJhc2VIZWxwZXIuZ2V0RmVhdHVyZSgpOwotCQlMaXN0IGZhY3RvcnlMaXN0ID0gZ2V0RmFjdG9yaWVzKGZlYXR1cmUsIGFjdGlvbkZsYWcpOwotCQlpZiAobnVsbCA9PSBmYWN0b3J5TGlzdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQXJyYXlMaXN0IGhlbHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZmFjdG9yeUxpc3QuaXRlcmF0b3IoKTsKLQkJTW9kaWZpZXJIZWxwZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlmYWN0b3J5ID0gKE1vZGlmaWVySGVscGVyRmFjdG9yeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IGhlbHBlciA9IGZhY3RvcnkuZ2V0SGVscGVyKGJhc2VIZWxwZXIsIGFjdGlvbkZsYWcpOwotCQkJaWYgKG51bGwgIT0gaGVscGVyKSB7Ci0JCQkJaGVscGVycy5hZGQoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVscGVyczsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RmFjdG9yaWVzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgYWN0aW9uRmxhZykgewotCQlMaXN0IGZhY3RvcnlIb2xkZXJMaXN0ID0gKExpc3QpIGZlYXR1cmVIYXNoLmdldChmZWF0dXJlKTsKLQkJaWYgKG51bGwgPT0gZmFjdG9yeUhvbGRlckxpc3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3QgZmFjdG9yeUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1vZGlmaWVySGVscGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYWN0b3J5SG9sZGVyTGlzdC5zaXplKCk7IGkrKykgewotCQkJZmFjdG9yeSA9ICgoRmFjdG9yeUhvbGRlcikgZmFjdG9yeUhvbGRlckxpc3QuZ2V0KGkpKS5nZXRGYWN0b3J5KGFjdGlvbkZsYWcpOwotCQkJaWYgKG51bGwgIT0gZmFjdG9yeSkgewotCQkJCWZhY3RvcnlMaXN0LmFkZChmYWN0b3J5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeUxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vT3duZXJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vT3duZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDgyNDM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL093bmVyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSAxMDoyNDo0NiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE93bmVyUHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybiB0aGUgRU9iamVjdCB0aGF0IHdpbGwgc2VydmUgYXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4gSjJFRU1vZGlmaWVySGVscGVyLgotCSAqLwotCUVPYmplY3QgZ2V0T3duZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEoyRUVNb2RpZmllckhlbHBlciBmb3IgdGhlIG93bmVyIGlmIHRoZSBvd25lciBkb2VzIG5vdCB5ZXQgZXhpc3QuCi0JICovCi0JTW9kaWZpZXJIZWxwZXIgZ2V0T3duZXJIZWxwZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Qcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjNzgzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Qcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbCBleHRlbmRzIFByb2plY3RSZXNvdXJjZVNldEltcGwgewotCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXN1cGVyKGFQcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJUmVzb3VyY2UgcmVzdWx0ID0gc3VwZXIuY3JlYXRlUmVzb3VyY2UodXJpLCBjb250ZW50VHlwZSk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXN1bHQpKQotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgoUmVmZXJlbmNlZFJlc291cmNlKSByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIENvbnRlbnRIYW5kbGVyLlVOU1BFQ0lGSUVEX0NPTlRFTlRfVFlQRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9SZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjZjZhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9SZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIGV4dGVuZHMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19FWFRFTlNJT04gPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfQVJDSElWRSA9ICJqYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTZXQgcmVjZW50bHlTYXZlZEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIE1hcCBpZ25vcmVkRmlsZXNDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBjbGFzcyBTYXZlZEZpbGVLZXkgewotCQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgcmVzOwotCQlwcml2YXRlIElGaWxlIHNhdmVkRmlsZTsKLQkJcHVibGljIFNhdmVkRmlsZUtleShSZXNvdXJjZSByZXMsIElGaWxlIHNhdmVkRmlsZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucmVzID0gbmV3IFdlYWtSZWZlcmVuY2UocmVzKTsKLQkJCXRoaXMuc2F2ZWRGaWxlID0gc2F2ZWRGaWxlOwotCQl9Ci0JCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXMgPT0gbnVsbCA/IG51bGwgOiAoUmVzb3VyY2UpcmVzLmdldCgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCQlpbnQgcmVzdWx0ID0gMTsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZ2V0T3V0ZXJUeXBlKCkuaGFzaENvZGUoKTsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChnZXRSZXMoKSA9PSBudWxsKSA/IDAgOiBnZXRSZXMoKS5oYXNoQ29kZSgpKTsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChzYXZlZEZpbGUgPT0gbnVsbCkgPyAwIDogc2F2ZWRGaWxlLmhhc2hDb2RlKCkpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTYXZlZEZpbGVLZXkgb3RoZXIgPSAoU2F2ZWRGaWxlS2V5KSBvYmo7Ci0JCQlpZiAoIWdldE91dGVyVHlwZSgpLmVxdWFscyhvdGhlci5nZXRPdXRlclR5cGUoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGdldFJlcygpID09IG51bGwpIHsKLQkJCQlpZiAob3RoZXIuZ2V0UmVzKCkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmICghZ2V0UmVzKCkuZXF1YWxzKG90aGVyLmdldFJlcygpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoc2F2ZWRGaWxlID09IG51bGwpIHsKLQkJCQlpZiAob3RoZXIuc2F2ZWRGaWxlICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoIXNhdmVkRmlsZS5lcXVhbHMob3RoZXIuc2F2ZWRGaWxlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwcml2YXRlIFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBnZXRPdXRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLnRoaXM7Ci0JCX0KLQl9Ci0KLQkvKiogVGhlIGVtZiByZXNvdXJjZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSBzZXQgYXMgYSByZXN1bHQgb2YgYSBkZWx0YSAqLwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkVW5sb2FkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkTG9hZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBMaXN0IGF1dG9sb2FkUmVzb3VyY2VzVVJJcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBhdXRvbG9hZFJlc291cmNlc0V4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJc3VwZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7Ci0JfQotCQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIucmVzb3VyY2VDaGFuZ2VkKGV2ZW50KTsKLQkJdHJ5IHsKLQkJCWFjY2VwdERlbHRhKGV2ZW50KTsKLQkJCW5vdGlmeUV4dGVuZGVyc0lmTmVjZXNzYXJ5KCk7Ci0JCQlwcm9jZXNzRGVmZXJyZWRSZXNvdXJjZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlkZWZlcnJlZFJlbW92ZVJlc291cmNlcy5jbGVhcigpOwotCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCWRlZmVycmVkTG9hZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmVycmVkUmVtb3ZlZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgZGVmZXJyZWRSZW1vdmVSZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCXJlc291cmNlLnVubG9hZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmVycmVkVW5sb2FkZWRSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZlcnJlZFVubG9hZFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmdldChpKTsKLQkJCXJlc291cmNlLnVubG9hZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWZlcnJlZExvYWRSZXNvdXJjZXMoKSB7Ci0JCVVSSSB1cmkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmVycmVkTG9hZFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJdXJpID0gKFVSSSkgZGVmZXJyZWRMb2FkUmVzb3VyY2VzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGV4KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTG9jayBsb2NrOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgZGVsYXkgPSAzMDsKLQkKLSAgICBwcml2YXRlIElMb2NrIGdldExvY2soKSB7Ci0gICAgICAgIGlmIChsb2NrID09IG51bGwpCi0gICAgICAgICAgICBsb2NrID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLSAgICAgICAgcmV0dXJuIGxvY2s7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlTG9jaygpIHsKLSAgICAgICAgZ2V0TG9jaygpLnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFxdWlyZUxvY2soKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb257Ci0gICAgCXJldHVybiBnZXRMb2NrKCkuYWNxdWlyZShkZWxheSk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCB2b2lkIGFjY2VwdERlbHRhKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJYm9vbGVhbiBoYXNMb2NrZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWhhc0xvY2tlZCA9IGFxdWlyZUxvY2soKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQkJCi0JCQotCQl0cnl7Ci0JCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCi0JCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7Ci0JCQkJcHJpbUFjY2VwdERlbHRhKGRlbHRhLCBldmVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQlwcmltQWNjZXB0RGVsdGEoZGVsdGEsIGV2ZW50KTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgcHJvamVjdCwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfWZpbmFsbHl7Ci0JCQlpZiggaGFzTG9ja2VkICkKLQkJCQlyZWxlYXNlTG9jaygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW1BY2NlcHREZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY3VycmVudFByb2plY3REZWx0YSA9IG51bGw7Ci0JCQkJZGVsdGEuYWNjZXB0KFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplci50aGlzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGlzIGdvaW5nIGF3YXkgc28gd2UgbmVlZCB0byBjbGVhbnVwIG91cnNlbGYgYW5kIHRoZSBSZXNvdXJjZVNldC4gVE9ETyBOZWVkIHRvCi0JICogcHVzaCB1cCB0aGlzIGNvZGUgdG8gUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgaW4gbmV4dCByZWxlYXNlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChKRU1VdGlsUGx1Z2luLmlzQWN0aXZhdGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQotCQkJCQkoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpLnJlbGVhc2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UucmVtb3ZlQ2FjaGVkUHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGVmZXJyZWRSZXNvdXJjZXMoKSB7Ci0JCXByb2Nlc3NEZWZlcnJlZFJlbW92ZWRSZXNvdXJjZXMoKTsKLQkJcHJvY2Vzc0RlZmVycmVkVW5sb2FkZWRSZXNvdXJjZXMoKTsKLQkJcHJvY2Vzc0RlZmVycmVkTG9hZFJlc291cmNlcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCS8vIG9ubHkgcmVzcG9uZCB0byBwcm9qZWN0IGNoYW5nZXMKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQlpZiAoaXNJbnRlcnJlc3RlZEluUHJvamVjdChwKSkgewotCQkJCQljdXJyZW50UHJvamVjdERlbHRhID0gZGVsdGE7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIGlzSW50ZXJyZXN0ZWRJbkZpbGUoKElGaWxlKSByZXNvdXJjZSkpIHsKLQkJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCQkJcmVtb3ZlZFJlc291cmNlKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgotCQkJCQkJYWRkZWRSZXNvdXJjZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgotCQkJCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCkKLQkJCQkJCQljaGFuZ2VkUmVzb3VyY2UoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwIHx8IChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApCi0JCQkJCQkJbW92ZWRSZXNvdXJjZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUXVldWUgdXAgdGhlIDxjb2RlPlJlc291cmNlPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIDxjb2RlPmFGaWxlPC9jb2RlPiwgZm9yIHJlbW92YWwKLQkgKiBmcm9tIHRoZSBjYWNoZSBvZiByZXNvdXJjZXMuCi0JICogCi0JICogQHBvc3QgUmV0dXJuIHRydWUgaWYgYSA8Y29kZT5SZXNvdXJjZTwvY29kZT4gd2FzIHF1ZXVlZCB1cCB0byBiZSByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZWRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gcHJvY2Vzc1Jlc291cmNlKGFGaWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBRdWV1ZSB1cCB0aGUgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gPGNvZGU+YUZpbGU8L2NvZGU+LCBmb3IgcmVsb2FkLgotCSAqIAotCSAqIEBwb3N0IFJldHVybiB0cnVlIGlmIGEgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHdhcyBxdWV1ZWQgdXAgdG8gYmUgcmVsb2FkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkZWRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQlib29sZWFuIGRpZFByb2Nlc3MgPSBmYWxzZTsKLQkJTGlzdCByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoYUZpbGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlY2VudGx5U2F2ZWRGaWxlc0NvbnRhaW5zKHJlc291cmNlKSkgewotCi0JCQkJCS8qCi0JCQkJCSAqIFRoZSBJRmlsZSB3YXMganVzdCBhZGRlZCB0byB0aGUgd29ya3NwYWNlIGJ1dCB3ZSBoYXZlIGEKLQkJCQkJICogY2hhbmdlZCByZXNvdXJjZSBpbiBtZW1vcnkuIE5lZWQgdG8gZGVjaWRlIGlmIGl0IHNob3VsZAotCQkJCQkgKiBiZSB1bmxvYWRlZC4KLQkJCQkJICovCi0JCQkJCWlmIChyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXNvdXJjZSkpIHsKLQkJCQkJCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzb3VyY2U7Ci0JCQkJCQkJaWYgKHJlZlJlcy5zaG91bGRGb3JjZVJlZnJlc2goKSkgewotCQkJCQkJCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQlkaWRQcm9jZXNzID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvKiBVbmxvYWQgaWYgZm91bmQgYW5kIGlzIG5vdCBtb2RpZmllZCBidXQgaW5jb25zaXN0ZW50LiAqLwotCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlc291cmNlKSkgewotCQkJCQkJCWlmICghV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNDb25zaXN0ZW50KChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlc291cmNlKSkgewotCQkJCQkJCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQlkaWRQcm9jZXNzID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJZGlkUHJvY2VzcyA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBQcm9jZXNzIGF1dG9sb2FkIHJlc291cmNlcyBvbiBhZGRlZCBmaWxlICovCi0JCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJCWlmICgoYXV0b2xvYWRSZXNvdXJjZXNVUklzLmNvbnRhaW5zKHVyaSkpIHx8IChhdXRvbG9hZFJlc291cmNlc0V4dHMuY29udGFpbnMoYUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSkpIHsKLQkJCQkJCQlkZWZlcnJlZExvYWRSZXNvdXJjZXMuYWRkKHVyaSk7Ci0JCQkJCQkJZGlkUHJvY2VzcyA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpZFByb2Nlc3M7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWNlbnRseVNhdmVkRmlsZXNDb250YWlucyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVjZW50bHlTYXZlZEZpbGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVNhdmVkRmlsZUtleSBrZXkgPSAoU2F2ZWRGaWxlS2V5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoa2V5LmdldFJlcygpICE9IG51bGwgJiYgKGtleS5nZXRSZXMoKS5nZXRVUkkoKS5lcXVhbHMocmVzb3VyY2UuZ2V0VVJJKCkpICYmIGtleS5nZXRSZXMoKS5nZXRDbGFzcygpLmVxdWFscyhyZXNvdXJjZS5nZXRDbGFzcygpKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUmVzb3VyY2UoSUZpbGUgYUZpbGUsIGJvb2xlYW4gaXNSZW1vdmUpIHsKLQkJTGlzdCByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoYUZpbGUpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKHJlc291cmNlICE9IG51bGwpKSB7Ci0JCQkJaWYgKHJlY2VudGx5U2F2ZWRGaWxlc0NvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzb3VyY2UpKSB7Ci0JCQkJCQkJUmVmZXJlbmNlZFJlc291cmNlIHJlZlJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlc291cmNlOwotCQkJCQkJCWlmICghcmVmUmVzLnNob3VsZEZvcmNlUmVmcmVzaCgpKQotCQkJCQkJCQljb250aW51ZTsgLy8gRG8gbm90IGRvIGFueXRoaW5nCi0JCQkJCQl9IGVsc2UKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaXNSZW1vdmUpCi0JCQkJCWRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzb3VyY2UpKSB7Ci0JCQkJCQlpZiAoIVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzQ29uc2lzdGVudCgoUmVmZXJlbmNlZFJlc291cmNlKSByZXNvdXJjZSkpCi0JCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRm9yIG5vdywgZG8gdGhlIHNhbWUgYXMgaWYgdGhlIDxjb2RlPmFGaWxlPC9jb2RlPiB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlZFJlc291cmNlKElGaWxlIGFGaWxlKSB7Ci0JCXJldHVybiByZW1vdmVkUmVzb3VyY2UoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50cyBvZiA8Y29kZT5hRmlsZTwvY29kZT4gaGF2ZSBjaGFuZ2VkIGluIHRoZSBXb3JrYmVuY2ggYW5kIHdlIG1heSBuZWVkIHRvIHVwZGF0ZQotCSAqIG91ciBjYWNoZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIFdlIHdpbGwgcHJvY2VzcyB0aGlzIHJlc291cmNlIHRvIGJlIHJlZnJlc2hlZCBhbmQgbm90IHJlbW92ZWQuCi0JICogCi0JICogQHBvc3QgUmV0dXJuIHRydWUgaWYgYSA8Y29kZT5SZXNvdXJjZTwvY29kZT4gd2FzIGFjdHVhbGx5IHJlbW92ZWQuCi0JICovCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGFuZ2VkUmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLQkJLy9Qcm9jZXNzIHJlc291cmNlIGFzIGEgcmVmcmVzaC4KLQkJcmV0dXJuIHByb2Nlc3NSZXNvdXJjZShhRmlsZSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQkKLQkJcmV0dXJuIHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGFGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVzb3VyY2VzKElGaWxlIGFGaWxlKSB7Ci0KLQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWxsUmVzb3VyY2VzID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlVUkkgcmVzVVJJID0gcmVzLmdldFVSSSgpOwotCQkJU3RyaW5nIHJlc1VSSVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzVVJJLnBhdGgoKSAhPSBudWxsKSB7Ci0JCQkJSVBhdGggcmVzVVJJUGF0aDsKLQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHJlc1VSSSkpCi0JCQkJCXJlc1VSSVBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHJlc1VSSS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOwotCQkJCWVsc2UKLQkJCQkJcmVzVVJJUGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUocmVzVVJJLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJcmVzVVJJU3RyaW5nID0gcmVzVVJJUGF0aC50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKCFyZXNVUklTdHJpbmcuZXF1YWxzKCIiKSAmJiBhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuaW5kZXhPZihyZXNVUklTdHJpbmcpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJcmVzb3VyY2VzLmFkZChyZXMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHdyaXRpbmcgdG8gYW4gSUZpbGUgZnJvbSBhIE1PRiByZXNvdXJjZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmVTYXZlKElGaWxlIGFGaWxlKSB7Ci0JCWlmIChhRmlsZSAhPSBudWxsKSB7Ci0JCQlyZWNlbnRseVNhdmVkRmlsZXNBZGQoYUZpbGUsbnVsbCk7Ci0JCQlpZ25vcmVkRmlsZXNDYWNoZS5yZW1vdmUoYUZpbGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gd3JpdGluZyB0byBhbiBJRmlsZSBmcm9tIGEgTU9GIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHByZVNhdmUoSUZpbGUgYUZpbGUsIFJlc291cmNlIHJlcykgewotCQlpZiAoYUZpbGUgIT0gbnVsbCkgewotCQkJcmVjZW50bHlTYXZlZEZpbGVzQWRkKGFGaWxlLCByZXMpOwotCQkJaWdub3JlZEZpbGVzQ2FjaGUucmVtb3ZlKGFGaWxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjZW50bHlTYXZlZEZpbGVzQWRkKElGaWxlIGZpbGUsIFJlc291cmNlIHJlcykgewotCQlyZXR1cm4gcmVjZW50bHlTYXZlZEZpbGVzLmFkZChuZXcgU2F2ZWRGaWxlS2V5KHJlcywgZmlsZSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYSBwcmVTYXZlIGlmIHRoZSBzYXZlIGZhaWxzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlY2VudGx5U2F2ZWRMaXN0KElGaWxlIGFGaWxlKSB7Ci0JCWlmIChhRmlsZSAhPSBudWxsKSB7Ci0JCQlyZWNlbnRseVNhdmVkRmlsZXNGb3JjZVJlbW92ZShhRmlsZSk7Ci0JCQlpZ25vcmVkRmlsZXNDYWNoZS5yZW1vdmUoYUZpbGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWNlbnRseVNhdmVkRmlsZXNSZW1vdmUoSUZpbGUgZmlsZSkgewotCQkKLQkJYm9vbGVhbiByZW1vdmVkRnJvbUxpc3QgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlY2VudGx5U2F2ZWRGaWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTYXZlZEZpbGVLZXkga2V5ID0gKFNhdmVkRmlsZUtleSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGtleS5zYXZlZEZpbGUgIT0gbnVsbCAmJiBrZXkuc2F2ZWRGaWxlLmVxdWFscyhmaWxlKSkgewotCQkJCUxpc3QgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKGZpbGUpOwotCQkJCWlmIChrZXkuZ2V0UmVzKCkgPT0gbnVsbCB8fCByZXNvdXJjZXMuY29udGFpbnMoa2V5LmdldFJlcygpKSApIHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCXJlbW92ZWRGcm9tTGlzdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZW1vdmVkRnJvbUxpc3Q7Ci0JfQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjZW50bHlTYXZlZEZpbGVzRm9yY2VSZW1vdmUoSUZpbGUgZmlsZSkgewotCQkKLQkJYm9vbGVhbiByZW1vdmVkRnJvbUxpc3QgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlY2VudGx5U2F2ZWRGaWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTYXZlZEZpbGVLZXkga2V5ID0gKFNhdmVkRmlsZUtleSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGtleS5zYXZlZEZpbGUgIT0gbnVsbCAmJiBrZXkuc2F2ZWRGaWxlLmVxdWFscyhmaWxlKSkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJcmVtb3ZlZEZyb21MaXN0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVtb3ZlZEZyb21MaXN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQganVzdCBhZnRlciB3cml0aW5nIHRvIGFuIElGaWxlIGZyb20gYSBNT0YgcmVzb3VyY2UuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0U2F2ZShJRmlsZSBhRmlsZSkgewotCQkvL1RPRE8gcmVtb3ZlIHRoaXMgbWV0aG9kCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmFQcm9qZWN0PC9jb2RlPiBoYXMgdGhlIHByb2plY3ROYXR1cmVJRC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5Qcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBhUHJvamVjdC5lcXVhbHMoZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcHRpbWl6ZWQgbm90IHRvIGJlIG5vdCBpbnRlcnJlc3RlZCBpbiBmaWxlcyB3aXRoIGFuIGV4dGVuc2lvbiBvZiAuamF2YSBvciAuY2xhc3Mgb3IgaWYgdGhlCi0JICogZmlsZSBoYXMganVzdCBiZWVuIHNhdmVkIGJ5IG91ciBvd24gaW50ZXJuYWwgbWVjaGFuaXNtLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJyZXN0ZWRJbkZpbGUoSUZpbGUgYUZpbGUpIHsKLQkJU3RyaW5nIGV4dGVuc2lvbiA9IGFGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJaWYgKENMQVNTX0VYVEVOU0lPTi5lcXVhbHMoZXh0ZW5zaW9uKSB8fCBKQVZBX0VYVEVOU0lPTi5lcXVhbHMoZXh0ZW5zaW9uKSB8fCBKQVZBX0FSQ0hJVkUuZXF1YWxzKGV4dGVuc2lvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyZWNlbnRseVNhdmVkRmlsZXNSZW1vdmUoYUZpbGUpKSB7Ci0JCQkJY2FjaGVJZ25vcmVkKGFGaWxlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFoYXNJZ25vcmVkKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGFscmVhZHkgaWdub3JlZCB0aGlzIDxjb2RlPmZpbGU8L2NvZGU+IGFuZCB0aGF0IGl0cyBtb2RpZmljYXRpb24KLQkgKiBzdGFtcCBpcyB0aGUgc2FtZSBhcyB3aGVuIHdlIHByb2Nlc3NlZCBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzSWdub3JlZChJRmlsZSBmaWxlKSB7Ci0JCUxvbmcgY2FjaGVkU3RhbXAgPSAoTG9uZykgaWdub3JlZEZpbGVzQ2FjaGUuZ2V0KGZpbGUpOwotCQlpZiAoY2FjaGVkU3RhbXAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJbG9uZyBzdGFtcCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJcmV0dXJuIGNhY2hlZFN0YW1wLmxvbmdWYWx1ZSgpID09IHN0YW1wOwotCX0KLQotCS8qKgotCSAqIENhY2hlIHRoZSBtb2RpZmljYXRpb24gc3RhbXAgb2YgdGhlIDxjb2RlPmZpbGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhY2hlSWdub3JlZChJRmlsZSBmaWxlKSB7Ci0JCWxvbmcgc3RhbXAgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7Ci0JCWlnbm9yZWRGaWxlc0NhY2hlLnB1dChmaWxlLCBuZXcgTG9uZyhzdGFtcCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuYWJsZUF1dG9sb2FkKFVSSSB1cmkpIHsKLQkJVVJJIG5vcm1hbGl6ZWQgPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJYXV0b2xvYWRSZXNvdXJjZXNVUklzLmFkZChub3JtYWxpemVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNhYmxlQXV0b2xvYWQoVVJJIHVyaSkgewotCQlVUkkgbm9ybWFsaXplZCA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQlhdXRvbG9hZFJlc291cmNlc1VSSXMucmVtb3ZlKG5vcm1hbGl6ZWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIjaW5pdGlhbGl6ZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCX0KLQlwdWJsaWMgdm9pZCBlbmFibGVBdXRvbG9hZChTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWF1dG9sb2FkUmVzb3VyY2VzRXh0cy5hZGQoZXh0ZW5zaW9uKTsKLQkJCi0JfQotCXB1YmxpYyB2b2lkIGRpc2FibGVBdXRvbG9hZChTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWF1dG9sb2FkUmVzb3VyY2VzRXh0cy5yZW1vdmUoZXh0ZW5zaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWN1cnJlbnRQcm9qZWN0RGVsdGEgPSBudWxsOwotCQlleHRlbmRlcnMgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L0lWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvSVZhbGlkYXRlRWRpdENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NTkwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvSVZhbGlkYXRlRWRpdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDE4LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpIFRoaXMgaXMgdGhlIGFic3RyYWN0aW9uIGxheWVyIGZvciB2YWxpZGF0ZSBlZGl0Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRlRWRpdENvbnRleHQgZXh0ZW5kcyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0tFWSA9ICJWYWxpZGF0ZUVkaXRDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgc2V0RWRpdE1vZGVsKEVkaXRNb2RlbCBmVmFsaWRhdG9yKTsKLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoRWRpdE1vZGVsIGZWYWxpZGF0b3IpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOGJjNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgY29udHJvbGxlZCByZXNvdXJjZXMgb3IgZmlsZXMgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0RpcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB0aGUgTU9GIFJlc291cmNlcyB0aGF0IGFyZSBiZWluZyBtYW5hZ2VkLiBTeW5jaHJvbml6YXRpb24KLQkgKiBjaGVja2luZyB3aWxsIG9ubHkgd29yayBpZiB5b3UgYXJlIHVzaW5nIHRoZSBlbWYud29ya2JlbmNoIHBsdWdpbiBhcGlzIGZvciBsb2FkaW5nIHJlc291cmNlcy4KLQkgKiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgeW91IGdldCBhbiBpbnN0YW5jZSBvZiBhIDxjb2RlPlJlZmVyZW5jZWRSZXNvdXJjZTwvY29kZT4uIFRoaXMKLQkgKiByZXNvdXJjZSB0eXBlIGlzIGNhcGFibGUgb2YgY2FjaGluZyBpdHMgbGFzdCBrbm93biBzeW5jaHJvbml6YXRpb24gc3RhbXAgdGhhdCBtYXkgYmUgdXNlZCB0bwotCSAqIHRlc3QgaWYgdGhlIHJlc291cmNlIGlzIGNvbnNpdGVudCB3aXRoIHRoZSB1bmRlcmx5aW5nIElGaWxlLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiBJRmlsZXMgdGhhdCBhcmUgbm90IE1PRiBSZXNvdXJjZXMgdGhhdCBhcmUgYWxzbyBiZWluZwotCSAqIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCUxpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBMaXN0IGZyb20gZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHRoYXQgYXJlIGluY29uc2lzdGVudCB3aXRoIHRoZQotCSAqIHVuZGVybHlpbmcgamF2YS5pby5GaWxlLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCi0JICovCi0JTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHByb3ZpZGVyIHRvIGNhY2hlIHRoZSBzeW5jaHJvbml6YXRpb24gc3RhbXAgZm9yIHRoZSBMaXN0IG9mCi0JICogPGNvZGU+cm9Ob25SZXNvdXJjZUZpbGVzPC9jb2RlPi4gVGhpcyBzdGFtcCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbmNvbnNpc3RlbnQKLQkgKiBmaWxlcy4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBvZiBJRmlsZXMgdGhhdCBhcmUgbm90IE1PRiByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHJvTm9uUmVzb3VyY2VGaWxlcwotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpCi0JICovCi0Jdm9pZCBjYWNoZU5vblJlc291cmNlVmFsaWRhdGVTdGF0ZShMaXN0IHJvTm9uUmVzb3VyY2VGaWxlcyk7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMzN2M0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgewotCXN0YXRpYyBmaW5hbCBJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSkVNVXRpbFBsdWdpbi5JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGEgPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBpcyBhY3RpdmF0ZWQgKGJlY29tZXMKLQkgKiBhY3RpdmUpLiBUaGlzIHdpbGwgY2hlY2sgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIHVuZGVybHlpbmcgZmlsZXMgdG8gc2VlIGlmIHRoZXkgYXJlIGRpZmZlcmVudAotCSAqIGZyb20gdGhlIGxhc3QgY2FjaGVkIG1vZGlmaWVkIHZhbHVlLiBUaGUgPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBzaG91bGQgYmUgcHJlcGFyZWQgdG8KLQkgKiBwcm9tcHQgdGhlIHVzZXIgaWYgdGhleSB3b3VsZCBsaWtlIHRvIHJlZnJlc2ggd2l0aCB0aGUgY29udGVudHMgb24gZGlzayBpZiB3ZSBhcmUgZGlydHkuCi0JICovCi0Jdm9pZCBjaGVja0FjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gbG9vc2VzIGFjdGl2YXRpb24uIFRoaXMgd2lsbAotCSAqIGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGFzdAotCSAqIGNhY2hlZCBtb2RpZmllZCB2YWx1ZS4gVGhlIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gc2hvdWxkIGJlIHByZXBhcmVkIHRvIHByb21wdCB0aGUgdXNlciBpZgotCSAqIHRoZXkgd291bGQgbGlrZSB0byByZWZyZXNoIHdpdGggdGhlIGNvbnRlbnRzIG9uIGRpc2sgaWYgd2UgYXJlIGRpcnR5LgotCSAqLwotCXZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB0aGUgZmlyc3QgdGltZSB0aGUgZmlsZXMgYXJlIGFib3V0IHRvIGJlIG1vZGlmaWVkIGFmdGVyIGEKLQkgKiA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IGJlY29tZXMgYWN0aXZlLiBUaGUgcmV0dXJuZWQgSVN0YXR1cyBtYXkgaGF2ZSBhbiBFUlJPUiBzdGF0dXMgd2hpY2gKLQkgKiBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotCSAqLwotCUlTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHRoZSA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IHNhdmluZyB0aGUgbW9kaWZpZWQKLQkgKiBjb250ZW50cy4gVGhpcyB3aWxsIGNoZWNrIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgdW5kZXJseWluZyBmaWxlcyB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZQotCSAqIHN5bmNocm9uaXplZC4gSWYgdHJ1ZSBpcyByZXR1cm5lZCwgdGhlIHNhdmUgY2FuIHByb2NlZWQuCi0JICovCi0JYm9vbGVhbiBjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSByZWFkIG9ubHkgZmlsZXMuCi0JICovCi0JYm9vbGVhbiBjaGVja1JlYWRPbmx5KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGI2ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbCBpbXBsZW1lbnRzIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgewotCXByb3RlY3RlZCBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciBwcm92aWRlcjsKLQlwcm90ZWN0ZWQgTWFwIGxhc3ROb25SZWZyZXNoU3RhdGVNYXA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGVja2luZ0NvbnNpc3RlbmN5OwotCi0JY2xhc3MgUmVmcmVzaFJ1bm5hYmxlIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQkJQ29yZUV4Y2VwdGlvbiB0aHJvd25FeGNlcHRpb247Ci0JCUxpc3QgZmlsZXM7Ci0JCUxpc3QgcmVzb3VyY2VzOwotCi0JCVJlZnJlc2hSdW5uYWJsZShMaXN0IHNvbWVGaWxlcywgTGlzdCBpbmNvbnNpc3RlbnRSZXNvdXJjZXMpIHsKLQkJCWZpbGVzID0gc29tZUZpbGVzOwotCQkJcmVzb3VyY2VzID0gaW5jb25zaXN0ZW50UmVzb3VyY2VzOwotCQl9Ci0KLQkJcHVibGljIENvcmVFeGNlcHRpb24gZ2V0VGhyb3duRXhjZXB0aW9uKCkgewotCQkJcmV0dXJuIHRocm93bkV4Y2VwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQl0cnkgewotCQkJCXByZXBhcmVSZXNvdXJjZXNGb3JSZWZyZXNoKHJlc291cmNlcyk7Ci0JCQkJcHJpbVJlZnJlc2hGaWxlcyhmaWxlcyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvd25FeGNlcHRpb24gPSBlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlc291cmNlU3RhdGVWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsKFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyIGFQcm92aWRlcikgewotCQlwcm92aWRlciA9IGFQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIDxjb2RlPmFMaXN0ZW5lcjwvY29kZT4gaXMgYWN0aXZhdGVkIChiZWNvbWVzIGFjdGl2ZSkuCi0JICogVGhpcyB3aWxsIGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUKLQkgKiBsYXN0IGNhY2hlZCBtb2RpZmllZCB2YWx1ZS4gPGNvZGU+YUxpc3RlbmVyPC9jb2RlPiBzaG91bGQgYmUgcHJlcGFyZWQgdG8gcHJvbXB0IHRoZSB1c2VyIGlmCi0JICogdGhleSB3b3VsZCBsaWtlIHRvIHJlZnJlc2ggd2l0aCB0aGUgY29udGVudHMgb24gZGlzayBpZiB3ZSBhcmUgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNoZWNrQ29uc2lzdGVuY3kocHJlc2VudGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb3N0QWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljaGVja0NvbnNpc3RlbmN5KHByZXNlbnRlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tTYXZlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcmVzZW50ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFwcm92aWRlci5pc0RpcnR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3QgaW5jb25zaXN0ZW50UmVzb3VyY2VzID0gZ2V0SW5jb25zaXN0ZW50UmVzb3VyY2VzKCk7Ci0JCUxpc3QgaW5jb25zaXN0ZW50RmlsZXMgPSBnZXRGaWxlcyhpbmNvbnNpc3RlbnRSZXNvdXJjZXMpOwotCQlpbmNvbnNpc3RlbnRGaWxlcyA9IGFkZE90aGVySW5jb25zaXN0ZW50RmlsZXMoaW5jb25zaXN0ZW50RmlsZXMpOwotCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHByZXNlbnRlci5wcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKGluY29uc2lzdGVudEZpbGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tSZWFkT25seSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tSZWFkT25seSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBjaGVja1JlYWRPbmx5UmVzb3VyY2VzKCk7Ci0JCWlmICghcmVzdWx0KQotCQkJcmVzdWx0ID0gY2hlY2tSZWFkT25seU5vblJlc291cmNlRmlsZXMoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY2hlY2tSZWFkT25seU5vblJlc291cmNlRmlsZXMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVhZE9ubHlOb25SZXNvdXJjZUZpbGVzKCkgewotCQlMaXN0IGZpbGVzID0gcHJvdmlkZXIuZ2V0Tm9uUmVzb3VyY2VGaWxlcygpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBzaXplID0gZmlsZXMuc2l6ZSgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIGZpbGVzLmdldChpKTsKLQkJCWlmIChmaWxlLmlzUmVhZE9ubHkoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNoZWNrUmVhZE9ubHlSZXNvdXJjZXMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVhZE9ubHlSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzb3VyY2VzID0gcHJvdmlkZXIuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5zaXplKCk7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrQ29uc2lzdGVuY3koUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ2hlY2tpbmdDb25zaXN0ZW5jeSB8fCBwcmVzZW50ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaXNDaGVja2luZ0NvbnNpc3RlbmN5ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCUxpc3QgaW5jb25zaXN0ZW50UmVzb3VyY2VzID0gZ2V0SW5jb25zaXN0ZW50UmVzb3VyY2VzKCk7Ci0JCQlMaXN0IGluY29uc2lzdGVudEZpbGVzID0gZ2V0RmlsZXMoaW5jb25zaXN0ZW50UmVzb3VyY2VzKTsKLQkJCWluY29uc2lzdGVudEZpbGVzID0gYWRkT3RoZXJJbmNvbnNpc3RlbnRGaWxlcyhpbmNvbnNpc3RlbnRGaWxlcyk7Ci0JCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJYm9vbGVhbiBzaG91bGRSZWZyZXNoRmlsZXMgPSB0cnVlOwotCQkJLy9EZWZlY3QgMjA4NjU0ICYgMjA5NjMxIHdhbnQgcHJvbXB0IG5vIG1hdHRlciB3aGF0LgotCQkJaWYgKGFueUZpbGVDaGFuZ2VkU2luY2VMYXN0UmVmcmVzaFByb21wdChpbmNvbnNpc3RlbnRGaWxlcykpIHsKLQkJCQljbGVhckxhc3ROb25SZWZyZXNoU3RhdGVNYXAoKTsKLQkJCQlzaG91bGRSZWZyZXNoRmlsZXMgPSBwcmVzZW50ZXIucHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZVJlZnJlc2goaW5jb25zaXN0ZW50RmlsZXMpOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuOwotCQkJaWYgKHNob3VsZFJlZnJlc2hGaWxlcykKLQkJCQlyZWZyZXNoRmlsZXMoaW5jb25zaXN0ZW50RmlsZXMsIGluY29uc2lzdGVudFJlc291cmNlcyk7Ci0JCQllbHNlCi0JCQkJY2FjaGVMYXN0Tm9uUmVmcmVzaEZpbGVTdGFtcHMoaW5jb25zaXN0ZW50RmlsZXMpOwotCQl9IGZpbmFsbHkgewotCQkJaXNDaGVja2luZ0NvbnNpc3RlbmN5ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY2FjaGVMYXN0Tm9uUmVmcmVzaEZpbGVTdGFtcHMuCi0JICogCi0JICogQHBhcmFtIGluY29uc2lzdGVudEZpbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhY2hlTGFzdE5vblJlZnJlc2hGaWxlU3RhbXBzKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJaWYgKGluY29uc2lzdGVudEZpbGVzICE9IG51bGwgJiYgIWluY29uc2lzdGVudEZpbGVzLmlzRW1wdHkoKSkgewotCQkJTWFwIG1hcCA9IGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJbG9uZyBzdGFtcCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY29uc2lzdGVudEZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZmlsZSA9IChJRmlsZSkgaW5jb25zaXN0ZW50RmlsZXMuZ2V0KGkpOwotCQkJCXN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJCW1hcC5wdXQoZmlsZSwgbmV3IExvbmcoc3RhbXApKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjYWNoZVZhbGlkYXRlU3RhdGUuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdAotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZVZhbGlkYXRlU3RhdGUoSVN0YXR1cyBhU3RhdHVzLCBMaXN0IHJlYWRPbmx5UmVzb3VyY2VzLCBMaXN0IHJvTm9uUmVzb3VyY2VGaWxlcykgewotCQlpZiAoYVN0YXR1cy5pc09LKCkpIHsKLQkJCWlmIChyZWFkT25seVJlc291cmNlcyAhPSBudWxsICYmICFyZWFkT25seVJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWRPbmx5UmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCXJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlYWRPbmx5UmVzb3VyY2VzLmdldChpKTsKLQkJCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuc2V0U3luaHJvbml6YXRpb25TdGFtcChyZXMsIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChyZXMpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcm92aWRlci5jYWNoZU5vblJlc291cmNlVmFsaWRhdGVTdGF0ZShyb05vblJlc291cmNlRmlsZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyTGFzdE5vblJlZnJlc2hTdGF0ZU1hcCgpIHsKLQkJaWYgKGxhc3ROb25SZWZyZXNoU3RhdGVNYXAgIT0gbnVsbCkKLQkJCWxhc3ROb25SZWZyZXNoU3RhdGVNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgYW55RmlsZUNoYW5nZWRTaW5jZUxhc3RSZWZyZXNoUHJvbXB0LgotCSAqIAotCSAqIEBwYXJhbSBpbmNvbnNpc3RlbnRGaWxlcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbnlGaWxlQ2hhbmdlZFNpbmNlTGFzdFJlZnJlc2hQcm9tcHQoTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgewotCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID09IG51bGwgfHwgbGFzdE5vblJlZnJlc2hTdGF0ZU1hcC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaW50IHNpemUgPSBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCk7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlMb25nIHN0YW1wID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIGluY29uc2lzdGVudEZpbGVzLmdldChpKTsKLQkJCXN0YW1wID0gKExvbmcpIGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKS5nZXQoZmlsZSk7Ci0JCQlpZiAoc3RhbXAgPT0gbnVsbCB8fCAoc3RhbXAubG9uZ1ZhbHVlKCkgIT0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgYWRkT3RoZXJJbmNvbnNpc3RlbnRGaWxlcyhMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7Ci0JCWlmIChpbmNvbnNpc3RlbnRGaWxlcyA9PSBudWxsIHx8IGluY29uc2lzdGVudEZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCk7Ci0JCUxpc3Qgbm9uUmVzRmlsZXMgPSBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCk7Ci0JCWlmIChub25SZXNGaWxlcyAhPSBudWxsKQotCQkJaW5jb25zaXN0ZW50RmlsZXMuYWRkQWxsKG5vblJlc0ZpbGVzKTsKLQkJcmV0dXJuIGluY29uc2lzdGVudEZpbGVzOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkgewotCQlMaXN0IGZpbGVzID0gcHJvdmlkZXIuZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZpbGVzOwotCQkvL0RldGVybWluZSBjb25zaXN0ZW5jeSBiYXNlZCBvbiB0aGUgc3luY2hyb25pemF0aW9uIG9mIHRoZSBJRmlsZQotCQlmaWxlcyA9IHByb3ZpZGVyLmdldE5vblJlc291cmNlRmlsZXMoKTsKLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgaW5jb25zaXN0ZW50ID0gbnVsbDsKLQkJaW50IHNpemUgPSBmaWxlcy5zaXplKCk7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgIWZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQotCQkJCQlpbmNvbnNpc3RlbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW5jb25zaXN0ZW50LmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlpZiAoaW5jb25zaXN0ZW50ID09IG51bGwpCi0JCQlpbmNvbnNpc3RlbnQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gaW5jb25zaXN0ZW50OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEluY29uc2lzdGVudFJlc291cmNlcygpIHsKLQkJTGlzdCBtb2ZSZXNvdXJjZXMgPSBwcm92aWRlci5nZXRSZXNvdXJjZXMoKTsKLQkJTGlzdCBpbmNvbnNpc3RlbnQgPSBudWxsOwotCQlpbnQgc2l6ZSA9IG1vZlJlc291cmNlcy5zaXplKCk7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSBtb2ZSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlcykpIHsKLQkJCQlyZWZSZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZXM7Ci0JCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc0NvbnNpc3RlbnQocmVmUmVzKSAmJiAocmVmUmVzLmlzTG9hZGVkKCkgJiYgIXJlZlJlcy5pc05ldygpKSkgewotCQkJCQlpZiAoaW5jb25zaXN0ZW50ID09IG51bGwpCi0JCQkJCQlpbmNvbnNpc3RlbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWluY29uc2lzdGVudC5hZGQocmVmUmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQotCQkJaW5jb25zaXN0ZW50ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIGluY29uc2lzdGVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGaWxlcyhMaXN0IHJlZlJlc291cmNlcykgewotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdChyZWZSZXNvdXJjZXMuc2l6ZSgpKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVmUmVzb3VyY2VzLmdldChpKTsKLQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlZlJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhdCBsZWFzdCB0aGUgZmlyc3QgdGltZSBhIFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIKLQkgKiBiZWNvbWVzIGFjdGl2ZSBhbmQgaXMgYWJvdXQgdG8gZWRpdCBpdHMgY29udGVudHMuIFRoZSByZXR1cm5lZCBJU3RhdHVzIG1heSBoYXZlIGFuIEVSUk9SCi0JICogc3RhdHVzIHdoaWNoIHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHJvUmVzb3VyY2VzLCBub25SZXNST0ZpbGVzLCByb0ZpbGVzID0gbnVsbDsKLQkJTGlzdFtdIHJlYWRPbmx5ID0gc2VsZWN0UmVhZE9ubHlSZXNvdXJjZXMocHJvdmlkZXIuZ2V0UmVzb3VyY2VzKCkpOwotCQlyb1Jlc291cmNlcyA9IHJlYWRPbmx5WzBdOwotCQlyb0ZpbGVzID0gcmVhZE9ubHlbMV07Ci0JCW5vblJlc1JPRmlsZXMgPSBzZWxlY3RSZWFkT25seUZpbGVzKHByb3ZpZGVyLmdldE5vblJlc291cmNlRmlsZXMoKSk7Ci0JCWlmIChub25SZXNST0ZpbGVzICE9IG51bGwpIHsKLQkJCWlmIChyb0ZpbGVzID09IG51bGwpCi0JCQkJcm9GaWxlcyA9IG5vblJlc1JPRmlsZXM7Ci0JCQllbHNlCi0JCQkJcm9GaWxlcy5hZGRBbGwobm9uUmVzUk9GaWxlcyk7Ci0JCX0KLQkJaWYgKHJvRmlsZXMgPT0gbnVsbCB8fCByb0ZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBPS19TVEFUVVM7Ci0JCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbcm9GaWxlcy5zaXplKCldOwotCQlyb0ZpbGVzLnRvQXJyYXkoZmlsZXMpOwotCQlPYmplY3QgY3R4ID0gcHJlc2VudGVyICE9IG51bGwgPyBwcmVzZW50ZXIuZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpIDogbnVsbDsKLQkJSVN0YXR1cyByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBjdHgpOwotCQljYWNoZVZhbGlkYXRlU3RhdGUocmVzdWx0LCByb1Jlc291cmNlcywgbm9uUmVzUk9GaWxlcyk7Ci0JCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCWNoZWNrQ29uc2lzdGVuY3kocHJlc2VudGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2Qgc2VsZWN0UmVhZE9ubHlGaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEBwYXJhbSByb0ZpbGVzCi0JICovCi0JcHJpdmF0ZSBMaXN0IHNlbGVjdFJlYWRPbmx5RmlsZXMoTGlzdCBmaWxlcykgewotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmlsZXM7Ci0JCWludCBzaXplID0gZmlsZXMuc2l6ZSgpOwotCQlMaXN0IHJlYWRPbmx5ID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQlpZiAocmVhZE9ubHkgPT0gbnVsbCkKLQkJCQkJcmVhZE9ubHkgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQkJCXJlYWRPbmx5LmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNlbGVjdFJlYWRPbmx5UmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHBhcmFtIHJvRmlsZXMKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3RbXSBzZWxlY3RSZWFkT25seVJlc291cmNlcyhMaXN0IHJlc291cmNlcykgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgTGlzdFtde3Jlc291cmNlcywgbnVsbH07Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5zaXplKCk7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCUxpc3QgcmVhZE9ubHkgPSBudWxsOwotCQlMaXN0IHJvRmlsZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQlpZiAocmVhZE9ubHkgPT0gbnVsbCkKLQkJCQkJcmVhZE9ubHkgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQkJCXJlYWRPbmx5LmFkZChyZXMpOwotCQkJCWlmIChyb0ZpbGVzID09IG51bGwpCi0JCQkJCXJvRmlsZXMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQkJCXJvRmlsZXMuYWRkKGZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgTGlzdFtde3JlYWRPbmx5LCByb0ZpbGVzfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZpbGVzKExpc3Qgc29tZUZpbGVzLCBMaXN0IGluY29uc2l0ZW50UmVzb3VyY2VzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlZnJlc2hSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSZWZyZXNoUnVubmFibGUoc29tZUZpbGVzLCBpbmNvbnNpdGVudFJlc291cmNlcyk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG51bGwpOwotCQlpZiAocnVubmFibGUuZ2V0VGhyb3duRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCXRocm93IHJ1bm5hYmxlLmdldFRocm93bkV4Y2VwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SZWZyZXNoRmlsZXMoTGlzdCBzb21lRmlsZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSBzb21lRmlsZXMuc2l6ZSgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIHNvbWVGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoIWZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKQotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJZWxzZQotCQkJCXJlZnJlc2hSZXNvdXJjZShmaWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBSZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5maWxlPC9jb2RlPiB0byBmb3JjZSBhCi0JICogcmVmcmVzaC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoUmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQlSZXNvdXJjZSByZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoZmlsZSk7Ci0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCXJlcy51bmxvYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSB0aGUgcmVzb3VyY2VzIHRvIG5vdCBiZSBkaXJ0eSB0byBlbnN1cmUgdGhhdCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZWlyCi0JICogUmVzb3VyY2VTZXQgd2hlbiB0aGVpciBmaWxlIGlzIHJlZnJlc2hlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVzb3VyY2VzRm9yUmVmcmVzaChMaXN0IHJlZlJlc291cmNlcykgewotCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlZlJlc291cmNlcy5nZXQoaSk7Ci0JCQlyZXMuc2V0Rm9yY2VSZWZyZXNoKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFzdE5vblJlZnJlc2hTdGF0ZU1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBNYXAKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKSB7Ci0JCWlmIChsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID09IG51bGwpCi0JCQlsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGxhc3ROb25SZWZyZXNoU3RhdGVNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTQ1ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgewotCS8qKgotCSAqIFByZXNlbnQgdG8gdGhlIHVzZXIgdGhhdCB0aGUgPGNvZGU+aW5jb25zaXN0ZW50RmlsZXM8L2NvZGU+IHdpbGwgbmVlZCB0byBiZSByZWZyZXNoZWQgaW4KLQkgKiB0aGUgd29ya2JlbmNoLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVmcmVzaCBzaG91bGQgb2NjdXIuIFRoZSBMaXN0IHdpbGwgYmUgYSBsaXN0IG9mIElGaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jb25zaXN0ZW50RmlsZXMKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHByb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250ZXh0IChTaGVsbCkgdGhhdCB3b3VsZCBiZSBwYXNzZWQgdG8gdGhlIHZhbGlkYXRlRWRpdCBtZXRob2QuIElmIHRoaXMgbWV0aG9kCi0JICogcmV0dXJucyBudWxsLCBhIHByb21wdCB0byBjaGVjayBvdXQgY29kZSB3aWxsIG5vdCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3ZhbGlkYXRlRWRpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZVtdLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlPYmplY3QgZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpOwotCi0JLyoqCi0JICogUHJlc2VudCBhIGRpYWxvZyB0byB0aGUgdXNlciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIGlzIGFib3V0IHRvIHNhdmUgYW5kIG92ZXJ3cml0ZSB0aGUKLQkgKiBsaXN0IG9mIDxjb2RlPmluY29uc2l0ZW50RmlsZXM8L2NvZGVzPi4gIFJldHVybiB0cnVlIGlmCi0JICogdGhlIG92ZXJ3cml0ZSBzaG91bGQgcHJvY2VlZC4gIFRoZSBsaXN0IG9mIDxjb2RlPmluY29uc2l0ZW50RmlsZXM8L2NvZGVzPiB3aWxsCi0JICogYmUgYSBsaXN0IG9mIElGaWxlcy4gCi0JICogQHBhcmFtIGluY29uc2lzdGVudEZpbGVzCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgYWN0aW9uIHRoYXQgaXMgYWJvdXQgdG8gZWRpdCBhbnkgY29udGVudHMgb2YgYW55IElGaWxlLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1ZhbGlkYXRlRWRpdEhlYWRsZXNzQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1ZhbGlkYXRlRWRpdEhlYWRsZXNzQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWM4ZWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDE4LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aSBIZWFkbGVzcyBWYWxpZGF0ZSBFZGl0IENvbnRleHQgSW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlRWRpdEhlYWRsZXNzQ29udGV4dCBpbXBsZW1lbnRzIElWYWxpZGF0ZUVkaXRDb250ZXh0IHsKLQotCXByb3RlY3RlZCBib29sZWFuIGZOZWVkc1N0YXRlVmFsaWRhdGlvbiA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZk1lc3NhZ2VVcCA9IGZhbHNlOwotCXByb3RlY3RlZCBFZGl0TW9kZWwgZlZhbGlkYXRvciA9IG51bGw7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dCN2YWxpZGF0ZVN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKCkgewotCQkvLyBGb3Igbm93IGRvIG5vdGhpbmcgaW4gaGVhZGxlc3Mgc3RhdGUKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNnZXRWYWxpZGF0ZUVkaXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlRWRpdENvbnRleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIjcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIjcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZVJlZnJlc2goamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZVJlZnJlc2goTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVmFsaWRhdGVFZGl0TGlzdGVuZXIjc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZWVkc1N0YXRlVmFsaWRhdGlvbihib29sZWFuIG5lZWRzU3RhdGVWYWxpZGF0aW9uKSB7Ci0JCWZOZWVkc1N0YXRlVmFsaWRhdGlvbiA9IG5lZWRzU3RhdGVWYWxpZGF0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0I3NldEVkaXRNb2RlbChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdE1vZGVsKEVkaXRNb2RlbCBmVmFsaWRhdG9yKSB7Ci0JCXRoaXMuZlZhbGlkYXRvciA9IGZWYWxpZGF0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQjdmFsaWRhdGVTdGF0ZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWwpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCXNldEVkaXRNb2RlbChlZGl0TW9kZWwpOwotCQlyZXR1cm4gdmFsaWRhdGVTdGF0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDk5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdiYTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuZW52IHBsdWdpbi4KLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBtYXN0ZXIgc3dpdGNoIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCBwbHVnaW4uCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2RlYnVnPXRydWUKLQotIyBUdXJuIG9uIGRpZmZlcmVudCB0cmFjaW5nIGxldmVsCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2luZm89dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93YXJuaW5nPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZXJyb3I9dHJ1ZQotCi0jIFR1cm4gb24gZGF0YSBmbG93IHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZGF0YT10cnVlCi0KLSMgVHVybiBvbiBjb21tYW5kIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvY29tbWFuZD10cnVlCi0KLSMgVHVybiBvbiBlbWl0dGVyIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZW1pdHRlcj10cnVlCi0KLSMgVHVybiBvbiB3ZWIgc2VydmljZSBhbnQgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93c19hbnQ9dHJ1ZQotCi0jIFR1cm4gb24gd2ViIHNlcnZpY2UgZGV0YWlsZWQgY29tbWFuZCBlbmdpbmUgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93c19kdF9jbWRfZW5naW5lPXRydWUKLQotIyBUdXJuIG9uIHdlYiBzZXJ2aWNlIGZyYW1ld29yayB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL3dzX2ZyYW1ld29yaz10cnVlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3MmVjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzdhNGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0jTW9uIEp1biAwOCAxNTozNTo0NSBFRFQgMjAwOQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZVVuY2hlY2tlZEV4Y2VwdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQzY2QwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6NDA6MjYgRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Njk3YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW4uRW52aXJvbm1lbnRQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZTt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjMwMCw0LjAuMCkiCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZSAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljNDAwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMDFhYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1FbnZpcm9ubWVudCBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDU4ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSBJU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UuCi0gKiBJdCBhbGxvd3MgY29kZSB0aGF0IGlzIHJlcG9ydGluZyBzdGF0dXMgdG8gc3BlY2lmeSBjaG9pY2VzIHRvIHRoZSB1c2VyCi0gKiB3aGljaCB0aGlzIHJlcG9ydGluZyBjb2RlIGNhbiByZWFjdCB0by4gCi0gKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hvaWNlIHsKLQotICBwcml2YXRlIGNoYXIgICBzaG9ydGN1dCA9ICcgJzsgCi0gIHByaXZhdGUgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotICAJCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENob2ljZS4KLQkgKi8KLQlwdWJsaWMgQ2hvaWNlKCkgewotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0JICogQHBhcmFtIHNob3J0Y3V0IHRoZSBzaW5nbGUgbGV0dGVyIHNob3J0Y3V0IGZvciB0aGlzIGNob2ljZS4KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBjaG9pY2UuCi0JICovCi0JcHVibGljIENob2ljZShjaGFyIHNob3J0Y3V0LCBTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5zaG9ydGN1dCA9IHNob3J0Y3V0OwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0gICAqIEBwYXJhbSBzaG9ydGN1dCB0aGUgc2luZ2xlIGxldHRlciBzaG9ydGN1dCBmb3IgdGhpcyBjaG9pY2UuCi0gICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciB0aGlzIGNob2ljZS4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNob2ljZS4KLQkgKi8KLQlwdWJsaWMgQ2hvaWNlKGNoYXIgc2hvcnRjdXQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuc2hvcnRjdXQgPSBzaG9ydGN1dDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFiZWwuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0Y3V0LgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGNoYXIKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRTaG9ydGN1dCgpIHsKLQkJcmV0dXJuIHNob3J0Y3V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3J0Y3V0LgotCSAqIEBwYXJhbSBzaG9ydGN1dCBUaGUgc2hvcnRjdXQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvcnRjdXQoY2hhciBzaG9ydGN1dCkgewotCQl0aGlzLnNob3J0Y3V0ID0gc2hvcnRjdXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDMyZDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgZm9yIGNvbmRpdGlvbnMgcmFpc2VkIGJ5IHRoZSBJRW52aXJvbm1lbnQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVudmlyb25tZW50RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzk3ODk4MzI3NTg5OTQwMjAzNkw7Ci0gIAotICAvKioKLSAgICogVGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgRW52aXJvbm1lbnRFeGNlcHRpb24gKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBFbnZpcm9ubWVudEV4Y2VwdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgRW52aXJvbm1lbnRFeGNlcHRpb24gKCBJU3RhdHVzIHN0YXR1cyApCi0gIHsKLSAgICBzdXBlcihzdGF0dXMgPT0gbnVsbCA/IG51bGwgOiBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2FlNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlLkNvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQ7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSBjb25zb2xlIGVudmlyb25tZW50LiAgSXQgYWxzbyBjb250YWlucyBzdGF0aWMKLSAqIGNvbnZpZW5jZXMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW4gSUxvZyBvYmplY3QgYXMgd2VsbCBhcyBhbiBFY2xpcHNlIGFuZAotICogRmlsZSBTY2hlbWUuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudFNlcnZpY2UKLXsKLSAgc3RhdGljIHByaXZhdGUgSUVudmlyb25tZW50IGVudmlyb25tZW50OwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gRWNsaXBzZSBjb25zb2xlIGVudmlyb25tZW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJRW52aXJvbm1lbnQgZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpCi0gIHsKLSAgICBpZiggZW52aXJvbm1lbnQgPT0gbnVsbCApIGVudmlyb25tZW50ID0gbmV3IENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoKTsKLSAgICAKLSAgICByZXR1cm4gZW52aXJvbm1lbnQ7IAotICB9ICAKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGFuIEVjbGlwc2UgbG9nZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJTG9nIGdldEVjbGlwc2VMb2coKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIAotICAgIHJldHVybiBlbnZpcm9ubWVudC5nZXRMb2coKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gRWNsaXBzZSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElVUklTY2hlbWUgZ2V0RWNsaXBzZVNjaGVtZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSVNjaGVtZSAgIHNjaGVtZSAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzY2hlbWUgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCkubmV3VVJJU2NoZW1lKCAicGxhdGZvcm0iICk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBzY2hlbWU7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBGaWxlIHNjaGVtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVVSSVNjaGVtZSBnZXRGaWxlU2NoZW1lKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJU2NoZW1lICAgc2NoZW1lICAgICAgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHNjaGVtZSA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKS5uZXdVUklTY2hlbWUoICJmaWxlIiApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7ICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc2NoZW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTAzYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeTsKLQotCi0vKioKLSAqIEFuIElFbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgbWVhbnMgZm9yIGdldHRpbmcgYSAKLSAqIDxvbD4KLSAqIDxsaT5BIGxvZyBmb3Igd3JpdGluZyBtZXNzYWdlcyB0byBhIGxvZ2dpbmcgZmFjaWxpdHksPC9saT4KLSAqIDxsaT5BIHByb2dyZXNzIG1vbml0b3IgZm9yIHJlY2VpdmluZyBwcm9ncmVzcyBpbmZvcm1hdGlvbiw8L2xpPgotICogPGxpPkEgc3RhdHVzIGhhbmRsZXIgZm9yIHJlY2VpdmluZyBhbmQgcHJvY2Vzc2luZyBzdGF0dXMgcmVwb3J0cyw8L2xpPgotICogPGxpPkEgZmFjdG9yeSBmb3IgdGhlIGhhbmRsaW5nIG9mIFVSSXMgKHJlc291cmNlcykuPC9saT4KLSAqIDwvb2w+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRW52aXJvbm1lbnQKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgYSBsb2dnaW5nIGZhY2lsaXR5LgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS4KLSAgICovCi0gIHB1YmxpYyBJTG9nIGdldExvZyAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIHN0YXR1cyBoYW5kbGVyLgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgc3RhdHVzIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgSVN0YXR1c0hhbmRsZXIgZ2V0U3RhdHVzSGFuZGxlciAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIElVUkkgZmFjdG9yeS4KLSAgICogSGludDogSW1wbGVtZW50ZXJzIHNob3VsZCBpbnN1cmUgdGhhdCB0aGUgRmFjdG9yeSB0aGV5IHJldHVybgotICAgKiBoYXMgYSByZWZlcmVuY2UgdG8gdGhpcyBJRW52aXJvbm1lbnQgc28gdGhhdCBJVVJJIG9iamVjdHMgY2FuCi0gICAqIHJlcG9ydCBwcm9ncmVzcyBhbmQgYW5ub3VuY2Ugc3RhdHVzLgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgVVJJIGZhY3RvcnkuCi0gICAqLwotICBwdWJsaWMgSVVSSUZhY3RvcnkgZ2V0VVJJRmFjdG9yeSAoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTFmY2FiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBJTG9nIG9iamVjdHMgcHJvdmlkZSBhIG1lYW5zIGZvciBsb2dnaW5nIGluZm9ybWF0aW9uIGZvciBGRkRDIGV0Yy4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2cKLXsKLSAgLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgT2suCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IDA7Ci0gIAotICAvKioKLSAgICogVGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBpbmZvcm1hdGlvbmFsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IDE7Ci0gIAotICAvKioKLSAgICogVGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyB3YXJuaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0gIAotICAvKioKLSAgICogVGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBhbiBlcnJvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gNDsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZC4KLSAgICogVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgYXR0ZW1wdGluZwotICAgKiBhIGNhbGwgdG8gb25lIG9mIHRoZSA8Y29kZT5sb2c8L2NvZGU+IG1ldGhvZHMsIGFzIHRoZXkgd2lsbAotICAgKiBxdWlldGx5IGRvIG5vdGhpbmcgaWYgbG9nZ2luZyBpcyBkaXNhYmxlZC4gVGhpcyBtZXRob2QgY2FuIGJlCi0gICAqIHVzZWZ1bCwgaG93ZXZlciwgYW55d2hlcmUgdGhlIGNvc3Qgb2YgYnVpbGRpbmcgdXAgdGhlIHBhcmFtZXRlcnMKLSAgICogdG8gYSBsb2cgbWV0aG9kIG1pZ2h0IGJlIGhpZ2ggYW5kIGJlc3QgYXZvaWRlZCBleGNlcHQgd2hlbiBsb2dnaW5nCi0gICAqIGlzIGVuYWJsZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBsb2dnaW5nIGlzIGVuYWJsZWQsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQgKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGVidWcgb3B0aW9uIGlzIHNldCB0byB0cnVlLgotICAgKiAKLSAgICogQHBhcmFtIG9wdGlvbiB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoaXMgZGVidWcgb3B0aW9uIGlzIHNldCB0byB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkIChTdHJpbmcgb3B0aW9uKTsKLQotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgVGhyb3dhYmxlIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUgKTsKLSAgCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG9wdGlvbiB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBUaHJvd2FibGUgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSApOwotCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBTdGF0dXMgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgSVN0YXR1cyBzdGF0dXMgKTsKLSAgCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG9wdGlvbiB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgU3RhdHVzIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIElTdGF0dXMgc3RhdHVzICk7Ci0KLSAgLyoqCi0gICAqIExvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBPYmplY3QgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCApOwotICAKLSAgLyoqCi0gICAqIExvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG9wdGlvbiB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIG9iamVjdCBUaGUgT2JqZWN0IHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTJhOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIFByb2Nlc3NlcyBzdGF0dXMgZXZlbnRzIHJhaXNlZCBieSB0aGUgY2FsbGVyIGFuZCByZXR1cm5zIGFuCi0gKiBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gKiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIGFnYWluc3QgdGhlIGNhbGxlciB0byBoYXZlIHRoZW0gYWJvcnQKLSAqIHByb2Nlc2luZy4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0dXNIYW5kbGVyCi17Ci0gIC8qKgotICAgKiBSZXBvcnRzIHRoZSBnaXZlbiBTdGF0dXMgYW5kIHNldCBvZiBwb3NzaWJsZSByZXNwb25zZXMuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgdG8gcmVwb3J0LgotICAgKiBAcGFyYW0gY2hvaWNlcyB0aGUgY2hvaWNlcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGNob2ljZSBtYWRlIGJ5IHRoZSB1c2VyL2hhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgQ2hvaWNlIHJlcG9ydCAoIElTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzICk7Ci0gIAotICAvKioKLSAgICogUmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIHdpdGggaW1wbGllZCBvcHRpb25zIHRvIGVpdGhlcgotICAgKiBjb250aW51ZSBvciBhYm9ydC4KLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIHRvIHJlcG9ydC4KLSAgICogQHRocm93cyBTdGF0dXNFeGNlcHRpb24gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaGFuZGxlciBkZWNpZGVzIHRoZSBjYWxsZXIKLSAgICogc2hvdWxkIHN0b3AgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydCAoIElTdGF0dXMgc3RhdHVzICkgdGhyb3dzIFN0YXR1c0V4Y2VwdGlvbjsKLSAgCi0gIC8qKgotICAgKiBSZXBvcnQgdGhlIGdpdmVuIEVycm9yIFN0YXR1cy4gIE5vIHVzZXIgZmVlZGJhY2sgaXMgcHJvdmlkZWQuCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIHN0YXR1cyB0byByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvciggSVN0YXR1cyBzdGF0dXMgKTsKLSAgCi0gIC8qKgotICAgKiBSZXBvcnQgdGhlIGdpdmVuIEluZm8gU3RhdHVzLiAgTm8gdXNlciBmZWVkYmFjayBpcyBwcm92aWRlZC4KLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgaW5mbyBzdGF0dXMgdG8gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyggSVN0YXR1cyBzdGF0dXMgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMWYxZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS4KLSAqIAotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIE51bGxTdGF0dXNIYW5kbGVyIGltcGxlbWVudHMgSVN0YXR1c0hhbmRsZXIKLXsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkNob2ljZVtdKQotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQoSVN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMpIAotICB7Ci0gIAlDaG9pY2UgcmVzdWx0ID0gbnVsbDsKLSAgCQotICAJLy8gQWx3YXlzIHRha2UgdGhlIGZpcnN0IGNob2ljZSBpZiBhdmFpbGFibGUuCi0gICAgaWYoIGNob2ljZXMgIT0gbnVsbCAmJiBjaG9pY2VzLmxlbmd0aCA+IDAgKQotICAgIHsKLSAgICAJcmVzdWx0ID0gY2hvaWNlc1swXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KElTdGF0dXMgc3RhdHVzKSB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgLyoKLSAgICogUmVwb3J0IGFuZCBlcnJvci4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZXBvcnRFcnJvclN0YXR1cyhJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlciNyZXBvcnRFcnJvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgcmVwb3J0RXJyb3JTdGF0dXMoIHN0YXR1cyApOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRJbmZvKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxYjhjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIGJ5IFN0YXR1c0hhbmRsZXJzIHRvIHRlbGwgdGhlaXIKLSAqIGNhbGxlcnMgdGhhdCBwcm9jZXNzaW5nIHNob3VsZCBzdG9wLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNFeGNlcHRpb24gZXh0ZW5kcyBFbnZpcm9ubWVudEV4Y2VwdGlvbgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICogKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzYxODE0MTE2MDMyMjExOTk5Mkw7Ci0KLSAgLyoqCi0gICAqIFRoZSBDaG9pY2UgdGhhdCBsZWFkIHRvIHRoZSBleGNlcHRpb24gYmVpbmcgdGhyb3duLAotICAgKiBpZiBhbnkgKGllLiBtYXkgYmUgbnVsbCkuCi0gICAqLwotICBwcm90ZWN0ZWQgQ2hvaWNlIGNob2ljZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiggSVN0YXR1cyBzdGF0dXMgKQotICB7Ci0gICAgc3VwZXIoIHN0YXR1cyApOyAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBDaG9pY2UuCi0gICAqIFRoZSBDaG9pY2UgbWF5IGJlIG51bGwuCi0gICAqIEBwYXJhbSBjaG9pY2UgdGhlIGNob2ljZSBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgU3RhdHVzRXhjZXB0aW9uICggQ2hvaWNlIGNob2ljZSApCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuY2hvaWNlID0gY2hvaWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIENob2ljZQotICAgKiBhbmQgc3RhdHVzIG9iamVjdC4gVGhlIENob2ljZSBtYXkgYmUgbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqIEBwYXJhbSBjaG9pY2UgdGhlIGNob2ljZSBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgU3RhdHVzRXhjZXB0aW9uICggSVN0YXR1cyBzdGF0dXMsIENob2ljZSBjaG9pY2UgKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzKTsKLSAgICB0aGlzLmNob2ljZSA9IGNob2ljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIENob2ljZSBvYmplY3QgaW5zaWRlIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIENob2ljZSBnZXRDaG9pY2UgKCkKLSAgewotICAgIHJldHVybiBjaG9pY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTYzYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEEgSVVSSSByZXByZXNlbnRzIGEgVW5pdmVyYWwgUmVzb3VyY2UgSWRlbnRpZmVyLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSSQotewotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgSVVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBJVVJJU2NoZW1lIGZvciB0aGUgc2NoZW1lIG9mIHRoaXMgSVVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKi8KLSAgcHVibGljIElVUklTY2hlbWUgZ2V0VVJJU2NoZW1lICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJIGV4aXN0cy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMKLSAgICogYW5kIGlzIGEgbGVhZi4gUmV0dXJucyB0cnVlIGFsd2F5cyBmb3Igbm9uLWhpZXJhcmNoaWNhbCBzY2hlbWVzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMZWFmICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJIGV4aXN0cwotICAgKiBhbmQgaXMgcmVhZGFibGUuIEEgcmVhZGFibGUgbGVhZiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBhbgotICAgKiBpbnB1dCBzdHJlYW0gY2FuIGJlIG9wZW5lZCBvbiB0aGUgcmVzb3VyY2UuIEEgcmVhZGFibGUgZm9sZGVyCi0gICAqIHJlc291cmNlIGluZGljYXRlcyB0aGF0IHRoZSBjaGlsZHJlbiBvZiB0aGUgZm9sZGVyLCBpZiBhbnksCi0gICAqIGNhbiBiZSBkZXRlcm1pbmVkIHZpYSB0aGUgbGlzdCgpIG9yIHZpc2l0KCkgbWV0aG9kcy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkgZXhpc3RzCi0gICAqIGFuZCBpcyB3cml0YWJsZS4gQSB3cml0YWJsZSBsZWFmIHJlc291cmNlIGluZGljYXRlcyB0aGF0IGFuCi0gICAqIG91dHB1dCBzdHJlYW0gY2FuIGJlIG9wZW5lZCBvbiB0aGUgcmVzb3VyY2UuIEEgd3JpdGFibGUgZm9sZGVyCi0gICAqIHJlc291cmNlIGluZGljYXRlcyB0aGF0IG5ldyByZXNvdXJjZXMgY2FuIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGRlci4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmZiB0aGlzIElVUkkgYmVsb25ncyB0byBhIGhpZXJhcmNoaWNhbCBzY2hlbWUuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICogdGhpcy5pc0hpZXJhcmNoaWNhbCgpID09IHRoaXMuZ2V0VVJJU2NoZW1lKCkuaXNIaWVyYXJjaGljYWwoKS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBJVVJJIGlzIGEgcmVsYXRpdmUgSVVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBJVVJJIG9mIHRoZSBmb2xkZXIgY29udGFpbmluZyB0aGlzIElVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gcGFyZW50IFVSSS4KLSAgICovCi0gIHB1YmxpYyBJVVJJIHBhcmVudCAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcGFyYW0gcmVsYXRpdmVVUkkgYSByZWxhdGl2ZSBVUkkuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldywgbm9ybWFsaXplZCBJVVJJIGZvcm1lZCBieSBhcHBlbmRpbmcgdGhlIGdpdmVuCi0gICAqIHJlbGF0aXZlIElVUkkgdG8gdGhpcyBJVVJJLiBCb3RoIFVSSXMgbXVzdCBiZSBoaWVyYXJjaGljYWwuCi0gICAqIFRoZSByZXN1bHRpbmcgSVVSSSB3aWxsIGFsd2F5cyBiZSBoaWVyYXJjaGljYWwuIFRoZSBnaXZlbgotICAgKiBJVVJJIG11c3QgYmUgcmVsYXRpdmUuIFRoaXMgSVVSSSBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuCi0gICAqIHRoZSByZXN1bHRpbmcgSVVSSSB3aWxsIGJlIGVxdWl2YWxlbnRseSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgcmVsYXRpdmVVUkkgaXMgbm90IHJlbGF0aXZlLgotICAgKi8KLSAgcHVibGljIElVUkkgYXBwZW5kICggSVVSSSByZWxhdGl2ZVVSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gR2V0cyBhbiBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyBmcm9tIHRoZSByZXNvdXJjZQotICAgKiBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIElVUkkuCi0gICAqIAotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhIHN0cmVhbSBmb3IgdGhpcyBVUkkgY2FuIG5vdCBiZSBjcmVhdGVkLgotICAgKi8KLSAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gR2V0cyBhbiBPdXRwdXRTdHJlYW0gZm9yIHdyaXRpbmcgdG8gdGhlIHJlc291cmNlCi0gICAqIGlkZW50aWZpZWQgYnkgdGhpcyBsZWFmIG9yIG5vbi1oaWVyYXJjaGljYWwgSVVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYSBzdHJlYW0gZm9yIHRoaXMgVVJJIGNhbiBub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gICAqIHRoZSBJVVJJLiBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IHRydWUuIElmIGEgbGVhZgotICAgKiByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBJZiBhCi0gICAqIG5vbi1sZWFmIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIHVuZGVyIHRoaXMgSVVSSSwgY3JlYXRpb24KLSAgICogd2lsbCBmYWlsIGFuZCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB0b3VjaGluZyB0aGlzIGxlYWYgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaExlYWYgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBmb2xkZXIgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIGlkZW50aWZpZWQgYnkKLSAgICogdGhlIElVUkkuIFRoZSBzY2hlbWUgb2YgdGhlIElVUkkgbXVzdCBiZSBoaWVyYXJjaGljYWwuCi0gICAqIE9uIGNvbXBsZXRpb24sIHRoaXMuaXNMZWFmKCkgPT0gZmFsc2UuIElmIGEgZm9sZGVyIHJlc291cmNlCi0gICAqIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEgbGVhZiByZXNvdXJjZQotICAgKiBhbHJlYWR5IGV4aXN0cyB1bmRlciB0aGlzIElVUkksIGNyZWF0aW9uIHdpbGwgZmFpbCBhbmQgYW4KLSAgICogZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdG91Y2hpbmcgdGhpcyBmb2xkZXIgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlciAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBFcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgZXJhc2luZyB0aGlzIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2UgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmVuYW1lcyBvciBtb3ZlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkKLSAgICogdG8gdGhlIG5ldyBJVVJJLgotICAgKiBAcGFyYW0gbmV3VVJJIHRoZSBuZXcgVVJJIG5hbWUgZm9yIHRoaXMgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgcmVuYW1pbmcgdGhpcyByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbmFtZSAoIElVUkkgbmV3VVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogVmlzaXRzIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBkZWNlbmRhbnRzIGluIHByZS1vcmRlciBmYXNoaW9uLgotICAgKiBGb3IgZWFjaCByZXNvdXJjZSwgd2hldGhlciBhIGZvbGRlciBvciBhIGxlYWYsIHRoZSBnaXZlbgotICAgKiBJVVJJVmlzaXRvcidzIHZpc2l0KCkgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBJVVJJIG9mIHRoZQotICAgKiByZXNvdXJjZS4gSWYgSVVSSVZpc2l0b3IudmlzaXQoKSByZXR1cm5zIGZhbHNlLCB0aGUgdmlzaXRpbmcKLSAgICogYWxnb3JpdGhtIHdpbGwgInBydW5lIiB0aGUgZGVjZW5kYW50cyBvZiB0aGUgcmVzb3VyY2UgYW5kCi0gICAqIGNhcnJ5IG9uIHZpc2l0aW5nIHRoZSByZXN0IG9mIHRoZSB0cmVlLiBJZiBJVVJJVmlzaXRvci52aXNpdCgpCi0gICAqIHJldHVybnMgdHJ1ZSwgdGhlIHZpc2l0aW5nIGFsZ29yaXRobSB3aWxsIGNvbnRpbnVlIGl0cyB3YWxrCi0gICAqIGRvd24gdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMuCi0gICAqIEBwYXJhbSB1cmlWaXNpdG9yIHRoZSB2aXNpdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcmVzb3VyY2UgdmlzaXRlZC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHZpc2l0aW5nIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0ICggSVVSSVZpc2l0b3IgdXJpVmlzaXRvciApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEFzIGZvciB2aXNpdChJVVJJVmlzaXRvciksIGV4Y2VwdCBvbmx5IHJlc291cmNlIFVSSXMgdGhhdCBhcmUKLSAgICogYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlciBhcmUgdmlzaXRlZC4gSWYgYSBmb2xkZXIgcmVzb3VyY2UKLSAgICogZmFpbHMgdG8gYmUgYWNjZXB0ZWQgYnkgdGhlIGZpbHRlciwgdGhpcyB3aWxsIG5vdCBwcmV2ZW50IHRoZQotICAgKiB2aXNpdGluZyBhbGdvcml0aG0gZnJvbSB3YWxraW5nIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRhbnRzLgotICAgKiBJdCByZW1haW5zIHRoZSBqb2Igb2YgdGhlIHZpc2l0b3IgdG8gY2hvb3NlIHdoZXRoZXIgb3Igbm90IHRvCi0gICAqIHBydW5lIGEgYnJhbmNoIGJ5IHJldHVybmluZyBmYWxzZSBvciB0cnVlLgotICAgKiBAcGFyYW0gdXJpVmlzaXRvciB0aGUgdmlzaXRvciB0aGF0IHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHJlc291cmNlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSB1cmlGaWx0ZXIgdGhlIHJlc291cmNlIGZpbHRlci4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHZpc2l0aW5nIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0ICggSVVSSVZpc2l0b3IgdXJpVmlzaXRvciwgSVVSSUZpbHRlciB1cmlGaWx0ZXIgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBVUklzIGZvciB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICAgKiBoaWVyYXJjaGljYWwsIG5vbi1sZWFmIElVUkkuIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCwKLSAgICogdGhvdWdoIGl0IG1heSByZXR1cm4gYSB6ZXJvIGxlbmd0aCBhcnJheS4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBjaGlsZHJlbiBmb3IgdGhpcyBVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBsb2NhdGluZyB0aGUgY2hpbGRyZW4gZm9yIHRoaXMgVVJJLgotICAgKi8KLSAgcHVibGljIElVUklbXSBsaXN0ICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEFzIGZvciBsaXN0KCksIGV4Y2VwdCBvbmx5IFVSSXMgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuCi0gICAqIGZpbHRlciBhcmUgcmV0dXJuZWQgaW4gdGhlIGFycmF5LiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsCi0gICAqIHRob3VnaCBpdCBtYXkgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCi0gICAqIEBwYXJhbSB1cmlGaWx0ZXIgdGhlIGNoaWxkIGZpbHRlci4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaWx0ZXJlZCBjaGlsZHJlbiBmb3IgdGhpcyBVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBsb2NhdGluZyB0aGUgY2hpbGRyZW4gZm9yIHRoaXMgVVJJLgotICAgKi8KLSAgcHVibGljIElVUklbXSBsaXN0ICggSVVSSUZpbHRlciB1cmlGaWx0ZXIgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXNVUkwoKSBtZXRob2QgaXMgZmFpciBnYW1lLAotICAgKiBpbiBvdGhlciB3b3JkcywgaWYgdGhpcyBJVVJJIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIFVSTC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFVSTCBvYmplY3QgZm9yIHRoZSByZXNvdXJjZSB1bmRlciB0aGlzIElVUkkuCi0gICAqIFRoZXJlIGFyZSBtYW55IFVSSXMgYW5kIFVSSVNjaGVtZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kCi0gICAqIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gICAqIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIHJlcHJlc2VudGFibGUgYXMgVVJMcy4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHJldHVybmluZyB0aGlzIFVSTC4KLSAgICovCi0gIHB1YmxpYyBVUkwgYXNVUkwgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzRmlsZSgpIG1ldGhvZCBpcyBmYWlyIGdhbWUsCi0gICAqIGluIG90aGVyIHdvcmRzLCBpZiB0aGlzIElVUkkgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEgRmlsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBGaWxlIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgSVVSSS4KLSAgICogVGhlcmUgYXJlIG1hbnkgVVJJcyBhbmQgVVJJU2NoZW1lcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QKLSAgICogd2lsbCBmYWlsIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uIEl0IHNob3VsZCBiZSB1c2VkIG9ubHkKLSAgICogaW4gY2FzZXMgd2hlcmUgVVJJcyBhcmUga25vd24gdG8gYmUgYmFja2VkIGJ5IHBoeXNpY2FsIGZpbGVzLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgcmV0dXJuaW5nIHRoaXMgRmlsZS4KLSAgICovCi0gIHB1YmxpYyBGaWxlIGFzRmlsZSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIElVUkkgYXMgYSBzdHJpbmcuCi0gICAqIEVxdWl2YWxlbnQgdG8gdG9TdHJpbmcoKS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcgKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODczNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoaXMgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgSVVSSSBhbmQgSVVSSVNjaGVtZSBvYmplY3RzLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSSUZhY3RvcnkKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy4KLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRvIGJlIGNyZWF0ZWQuCi0gICAqIEByZXR1cm4gdGhlIG5ldyBVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHRoZSB1cmkgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbGlkIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSSAoIFN0cmluZyB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuCi0gICAqIEBwYXJhbSB1cmwgdGhlIHVybCB0byB1c2UgdG8gY3JlYXRlIHRoaXMgVVJJCi0gICAqIEByZXR1cm4gdGhlIG5ldyBVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHRoZSB1cmwgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbGlkIHVybC4KLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSSAoIFVSTCB1cmwgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUklTY2hlbWUgZm9yIHRoZSBnaXZlbiBzY2hlbWUgc3RyaW5nLgotICAgKiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbG9ucywgdGhlIGVudGlyZSBzdHJpbmcgaXMgaW50ZXJwcmV0dGVkCi0gICAqIGFzIHRoZSBuYW1lIG9mIHRoZSBzY2hlbWUuIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYSBjb2xvbiwgdGhlbiB0aGUKLSAgICogc3Vic3RyaW5nIHVwIHRvIGJ1dCBleGNsdWRpbmcgdGhlIGZpcnN0IGNvbG9uIGlzIGludGVycHJldHRlZCBhcyB0aGUKLSAgICogbmFtZSBvZiB0aGUgc2NoZW1lLCBtZWFuaW5nIHRoZSBjYWxsZXIgY2FuIHBhc3MgaW4gYW55IElVUkkgc3RyaW5nIGluCi0gICAqIG9yZGVyIHRvIGdldCBhIElVUklTY2hlbWUgb2JqZWN0LgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtZU9yVVJJIHRoZSBzY2hlbWUgb3IgVVJJIGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSBzY2hlbWUuCi0gICAqIEByZXR1cm4gdGhlIG5ldyBTY2hlbWUuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHNjaGVtZU9yVXJpIHBhcmFtZXRlciBkb2VzIG5vdCBjb250YWluCi0gICAqIGEgdmFsaWQgc2NoZW1lIG9yIFVSSSBuYW1lLgotICAgKi8KLSAgcHVibGljIElVUklTY2hlbWUgbmV3VVJJU2NoZW1lICggU3RyaW5nIHNjaGVtZU9yVVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ODVjMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHZpc2l0IG9yIGxpc3QgVVJJcy4KLSAqIFJlZmVyIHRvIHtAbGluayBJVVJJI2dldENoaWxkcmVufS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUklGaWx0ZXIKLXsKLSAgLyoqCi0gICAqIEZpbHRlcnMgdGhlIGdpdmVuIElVUkkuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIHRvIGZpbHRlci4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZXNvdXJjZSBtYXRjaGVzIHRoZSBmaWx0ZXIsCi0gICAqIGZhbHNlIGlmIGl0IGRvZXMgbm90LgotICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLgotICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHVyaSBpcyBhY2NlcHRlZC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gSWYgdGhlIGZpbHRlciBmYWlscyB0byBhbmFseXplIHRoZSByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFjY2VwdHMgKCBJVVJJIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjg3NjA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEEgSVVSSVNjaGVtZSByZXByZXNlbnRzIGEgc2luZ2xlIHNjaGVtZSBmb3Igc29tZSBhIGZhbWlseSBvZgotICogVW5pdmVyYWwgUmVzb3VyY2UgSWRlbnRpZmllcnMuIEV4YW1wbGVzIGluY2x1ZGUgImZpbGUiLCAiaHR0cCIKLSAqIGFuZCAicGxhdGZvcm0iIChFY2xpcHNlKS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUklTY2hlbWUKLXsKLSAgLyoqCi0gICAqIEBwYXJhbSB1cmkgdGhlIFVSSSB0byBiZSBjcmVhdGVkLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgSVVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgdGhlIHVyaSBzcGVjaWZpZWQgaXMgbm90IHZhbGlkIG9yCi0gICAqIGNhbiBub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSSAoIFN0cmluZyB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdXJsIHRoZSB1cmwgdXNlZCB0byBjcmVhdGUgdGhlIFVSSS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IElVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHRoZSB1cmwgc3BlY2lmaWVkIGlzIG5vdCB2YWxpZCBvcgotICAgKiBjYW4gbm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkgKCBVUkwgdXJsICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRvIGJlIGNyZWF0ZWQuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBJVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGUgdXJpIHNwZWNpZmllZCBpcyBub3QgdmFsaWQgb3IKLSAgICogY2FuIG5vdCBiZSBjcmVhdGVkLgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJICggSVVSSSB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb3BlciBuYW1lIG9mIHRoZSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIHNjaGVtZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsICgpOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdG8gY2hlY2sgZm9yIHZhbGlkaXR5LgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gSVVSSSBzYXRpc2ZpZXMgdGhlCi0gICAqIGdyYW1tYXRpY2FsIHJlcXVpcmVtZW50cyBvZiB0aGUgc2NoZW1lLiBBYnNvbHV0ZSBVUklzIG11c3QKLSAgICogYmVnaW4gd2l0aCAiPHNjaGVtZT46Ii4gUmVsYXRpdmUgVVJJcyBtdXN0IGVpdGhlciBub3QgY29udGFpbgotICAgKiBhIGNvbG9uLCAiOiIsIG9yIGl0IG11c3QgYmVnaW4gd2l0aCAiLi8iLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCAoIElVUkkgdXJpICk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB1cmkgdGhlIHVyaSB0byBjaGVjayBmb3IgdmFsaWRpdHkuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4KLSAgICogSVVSSSBpcyB2YWxpZC4gVGhlIHNldmVyaXR5IGFuZCBtZXNzYWdlIG9mIHRoZSBTdGF0dXMgb2JqZWN0Ci0gICAqIHdpbGwgZGVzY3JpYmUgdGhpcy4KLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlICggSVVSSSB1cmkgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2YTNkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHZpc2l0IFVSSXMuCi0gKiBSZWZlciB0byB7QGxpbmsgSVVSSSN2aXNpdH0uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJVmlzaXRvcgotewotICAvKioKLSAgICogVmlzaXRzIHRoZSBnaXZlbiBJVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSB0byB2aXNpdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRhbnRzIHNob3VsZCBiZSB2aXNpdGVkLAotICAgKiBvciBmYWxzZSBpZiB0aGV5IHNob3VsZCBub3QgYmUgdmlzaXRlZC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gSWYgdGhlIHZpc2l0IG1ldGhvZCBmYWlscy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHZpc2l0ICggSVVSSSB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzM2M2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmUuUmVsYXRpdmVTY2hlbWU7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVVSSUZhY3RvcnkgaW50ZXJmYWNlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVVUklGYWN0b3J5IGltcGxlbWVudHMgSVVSSUZhY3RvcnkKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgc2NoZW1lc18gPSBuZXcgSGFzaHRhYmxlKCk7ICAKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdG8gYmUgY3JlYXRlZC4KLSAgICogQHJldHVybiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGlzIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShTdHJpbmcgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IG5ld1VSSVNjaGVtZSggdXJpLCBmYWxzZSApOwotICAgIAotICAgIHJldHVybiBzY2hlbWUubmV3VVJJKCB1cmkgKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdXJsIHRoZSB1cmwgdG8gdXNlIHRvIGNyZWF0ZSB0aGlzIHVyaS4KLSAgICogQHJldHVybiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGlzIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShVUkwgdXJsKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IG5ld1VSSVNjaGVtZSggdXJsLnRvU3RyaW5nKCksIGZhbHNlICk7Ci0gICAgCi0gICAgcmV0dXJuIHNjaGVtZS5uZXdVUkkoIHVybCApOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzY2hlbWVPclVSSSB0aGUgc2NoZW1lIG5hbWUgb3IgVVJJIGZyb20gd2hpY2ggdGhpcyBzY2hlbWUgaXMgCi0gICAqIHRvIGJlIGNyZWF0ZWQuCi0gICAqIEByZXR1cm4gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBubyBjb2xvbnMsIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGludGVycHJldHRlZAotICAgKiBhcyB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lLiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgY29sb24sIHRoZW4gdGhlCi0gICAqIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gICAqIG5hbWUgb2YgdGhlIHNjaGVtZSwgbWVhbmluZyB0aGUgY2FsbGVyIGNhbiBwYXNzIGluIGFueSBJVVJJIHN0cmluZyBpbgotICAgKiBvcmRlciB0byBnZXQgYSBJVVJJU2NoZW1lIG9iamVjdC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoaXMgVVJJIHNjaGVtZS4KLSAgICovCi0gIHB1YmxpYyBJVVJJU2NoZW1lIG5ld1VSSVNjaGVtZShTdHJpbmcgc2NoZW1lT3JVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXdVUklTY2hlbWUoIHNjaGVtZU9yVVJJLCB0cnVlICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCByZWdpc3RlcnMgYSBzY2hlbWUgZm9yIGEgcGFydGljdWxhciBwcm90b2NvbC4KLSAgICogCi0gICAqIEBwYXJhbSBwcm90b2NvbCB0aGUgcHJvdG9jb2wuCi0gICAqIEBwYXJhbSBzY2hlbWUgdGhlIHNjaGVtZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyU2NoZW1lKCBTdHJpbmcgcHJvdG9jb2wsIElVUklTY2hlbWUgc2NoZW1lICkKLSAgewotICAgIHNjaGVtZXNfLnB1dCggcHJvdG9jb2wsIHNjaGVtZSApOwotICB9Ci0gIAotICBwcml2YXRlIElVUklTY2hlbWUgbmV3VVJJU2NoZW1lKFN0cmluZyBzY2hlbWVPclVSSSwgYm9vbGVhbiBjaGVja0ZvclNjaGVtZSApIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElVUklTY2hlbWUgbmV3U2NoZW1lID0gbnVsbDsKLSAgICAKLSAgICBpZiggc2NoZW1lT3JVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfTlVMTF9BUkdfU1BFQ0lGSUVELCAibmV3VVJJU2NoZW1lIiksIG51bGwgKSApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIGludCBjb2xvbiAgICA9IHNjaGVtZU9yVVJJLmluZGV4T2YoJzonKTsKLSAgICBpbnQgc2xhc2ggICAgPSBzY2hlbWVPclVSSS5pbmRleE9mKCcvJyk7Ci0gICAgCi0gICAgLy8gQSBwcm90b2NvbCB3YXMgc3BlY2lmaWVkLiAgTm90ZTogYSBjb2xvbiBhcHBlYXJpbmcgYWZ0ZXIgYSBwYXRoIGlzIG5vdAotICAgIC8vIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHJvdG9jb2wgZm9yIHRoaXMgSVVSSS4KLSAgICBpZiggKCBjaGVja0ZvclNjaGVtZSAmJiBjb2xvbiA9PSAtMSApIHx8Ci0gICAgICAgICggY29sb24gIT0gLTEgJiYgc2xhc2ggPT0gLTEpIHx8IAotICAgICAgICAoIGNvbG9uICE9IC0xICYmIGNvbG9uIDwgc2xhc2ggKSApCi0gICAgewotICAgICAgLy8gSWYgY29sb24gaXMgLTEgdGhlbiB3ZSB3aWxsIHRyZWF0IHRoZSBlbnRpcmUgaW5wdXQgcGFyYW1ldGVyIGFzIHRoZSBwcm90b2NvbC4KLSAgICAgIGlmKCBjb2xvbiA9PSAtMSApIGNvbG9uID0gc2NoZW1lT3JVUkkubGVuZ3RoKCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBwcm90b2NvbCA9IHNjaGVtZU9yVVJJLnN1YnN0cmluZygwLCBjb2xvbiApOwotICAgICAgbmV3U2NoZW1lICAgICAgID0gKElVUklTY2hlbWUpc2NoZW1lc18uZ2V0KCBwcm90b2NvbCApOwotICAgICAgCi0gICAgICBpZiggbmV3U2NoZW1lID09IG51bGwgKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19TQ0hFTUVfTk9UX0ZPVU5ELCBzY2hlbWVPclVSSSApLCBudWxsICkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggc2NoZW1lT3JVUkkuc3RhcnRzV2l0aCggIi8iKSApIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfQUJTT0xVVEVfUEFUSF9XSVRIT1VUX1NDSEVNRSwgc2NoZW1lT3JVUkkgKSwgbnVsbCApICk7Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG5ld1NjaGVtZSA9IG5ldyBSZWxhdGl2ZVNjaGVtZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmV3U2NoZW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiNzU0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9zdCBleGNlcHRpb25zIHRocm93biBieSBJVVJJIGNsYXNzZXMuCi0gKiBFdmVyeSBVUklFeGNlcHRpb24gY2FycmllcyBhIElVUkkgYW5kIGEgU3RhdHVzLCBlYWNoIG9mIHdoaWNoIG1heQotICogYmUgbnVsbC4gVGhlIGdldE1lc3NhZ2UoKSBtZXRob2QgYXMgaW5oZXJpdGVkIGZyb20gRXhjZXB0aW9uIHdpbGwKLSAqIHJldHVybiB0aGUgbWVzc2FnZSBmcm9tIHRoZSBVUklFeGNlcHRpbidzIFN0YXR1cyBvYmplY3QsIGlmIGFueS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVVJJRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODEzMDI3MTQyNDc1NjAxOEw7Ci0KLSAgLyoqCi0gICAqIEEgU3RhdHVzIG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGV4Y2VwdGlvbiwKLSAgICogaWYgYXBwbGljYWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJU3RhdHVzIHN0YXR1czsKLQotICAvKioKLSAgICogVGhlIElVUkkgZm9yIHdoaWNoIHRoZSBleGNlcHRpb24gb2NjdXJlZCwKLSAgICogaWYgYXBwbGljYWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJVVJJIHVyaTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBVUklFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotICAgKiBUaGUgc3RhdHVzIG1heSBiZSBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFVSSUV4Y2VwdGlvbiAoIElTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBVUklFeGNlcHRpb24gZm9yIHRoZSBnaXZlbiBTdGF0dXMgYW5kIElVUkksCi0gICAqIGVhY2ggb2Ygd2hpY2ggbWF5IGJlIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgVVJJRXhjZXB0aW9uICggSVN0YXR1cyBzdGF0dXMsIElVUkkgdXJpICkKLSAgewotICAgIHN1cGVyKHN0YXR1cyAhPSBudWxsID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6IG51bGwpOwotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgU3RhdHVzIG9iamVjdCBpbnNpZGUgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMgKCkKLSAgewotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBJVVJJIGluc2lkZSB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJVVJJIGdldFVSSSAoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDJmMzAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5OdWxsU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZS5GaWxlU2NoZW1lOwotCi0KLS8qKgotICogIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBhIGhlYWRsZXNzIEVjbGlwc2UgZW52aXJvbm1lbnQuICAKLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQgaW1wbGVtZW50cyBJRW52aXJvbm1lbnQKLXsKLQlwcml2YXRlIFNpbXBsZVVSSUZhY3RvcnkgIHVyaUZhY3RvcnlfICAgICAgPSBudWxsOwotCXByaXZhdGUgSVN0YXR1c0hhbmRsZXIgICAgIHN0YXR1c0hhbmRsZXJfICAgPSBudWxsOwotCSAgCi0JcHVibGljIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoKQotCXsKLQkgIHRoaXMoIG5ldyBOdWxsU3RhdHVzSGFuZGxlcigpICk7CQotCX0KLQkKLQlwdWJsaWMgQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudCggSVN0YXR1c0hhbmRsZXIgIHN0YXR1c0hhbmRsZXIgKQotCXsKLQkgIHVyaUZhY3RvcnlfICAgICAgPSBuZXcgU2ltcGxlVVJJRmFjdG9yeSgpOwotCSAgc3RhdHVzSGFuZGxlcl8gICA9IHN0YXR1c0hhbmRsZXI7Ci0JICAgIAotCSAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJwbGF0Zm9ybSIsIG5ldyBFY2xpcHNlU2NoZW1lKCB0aGlzICkgKTsgLy8kTk9OLU5MUy0xJAotCSAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJmaWxlIiwgbmV3IEZpbGVTY2hlbWUoKSApOyAvLyROT04tTkxTLTEkCi0JfQotCQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0TG9nKCkKLQkgKi8KLQlwdWJsaWMgSUxvZyBnZXRMb2coKSAKLQl7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxvZygpOwotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0U3RhdHVzSGFuZGxlcigpCi0JICovCi0JcHVibGljIElTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKSAKLQl7Ci0JCXJldHVybiBzdGF0dXNIYW5kbGVyXzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0VVJJRmFjdG9yeSgpCi0JICovCi0JcHVibGljIElVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkoKSAKLQl7Ci0JCXJldHVybiB1cmlGYWN0b3J5XzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlTG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODZmNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZUxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMSAgIDEwMDM2NCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW4uRW52aXJvbm1lbnRQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTG9nIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nIAotewotCXByaXZhdGUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2cgbG9nZ2VyOwotCQotCXB1YmxpYyBFY2xpcHNlTG9nKCkgCi0JewotCQlQbHVnaW4gcGx1Z2luID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQkJCi0gICAgbG9nZ2VyID0gcGx1Z2luLmdldExvZygpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIAotICB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uRW52aXJvbm1lbnQuSUxvZyNpc0VuYWJsZWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIG9wdGlvbikgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS8iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSsgb3B0aW9uKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QpIAotCXsKLQkJCi0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJCWNhc2UgSUxvZy5FUlJPUiA6Ci0JCQkJewotCQkJCQlpZiAoaXNFbmFibGVkKCJlcnJvciIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJFICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgY2FsbGVyICsgIjo6IiArIG1ldGhvZCArICI6IG9iamVjdD0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCSsgb2JqZWN0OwotCQkJCQkJbG9nKCBzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQljYXNlIElMb2cuV0FSTklORyA6Ci0JCQkJewotCQkJCQlpZiAoaXNFbmFibGVkKCJ3YXJuaW5nIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pCi0JCQkJCQkJCSsgIlcgIiArIGNhbGxlciArICI6OiIgKyBtZXRob2QgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSsgIjogb2JqZWN0PSIgKyBvYmplY3Q7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxvZyggc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwgKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJY2FzZSBJTG9nLklORk8gOgotCQkJCXsKLQkJCQkJaWYgKGlzRW5hYmxlZCgiaW5mbyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBvYmplY3Q7Ci0JCQkJCQlsb2coIHNldmVyaXR5LCBtZXNzYWdlLCBudWxsICk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJbG9nKHNldmVyaXR5LCBtZXNzYWdlTnVtLCBjYWxsZXIsIG1ldGhvZCwgKE9iamVjdClzdGF0dXMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsCi0JCQlTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyggc2V2ZXJpdHksIG1lc3NhZ2VOdW0sIGNhbGxlciwgbWV0aG9kLCAoT2JqZWN0KW51bGwgKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLAotCQkJT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCkgCi0JewotCQlpZiAoaXNFbmFibGVkKG9wdGlvbikpCi0JCXsKLQkJCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgKyBjYWxsZXIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IiArIG9iamVjdDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsb2coc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwgKTsKLQkJfQkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLAotCQkJT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSkgCi0JewotCQlpZiAoaXNFbmFibGVkKG9wdGlvbikpIAotCQl7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiICsgY2FsbGVyIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiOjoiICsgbWV0aG9kOyAvLyROT04tTkxTLTEkCi0JCQlsb2coIHNldmVyaXR5LCBtZXNzYWdlLCB0aHJvd2FibGUgKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLAotCQkJT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgSVN0YXR1cyBzdGF0dXMpIAotCXsKLQkJbG9nZ2VyLmxvZyggc3RhdHVzICk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2VOdW1TdHJpbmcoZmluYWwgaW50IG1lc3NhZ2VOdW0pIHsKLQkJU3RyaW5nIG1lc3NhZ2VOdW1TdHJpbmcgPSAiSVdBQiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGlubmVyTWVzc2FnZU51bSA9IG1lc3NhZ2VOdW07Ci0JCWlmIChpbm5lck1lc3NhZ2VOdW0gPiA5OTk5IHx8IGlubmVyTWVzc2FnZU51bSA8IDApCi0JCQlpbm5lck1lc3NhZ2VOdW0gPSA5OTk5OyAvL2RlZmF1bHQgbWVzc2FnZSBudW1iZXIKLQkJbWVzc2FnZU51bVN0cmluZyArPSAobmV3IEludGVnZXIoaW5uZXJNZXNzYWdlTnVtKSkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIG1lc3NhZ2VOdW1TdHJpbmc7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coIGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGMgKQotCXsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoIHNldmVyaXR5LCAiaWQiLCAwLCBtZXNzYWdlLCBleGMgKTsgLy8kTk9OLU5MUy0xJAotCQlsb2dnZXIubG9nKCBzdGF0dXMgKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjY1YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlU2NoZW1lIGltcGxlbWVudHMgSVVSSVNjaGVtZQotewotICBwcml2YXRlIElFbnZpcm9ubWVudCAgICAgIGVudmlyb25tZW50XzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlU2NoZW1lKCBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgZW52aXJvbm1lbnRfID0gZW52aXJvbm1lbnQ7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICAvKioKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElVUkkgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIAotICAgIGlmKCB1cmkgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IHVyaS5nZXRVUklTY2hlbWUoKTsKLSAgICAgIAotICAgICAgaWYoIHNjaGVtZS50b1N0cmluZygpLmVxdWFscyggInJlbGF0aXZlIikgKSByZXR1cm4gc2NoZW1lLmlzVmFsaWQoIHVyaSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgZ2V0UGF0aEZyb21QbGF0Zm9ybVVSSSggdXJpLnRvU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5ld1VSSSA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKCAicGxhdGZvcm06IikgKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgLy8gVGhlIHBsYXRmb3JtIGhhcyBiZWVuIHNwZWNpZmllZCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgbmV3VVJJID0gdXJpOwotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkgPT0gbnVsbCB8fCB1cmkuaW5kZXhPZiggIjoiKSAhPSAtMSApIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gdXJpIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gc29tZSBvdGhlciBwcm90b2NvbC4gCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19JTlZBTElEX1BMQVRGT1JNX1VSTCx1cmkpLCBudWxsICkgKTsKLSAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYoIHVyaS5zdGFydHNXaXRoKCAiLyIpICkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIC8vIFRoZSBwbGF0Zm9ybSBzY2hlbWUgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBzbyB3ZSB3aWxsIGFkZCBpdC4KLSAgICAgIG5ld1VSSSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgdXJpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIGlmKCBuZXdVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgRWNsaXBzZVVSSSggbmV3VVJJLCBlbnZpcm9ubWVudF8gKTsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKElVUkkgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJKCB1cmkgPT0gbnVsbCA/IG51bGwgOiB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1VSSSggdXJsID09IG51bGwgPyBudWxsIDogdXJsLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVVSSSB1cmkpCi0gIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgPSB1cmkuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIGlmKCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJyZWxhdGl2ZSIpICkgcmV0dXJuIHNjaGVtZS52YWxpZGF0ZSggdXJpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAotICAgICAgZ2V0UGF0aEZyb21QbGF0Zm9ybVVSSSggdXJpLnRvU3RyaW5nKCkgKTsKLSAgICAgIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBleGMuZ2V0U3RhdHVzKCk7IAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0cyB0aGUgInBsYXRmb3JtOi9yZXNvdXJjZSIgSVBhdGggZ2l2ZW4gYSB1cmwKLSAgICogCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhdGhGcm9tUGxhdGZvcm1VUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbiAKLSAgewotICAgIFN0cmluZyByZXNvdXJjZUZpbGUgPSBudWxsOwotICAgIFVSTCAgICB1cmwgICAgICAgICAgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwoIHVyaSApOyAKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsgCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19JTlZBTElEX1BMQVRGT1JNX1VSTCwgdXJpICksIGV4YyApICk7Ci0gICAgfQotICAgIAotICAgIGlmKCB1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikgKSAgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIFN0cmluZyByZXNvdXJjZVVSTCA9IHVybC5nZXRGaWxlKCk7Ci0gICAgICAKLSAgICAgIGlmIChyZXNvdXJjZVVSTC5zdGFydHNXaXRoKCIvcmVzb3VyY2UiKSkgIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2VGaWxlID0gcmVzb3VyY2VVUkwuc3Vic3RyaW5nKDEwKTsgICAvLyBvbWl0IHRoZSAiL3Jlc291cmNlIiBwb3J0aW9uCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19JTlZBTElEX1BMQVRGT1JNX1VSTCx1cmwuZ2V0RmlsZSgpICksIG51bGwgKSApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzb3VyY2VGaWxlOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggYW4gYWJzb2x1dGUgSVBhdGgKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBwbGF0Zm9ybSBJVVJJIGZvciB0aGlzIHBhdGguCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSTEZyb21QYXRoKCBJUGF0aCBhYnNvbHV0ZVBhdGggKQotICB7Ci0gICAgcmV0dXJuICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgYWJzb2x1dGVQYXRoOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VVUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwZjliMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlVVJJIGV4dGVuZHMgUmVsYXRpdmVVUkkKLXsKLSAgcHJpdmF0ZSBJRW52aXJvbm1lbnQgICBlbnZpcm9ubWVudF87Ci0gIHByaXZhdGUgRWNsaXBzZVNjaGVtZSAgc2NoZW1lXzsKLSAgcHJpdmF0ZSBGaWxlICAgICAgICAgICBmaWxlXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlVVJJKCBTdHJpbmcgdXJpLCBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgc3VwZXIoIHVyaSApOwotICAgIAotICAgIGVudmlyb25tZW50XyAgPSBlbnZpcm9ubWVudDsKLSAgICBzY2hlbWVfICAgICAgID0gbmV3IEVjbGlwc2VTY2hlbWUoIGVudmlyb25tZW50ICk7Ci0gICAgZmlsZV8gICAgICAgICA9IGdldEZpbGUoKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZXJhc2UoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCBlcmFzZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHRyeSAKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgZmlsZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSApIAotICAgICAgewotICAgICAgICBpZiggZmlsZSBpbnN0YW5jZW9mIElGaWxlICkKLSAgICAgICAgewotICAgICAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLmRlbGV0ZUZpbGUoIChJRmlsZSlmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBmaWxlIGluc3RhbmNlb2YgSUZvbGRlciApCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlUmVzb3VyY2VVdGlscy5kZWxldGVGb2xkZXIoIChJRm9sZGVyKWZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBleGMgKSAKLSAgICB7ICAgICAgCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2dldElucHV0U3RyZWFtKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIC8vIElmIGEgY2xhc3MgY2FzdCBleGNlcHRpb24gaXMgdGhyb3cgaXQgd2lsbCBiZSBwcm9wb2dhdGVkIGFzCi0gICAgICAvLyBhIFVSSUV4Y2VwdGlvbi4KLSAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpZ2V0UmVzb3VyY2UoKTsKLQotICAgICAgLy9jYWxsIGdldENvbnRlbnRzIG9uIHRoZSBlY2xpcHNlIEZpbGUgb2JqZWN0Ci0gICAgICBpZiggZmlsZSAhPSBudWxsICkgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBUaHJvd2FibGUgZXhjICkgCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZm9sZGVyIGV4aXN0cy4KLSAgICBJVVJJIHBhcmVudCA9IHBhcmVudCgpOwotICAgIAotICAgIGlmKCAhcGFyZW50LmlzUHJlc2VudCgpICkKLSAgICB7Ci0gICAgICBwYXJlbnQoKS50b3VjaEZvbGRlcigpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZ2V0T3V0U3RyZWFtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZ2V0VVJJU2NoZW1lKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIElVUklTY2hlbWUgZ2V0VVJJU2NoZW1lKCkKLSAgewotICAgIHJldHVybiBzY2hlbWVfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzTGVhZigpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiAKLSAgICAgICAgICByZXNvdXJjZS5leGlzdHMoKSAmJiAKLSAgICAgICAgICByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICAvLyBUaGlzIElVUkkgZG9lcyBub3QgZXhpc3QuCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzUHJlc2VudCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgSVVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgKQotICAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBJVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzUmVsYXRpdmUoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLSAgeyAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjaXNXcml0YWJsZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiAKLSAgICAgICAgICByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiAKLSAgICAgICAgICAhcmVzb3VyY2UuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgSVVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2xpc3QoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgSVVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgICAgPSBnZXRSZXNvdXJjZSgpOwotICAgIElVUklbXSAgICAgdXJpQ2hpbGRyZW4gPSBuZXcgSVVSSVswXTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgIHsKLSAgICAgIElGb2xkZXIgICAgIGZvbGRlciAgID0gKElGb2xkZXIpcmVzb3VyY2U7Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJUmVzb3VyY2VbXSBjaGlsZHJlbiAgICA9IGZvbGRlci5tZW1iZXJzKCk7ICAKLSAgCi0gICAgICAgIHVyaUNoaWxkcmVuID0gbmV3IElVUklbY2hpbGRyZW4ubGVuZ3RoXTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgSVBhdGggcGF0aCA9IGNoaWxkcmVuW2luZGV4XS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgIHVyaUNoaWxkcmVuW2luZGV4XSA9IG5ldyBFY2xpcHNlVVJJKCBzY2hlbWVfLmdldFVSTEZyb21QYXRoKHBhdGgpLCBlbnZpcm9ubWVudF8gICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB1cmlDaGlsZHJlbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNsaXN0KG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSUZpbHRlcikKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIElVUklbXSBsaXN0KElVUklGaWx0ZXIgdXJpRmlsdGVyKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgIElVUklbXSAgICAgcmVzdWx0ICAgPSBuZXcgSVVSSVswXTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgICB7Ci0gICAgICBJRm9sZGVyICAgICBmb2xkZXIgICA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlW10gY2hpbGRyZW4gICAgPSBmb2xkZXIubWVtYmVycygpOyAgICAgICAKLSAgICAgICAgVmVjdG9yICAgICAgdXJpQ2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICAgIHsKLSAgICAgICAgICBJUGF0aCBwYXRoID0gY2hpbGRyZW5baW5kZXhdLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgSVVSSSAgIHVyaSAgPSBuZXcgRWNsaXBzZVVSSSggc2NoZW1lXy5nZXRVUkxGcm9tUGF0aChwYXRoKSwgZW52aXJvbm1lbnRfICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIHVyaUZpbHRlci5hY2NlcHRzKCB1cmkgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgdXJpQ2hpbGRyZW4uYWRkKCB1cmkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IChJVVJJW10pdXJpQ2hpbGRyZW4udG9BcnJheSggbmV3IElVUklbMF0gKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIHZvaWQgcmVuYW1lKElVUkkgbmV3VVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYoIG5ld1VSSSA9PSBudWxsIHx8ICEobmV3VVJJIGluc3RhbmNlb2YgRWNsaXBzZVVSSSkgKSByZXR1cm47Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRWNsaXBzZVVSSSBuZXdFY2xpcHNlVVJJID0gKEVjbGlwc2VVUkkpbmV3VVJJOwotICAgICAgSVBhdGggICAgICBuZXdQYXRoICAgICAgID0gbmV3IFBhdGgoIHNjaGVtZV8uZ2V0UGF0aEZyb21QbGF0Zm9ybVVSSSggbmV3RWNsaXBzZVVSSS51cmlfICkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElSZXNvdXJjZSAgcmVzb3VyY2UgICAgICA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2UubW92ZSggbmV3UGF0aCwgdHJ1ZSwgbnVsbCApOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApICk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjdG91Y2hGb2xkZXIoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCB0b3VjaEZvbGRlcigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgCi0gICAgaWYoIHJlc291cmNlICE9IG51bGwgKQotICAgIHsgCi0gICAgICBpZiggcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgICAgewotICAgICAgICBJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiggZm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0VSUk9SX0ZPTERFUl9IQVNfQ0hJTERSRU4sIGZvbGRlci50b1N0cmluZygpICksIG51bGwgKSwKLSAgICAgICAgICAgICAgICB0aGlzICk7Ci0JCQkJCQkJCQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8vPz8/IE5vdCBzdXJlIHdoYXQgdG8gZG8gaWYgdG91Y2hpbmcgYSBmb2xkZXIgYW5kIHRoZSBJVVJJIGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZm9sZGVyLgotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSVBhdGggbmV3UGF0aCA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaV8gKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgRmlsZVJlc291cmNlVXRpbHMubWFrZUZvbGRlclBhdGgoIG5ld1BhdGgsCi0JCQkgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjdG91Y2hMZWFmKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIHZvaWQgdG91Y2hMZWFmKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgewotICAgICAgLy8gVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIHNvIGRvIG5vdGhpbmcuCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgZm9yIHRoaXMgbGVhZiBhbmQgY3JlYXRlIGl0IGlmIHJlcXVpcmVkLgotICAgICAgSVVSSSBwYXJlbnQgPSBwYXJlbnQoKTsKLSAgICAgIAotICAgICAgaWYoICFwYXJlbnQuaXNQcmVzZW50KCkgKQotICAgICAgeyAgCi0gICAgICAgIHBhcmVudCgpLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBHZXQgYW4gb3V0cHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkIGZpbGUgYW5kIGltbWVkaWF0ZWx5IGNsb3NlIGl0LgotICAgICAgICAvLyBUaGlzIHNob3VsZCBjcmVhdGUgYSAwIGJ5dGUgZmlsZS4KLSAgICAgICAgZ2V0T3V0U3RyZWFtKCkuY2xvc2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgeyAgICAKLSAgICBJUGF0aCAgcGF0aCAgICAgICAgICAgICA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkodXJpXykgKTsKLSAgICBTdHJpbmcgYWJzb2x1dGVQYXRobmFtZSA9IHBhdGgubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLSAgIAotICAgIHJldHVybiBGaWxlUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoYWJzb2x1dGVQYXRobmFtZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZ2V0T3V0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVBhdGggICAgICAgIGZpbGUgICA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaV8gKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgIE91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHN0cmVhbSA9IEZpbGVSZXNvdXJjZVV0aWxzLm5ld0ZpbGVPdXRwdXRTdHJlYW0gKCBmaWxlLAotIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOyAgICAKLSAgICByZXR1cm4gc3RyZWFtOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBJVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSBiYWNrZWQgYnkgcGh5c2ljYWwgZmlsZXMuCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBGaWxlIGFzRmlsZSAoKQotICB7Ci0gIAlyZXR1cm4gZmlsZV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJI2lzQXZhaWxhYmxlQXNGaWxlKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUoKSAKLSAgewotICAJcmV0dXJuIGZpbGVfICE9IG51bGw7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc1VSTCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBVUkwgYXNVUkwoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKCB1cmlfICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdXJsOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc1VSTCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgVVJMIHRoZVVSTCA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdGhlVVJMID0gYXNVUkwoKTsgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgeyAgCi0gICAgfQotICAgIAotICAgIHJldHVybiB0aGVVUkwgIT0gbnVsbCA7Ci0gIH0KLQotICBwcml2YXRlIEZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICBTdHJpbmcgcGxhdGZvcm1SZXMgPSAicGxhdGZvcm06L3Jlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIEZpbGUgICByZXN1bHQgICAgICA9IG51bGw7Ci0gICAgCi0gICAgaWYgKHVyaV8uc3RhcnRzV2l0aChwbGF0Zm9ybVJlcykpCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IEZpbGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKHVyaV8uc3Vic3RyaW5nKHBsYXRmb3JtUmVzLmxlbmd0aCgpLCB1cmlfLmxlbmd0aCgpKSkudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzUwZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLQotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGRlZmluZXMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IHdyaXRlcyB0byBhbgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9LgotKi8KLXB1YmxpYyBjbGFzcyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0KLXsKLQotICBJUGF0aCAgICAgICAgICAgICAgICAgZkZpbGVQYXRoOwotICBJU3RhdHVzSGFuZGxlciAgICAgICAgIGZTdGF0dXNIYW5kbGVyOwotICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLSAgYm9vbGVhbiAgICAgICAgICAgICAgIGZPcGVuOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRvIHRoZQotICAqIGdpdmVuIDxjb2RlPmZpbGU8L2NvZGU+LiBUaGUgd29ya3NwYWNlIGlzIG5laXRoZXIgZXhhbWluZWQgbm9yCi0gICogYWx0ZXJlZCBkdXJpbmcgY29uc3RydWN0aW9uLiBBbGwgcmVzb3VyY2UgY3JlYXRpb24gaXMgZGVmZXJyZWQKLSAgKiB1bnRpbCBsYXRlciBpbiB0aGUgc3RyZWFtJ3MgbGlmZWN5Y2xlLCBzdWNoIGFzIGR1cmluZyB3cml0aW5nCi0gICogb3IgY2xvc3VyZS4KLSAgKiA8Yj5Ob3RlOjwvYj4gVGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIGEgc3RyZWFtIHRoYXQKLSAgKiB3cml0ZXMgdG8gYW4gSUZpbGUgaXMgdG8gY2FsbCB0aGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kCi0gICoge0BsaW5rIEZpbGVSZXNvdXJjZVV0aWxzI25ld0ZpbGVPdXRwdXRTdHJlYW0gRmlsZVJlc291cmNlVXRpbHMubmV3RmlsZU91dHB1dFN0cmVhbSgpfQotICAqIGFuZCB3b3JrIHdpdGggdGhlIHJlc3VsdGluZyA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgotICAqIERpcmVjdCBjb25zdHJ1Y3Rpb24gb2YgYSBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gaXMgbm90IHJlY29tbWVuZGVkLgotICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlIHJlc291cmNlIHRvIGNyZWF0ZS4gVGhlIHByb2plY3QgaW1wbGllZCBieSB0aGUKLSAgKiBwYXRobmFtZSBvZiB0aGUgZmlsZSBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICovCi0gIHB1YmxpYyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gKCAKLSAgCQkJSVBhdGggICAgICAgICAgIGZpbGVQYXRoLCAKLSAgCQkJSVN0YXR1c0hhbmRsZXIgICBzdGF0dXNIYW5kbGVyCi0gIAkJCSkKLSAgewotICAgIGZGaWxlUGF0aCA9IGZpbGVQYXRoOwotICAgIGZTdGF0dXNIYW5kbGVyID0gc3RhdHVzSGFuZGxlcjsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIGZPcGVuID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAqIENsb3NlcyB0aGUgc3RyZWFtLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNsb3NpbmcgdGhlIHN0cmVhbS4KLSAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlCi0gICogYW5kIGEgZmlsZSBvZiB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIHdpbGwKLSAgKiBiZSB0aHJvd24gZWl0aGVyIG5vdyBvciBkdXJpbmcgYW4gZWFybGllciB7QGxpbmsgI3dyaXRlIHdyaXRlfS4KLSAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCBjbG9zZSAoKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICghZk9wZW4pIHJldHVybjsKLSAgICBmT3BlbiA9IGZhbHNlOwotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICBieXRlW10gYnVmZmVyID0gZkJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHRlbXBJbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoZkZpbGVQYXRoLCB0ZW1wSW5wdXRTdHJlYW0sIGZTdGF0dXNIYW5kbGVyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIEZsdXNoZXMgdGhlIHN0cmVhbS4gVGhpcyBkb2VzIG5vdCBpbXBseSB0aGUgRmlsZSByZXNvdXJjZQotICAqIHdpbGwgYmUgY3JlYXRlZCBvciBiZWNvbWUgdmlzaWJsZSB3aXRoaW4gdGhlIHdvcmtiZW5jaC4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIGZsdXNoICgpCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS5mbHVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGFsbCBieXRlcyBmcm9tIHRoZSBnaXZlbiBhcnJheSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIHdyaXRlICggYnl0ZVtdIGIgKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYik7Ci0gIH0KLQotICAvKioKLSAgKiBXcml0ZXMgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgYmVnaW5uaW5nIGF0IHNvbWUgb2Zmc2V0Ci0gICogYW5kIGNvbnRpbnVpbmcgZm9yIHNvbWUgbnVtYmVyIG9mIGJ5dGVzIChsZW4pIHRvIHRoZSBzdHJlYW0uCi0gICogQHBhcmFtIGIgVGhlIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlLgotICAqIEBwYXJhbSBvZmYgVGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheSB0byBiZWdpbiB3cml0aW5nLgotICAqIEBwYXJhbSBsZW4gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIHdyaXRlICggYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4gKQotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS53cml0ZShiLG9mZixsZW4pOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHN0cmVhbS4KLSAgKiBAcGFyYW0gYiBUaGUgYnl0ZSB0byB3cml0ZS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIHdyaXRlICggaW50IGIgKQotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS53cml0ZShiKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9GaWxlUmVzb3VyY2VVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRmlsZVJlc291cmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiNmIyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9GaWxlUmVzb3VyY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwODA3MTEgICAyNDA0MDggcmtrbGFpQGNhLmlibS5jb20gLSBSYXltb25kIExhaSwgc3VwcG9ydCBjYXNlLWluc2Vuc2l0aXZlIHBsYXRmb3JtIG1ha2VGaWxlIHdoZW4gYSBmaWxlIHdpdGggdmFyaWFudCBjYXNlIGV4aXN0cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjsKLQotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHVzZWZ1bCBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggRWNsaXBzZSByZXNvdXJjZXMuCi0qLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVSZXNvdXJjZVV0aWxzCi17Ci0gIC8vCi0gIC8vIEtlZXBzIHRoZSBJV29ya3NwYWNlIGhhbmdpbmcgYXJvdW5kLiBTZWUgZ2V0V29ya3NwYWNlKCkuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2Ugd29ya3NwYWNlXyA9IG51bGw7Ci0gIC8vCi0gIC8vIEtlZXBzIHRoZSBJV29ya3NwYWNlUm9vdCBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZVJvb3QoKS4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZVJvb3Qgcm9vdF8gPSBudWxsOwotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZVJvb3Qgb2JqZWN0LgotICAqIEByZXR1cm4gVGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290ICgpCi0gIHsKLSAgICBpZiAocm9vdF8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotICAgIHJldHVybiByb290XzsKLSAgfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZSBvYmplY3QuCi0gICogQHJldHVybiBUaGUgSVdvcmtzcGFjZSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UgKCkKLSAgewotICAgIGlmICh3b3Jrc3BhY2VfID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHJvb3RfID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJvb3RfID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgd29ya3NwYWNlXyA9IHJvb3RfLmdldFdvcmtzcGFjZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd29ya3NwYWNlXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gYXJyYXkgb2YgdGhyZWUgY29tbW9uIGNob2ljZXMuIChpZS4gWWVzLCB5ZXMgYWxsLCBhbmQgY2FuY2VsICkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ2hvaWNlW10gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkgCi0gIHsKLSAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnWScsIE1lc3NhZ2VzLkxBQkVMX1lFUyApKTsKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnQScsIE1lc3NhZ2VzLkxBQkVMX1lFU19UT19BTEwgKSk7Ci0gICAgY2hvaWNlcy5hZGQobmV3IENob2ljZSggJ0MnLCBNZXNzYWdlcy5MQUJFTF9DQU5DRUwgKSk7Ci0gICAgCi0gICAgcmV0dXJuIChDaG9pY2VbXSljaG9pY2VzLnRvQXJyYXkobmV3IENob2ljZVtjaG9pY2VzLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBJUmVzb3VyY2V9Ci0gICogb2YgdGhlIGdpdmVuIGFic29sdXRlIHBhdGhuYW1lIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0gICogQHBhcmFtIGFic29sdXRlUGF0aG5hbWUgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlLgotICAqIEByZXR1cm4gVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZSAoIFN0cmluZyBhYnNvbHV0ZVBhdGhuYW1lICkKLSAgewotICAgIGlmIChhYnNvbHV0ZVBhdGhuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmaW5kUmVzb3VyY2UobmV3IFBhdGgoYWJzb2x1dGVQYXRobmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfQotICAqIG9mIHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgPGNvZGU+SVBhdGg8L2NvZGU+IG9mIHRoZSByZXNvdXJjZS4KLSAgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotICAqLwotICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UgKCBJUGF0aCBhYnNvbHV0ZVBhdGggKQotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmZpbmRNZW1iZXIoYWJzb2x1dGVQYXRoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvcGllcyBhIGZpbGUgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbgotICAgKiB0byBhbiBFY2xpcHNlIGZvbGRlci4KLSAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBzb3VyY2VQYXRoIFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luPC9jb2RlPgotICAgKiBpbnN0YWxsIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LgotICAgKiBJZiBudWxsLCB0aGVuIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbiBpcyB0aGUgc291cmNlIHBhdGgKLSAgICogKGllLiBudWxsIGlzIGVxdWl2YWxlbnQgdG8gIi4iKS4KLSAgICogQHBhcmFtIHBhdGhuYW1lIFRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSB0byBjb3B5LgotICAgKiBUaGUgcGF0aG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPnBsdWdpbiBzb3VyY2VQYXRoPC9jb2RlPi4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHBhcmFtIHRhcmdldFBhdGggVGhlIGFic29sdXRlIEVjbGlwc2UgcGF0aCBvZiB0aGUgZm9sZGVyIHRvCi0gICAqIHdoaWNoIHRoZSBmaWxlIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlCi0gICAqIGZpbGUgaXMgcHJlc2VydmVkLgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gY3JlYXRlRm9sZGVycyBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotICAgKiB7QGxpbmsgI0NSRUFURSBDUkVBVEV9IG9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotICAgKiA8dWw+Ci0gICAqIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+IC0KLSAgICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICAqIGRvIG5vdCBleGlzdCwgdGhleSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAqIDxsaT48Y29kZT5ET05UX0NSRUFURTwvY29kZT4gLQotICAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgICogZG8gbm90IGV4aXN0LCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KLSAgICogPC91bD4KLSAgICogQHBhcmFtIG92ZXJ3cml0ZUZpbGUgVGhlIHBvbGljeSBmb3IgZXhpc3RpbmcgZmlsZXMsIG9uZSBvZgotICAgKiB7QGxpbmsgI09WRVJXUklURSBPVkVSV1JJVEV9IG9yIHtAbGluayAjRE9OVF9PVkVSV1JJVEUgRE9OVF9PVkVSV1JJVEV9LgotICAgKiA8dWw+Ci0gICAqIDxsaT48Y29kZT5PVkVSV1JJVEU8L2NvZGU+IC0KLSAgICogSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhIGZpbGUsCi0gICAqIGl0IHdpbGwgYmUgcmVwbGFjZWQuCi0gICAqIElmIHRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZmlsZSwKLSAgICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgICogYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLSAgICogPGxpPjxjb2RlPkRPTlRfT1ZFUldSSVRFPC9jb2RlPiAtCi0gICAqIElmIGFueSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzLAotICAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAgKiA8L3VsPgotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAgKi8KLSAgIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RmlsZSggUGx1Z2luIHBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggc291cmNlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHRhcmdldFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXNIYW5kbGVyIHN0YXR1c01vbml0b3IgKQotICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgewotICAgICB0cnkKLSAgICAgewotICAgICAgIElQYXRoIHRhcmdldCA9IHRhcmdldFBhdGguYXBwZW5kKHBhdGhuYW1lKTsKLSAgICAgICBJUGF0aCBzb3VyY2UgPSBzb3VyY2VQYXRoID09IG51bGwgPyBwYXRobmFtZSA6IHNvdXJjZVBhdGguYXBwZW5kKHBhdGhuYW1lKTsKLSAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKHNvdXJjZSk7Ci0gICAgICAgY3JlYXRlRmlsZSh0YXJnZXQsIGlucHV0LCBzdGF0dXNNb25pdG9yKTsKLSAgICAgfQotICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgewotICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5NU0dfRVJST1JfSU8sZSkpOwotICAgICB9Ci0gICB9Ci0gICAKLSAgLyoqCi0gICAqIERlbGV0ZXMgYSBmaWxlIHVuZGVyIGEgY29udGFpbmVyLgotICAgKiBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLSAgICogQHBhcmFtIGZpbGUgLSB0aGUgSUZpbGUgdG8gYmUgZGVsZXRlZAotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0gICAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpZiBpdCBleGlzdHMgYW5kIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkLiBGYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRmlsZSggSUZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdGF0dXNIYW5kbGVyIHN0YXR1c01vbml0b3IpCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGlmIChmaWxlLmV4aXN0cygpKQotICAgIHsgICAgICAKLSAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotICAgICAgaWYgKGZpbGUuaXNSZWFkT25seSgpKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIElGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbMV07Ci0gICAgICAgIGZpbGVzWzBdID0gZmlsZTsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBnZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzTW9uaXRvci5yZXBvcnRFcnJvciggc3RhdHVzICk7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGZpbGUuZGVsZXRlKHRydWUsIG51bGwpOwotICAgIH0KLSAgICAvL0F0IHRoaXMgcG9pbnQsIGVpdGhlciB0aGUgZmlsZSBkaWQgbm90IGV4aXN0IG9yIHdlIHN1Y2Nlc3NmdWxseSBkZWxldGVkCi0gICAgLy8gaXQuIFJldHVybiBzdWNjZXNzLgotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIERlbGV0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0gICAqIEBwYXJhbSBmb2xkZXIgLSB0aGUgSUZvbGRlciB0byBiZSBkZWxldGVkCi0gICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLSAgICogQHBhcmFtIHN0YXR1c01vbml0b3IKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZCBhbG9uZyB3aXRoIGl0cyBtZW1iZXJzLiBGYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZvbGRlciggSUZvbGRlciBmb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yICkKLSAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHJldHVybiB0cnVlOwotCi0gICAgIGJvb2xlYW4gICAgIGRlbGV0ZWQgICA9IHRydWU7Ci0gICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0gICAgIAotICAgICBmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VzLmxlbmd0aDsgaSsrKQotICAgICB7Ci0gICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgIHsKLSAgICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGaWxlKChJRmlsZSlyZXNvdXJjZSwgc3RhdHVzTW9uaXRvcik7Ci0gICAgICAgfQotICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpCi0gICAgICAgewotICAgICAgICAgZGVsZXRlZCA9IGRlbGV0ZUZvbGRlciggKElGb2xkZXIpcmVzb3VyY2UsIHN0YXR1c01vbml0b3IpOwotICAgICAgIH0KLQotICAgICAgIGlmKCAhZGVsZXRlZCApIGJyZWFrOwotICAgICB9Ci0gICAgIAotICAgICBpZiggZGVsZXRlZCApCi0gICAgIHsKLSAgICAgICBmb2xkZXIuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotICAvKioKLSAgKiBDcmVhdGVzIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGFuZCByZXR1cm5zIGl0cyBoYW5kbGUgYXMgYW4gPGNvZGU+SUZpbGU8L2NvZGU+LgotICAqIElmIHRoZSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLCBhCi0gICogPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gY29udGFpbmluZyBhbgotICAqIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdCBpcyB0aHJvd24uCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCi0gICogVGhlIHByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aCBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICogQHJldHVybiBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZS4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIElGaWxlIGNyZWF0ZUZpbGUgKAotICAgIElQYXRoICAgICAgICAgICBhYnNvbHV0ZVBhdGgsCi0gICAgSW5wdXRTdHJlYW0gICAgIGlucHV0U3RyZWFtLAotICAgIElTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0KLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgeyAgICAKLSAgICBpZiAoIWFic29sdXRlUGF0aC5pc0Fic29sdXRlKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAiUmVzb3VyY2VVdGlscyIsMCwgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19FUlJPUl9QQVRIX05PVF9BQlNPTFVURSwgYWJzb2x1dGVQYXRoLnRvU3RyaW5nKCkgKSxudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8IDEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUEFUSF9FTVBUWSwgYWJzb2x1dGVQYXRoLnRvU3RyaW5nKCkgKSxudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8IDIpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUEFUSF9OT1RfRk9MREVSLCBhYnNvbHV0ZVBhdGgudG9TdHJpbmcoKSApLG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBJQ29udGFpbmVyIHBhcmVudCAgID0gbWFrZUZvbGRlclBhdGgoYWJzb2x1dGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgc3RhdHVzSGFuZGxlcik7Ci0gICAgU3RyaW5nICAgICBmaWxlTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotICAgIAotICAgIHJldHVybiBtYWtlRmlsZShwYXJlbnQsIGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgc3RhdHVzSGFuZGxlcik7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGVzIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPgotICAqIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+cmVsYXRpdmVQYXRoPC9jb2RlPgotICAqIGFuZCByZXR1cm5zIGl0cyBoYW5kbGUgYXMgYW4gPGNvZGU+SUZpbGU8L2NvZGU+LgotICAqIElmIHRoZSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLCBhCi0gICogPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gY29udGFpbmluZyBhbgotICAqIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdCBpcyB0aHJvd24uCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCi0gICogVGhlIHByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aCBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzIFRoZSBpbnRlcm1lZGlhdGUgZm9sZGVyIGNyZWF0aW9uIHBvbGljeSwgb25lIG9mCi0gICoge0BsaW5rICNDUkVBVEUgQ1JFQVRFfSBvciB7QGxpbmsgI0RPTlRfQ1JFQVRFIERPTlRfQ1JFQVRFfS4KLSAgKiA8dWw+Ci0gICogPGxpPjxjb2RlPkNSRUFURTwvY29kZT4gLQotICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGRvIG5vdCBleGlzdCwgdGhleSB3aWxsIGJlIGNyZWF0ZWQuCi0gICogPGxpPjxjb2RlPkRPTlRfQ1JFQVRFPC9jb2RlPiAtCi0gICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICogZG8gbm90IGV4aXN0LCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KLSAgKiA8L3VsPgotICAqIEBwYXJhbSBvdmVyd3JpdGVGaWxlIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLSAgKiB7QGxpbmsgI09WRVJXUklURSBPVkVSV1JJVEV9IG9yIHtAbGluayAjRE9OVF9PVkVSV1JJVEUgRE9OVF9PVkVSV1JJVEV9LgotICAqIDx1bD4KLSAgKiA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPiAtCi0gICogSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAqIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeSBleGlzdHMgYW5kIGlzIGEgZmlsZSwKLSAgKiBpdCB3aWxsIGJlIHJlcGxhY2VkLgotICAqIElmIHRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZmlsZSwKLSAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAqIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0gICogPGxpPjxjb2RlPkRPTlRfT1ZFUldSSVRFPC9jb2RlPiAtCi0gICogSWYgYW55IHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuCi0gICogPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cywKLSAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAqIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0gICogPC91bD4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqIEByZXR1cm4gVGhlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBJRmlsZX0KLSAgKiBoYW5kbGUgb2YgdGhlIGZpbGUuCi0gICogQHRocm93cyBDb3JlRXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICogd2l0aCBhIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0gICogbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlICgKLSAgICBJUHJvamVjdCAgICAgICAgcHJvamVjdCwKLSAgICBJUGF0aCAgICAgICAgICAgcmVsYXRpdmVQYXRoLAotICAgIElucHV0U3RyZWFtICAgICBpbnB1dFN0cmVhbSwKLSAgICBJU3RhdHVzSGFuZGxlciAgIHN0YXR1c01vbml0b3IgKQotIAotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICB7Ci0gICAgSVBhdGggYWJzb2x1dGVQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChyZWxhdGl2ZVBhdGgpOwotICAgIHJldHVybiBjcmVhdGVGaWxlKGFic29sdXRlUGF0aCwgaW5wdXRTdHJlYW0sIHN0YXR1c01vbml0b3IpOwotICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyBhbiBvdXRwdXQgc3RyZWFtIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdG8gdGhlCi0gICogZ2l2ZW4gPGNvZGU+ZmlsZTwvY29kZT4uIEFjdHVhbCBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UKLSAgKiBtYXkgb2NjdXIgZHVyaW5nIGNyZWF0aW9uIG9mIHRoZSBzdHJlYW0sIHdoaWxlIHdyaXRpbmcgdG8KLSAgKiB0aGUgc3RyZWFtLCBvciB3aGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgotICAqIEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gY29udGFpbmluZwotICAqIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpbGwgYmUgdGhyb3duCi0gICogYXQgc29tZSBwb2ludCBpbiB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzdHJlYW0KLSAgKiBpZiB0aGUgZmlsZSByZXNvdXJjZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgKiBAcGFyYW0gZmlsZSBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZSByZXNvdXJjZSB0byBjcmVhdGUuIFRoZSBwcm9qZWN0IGltcGxpZWQgYnkgdGhlCi0gICogcGF0aG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqIEByZXR1cm4gQW4gPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB0aWVkIHRvIHRoZSBmaWxlIHJlc291cmNlLgotICAqIEFjdHVhbCBjaGVja3Mgb2Ygb3IgY2hhbmdlcyB0byB0aGUgd29ya3NwYWNlIG1heSBvY2N1ciBhcyBlYXJseSBkdXJpbmcKLSAgKiBzdHJlYW0gY3JlYXRpb24sIGNsb3N1cmUsIG9yIGFueSB0aW1lIGluIGJldHdlZW4uCi0gICogQHRocm93cyBDb3JlRXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICogd2l0aCBhIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0gICogbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLSAgKiBSZWFzb25zIGluY2x1ZGU6Ci0gICogPG9sPgotICAqIDxsaT5UaGUgcHJvamVjdCBvZiB0aGUgZ2l2ZW4gZmlsZSdzIHBhdGggZG9lcyBub3QgZXhpc3QuCi0gICogPGxpPkEgbm9uLWZpbGUgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZQotICAqIGFscmVhZHkgZXhpc3RzLgotICAqIDxsaT5BIGZpbGUgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZQotICAqIGFscmVhZHkgZXhpc3RzLCBhbmQgPGNvZGU+b3ZlcndyaXRlRmlsZTwvY29kZT4gaXMgZmFsc2UuCi0gICogPGxpPk9uZSBvciBtb3JlIGludGVybWVkaWF0ZSBmb2xkZXJzIHRvIHRoZSBnaXZlbiBmaWxlCi0gICogZG8gbm90IGV4aXN0LCBhbmQgPGNvZGU+Y3JlYXRlRm9sZGVyczwvY29kZT4gaXMgZmFsc2UuCi0gICogPC9vbD4KLSAgKi8KLQotICBwdWJsaWMgc3RhdGljIE91dHB1dFN0cmVhbSBuZXdGaWxlT3V0cHV0U3RyZWFtICgKLSAgICAgICBJUGF0aCAgICAgICAgICAgIGZpbGUsCi0gICAgICAgSVN0YXR1c0hhbmRsZXIgICAgc3RhdHVzSGFuZGxlciApCi0gCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbShmaWxlLCBzdGF0dXNIYW5kbGVyKTsKLSAgfQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBOYXVnaHR5IGJpdHMuLi4KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIHBhdGggb2YgZm9sZGVycy4KLSAgLy8gRG8gbm90IGNhbGwgd2l0aCBhbiBhYnNvbHV0ZVBhdGggb2YgbGVzcyB0aGFuIG9uZSBzZWdtZW50LgotICAvLwotICAvKioKLSAgICogQ3JlYXRlcyBhIHBhdGggb2YgZm9sZGVycy4KLSAgICogRG8gbm90IGNhbGwgd2l0aCBhbiBhYnNvbHV0ZVBhdGggb2YgbGVzcyB0aGFuIG9uZSBzZWdtZW50LgotICAgKiBAcGFyYW0gcmVzb3VyY2VDb250ZXh0IHRoZSByZXNvdXJjZSBjb250ZXh0IGZvciBtYWtpbmcgZm9sZGVycy4KLSAgICogQHBhcmFtIGFic29sdXRlUGF0aCB0aGUgcGF0aCBvZiBmb2xkZXJzIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIGJlIHVzZWQuCi0gICAqIEBwYXJhbSBzdGF0dXNIYW5kbGVyIHRoZSBzdGF0dXMgaGFuZGxlci4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBJQ29udGFpbmVyIG9mIHRoZSBjcmVhdGVkIGZvbGRlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBtYWtlRm9sZGVyUGF0aCAoCi0gICAgSVBhdGggICAgICAgICAgICBhYnNvbHV0ZVBhdGgsCi0gICAgSVN0YXR1c0hhbmRsZXIgICAgc3RhdHVzSGFuZGxlciApCi0gIAotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoYWJzb2x1dGVQYXRoLnNlZ21lbnRDb3VudCgpIDw9IDEpCi0gICAgewotICAgICAgcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGFic29sdXRlUGF0aC5zZWdtZW50KDApKTsKLSAgICB9Ci0gICAgICBJQ29udGFpbmVyIHBhcmVudCA9IG1ha2VGb2xkZXJQYXRoKGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIHN0YXR1c0hhbmRsZXIgKTsKLSAgICAgIFN0cmluZyBmb2xkZXJOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBtYWtlRm9sZGVyKHBhcmVudCxmb2xkZXJOYW1lLCBzdGF0dXNIYW5kbGVyICk7Ci0gIH0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIGZvbGRlciB1bmRlciBhIGNvbnRhaW5lci4KLSAgLy8gVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0gIC8vCi0gcHJpdmF0ZSBzdGF0aWMgSUZvbGRlciBtYWtlRm9sZGVyICgKLSAgICBJQ29udGFpbmVyICAgICAgIHBhcmVudCwKLSAgICBTdHJpbmcgICAgICAgICAgIGZvbGRlck5hbWUsCi0gICAgSVN0YXR1c0hhbmRsZXIgICAgc3RhdHVzSGFuZGxlciApCi0gIAotICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIGNoaWxkICA9IHBhcmVudC5maW5kTWVtYmVyKGZvbGRlck5hbWUpOwotICAgIAotICAgIGlmKCBjaGlsZCA9PSBudWxsICkKLSAgICB7ICAgICAgCi0gICAgICBJRm9sZGVyIGZvbGRlciA9IHBhcmVudC5nZXRGb2xkZXIobmV3IFBhdGgoZm9sZGVyTmFtZSkpOwotICAgICAgZm9sZGVyLmNyZWF0ZSh0cnVlLHRydWUsbnVsbCk7Ci0gICAgICByZXR1cm4gZm9sZGVyOwotICAgIH0KLSAgICBlbHNlIGlmKCBjaGlsZC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiApCi0gICAgewotICAgICAgcmV0dXJuIChJRm9sZGVyKWNoaWxkOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0gICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIAotICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VVdGlscyIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgMCwgCi0JCQkJCU5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZPTERFUiwgcGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZvbGRlck5hbWUpLnRvU3RyaW5nKCkpLAotCQkJbnVsbCApICk7Ci0gICAgfQotICB9Ci0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIGZpbGUgdW5kZXIgYSBjb250YWluZXIuCi0gIC8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotICAvLwotIHByaXZhdGUgc3RhdGljIElGaWxlIG1ha2VGaWxlICgKLQkJIElDb250YWluZXIgICAgICAgcGFyZW50LAotCQkgU3RyaW5nICAgICAgICAgICBmaWxlTmFtZSwKLQkJIElucHV0U3RyZWFtICAgICAgaW5wdXRTdHJlYW0sCi0JCSBJU3RhdHVzSGFuZGxlciAgICBzdGF0dXNIYW5kbGVyICkKLQotIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gewotCSBTdHJpbmcgaW5uZXJGaWxlTmFtZSA9IGZpbGVOYW1lOwotCSBJRmlsZSBmaWxlID0gcGFyZW50LmdldEZpbGUoIG5ldyBQYXRoKGlubmVyRmlsZU5hbWUpICk7Ci0KLQkgLy8gY3JlYXRlIHRoZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QKLQkgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCSB0cnkgewotCQkJIGZpbGUuY3JlYXRlKCBpbnB1dFN0cmVhbSwgdHJ1ZSwgbnVsbCk7ICAgIAotCQkJIHJldHVybiBmaWxlOwotCQkgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uKSB7Ci0JCQkgLy8gdGhpcyBlcnJvciBvbmx5IGhhcHBlbnMgaW4gYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtOyBzbyBpZ25vcmUgdGhlIGNhc2VzLgotCQkJIGlmIChjb3JlRXhjZXB0aW9uLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuQ0FTRV9WQVJJQU5UX0VYSVNUUykgewotCQkJCSBib29sZWFuIGZvdW5kSWdub3JpbmdDYXNlID0gZmFsc2U7Ci0KLQkJCQkgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBwYXJlbnQubWVtYmVycygpKSB7Ci0JCQkJCSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaW5uZXJGaWxlTmFtZSkpIHsKLQkJCQkJCSAvLyBmb3VuZCB0aGUgZmlsZQotCQkJCQkJIGZvdW5kSWdub3JpbmdDYXNlID0gdHJ1ZTsKLQkJCQkJCSBpbm5lckZpbGVOYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJCQkJIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZSggbmV3IFBhdGgoaW5uZXJGaWxlTmFtZSkpOwotCQkJCQkJIGJyZWFrOwotCQkJCQkgfQotCQkJCSB9Ci0KLQkJCQkgLy8gY2FuJ3QgZmluZCB0aGUgZmlsZSBjYXVzaW5nIHRoZSBDQVNFX1ZBUklBTlRfRVhJU1RTIGV4Y2VwdGlvbjsgdGhyb3cgdGhlIGV4Y2VwdGlvbgotCQkJCSBpZiAoIWZvdW5kSWdub3JpbmdDYXNlKQotCQkJCQkgdGhyb3cgY29yZUV4Y2VwdGlvbjsKLQkJCSB9IGVsc2UgewotCQkJCSAvLyB0aHJvdyBvdGhlciBleGNlcHRpb25zCi0JCQkJIHRocm93IGNvcmVFeGNlcHRpb247Ci0JCQkgfQotCQkgfQotCSB9Ci0KLQkgLy8gZmlsZSBleGlzdHM7IG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZmlsZQotCSBpZiggZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotCSB7ICAgICAgICAKLQkJIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotCQkgaWYoIGZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpICkKLQkJIHsKLQkJCSBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotCQkJIGZpbGVzWzBdID0gZmlsZTsKLQotCQkJIElTdGF0dXMgc3RhdHVzID0gZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLG51bGwpOwotCi0JCQkgdHJ5Ci0JCQkgewotCQkJCSBzdGF0dXNIYW5kbGVyLnJlcG9ydCggc3RhdHVzICk7Ci0JCQkgfQotCQkJIGNhdGNoKCBTdGF0dXNFeGNlcHRpb24gZXhjICkKLQkJCSB7Ci0JCQkJIHJldHVybiBudWxsOwotCQkJIH0KLQkJIH0KLQotCQkgLy9DaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBleGlzdGluZyBmaWxlLgotCQkgZmlsZS5zZXRDb250ZW50cyggaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwgKTsKLQotCQkgcmV0dXJuIGZpbGU7Ci0KLQkgfQotCSB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggCi0JCQkgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwKLQkJCQkJICJSZXNvdXJjZVV0aWxzIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkgMCwgCi0JCQkJCSBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFLCBwYXJlbnQuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoaW5uZXJGaWxlTmFtZSkpLAotCQkJCQkgbnVsbCApICk7Ci0gfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGEzZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2UuZW52aXJvbm1lbnQiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfTlVMTF9BUkdfU1BFQ0lGSUVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfU0NIRU1FX05PVF9GT1VORDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0FCU09MVVRFX1BBVEhfV0lUSE9VVF9TQ0hFTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19VUklfTk9UX1JFTEFUSVZFOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1VORVhQRUNURURfRVJST1I7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSU5WQUxJRF9QTEFURk9STV9VUkw7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfSU5WQUxJRF9GSUxFX1VSTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1BBVEhfTk9UX0FCU09MVVRFOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1BBVEhfRU1QVFk7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfUEFUSF9OT1RfRk9MREVSOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GT0xERVI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZJTEU7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfRk9MREVSX0hBU19DSElMRFJFTjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9JTzsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1lFUzsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1lFU19UT19BTEw7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9DQU5DRUw7IAotICAKLSAgc3RhdGljCi0gIHsKLSAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCBCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvZW52aXJvbm1lbnQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL2Vudmlyb25tZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTA4YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvZW52aXJvbm1lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgU2ltcGxlVVJJRmFjdG9yeQotIwotTVNHX05VTExfQVJHX1NQRUNJRklFRD1OdWxsIHNwZWNpZmllZCBhcyBhcmd1bWVudCB0byB7MH0uCi1NU0dfU0NIRU1FX05PVF9GT1VORD1TY2hlbWUgbm90IGZvdW5kIGZvciBVUkkgezB9LgotTVNHX0FCU09MVVRFX1BBVEhfV0lUSE9VVF9TQ0hFTUU9QWJzb2x1dGUgcGF0aCBzcGVjaWZpZWQgd2l0aG91dCBhIHNjaGVtZSBmb3IgVVJJIHswfS4KLQotIwotIyBDb21tb24gTWVzc2FnZXMKLSMKLU1TR19VUklfTk9UX1JFTEFUSVZFPVVSTDogezB9IGlzIG5vdCByZWxhdGl2ZS4KLU1TR19FUlJPUl9VTkVYUEVDVEVEX0VSUk9SPVVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VyZWQuCi1NU0dfSU5WQUxJRF9QTEFURk9STV9VUkw9SW52YWxpZCBVUkw6IHswfSBmb3IgYW4gRWNsaXBzZSBwbGF0Zm9ybS4KLU1TR19JTlZBTElEX0ZJTEVfVVJMPUludmFsaWQgVVJMOiB7MH0gZm9yIHRoZSBmaWxlIHByb3RvY29sCi0KLSMKLSMgTWVzc2FnZXMgZm9yIFJlc291Y2VVdGlscwotIwotTVNHX0VSUk9SX1BBVEhfTk9UX0FCU09MVVRFPVBhdGggezB9IGlzIG5vdCBhYnNvbHV0ZSBmb3IgY3JlYXRpbmcgYSBmaWxlLgotTVNHX0VSUk9SX1BBVEhfRU1QVFk9UGF0aCB7MH0gaXMgZW1wdHkgd2hpbGUgY3JlYXRpbmcgYSBmaWxlLgotTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUj1QYXRoIHswfSBpcyBub3QgYSBmb2xkZXIgZm9yIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSPVJlc291cmNlIHswfSBpcyBub3QgYSBmb2xkZXIuCi1NU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZJTEU9VGhlIGZvbGxvd2luZyBwYXRoIGlzIG5vdCBhIHJlc291cmNlOiB7MH0uCi1NU0dfRVJST1JfRk9MREVSX0hBU19DSElMRFJFTj1DYW4gbm90IGNyZWF0ZSBmb2xkZXI6IHswfSB0aGF0IGFscmVhZHkgaGFzIGNoaWxkcmVuLgotTVNHX0VSUk9SX0lPPUFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXNvdXJjZSAiezB9Ii4KLQotTEFCRUxfWUVTPVllcwotTEFCRUxfWUVTX1RPX0FMTD1ZZXMgQWxsCi1MQUJFTF9DQU5DRUw9Q2FuY2VsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcGx1Z2luL0Vudmlyb25tZW50UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcGx1Z2luL0Vudmlyb25tZW50UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzA0NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3BsdWdpbi9FbnZpcm9ubWVudFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjIxICAgMTAwMzY0IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnBsdWdpbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucGx1Z2luLkVudmlyb25tZW50UGx1Z2luLgotKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudFBsdWdpbiBleHRlbmRzIFBsdWdpbgotewkKLQkvKioKLQkgKiBUaGUgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRW52aXJvbm1lbnRQbHVnaW4gaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHRoZSBFY2xpcHNlIHBsYXRmb3JtIG9ubHkuCi0JICovCi0JcHVibGljIEVudmlyb25tZW50UGx1Z2luKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBFbnZpcm9ubWVudFBsdWdpbiBnZXRJbnN0YW5jZSAoKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9yZWxhdGl2ZS9SZWxhdGl2ZVNjaGVtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3JlbGF0aXZlL1JlbGF0aXZlU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYjk4NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3JlbGF0aXZlL1JlbGF0aXZlU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFJlbGF0aXZlU2NoZW1lIGltcGxlbWVudHMgSVVSSVNjaGVtZQotewotCi0gIEBPdmVycmlkZQotcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gInJlbGF0aXZlIjsgLy8kTk9OLU5MUy0xJCAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc0hpZXJhcmNoaWNhbCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChJVVJJIHVyaSkKLSAgewotICAgIHJldHVybiAhdXJpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCggIi8iICk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShTdHJpbmcgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoSVVSSSB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVyaS50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubmV0LlVSTCkKLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShVUkwgdXJsKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmwudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVVSSSB1cmkpCi0gIHsKLSAgICBJU3RhdHVzIHJlc3VsdCA9IG51bGw7Ci0gICAgCi0gICAgaWYoIGlzVmFsaWQoIHVyaSApICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgIiIsbnVsbCApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVVUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9yZWxhdGl2ZS9SZWxhdGl2ZVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODc3NDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9yZWxhdGl2ZS9SZWxhdGl2ZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlLk1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVVSSSBpbXBsZW1lbnRzIElVUkkKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyB1cmlfOwotICAKLSAgcHVibGljIFJlbGF0aXZlVVJJKCBTdHJpbmcgdXJpICkKLSAgewotICAgIHVyaV8gPSB1cmk7ICAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhcHBlbmQob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgSVVSSSBhcHBlbmQoSVVSSSByZWxhdGl2ZVVSSSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYoICFyZWxhdGl2ZVVSSS5pc1JlbGF0aXZlKCkpIAotICAgICB7ICAgICAgCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfVVJJX05PVF9SRUxBVElWRSwgcmVsYXRpdmVVUkkudG9TdHJpbmcoKSApLCBudWxsICkgKTsKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgbmV3VVJJID0gdXJpXyArICIvIiArIHJlbGF0aXZlVVJJLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICByZXR1cm4gZ2V0VVJJU2NoZW1lKCkubmV3VVJJKCBuZXdVUkkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIEZpbGUgYXNGaWxlKCkgCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG9TdHJpbmcoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNVUkwoKQotICAgKi8KLSAgcHVibGljIFVSTCBhc1VSTCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2VyYXNlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0SW5wdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0VVJJU2NoZW1lKCkKLSAgICovCi0gIHB1YmxpYyBJVVJJU2NoZW1lIGdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlU2NoZW1lKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNVUkwoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc1VSTCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNIaWVyYXJjaGljYWwoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNMZWFmKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNQcmVzZW50KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWFkYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1JlbGF0aXZlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNXcml0YWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KCkKLSAgICovCi0gIHB1YmxpYyBJVVJJW10gbGlzdCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgSVVSSVswXTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgcHVibGljIElVUklbXSBsaXN0KElVUklGaWx0ZXIgdXJpRmlsdGVyKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IElVUklbMF07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcGFyZW50KCkKLSAgICovCi0gIHB1YmxpYyBJVVJJIHBhcmVudCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGludCBsYXN0U2xhc2ggID0gdXJpXy5sYXN0SW5kZXhPZiggJy8nICk7Ci0gICAgaW50IGZpcnN0U2xhc2ggPSB1cmlfLmluZGV4T2YoICcvJyApOwotICAgIAotICAgIC8vIElmIHRoZXJlIGlzIGEgcGFyZW50LCB0aGVuIGl0IG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoCi0gICAgLy8gYW5kIGVuZCB3aXRoIGEgc2xhc2guCi0gICAgaWYoIGxhc3RTbGFzaCA9PSAtMSB8fCBmaXJzdFNsYXNoID09IC0xICkgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgIHJldHVybiBnZXRVUklTY2hlbWUoKS5uZXdVUkkoIHVyaV8uc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCApICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lKElVUkkgbmV3VVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB1cmlfID0gbmV3VVJJLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG91Y2hGb2xkZXIoKQotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hGb2xkZXIoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaExlYWYoKQotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hMZWFmKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdmlzaXQob3JnLmVjbGlwc2UuZW52LnVyaS5VUklWaXNpdG9yLCBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSUZpbHRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KElVUklWaXNpdG9yIHVyaVZpc2l0b3IsIElVUklGaWx0ZXIgdXJpRmlsdGVyKQotICAgIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gY29udGludWVWaXNpdCA9IHRydWU7Ci0gICAgCi0gICAgLy8gSWYgdGhlIGZpbHRlciBhY2NlcHRzIHRoaXMgd2Ugd2lsbCB2aXNpdCBpdC4KLSAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIHRoaXMgKSApCi0gICAgewotICAgICAgY29udGludWVWaXNpdCA9IHVyaVZpc2l0b3IudmlzaXQoIHRoaXMgKTsgIAotICAgIH0KLSAgICAgICAKLSAgICBJVVJJW10gY2hpbGRyZW4gID0gbGlzdCgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggJiYgY29udGludWVWaXNpdDsgaW5kZXgrKyApCi0gICAgewotICAgICAgY2hpbGRyZW5baW5kZXhdLnZpc2l0KCB1cmlWaXNpdG9yLCB1cmlGaWx0ZXIgKTsKLSAgICB9ICAKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN2aXNpdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVZpc2l0b3IpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJVVJJVmlzaXRvciB1cmlWaXNpdG9yKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGNvbnRpbnVlVmlzaXQgPSB1cmlWaXNpdG9yLnZpc2l0KCB0aGlzICk7ICAKLSAgICAKLSAgICBJVVJJW10gY2hpbGRyZW4gID0gbGlzdCgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggJiYgY29udGludWVWaXNpdDsgaW5kZXgrKyApCi0gICAgIHsKLSAgICAgIGNoaWxkcmVuW2luZGV4XS52aXNpdCggdXJpVmlzaXRvciApOwotICAgIH0gIAotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvdXJpL2ZpbGUvRmlsZVNjaGVtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzMzJiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvdXJpL2ZpbGUvRmlsZVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnVyaS5maWxlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmUuUmVsYXRpdmVVUkk7Ci0KLQotcHVibGljIGNsYXNzIEZpbGVTY2hlbWUgZXh0ZW5kcyBSZWxhdGl2ZVNjaGVtZQotewotICBAT3ZlcnJpZGUKLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjaXNWYWxpZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNWYWxpZChJVVJJIHVyaSkKLSAgeyAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIGlmKCB1cmkgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IHVyaS5nZXRVUklTY2hlbWUoKTsKLSAgICAgIAotICAgIGlmKCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJyZWxhdGl2ZSIpICkgcmV0dXJuIHNjaGVtZS5pc1ZhbGlkKCB1cmkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICBTdHJpbmcgdXJpU3RyaW5nID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgICAKLSAgICBpZiggdXJpU3RyaW5nICE9IG51bGwgJiYgdXJpU3RyaW5nLnN0YXJ0c1dpdGgoICJmaWxlOiIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0gIAotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBJVVJJIG5ld1VSSShTdHJpbmcgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgbmV3VVJJID0gbnVsbDsKLSAgICAKLSAgICBpZiggdXJpICE9IG51bGwgJiYgdXJpLnN0YXJ0c1dpdGgoICJmaWxlOiIpICkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIC8vIFRoZSBmaWxlIHByb3RvY29sIGhhcyBiZWVuIHNwZWNpZmllZCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgbmV3VVJJID0gdXJpOwotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkgPT0gbnVsbCB8fCB1cmkuaW5kZXhPZiggIjoiKSAhPSAtMSApIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICAvLyBUaGUgZmlsZSB1cmkgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBzb21lIG90aGVyIHByb3RvY29sLiAKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0lOVkFMSURfRklMRV9VUkwsdXJpKSwgbnVsbCApICk7Ci0gICAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkuc3RhcnRzV2l0aCggIi8iKSApIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICAvLyBUaGUgZmlsZSBzY2hlbWUgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBzbyB3ZSB3aWxsIGFkZCBpdC4KLSAgICAgIG5ld1VSSSA9ICJmaWxlOiIgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgaWYoIG5ld1VSSSA9PSBudWxsICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkgKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBGaWxlVVJJKCBuZXdVUkkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBJVVJJIG5ld1VSSShJVVJJIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1VSSSggdXJpID09IG51bGwgPyBudWxsIDogdXJpLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5uZXQuVVJMKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgSVVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1VSSSggdXJsID09IG51bGwgPyBudWxsIDogdXJsLnRvU3RyaW5nKCkgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVVUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjNkMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlVVJJIGV4dGVuZHMgUmVsYXRpdmVVUkkgCi17Ci0gIHByaXZhdGUgRmlsZSBmaWxlXyA9IG51bGw7Ci0gIAotICBwdWJsaWMgRmlsZVVSSSggU3RyaW5nIHVyaSApCi0gIHsKLSAgICBzdXBlciggdXJpICk7Ci0gICAgCi0gICAgaWYoIGdldFVSSVNjaGVtZSgpLmlzVmFsaWQoIHRoaXMgKSApCi0gICAgewotICAgICAgZmlsZV8gPSBuZXcgRmlsZSggdXJpLnN1YnN0cmluZyggNSwgdXJpLmxlbmd0aCgpICkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc0ZpbGUoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgRmlsZSBhc0ZpbGUoKSAKLSAgewotICAgIHJldHVybiBmaWxlXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2VyYXNlKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIHZvaWQgZXJhc2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBkZWxldGVGaWxlKCBmaWxlXyApOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUZpbGUoIEZpbGUgZmlsZSApCi0gIHsKLSAgICBpZiggZmlsZS5pc0RpcmVjdG9yeSgpICkKLSAgICB7Ci0gICAgICBGaWxlW10gY2hpbGRyZW4gPSBmaWxlLmxpc3RGaWxlcygpOwotICAgICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBjaGlsZC5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgewotICAgICAgICAgIGRlbGV0ZUZpbGUoIGNoaWxkICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGQuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZmlsZS5kZWxldGUoKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldElucHV0U3RyZWFtKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlXy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAKLSAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGVfICk7ICAKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RyZWFtOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldE91dHB1dFN0cmVhbSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgcGFyZW50ID0gZmlsZV8uZ2V0UGFyZW50RmlsZSgpOwotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgCi0gICAgICBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZmlsZV8gKTsgIAotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0VVJJU2NoZW1lKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIElVUklTY2hlbWUgZ2V0VVJJU2NoZW1lKCkKLSAgewotICAgIHJldHVybiBuZXcgRmlsZVNjaGVtZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNGaWxlKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfICE9IG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc1VSTCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfICE9IG51bGw7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc1VSTCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBVUkwgYXNVUkwoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmwgPSBmaWxlXyA9PSBudWxsID8gbnVsbCA6IGZpbGVfLnRvVVJMKCk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAvLyROT04tTkxTLTEkICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiB1cmw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNMZWFmKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNMZWFmKCkKLSAgewotICAgIHJldHVybiBmaWxlXy5pc0ZpbGUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1ByZXNlbnQoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfLmV4aXN0cygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIHJldHVybiBmaWxlXy5jYW5SZWFkKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNXcml0YWJsZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfLmNhbldyaXRlKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBJVVJJW10gbGlzdCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIEZpbGVbXSBjaGlsZHJlbiA9IGZpbGVfLmxpc3RGaWxlcygpOwotICAgIElVUklbXSAgVVJJcyAgICAgPSBuZXcgSVVSSVswXTsKLSAgICAKLSAgICBpZiggY2hpbGRyZW4gIT0gbnVsbCApCi0gICAgewotICAgICAgaW50ICAgbGVuZ3RoICAgPSBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgICAKLSAgICAgIFVSSXMgPSBuZXcgSVVSSVtsZW5ndGhdOwotICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIFVSSXNbaW5kZXhdID0gbmV3IEZpbGVVUkkoICJmaWxlOiIgKyBjaGlsZHJlbltpbmRleF0uZ2V0QWJzb2x1dGVQYXRoKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gVVJJczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgSVVSSVtdIGxpc3QoSVVSSUZpbHRlciB1cmlGaWx0ZXIpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIEZpbGVbXSAgIGNoaWxkcmVuID0gZmlsZV8ubGlzdEZpbGVzKCk7Ci0gICAgaW50ICAgICAgbGVuZ3RoICAgPSBjaGlsZHJlbiA9PSBudWxsID8gMCA6IGNoaWxkcmVuLmxlbmd0aDsKLSAgICBWZWN0b3IgICBVUklzICAgICA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICBpZihjaGlsZHJlbiAhPSBudWxsKXsKLQkgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0JICAgIHsKLQkgICAgICBJVVJJIG5ld1VSSSA9IG5ldyBGaWxlVVJJKCAiZmlsZToiICsgY2hpbGRyZW5baW5kZXhdLmdldEFic29sdXRlUGF0aCgpICk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAKLQkgICAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIG5ld1VSSSkgKQotCSAgICAgIHsKLQkgICAgICAgIFVSSXMuYWRkKCBuZXdVUkkgKTsKLQkgICAgICB9IAotCSAgICB9Ci0gICAgfQotICAgIHJldHVybiAoSVVSSVtdKVVSSXMudG9BcnJheSggbmV3IElVUklbMF0gKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNyZW5hbWUob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIHJlbmFtZShJVVJJIG5ld1VSSSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgdXJpXyA9IG5ld1VSSS50b1N0cmluZygpOwotICAgICAgVVJMIG5ld1VSTCA9IG5ldyBVUkwoIHVyaV8gKTsKLSAgICAgIGZpbGVfLnJlbmFtZVRvKCBuZXcgRmlsZSggbmV3VVJMLmdldFBhdGgoKSApICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAvLyROT04tTkxTLTEkICAgICAgCi0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIHZvaWQgdG91Y2hGb2xkZXIoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBmaWxlXy5ta2RpcnMoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaExlYWYoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCB0b3VjaExlYWYoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGZvbGRlcnMgYXJlIGNyZWF0ZWQuCi0gICAgICBGaWxlIHBhcmVudCA9IGZpbGVfLmdldFBhcmVudEZpbGUoKTsKLSAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgIAotICAgICAgZmlsZV8uY3JlYXRlTmV3RmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAvLyROT04tTkxTLTEkICAgICAgCi0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQwNTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ind0cF91aS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYTdhMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi13dHBfdWkuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzg4NWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3YTRlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0jTW9uIEp1biAwOCAxNTozNTo0NSBFRFQgMjAwOQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZVVuY2hlY2tlZEV4Y2VwdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTYyZjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZWY5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSB3dHBfdWkvLFwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDgxOWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DdXQ9Q3V0Ci1GTEVYSUJMRV9QUk9KRUNUX1BSRUZFUkVOQ0U9SjJFRSBQcm9qZWN0IE1vZHVsZXMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1XVFAgVUkgUGx1Zy1pbgotV1RQX1VJX0FjdGlvbj1XVFAgVUkgQWN0aW9uCi1FeHRlbmRlZF9WaWV3ZXJzPUV4dGVuZGVkIFZpZXdlcnMKLUV4dGVuZGFibGVfV2l6YXJkPUV4dGVuZGFibGUgV2l6YXJkCi1FeHRlbmRhYmxlX1dpemFyZF9QYWdlPUV4dGVuZGFibGUgV2l6YXJkIFBhZ2UKLURhdGFNb2RlbFdpemFyZD1EYXRhTW9kZWxXaXphcmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzAxYTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ3dHB1aUFjdGlvbiIgbmFtZT0iJVdUUF9VSV9BY3Rpb24iIHNjaGVtYT0ic2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuZGVkVmlld2VyIiBuYW1lPSIlRXh0ZW5kZWRfVmlld2VycyIgc2NoZW1hPSJzY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5kYWJsZVdpemFyZCIgbmFtZT0iJUV4dGVuZGFibGVfV2l6YXJkIiBzY2hlbWE9InNjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndpemFyZFBhZ2VHcm91cCIgbmFtZT0iJUV4dGVuZGFibGVfV2l6YXJkX1BhZ2UiIHNjaGVtYT0ic2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvbiIgbmFtZT0iJURhdGFNb2RlbFdpemFyZCIgc2NoZW1hPSJzY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlVJVGVzdGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51aVRlc3RlciI+Ci0gICAgICA8dWlUZXN0ZXIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlVJVGVzdGVySW1wbCI+Ci0gICAgICA8L3VpVGVzdGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29udGV4dC5TZW5zaXRpdmUuQ2xhc3Muc2F2ZUhhbmRsZXIiCi0gICAgICAgICBuYW1lPSJTYXZlIEhhbmRsZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ic2F2ZUhhbmRsZXIiCi0gICAgICAgICAgICBjb250ZXh0PSJVSSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlNhdmVIYW5kbGVyVUkiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgIG5hbWU9IlVJIEVuYWJsZW1lbnQgRGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgICAgIGNvbnRleHQ9IlVJIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuVUlFbmFibGVtZW50TWFuYWdlciI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLldUUEFjdGl2aXR5QnJpZGdlSGVscGVyIj4KLSAgICAgIDxXVFBBY3Rpdml0eUJyaWRnZUhlbHBlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwiPgotICAgICAgPC9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbHMuT3BlcmF0aW9uRXh0ZW5zaW9uIj4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuUG9zdFBhc3RlQWN0aW9uT3BlcmF0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9uLnVpLlBhc3RlQWN0aW9uT3BlcmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotICAgPGV4dGVuc2lvbiAKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICBrZXk9IklTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0IgotICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSSIKLSAgICAgICAgICBjb250ZXh0PSJVSSIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkY2E0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmNvbW1vbi51aSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGVzIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vcHJvcGVydHlfZmlsZXMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJCi0gIAkJPGNvcHkgZmlsZT0iJHtwbHVnaW5kaXJ9L3BsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcm9wZXJ0eV9maWxlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkYmNmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcm9wZXJ0eV9maWxlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbCA9IFByb2plY3QgY29udGVudHMKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfdXNlRGVmYXVsdExhYmVsID0gVXNlICZkZWZhdWx0Ci1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2xvY2F0aW9uTGFiZWwgPSBEaXJlY3RvciZ5OgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL3d0cGNvbW1vbnVpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcm9wZXJ0eV9maWxlcy93dHBjb21tb251aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzY2MWI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL3d0cGNvbW1vbnVpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUlBY3Rpb25XVFBPcGVyYXRpb25fVUlfMD1ObyBhY3Rpb24gYXZhaWxhYmxlIGZvciBleGVjdXRpb24uCi1XVFBBY3Rpb25EaWFsb2dfVUlfMD1TZWxlY3QgdGhlIG9wdGlvbmFsIGRlcGVuZGVudCBhY3Rpb25zIHlvdSB3b3VsZCBsaWtlIHRvIGV4ZWN1dGUuCi1XVFBPcHRpb25hbE9wZXJhdGlvbkRhdGFNb2RlbF9VSV8wPVJvb3QgdHJlZSBjYW4gbm90IGJlIHNlbGVjdGVkLgotV1RQT3B0aW9uYWxPcGVyYXRpb25EYXRhTW9kZWxfVUlfMT1ObyBvcGVyYXRpb25zIGFyZSBzZWxlY3RlZC4KLU1hc3RlckRlc2NyaXB0b3JfRVJST1JfMj1JV0FFMDAwNUUgV1RQVUlPcGVyYXRpb24gZWxlbWVudHMgcmVxdWlyZSBleGFjdGx5IG9uZSA8c2VsZWN0aW9uRW5hYmxlbWVudCAvPi4KLVdUUE9wZXJhdGlvbkFjdGlvbl9VSV8wPU9wZXJhdGlvbiBTdGF0dXMKLVdUUE9wZXJhdGlvbkFjdGlvbl9VSV8xPVByb2JsZW0gZXhlY3V0aW5nIG9wZXJhdGlvbi4KLVRpbWVyUXVldWVfRVJST1JfMD1JV0FFMDAwNkUgQ2FuJ3Qgc3RhcnQgYSBUaW1lclF1ZXVlIHRoYXQgaXMgYWxyZWFkeSBydW5uaW5nCi1FeHRlbmRlZFdpemFyZFBhZ2VfRVJST1JfMD1JV0FFMDAwN0UgQ2Fubm90IG1vZGlmeSBpZCBhZnRlciBpdCBoYXMgYWxyZWFkeSBiZWVuIHNldC4KLUV4dGVuZGVkV2l6YXJkUGFnZV9FUlJPUl8xPUlXQUUwMDA4RSBUaGUgaWQgY2Fubm90IGJlIG51bGwKLU1hc3RlckRlc2NyaXB0b3JfVUlfMT1ObyBcIiB7MH0gXCIgYXR0cmlidXRlIGRlZmluZWQKLVRpbWVyX1VJXzA9SW52YWxpZCBkZWxheTogezB9Ci1UaW1lcl9VSV8xPUludmFsaWQgaW5pdGlhbCBkZWxheTogezB9Ci1XVFBXaXphcmRfVUlfMD1XaXphcmQgRXJyb3I6IHswfQotV1RQV2l6YXJkX1VJXzE9QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoZW4gezB9IGZpbmlzaGVkLgotV1RQV2l6YXJkX1VJXzI9V2l6YXJkIFdhcm5pbmc6IHswfQotRXh0ZW5kYWJsZVdpemFyZF9VSV8wPVdpemFyZCBwYWdlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIHswfSB7MX0KLVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzA9RWxlbWVudDogezB9IGRvZXMgbm90IGFsbG93IHBhZ2UgaW5zZXJ0aW9uIGFmdGVyLgotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMT17MH0gd2lsbCBub3QgYmUgY3JlYXRlZAotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMj1DaXJjdWxhciBkZXBlbmRlbmN5LCBlbGVtZW50OiB7MH0gY2hlY2s6IHsxfQotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMz1FZGl0b3IgZG9lcyBub3QgYWxsb3cgcGFnZSBpbnNlcnRpb25zCi1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV80PVBhcmVudCBDbGFzcyBOb3QgRm91bmQgRXJyb3I6IHswfSBcclxuIGZvciBhdHRyaWJ1dGU6IHsxfSBpbiBwbHVnaW4gezJ9IFxyXG5QYWdlIG5vdCBjcmVhdGVkCi1EZWxldGVfVUlfMD1EZWxldGUKLU5hbWVfPVByb2plY3QgbmFtZToKLUJyb3dzZV89QnJvd3NlLi4uCi1Qcm9qZWN0X2xvY2F0aW9uXz1Qcm9qZWN0IExvY2F0aW9uOgotTVVMVElQTEVfTU9EVUxFX1BSRUZfVEVYVD1BbGxvdyBNdWx0aXBsZSBtb2R1bGVzIHBlciBwcm9qZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzc1YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL0RhdGFNb2RlbFdpemFyZEV4dGVuc2lvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0iRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uIiBuYW1lPSJEYXRhIE1vZGVsIFdpemFyZCBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQW4gZXh0ZW5zaW9uIHRvIGEgc3BlY2lmaWMgRGF0YSBNb2RlbCBXaXphcmQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkRhdGFNb2RlbFdpemFyZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iRGF0YU1vZGVsV2l6YXJkIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZGF0YSBtb2RlbCB3aXphcmQgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGRhdGEgbW9kZWwgd2l6YXJkIGNsYXNzIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ5OTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9ImV4dGVuZGFibGVXaXphcmQiIG5hbWU9IkV4dGVuZGFibGUgV2l6YXJkIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZGVjbGFyZXMgYSBkYXRhIG1vZGVsIHdpemFyZCBhcyBhIHZhbGlkIGV4dGVuZGFibGUgd2l6YXJkLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0ZW5kYWJsZVdpemFyZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5kYWJsZVdpemFyZCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSByZXF1aXJlZCBpZCBmb3IgdGhlIGRhdGEgbW9kZWwgd2l6YXJkIGluc3RhbmNlIHRvIGJlIGV4dGVuZGVkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkUGFnZS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGE5Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0id2l6YXJkUGFnZUdyb3VwIiBuYW1lPSJFeHRlbmRhYmxlIFdpemFyZCBQYWdlIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgYWxsb3dzIHlvdSB0byBhZGQgYW4gZGF0YSBtb2RlbCB3aXphcmQgcGFnZSB0byBhIHByZWRlZmluZWQgZXh0ZW5zYWJsZSBkYXRhIG1vZGVsIHdpemFyZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIvPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZUdyb3VwIi8+DQotICAgICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRQYWdlR3JvdXAiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndpemFyZElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBtYXRjaCB0aGUgaWQgZGVmaW5lZCBpbiB0aGUgZXh0ZW5kYWJsZVdpemFyZCBlbGVtZW50IGluIHRoZSBleHRlbmRhYmxlV2l6YXJkIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyB0byBzcGVjaWZ5IHdoZXRoZXIgdGhpcyBwYWdlIGFsbG93cyBleHRlbmRlZCBwYWdlcyBhZnRlciBpdHNlbGYsIGRlZmF1bHQgaXQgdHJ1ZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWdlR3JvdXBJbnNlcnRpb25JRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgaXMgdG8gaW1tZWRpYXRlbHkgYWZ0ZXIgYW5vdGhlciBwYWdlLCB0aGlzIG11c3QgbWF0Y2ggdGhlIHBhZ2VJRCBvZiB0aGUgcGFnZSB0byBpbnNlcnQgYWZ0ZXIuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhZ2VHcm91cElEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgZm9yIHRoZSBwYWdlIGdyb3VwIElEDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRQYWdlIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aXphcmRJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGlzIG11c3QgbWF0Y2ggdGhlIGlkIGRlZmluZWQgaW4gdGhlIGV4dGVuZGFibGVXaXphcmQgZWxlbWVudCBpbiB0aGUgZXh0ZW5kYWJsZVdpemFyZCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGlzIGNsYXNzIGlzIGFuIGluc3RhbmNvZiBjb20uaWJtLnd0cC5jb21tb24udWkud2l6YXJkLmV4dGVuc2lvbnMuV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLQ0KLQ0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGVkVmlld2VyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4OTA4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0iZXh0ZW5kZWRWaWV3ZXIiIG5hbWU9IkV4dGVuZGVkIFZpZXdlcnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGV4dGVuZGVkVmlld2VyIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdGhlIGNvbnRyaWJ1dGlvbiBvZiBuZXcgZnVuY3Rpb24gdG8gYW4gZXhpc3Rpbmcgdmlld2VyLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0ZW5kZWRWaWV3ZXIiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuZGVkVmlld2VyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3ZXJJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHJlcXVpcmVkIGlkIGZvciB0aGUgZXh0ZW5kZWRWaWV3ZXIgaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50Vmlld2VySUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWQgdXNlZCB0byBzcGVjaWZ5IGEgcGFyZW50IHZpZXdlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIGZhY3RvcnkgY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgcGF0aCB0byBhbiBpY29uIGltYWdlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgcmVxdWlyZWQgbGFiZWwgZGVzY3JpcHRpb24gZm9yIHRoZSBleHRlbmRlZCB2aWV3ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb25Hcm91cElEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIHNldHRpbmcgdG8gYXNzb2NpYXRlIHRoZSBleHRlbmRlZCB2aWV3ZXIgd2l0aCBhIHNwZWNpZmljIGZ1bmN0aW9uIGdyb3VwIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS93dHB1aUFjdGlvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODg2MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9Ind0cHVpQWN0aW9uIiBuYW1lPSJXVFAgVUkgQWN0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGZvciBXVFAgT3BlcmF0aW9ucyB3aGljaCBuZWVkIHRvIGJlIHRpZWQgdG8gYSBnZW5lcmljIFVJIGFjdGlvbiwgc3VjaCBhcyBDVVQsIENPUFksIFBBU1RFLCBERUxFVEUsIGFuZCBSRU5BTUUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hc3Rlck9wZXJhdGlvbiIvPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2xhdmVPcGVyYXRpb24iLz4NCi0gICAgICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1hc3Rlck9wZXJhdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgQSBtYXN0ZXJPcGVyYXRpb24gZW5hYmxlcyBhbiBleGlzdGluZyBXVFAgT3BlcmF0aW9uIHRvIGJlIHVzZWQgaW4gYSBVSSBhY3Rpb24uIEdlbmVyaWMgSWRzIGFnZ3JlZ2F0ZSBhIHNldCBvZiBtYXN0ZXJPcGVyYXRpb25zIGZvciB0aGUgc2FtZSBBYnN0cmFjdCBhY3Rpb24gKGxpa2UgYSAmcXVvdDtDVVQmcXVvdDsgb3BlcmF0aW9uKS4gV1RQIE9wZXJhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgZXh0ZW5kaWJsZSwgc28gZm9yIGFueSBtYXN0ZXJPcGVyYXRpb24gZGVmaW5lZCwgdGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgcHJlfHBvc3Qgb3BlcmF0aW9ucy4gVGhlc2UgcHJlfHBvc3Qgb3BlcmF0aW9uIGNhbiBoYXZlIHNsYXZlT3BlcmF0aW9uIGVsZW1lbnRzIGRlZmluZWQgd2hpY2ggaW5kaWNhdGUgdGhlIHByZXxwb3N0IG9wZXJhdGlvbiBtYXkgYmUgcnVuIGluZGVwZW5kZW50bHkuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VsZWN0aW9uRW5hYmxlbWVudCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbmRlZEdlbmVyaWNJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlIEdlbmVyaWMgQWN0aW9uIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8uIChlLmcuIFRoZSBpZCBmb3IgQ1VULCBDT1BZLCBQQVNURSwgREVMRVRFLCBSRU5BTUUpLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb25DbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG9mIHlvdXIgb3BlcmF0aW9uLiBZb3VyIG9wZXJhdGlvbiBtdXN0IGJlIGEgV1RQT3BlcmF0aW9uIGFuZCBtdXN0IHByb3ZpZGUgYSBuby1hcmd1bWVudHMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHByb3ZpZGVkLCB0aGUgZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHJldHVybmVkIGJ5IHRoZSBkYXRhTW9kZWwgd2lsbCBiZSB1c2VkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgbmFtZSB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9wdWxhdG9yQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHBvcHVsYXRvckNsYXNzIGtub3dzIGhvdyB0byBwcm92aWRlIGEgV1RQIE9wZXJhdGlvbiBEYXRhIE1vZGVsIGJhc2VkIG9uIGEgZ2l2ZW4gc2VsZWN0aW9uLiBUaGUgZ2V0RGVmYXVsdE9wZXJhdGlvbigpIG1ldGhvZCBvZiB0aGUgZGF0YSBtb2RlbCB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIG9wZXJhdGlvbkNsYXNzIGlzIHByb3ZpZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbHdheXNFeGVjdXRlIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBzZXR0aW5nIHRvIGRldGVybWluZSBleGVjdXRpb24gY29udGV4dA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZUlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgdG8gZGVmaW5lIGFuIG92ZXJyaWRhYmxlIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGlkZW50aWZpY2F0aW9uIGZvciBvcGVyYXRpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InNlbGVjdGlvbkVuYWJsZW1lbnQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoZSBzZWxlY3Rpb25FbmFibGVtZW50IGVsZW1lbnQgYWxsb3dzIHlvdSB0byBmaWx0ZXIgd2hpY2gga2luZHMgb2Ygc2VsZWN0aW9uIHlvdXIgb2JqZWN0IGlzIGFwcGxpY2FibGUgdG8gdXNpbmcgU3RhbmRhcmQgRWNsaXBzZSBBY3Rpb24gRXhwcmVzaW9ucy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2xhdmVPcGVyYXRpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoZSBzbGF2ZU9wZXJhdGlvbiBlbGVtZW50IGRlZmluZXMgZGlzcGxheSBpbmZvcm1hdGlvbiBmb3Igb3BlcmF0aW9ucyB3aGljaCBleHRlbmQgYSBkZWNsYXJlZCBtYXN0ZXIgb3BlcmF0aW9uLiBJZiBhIHByZXxwb3N0IG9wZXJhdGlvbiBvZiBhIG1hc3RlciBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzbGF2ZU9wZXJhdGlvbiBlbGVtZW50LCB0aGVuIHRoZSBwcmV8cG9zdCBvcGVyYXRpb24gd2lsbCBiZSBjb25zaWRlciByZXF1aXJlZCwgYW5kIG5vdCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb25DbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG9mIHlvdXIgb3BlcmF0aW9uLiBZb3VyIG9wZXJhdGlvbiBtdXN0IGJlIGEgV1RQT3BlcmF0aW9uIGFuZCBtdXN0IHByb3ZpZGUgYSBuby1hcmd1bWVudHMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gRm9yIHNsYXZlIG9wZXJhdGlvbnMsIHRoZSBkYXRhIG1vZGVsIG9mIHRoZSBtYXN0ZXIgb3BlcmF0aW9uIHdpbGwgYmUgcHJvdmlkZWQuIFRoZXJlZm9yZSwgc2xhdmVzIGNhbm5vdCBvdmVycmlkZSB0aGUgZGF0YSBtb2RlbCB1c2luZyBhIHNlcGVyYXRlIHBvcHVsYXRvckNsYXNzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgbmFtZSB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im9yIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdENsYXNzIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbmQiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdFN0YXRlIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0Q2xhc3MiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG9iamVjdCBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhZGFwdGFibGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyB0byBzcGVjaWZ5IHRoZSBvYmplY3QgY2xhc3MgYXMgYWRhcHRhYmxlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJhbmQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0U3RhdGUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgZm9yIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIG9iamVjdCBzdGF0ZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgZm9yIGFuIG9iamVjdCBzdGF0ZSBuYW1lIHRvIGNoZWNrIHRoZSBzZWxlY3RlZCBvYmplY3QmYXBvcztzIHZhbHVlIGlzIG1hdGNoaW5nIHdpdGgNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDshLS0gVGhlIGV4YW1wbGVzIGluIHRoaXMgc2VjdGlvbiBoYXZlIGJlZW4gY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXkgcmVmZXJlbmNlIG9ubHkgZXh0ZW5zaW9uIHBvaW50IElEcy4gVGhlc2UgZXhhbXBsZXMgbXVzdCBiZSBjb3JyZWN0ZWQgYmVmb3JlIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAtLSZndDsNCi0mbHQ7IS0tDQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlY2xhcmVzIHR3byBNYXN0ZXIgT3BlcmF0aW9ucyAoJmx0O2NvZGUmZ3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmbHQ7L2NvZGUmZ3Q7IGFuZCAmbHQ7Y29kZSZndDtjb20uYWNtZS51aS5vcGVyYXRpb24uTWFzdGVyT3BlcmF0aW9uQiZsdDsvY29kZSZndDspIHdoaWNoIGFyZSBhdHRhY2hlZCB0byB0aGUgR2VuZXJpYyBJRCAmbHQ7Y29kZSZndDtjb20uYWNtZS51aS5XVFBPcHRpb25hbE9wZXJhdGlvblRlc3QmbHQ7L2NvZGUmZ3Q7LiANCi1UaGUgc2NlbmFyaW8gaGFzIE1hc3RlciBBIHdoaWNoIGhhcyBhcyBhIHByZS1vcGVyYXRpb24gb2YgU2xhdmUgQSBhbmQgYSBwb3N0LW9wZXJhdGlvbiBvZiBTbGF2ZSBDLiBTbGF2ZSBBIGlzIG1hZGUgb3B0aW9uYWwgYnkgdGhlICZsdDtjb2RlJmd0O3NsYXZlT3BlcmF0aW9uJmx0Oy9jb2RlJmd0OyBlbGVtZW50LCB3aGlsZSBTbGF2ZSBDIHdpbGwgYWx3YXlzIGJlIHJ1biAobm8gJmx0O2NvZGUmZ3Q7c2xhdmVPcGVyYXRpb24mbHQ7L2NvZGUmZ3Q7IGlzIGdpdmVuIHRvIHJ1biBpdCBzZXBlcmF0ZWx5KS4gU2xhdmUgQSBmdXJ0aGVyIGhhcyBhbiBvcHRpb25hbCBwcmUtb3BlcmF0aW9uIChTbGF2ZSBCKSB0aGF0IGNhbiBiZSBleGVjdXRlZCBpbmRlcGVudGx5IG9mIGVpdGhlciBTbGF2ZSBBIG9yIE1hc3RlciBBLg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkud3RwdWlBY3Rpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0O21hc3Rlck9wZXJhdGlvbg0KLSAgICAgICAgICAgIHBvcHVsYXRvckNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5BY21lT3BlcmF0aW9uUG9wdWxhdG9yJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslbWFzdGVyX2FfbmFtZSZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7DQotICAgICAgICAgICAgZXh0ZW5kZWRHZW5lcmljSWQ9JnF1b3Q7Y29tLmFjbWUudWkuV1RQT3B0aW9uYWxPcGVyYXRpb25UZXN0JnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7JW1hc3Rlcl9hX2Rlc2NyaXB0aW9uJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvbWFzdGVyT3BlcmF0aW9uJmd0OyANCi0gICAmbHQ7c2xhdmVPcGVyYXRpb24NCi0gICAgICAgICAgICBuYW1lPSZxdW90O1NsYXZlIEEmcXVvdDsNCi0gICAgICAgICAgICBvcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvc2xhdmVPcGVyYXRpb24mZ3Q7IA0KLSAgICAgICZsdDtzbGF2ZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7U2xhdmUgQiZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkImcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9zbGF2ZU9wZXJhdGlvbiZndDsgICAgICANCi0gICAgICAmbHQ7bWFzdGVyT3BlcmF0aW9uDQotICAgICAgICAgICAgcG9wdWxhdG9yQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLkFjbWVPcGVyYXRpb25Qb3B1bGF0b3ImcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90O0VBUiBQcm9qZWN0IEFjdGlvbiZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25CJnF1b3Q7DQotICAgICAgICAgICAgZXh0ZW5kZWRHZW5lcmljSWQ9JnF1b3Q7Y29tLmFjbWUudWkuV1RQT3B0aW9uYWxPcGVyYXRpb25UZXN0JnF1b3Q7Jmd0Ow0KLSAgICAgICAgICAgICZsdDtzZWxlY3Rpb25FbmFibGVtZW50Jmd0OyANCi0gICAgICAgICAgICAgJmx0O29iamVjdFN0YXRlIG5hbWU9JnF1b3Q7cHJvamVjdE5hdHVyZSZxdW90OyB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUmcXVvdDsgLyZndDsNCi0gICAgICAgICAgICAmbHQ7L3NlbGVjdGlvbkVuYWJsZW1lbnQmZ3Q7DQotICAgICAgJmx0Oy9tYXN0ZXJPcGVyYXRpb24mZ3Q7ICAgDQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7ICAgDQotLS0mZ3Q7DQotJmx0OyEtLQ0KLUZvciBlYWNoIG9mIHRoZSBzbGF2ZU9wZXJhdGlvbnMgcmVmZXJlbmNlZCBhYm92ZSwgeW91IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgV1RQIE9wZXJhdGlvbiBFeHRlbnNpb24gZGVjbGFyZWQgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0OyANCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9JnF1b3Q7d3RwdWlBY2l0b24uQWNtZS5FeHRlbnNpb25zJnF1b3Q7DQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkV4dGVuZGFibGVPcGVyYXRpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0O2V4dGVuZGFibGVPcGVyYXRpb24NCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uTWFzdGVyT3BlcmF0aW9uQSZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvZXh0ZW5kYWJsZU9wZXJhdGlvbiZndDsNCi0gICAgICAmbHQ7ZXh0ZW5kYWJsZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvZXh0ZW5kYWJsZU9wZXJhdGlvbiZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiZxdW90OyZndDstLSZndDsNCi0gICAgICAmbHQ7IS0tIE1hZGUgb3B0aW9uYWwgYnkgdGhlIGFib3ZlIGRlY2xhcmF0aW9uIC0tJmd0Ow0KLSAgICAgICZsdDshLS0mbHQ7b3BlcmF0aW9uRXh0ZW5zaW9uDQotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQSZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvb3BlcmF0aW9uRXh0ZW5zaW9uJmd0Oy0tJmd0Ow0KLSAgICAgICZsdDshLS0gTWFkZSBvcHRpb25hbCBieSB0aGUgYWJvdmUgZGVjbGFyYXRpb24gLS0mZ3Q7DQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwb3N0T3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQiZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7LS0mZ3Q7ICAgDQotICAgICAgJmx0OyEtLSBOb24tb3B0aW9uYWwgb3BlcmF0aW9uLCB3aWxsIGFsd2F5cyBydW4gLS0mZ3Q7DQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwb3N0T3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQyZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvb3BlcmF0aW9uRXh0ZW5zaW9uJmd0OyAgDQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IA0KLSZsdDsvcHJlJmd0Ow0KLS0tJmd0Ow0KLSZsdDshLS0NCi1JbiBnZW5lcmFsLCB1c2VycyBleHRlbmRpbmcgZXhpc3RpbmcgYWN0aW9ucyBvbmx5IG5lZWQgdG8gZGVjbGFyZSB0aGUgZm9sbG93aW5nOiANCi0tLSZndDsNCi0mbHQ7IS0tDQotJmx0O3ByZSZndDsNCi0gJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5PcGVyYXRpb25FeHRlbnNpb24mcXVvdDsmZ3Q7LS0mZ3Q7IA0KLSAmbHQ7IS0tIFRoZSBhY3Rpb24gcmVmZXJlbmNlZCBtdXN0IGJlIGRlY2xhcmVkIGFzIGV4dGVuc2libGUgYnkgdGhlICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkV4dGVuZGFibGVPcGVyYXRpb24gZXh0ZW5zaW9uIHBvaW50IC0tJmd0OyAgICAgICAgIA0KLSAgICAgICZsdDshLS0mbHQ7b3BlcmF0aW9uRXh0ZW5zaW9uDQotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Li4uWU9VUiBDTEFTUy4uLiZxdW90OyAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlkPSZxdW90Oy4uLklEIE9GIEVYSVNUSU5HIE9QRVJBVElPTi4uLiZxdW90OyZndDsgDQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7IA0KLSAmbHQ7L2V4dGVuc2lvbiZndDsgICAgICANCi0mbHQ7L3ByZSZndDsgICAgICANCi0tLSZndDsNCi0mbHQ7IS0tDQotQW5kIGlmIHlvdXIgb3BlcmF0aW9uIGlzIG9wdGlvbmFsIGRlY2xhcmUgdGhlIHNsYXZlT3BlcmF0aW9uOg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0OyANCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLnd0cHVpQWN0aW9uJnF1b3Q7Jmd0OyANCi0gICAmbHQ7c2xhdmVPcGVyYXRpb24NCi0gICAgICAgICAgICBuYW1lPSZxdW90Oy4uTkFNRSBPRiBZT1VSIE9QRVJBVElPTi4uLiZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90Oy4uLkRFU0NSSVBUSU9OIE9GIFlPVVIgQUNUSU9OLi4uJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Li4uWU9VUiBDTEFTUy4uLiZxdW90OyZndDsNCi0gICAgICAmbHQ7L3NsYXZlT3BlcmF0aW9uJmd0OyANCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgICAgICANCi0mbHQ7L3ByZSZndDsNCi0tLSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0FkZGFibGVQYWdlR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0FkZGFibGVQYWdlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjMzM2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9BZGRhYmxlUGFnZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQWRkYWJsZVBhZ2VHcm91cCBleHRlbmRzICBJRE1QYWdlR3JvdXAKLXsKLSAgcHVibGljIHZvaWQgYWRkUGFnZSggSVdpemFyZFBhZ2UgcGFnZSApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsU3luY2hIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFN5bmNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMThhYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsU3luY2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5UaW1lZE1vZGlmeUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxTeW5jaEhlbHBlciBpbXBsZW1lbnRzIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTGludXggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIkxpbnV4Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCXByb3RlY3RlZCBNYXAgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2g7Ci0JcHJvdGVjdGVkIE1hcCBwcm9wZXJ0eVRvV2lkZ2V0SGFzaDsKLQlwcm90ZWN0ZWQgTWFwIHdpZGdldFRvRGVwQ29udHJvbHM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLQlwcm90ZWN0ZWQgV2lkZ2V0IGN1cnJlbnRXaWRnZXQ7Ci0JcHJvdGVjdGVkIFdpZGdldCBjdXJyZW50V2lkZ2V0RnJvbUV2ZW50OyAvLyBUT0RPIE00IHNlZSBpZiB0aGlzIHNob3VsZCBiZSBzZXQgd2l0aCBmb3IKLQkvLyBsaXN0ZW5lcnMKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVNb2RpZnlFdmVudCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBjbGFzcyBNb2RpZnlUZXh0TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZU1vZGlmeUV2ZW50KQotCQkJCXJldHVybjsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gdGV4dCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHRleHQpOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXh0LmdldFRleHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1vZGlmeVRleHRMaXN0ZW5lciBtb2RpZnlUZXh0TGlzdGVuZXI7Ci0JcHJpdmF0ZSBUaW1lZE1vZGlmeUxpc3RlbmVyIHRpbWVkTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIGNsYXNzIENvbWJvTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZU1vZGlmeUV2ZW50KQotCQkJCXJldHVybjsKLQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gY29tYm8pCi0JCQkJcmV0dXJuOwotCi0JCQl0cnkgewotCQkJCWN1cnJlbnRXaWRnZXRGcm9tRXZlbnQgPSBjb21ibzsKLQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGNvbWJvKTsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRhdGFNb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJLy8gT24gYSBjb21ibyBzZWxlY3Rpb24gbGludXggZmlyZXMgMiBldmVudHM7Ci0JCQkJLy8gdGhlIGZpcnN0IGNsZWFycyB0aGUgdmFsdWUgd2hpY2ggbmVlZHMgdG8gYmUgaWdub3JlZCB3aGVuIHRoZSB0eXBlIGlzIG5vdCBTdHJpbmcKLQkJCQkvLyB0aGUgc2Vjb25kIHNldHMgdGhlIG5ldyB2YWx1ZQotCQkJCWlmIChpc0xpbnV4ICYmIGRlc2NyaXB0aW9uLmxlbmd0aCgpID09IDAgJiYgZGVzY3JpcHRvcnMubGVuZ3RoICE9IDAgJiYgIShkZXNjcmlwdG9yc1swXS5nZXRQcm9wZXJ0eVZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSkpIHsKLQkJCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGNvbWJvLmdldFRleHQoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWN1cnJlbnRXaWRnZXRGcm9tRXZlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBjb21ibykKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGNvbWJvKTsKLQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID49IDApIHsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRhdGFNb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb21iby5nZXRJdGVtKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGRlc2NyaXB0aW9uLmVxdWFscyhkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpKSB7Ci0JCQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBjb21iby5nZXRJdGVtKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbWJvTGlzdGVuZXIgY29tYm9MaXN0ZW5lcjsKLQotCXByaXZhdGUgY2xhc3MgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBidXR0b24pCi0JCQkJcmV0dXJuOwotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHdpZGdldFRvUHJvcGVydHlIYXNoLmdldChidXR0b24pOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXcgQm9vbGVhbihidXR0b24uZ2V0U2VsZWN0aW9uKCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgY2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXB1YmxpYyBEYXRhTW9kZWxTeW5jaEhlbHBlcihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gbW9kZWw7Ci0JCWRhdGFNb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94Vmlld2VyTGlzdGVuZXIgY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBDaGVja0JveFZpZXdlckxpc3RlbmVyIGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGV2ZW50LmdldFNvdXJjZSgpOwotCQkJQ2hlY2tib3hUYWJsZVZpZXdlciBjaGVja0JveFRhYmxlVmlld2VyOwotCQkJQ2hlY2tib3hUcmVlVmlld2VyIGNoZWNrQm94VHJlZVZpZXdlcjsKLQkJCU9iamVjdFtdIGl0ZW1zID0gbnVsbDsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBDaGVja2JveFRhYmxlVmlld2VyKSB7Ci0JCQkJY2hlY2tCb3hUYWJsZVZpZXdlciA9IChDaGVja2JveFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0JCQkJaXRlbXMgPSBjaGVja0JveFRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJfSBlbHNlIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBDaGVja2JveFRyZWVWaWV3ZXIpIHsKLQkJCQljaGVja0JveFRyZWVWaWV3ZXIgPSAoQ2hlY2tib3hUcmVlVmlld2VyKSB2aWV3ZXI7Ci0JCQkJaXRlbXMgPSBjaGVja0JveFRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQkJc2V0UHJvcGVydHlJdGVtcyhwcm9wZXJ0eU5hbWUsIGl0ZW1zKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCWludCBmbGFnID0gZXZlbnQuZ2V0RmxhZygpOwotCQlpZiAoZmxhZyA9PSBEYXRhTW9kZWxFdmVudC5FTkFCTEVfQ0hHKQotCQkJc2V0RW5hYmxlbWVudChwcm9wZXJ0eU5hbWUsIGV2ZW50LmlzUHJvcGVydHlFbmFibGVkKCkpOwotCQllbHNlCi0JCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgZmxhZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWN1cnJlbnRQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZTsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWN1cnJlbnRQcm9wZXJ0eSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eUl0ZW1zKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdFtdIGl0ZW1zKSB7Ci0JCWN1cnJlbnRQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZTsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGl0ZW1zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWN1cnJlbnRQcm9wZXJ0eSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBVSSB0byBoYXZlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBkZWZpbmVkIGluIHRoZSBtb2RlbAotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAbGluayBJRGF0YU1vZGVsTGlzdGVuZXIgZm9yIHRoZSBmbGFnIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaFVJV2l0aE1vZGVsKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGludCBmbGFnKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5VG9XaWRnZXRIYXNoICYmIHByb3BlcnR5VG9XaWRnZXRIYXNoLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0VGhyZWFkKCkpewotCQkJCWRvU3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIGZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlkb1N5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBmbGFnKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcnVuIG9uIHRoZSBVSSB0aHJlYWQKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIGZsYWcKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9TeW5jaFVJV2l0aE1vZGVsKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGludCBmbGFnKSB7Ci0JCXRyeSB7Ci0JCQljdXJyZW50V2lkZ2V0ID0gKFdpZGdldCkgcHJvcGVydHlUb1dpZGdldEhhc2guZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCAhPSBudWxsICYmIGN1cnJlbnRXaWRnZXQgIT0gY3VycmVudFdpZGdldEZyb21FdmVudCkgewotCQkJCS8vV2UgbXVzdCBob2xkIGEgY29weSBpbiBhIHRlbXAgdmFyaWFibGUgYmVjYXVzZSBzZXR0aW5nIHRoZSB3aWRnZXQgdmFsdWUKLQkJCQkvL21heSB0cmlnZ2VyIGFuIGV2ZW50IHRoYXQgd2lsbCBjYXVzZSB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgYWdhaW4uCi0JCQkJV2lkZ2V0IHdpZGdldCA9IGN1cnJlbnRXaWRnZXQ7Ci0JCQkJdHJ5IHsKLQkJCQkJaWdub3JlTW9kaWZ5RXZlbnQgPSB0cnVlOwotCQkJCQlpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRleHQpCi0JCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChUZXh0KSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChDb21ibykgY3VycmVudFdpZGdldCk7Ci0JCQkJCX0gZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKEJ1dHRvbikgY3VycmVudFdpZGdldCk7Ci0JCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBMYWJlbCkKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKExhYmVsKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChMaXN0KSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRhYmxlKQotCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoVGFibGUpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVHJlZSkKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKFRyZWUpIGN1cnJlbnRXaWRnZXQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlnbm9yZU1vZGlmeUV2ZW50ID0gZmFsc2U7Ci0JCQkJfQotCQkJCS8vUGFzcyB0aGUgY29weSBvZiB0aGUgY3VycmVudFdpZGdldAotCQkJCXNldEVuYWJsZW1lbnQoKENvbnRyb2wpIHdpZGdldCwgZGF0YU1vZGVsLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJY3VycmVudFdpZGdldCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlbWVudChDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoY29udHJvbC5pc0VuYWJsZWQoKSAhPSBlbmFibGVkKQotCQkJY29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlzZXREZXBlbmRlbnRDb250cm9sRW5hYmxlbWVudChjb250cm9sLCBlbmFibGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW5hYmxlbWVudChmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKHByb3BlcnR5VG9XaWRnZXRIYXNoICE9IG51bGwpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5nZXQocHJvcGVydHlOYW1lKTsKLQkJCQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQkJc2V0RW5hYmxlbWVudChjb250cm9sLCBlbmFibGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREZXBlbmRlbnRDb250cm9sRW5hYmxlbWVudChDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAod2lkZ2V0VG9EZXBDb250cm9scyAhPSBudWxsKSB7Ci0JCQlDb250cm9sW10gZGVwZW5kZW50cyA9IChDb250cm9sW10pIHdpZGdldFRvRGVwQ29udHJvbHMuZ2V0KGNvbnRyb2wpOwotCQkJaWYgKGRlcGVuZGVudHMgIT0gbnVsbCkgewotCQkJCUNvbnRyb2wgZGVwID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGVwID0gZGVwZW5kZW50c1tpXTsKLQkJCQkJaWYgKGRlcC5pc0VuYWJsZWQoKSAhPSBlbmFibGVkKQotCQkJCQkJZGVwLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIEJ1dHRvbiBidXR0b24pIHsKLQkJaWYgKChidXR0b24uZ2V0U3R5bGUoKSAmIFNXVC5DSEVDSykgPT0gU1dULkNIRUNLIHx8IChidXR0b24uZ2V0U3R5bGUoKSAmIFNXVC5SQURJTykgPT0gU1dULlJBRElPKSB7Ci0JCQlib29sZWFuIGNoZWNrZWQgPSBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAoYnV0dG9uLmdldFNlbGVjdGlvbigpICE9IGNoZWNrZWQpIHsKLQkJCQlidXR0b24uc2V0U2VsZWN0aW9uKGNoZWNrZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIENvbWJvIGNvbWJvKSB7Ci0JCWlmIChmbGFnID09IERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcgfHwgY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJLy8gRGlzcGxheSBwcm9wZXJ0aWVzIHNob3VsZCBvbmx5IGZpcmUgaWYgdGhlIGNvbnRlbnRzIGNoYW5nZS4KLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXRlbXNbaV0gPSBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCQljb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0KLQkJU3RyaW5nIG5ld1RleHQgPSBkYXRhTW9kZWwuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSkuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpOwotCQlpbnQgc2VsSW5kZXggPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsSW5kZXggPCAwIHx8ICFuZXdUZXh0LmVxdWFscyhjb21iby5nZXRJdGVtKHNlbEluZGV4KSkpIHsKLQkJCVN0cmluZ1tdIGl0ZW1zID0gY29tYm8uZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXRlbXNbaV0uZXF1YWxzKG5ld1RleHQpKSB7Ci0JCQkJCWNvbWJvLnNlbGVjdChpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQljb21iby5zZXRUZXh0KG5ld1RleHQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBUZXh0IHRleHQpIHsKLQkJU3RyaW5nIG5ld1RleHQgPSBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKCFuZXdUZXh0LmVxdWFscyh0ZXh0LmdldFRleHQoKSkpIHsKLQkJCXRleHQuc2V0VGV4dChuZXdUZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBUYWJsZSB0YWJsZSkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IChPYmplY3RbXSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlzZXRUYWJsZUl0ZW1zQ2hlY2tlZCh0YWJsZS5nZXRJdGVtcygpLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJamF2YS51dGlsLkxpc3QgZWxlbWVudExpc3QgPSBBcnJheXMuYXNMaXN0KGVsZW1lbnRzKTsKLQkJVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZUl0ZW1zW2ldOwotCQkJaWYgKGVsZW1lbnRMaXN0LmNvbnRhaW5zKGl0ZW0uZ2V0RGF0YSgpKSkKLQkJCQlpdGVtLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQllbHNlCi0JCQkJaXRlbS5zZXRDaGVja2VkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhYmxlSXRlbXNDaGVja2VkKFRhYmxlSXRlbVtdIHRhYmxlSXRlbXMsIGJvb2xlYW4gYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspCi0JCQl0YWJsZUl0ZW1zW2ldLnNldENoZWNrZWQoYik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIFRyZWUgdHJlZSkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IChPYmplY3RbXSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlqYXZhLnV0aWwuTGlzdCBlbGVtZW50TGlzdCA9IEFycmF5cy5hc0xpc3QoZWxlbWVudHMpOwotCQlUcmVlSXRlbVtdIHRyZWVJdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlzZXRUcmVlSXRlbXNHcmV5KHRyZWVJdGVtcywgZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0cmVlSXRlbXMubGVuZ3RoID4gMCkKLQkJCXNldFRyZWVJdGVtQ2hlY2tlZCh0cmVlSXRlbXMsIGVsZW1lbnRMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUcmVlSXRlbXNHcmV5KFRyZWVJdGVtW10gdHJlZUl0ZW1zLCBib29sZWFuIGIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlSXRlbXNbaV07Ci0JCQlpdGVtLnNldEdyYXllZChiKTsKLQkJCXNldFRyZWVJdGVtc0dyZXkodHJlZUl0ZW1zW2ldLmdldEl0ZW1zKCksIGIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHJlZUl0ZW1DaGVja2VkKFRyZWVJdGVtW10gdHJlZUl0ZW1zLCBqYXZhLnV0aWwuTGlzdCBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGl0ZW1zLmNvbnRhaW5zKHRyZWVJdGVtc1tpXS5nZXREYXRhKCkpKXsKLQkJCQl0cmVlSXRlbXNbaV0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQl0cmVlSXRlbXNbaV0uc2V0R3JheWVkKGZhbHNlKTsKLQkJCX1lbHNlewotCQkJCXRyZWVJdGVtc1tpXS5zZXRHcmF5ZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlUcmVlSXRlbVtdIGNoaWxkZXJuSXRlbXMgPSB0cmVlSXRlbXNbaV0uZ2V0SXRlbXMoKTsKLQkJCWlmIChjaGlsZGVybkl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCQl0cmVlSXRlbXNbaV0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQkJc2V0VHJlZUl0ZW1DaGVja2VkKGNoaWxkZXJuSXRlbXMsIGl0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBMYWJlbCBsYWJlbCkgewotCQlTdHJpbmcgbmV3VGV4dCA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoIW5ld1RleHQuZXF1YWxzKGxhYmVsLmdldFRleHQoKSkpIHsKLQkJCWxhYmVsLnNldFRleHQobmV3VGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgTGlzdCBsaXN0KSB7Ci0JCU9iamVjdCBuZXdDb250ZW50cyA9IGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAobmV3Q29udGVudHMgPT0gbnVsbCkgewotCQkJbGlzdC5zZXRJdGVtcyhuZXcgU3RyaW5nWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobmV3Q29udGVudHMgaW5zdGFuY2VvZiBqYXZhLnV0aWwuTGlzdCkgewotCQkJamF2YS51dGlsLkxpc3QgbW9kZWxDb250ZW50cyA9IChqYXZhLnV0aWwuTGlzdCkgbmV3Q29udGVudHM7Ci0JCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbW9kZWxDb250ZW50cy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbENvbnRlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJaXRlbXNbaV0gPSBtb2RlbENvbnRlbnRzLmdldChpKS50b1N0cmluZygpOwotCQkJfQotCQkJbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0gZWxzZSBpZiAobmV3Q29udGVudHMgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotCQkJbGlzdC5zZXRJdGVtcygoU3RyaW5nW10pIG5ld0NvbnRlbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoQWxsVUlXaXRoTW9kZWwoKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5VG9XaWRnZXRIYXNoKSB7Ci0JCQlDb2xsZWN0aW9uIGtleXMgPSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5rZXlTZXQoKTsKLQkJCWlmICgha2V5cy5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvciBwcm9wZXJ0eU5hbWVzID0ga2V5cy5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBudWxsOwotCQkJCXdoaWxlIChwcm9wZXJ0eU5hbWVzLmhhc05leHQoKSkgewotCQkJCQlwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0eU5hbWVzLm5leHQoKTsKLQkJCQkJc3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hDb21wb3NpdGUoV2lkZ2V0IHdpZGdldCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcENvbnRyb2xzKSB7Ci0JCWlmIChudWxsID09IHdpZGdldFRvUHJvcGVydHlIYXNoKQotCQkJd2lkZ2V0VG9Qcm9wZXJ0eUhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAocHJvcGVydHlUb1dpZGdldEhhc2ggPT0gbnVsbCkKLQkJCXByb3BlcnR5VG9XaWRnZXRIYXNoID0gbmV3IEhhc2hNYXAoKTsKLQkJd2lkZ2V0VG9Qcm9wZXJ0eUhhc2gucHV0KHdpZGdldCwgcHJvcGVydHlOYW1lKTsKLQkJcHJvcGVydHlUb1dpZGdldEhhc2gucHV0KHByb3BlcnR5TmFtZSwgd2lkZ2V0KTsKLQkJaWYgKGRlcENvbnRyb2xzICE9IG51bGwpIHsKLQkJCWlmICh3aWRnZXRUb0RlcENvbnRyb2xzID09IG51bGwpCi0JCQkJd2lkZ2V0VG9EZXBDb250cm9scyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl3aWRnZXRUb0RlcENvbnRyb2xzLnB1dCh3aWRnZXQsIGRlcENvbnRyb2xzKTsKLQkJfQotCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaFRleHQoVGV4dCB0ZXh0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hUZXh0KHRleHQsIHByb3BlcnR5TmFtZSwgZmFsc2UsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaFRleHQoVGV4dCB0ZXh0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIGlzVGltZU1vZGlmaWVkLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUodGV4dCwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChpc1RpbWVNb2RpZmllZCkKLQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0VGltZWRMaXN0ZW5lcigpKTsKLQkJZWxzZQotCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRNb2RpZnlUZXh0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hMYWJlbChMYWJlbCBsYWJlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCXN5bmNoQ29tcG9zaXRlKGxhYmVsLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBzeW5jaCB0aGUgY29udGVudHMgb2YgdGhlIDxjb2RlPmxpc3Q8L2NvZGU+IHRvIHRoZSBMaXN0IGVsZW1lbnRzIHJldHVybmVkIGZyb20KLQkgKiB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaExpc3QoTGlzdCBsaXN0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUobGlzdCwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgdG8gc3luY2ggdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgQ29tYm8gd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZS4gVGhlCi0JICogcG9zc2libGUgdmFsdWVzIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcmUgZGV0ZXJtaW5lZCBieSByZXR1cm4gb2YKLQkgKiBJRGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpLgotCSAqIAotCSAqIEBwYXJhbSBjb21ibwotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcGFyYW0gZGVwZW5kZW50Q29udHJvbHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaENvbWJvKENvbWJvIGNvbWJvLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUoY29tYm8sIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCQlpZiAobnVsbCA9PSBjb21ib0xpc3RlbmVyKSB7Ci0JCQljb21ib0xpc3RlbmVyID0gbmV3IENvbWJvTGlzdGVuZXIoKTsKLQkJfQotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgdG8gc3luYyB0aGUgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjaGVja2JveCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHlOYW1lLiBUaGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBtdXN0IGNvbnRhaW4gYSBqYXZhLmxhbmcuQm9vbGVhbiB0eXBlZCBPYmplY3QuCi0JICogCi0JICogQHBhcmFtIGNoZWNrYm94Ci0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBkZXBlbmRlbnRDb250cm9scwotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tib3goQnV0dG9uIGNoZWNrYm94LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUoY2hlY2tib3gsIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCQlpZiAobnVsbCA9PSBjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQljaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IENoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCQljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaENoZWNrQm94VGFibGVWaWV3ZXIoQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCXN5bmNoQ29tcG9zaXRlKHRhYmxlVmlld2VyLmdldENvbnRyb2woKSwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChudWxsID09IGNoZWNrQm94Vmlld2VyU3RhdGVMaXN0ZW5lcikgewotCQkJY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyID0gbmV3IENoZWNrQm94Vmlld2VyTGlzdGVuZXIoKTsKLQkJfQotCQl0YWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIoY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaENoZWNrQm94VHJlZVZpZXdlcihDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXN5bmNoQ29tcG9zaXRlKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKG51bGwgPT0gY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKSB7Ci0JCQljaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIgPSBuZXcgQ2hlY2tCb3hWaWV3ZXJMaXN0ZW5lcigpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGNoZWNrQm94Vmlld2VyU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hSYWRpbyhCdXR0b24gcmFkaW8sIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQkvLyBVc2VzIGNoZWNrYm94IHN5bmNoZXIKLQkJc3luY2hDaGVja2JveChyYWRpbywgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JfQotCi0JcHJpdmF0ZSBUaW1lZE1vZGlmeUxpc3RlbmVyIGdldFRpbWVkTGlzdGVuZXIoKSB7Ci0JCWlmICh0aW1lZE1vZGlmeUxpc3RlbmVyID09IG51bGwpCi0JCQl0aW1lZE1vZGlmeUxpc3RlbmVyID0gbmV3IFRpbWVkTW9kaWZ5TGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVdpZGdldCB3ID0gKFdpZGdldCkgZS5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gdyB8fCB3LmlzRGlzcG9zZWQoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHdpZGdldFRvUHJvcGVydHlIYXNoLmdldCh3KTsKLQkJCQkJc2V0VGV4dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgKFRleHQpIHcpOwotCQkJCX0KLQkJCX0pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKGlnbm9yZU1vZGlmeUV2ZW50KQotCQkJCQkJcmV0dXJuOwotCQkJCQlzdXBlci5tb2RpZnlUZXh0KGUpOwotCQkJCX0KLQkJCX07Ci0JCXJldHVybiB0aW1lZE1vZGlmeUxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRleHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBUZXh0IHRleHQpIHsKLQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXh0LmdldFRleHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZnlUZXh0TGlzdGVuZXIgZ2V0TW9kaWZ5VGV4dExpc3RlbmVyKCkgewotCQlpZiAobnVsbCA9PSBtb2RpZnlUZXh0TGlzdGVuZXIpCi0JCQltb2RpZnlUZXh0TGlzdGVuZXIgPSBuZXcgTW9kaWZ5VGV4dExpc3RlbmVyKCk7Ci0JCXJldHVybiBtb2RpZnlUZXh0TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRhdGFNb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJY2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciA9IG51bGw7Ci0JCWN1cnJlbnRXaWRnZXQgPSBudWxsOwotCQltb2RpZnlUZXh0TGlzdGVuZXIgPSBudWxsOwotCQlwcm9wZXJ0eVRvV2lkZ2V0SGFzaCA9IG51bGw7Ci0JCXRpbWVkTW9kaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl3aWRnZXRUb0RlcENvbnRyb2xzID0gbnVsbDsKLQkJd2lkZ2V0VG9Qcm9wZXJ0eUhhc2ggPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTU2NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjEzOTI3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aS5XYXJuaW5nRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlBhZ2VHcm91cE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhTW9kZWxXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJRE1QYWdlSGFuZGxlciB7Ci0JCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQlwcml2YXRlIEFkZGFibGVQYWdlR3JvdXAgcm9vdFBhZ2VHcm91cDsKLQlwcml2YXRlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiByb290T3BlcmF0aW9uOwotCi0JcHJpdmF0ZSBQYWdlR3JvdXBNYW5hZ2VyIHBhZ2VHcm91cE1hbmFnZXI7Ci0JcHJpdmF0ZSBQYWdlRXh0ZW5zaW9uTWFuYWdlciBwYWdlRXh0ZW5zaW9uTWFuYWdlcjsKLQotCS8vIHByaXZhdGUgSVdpemFyZFBhZ2UgZmlyc3RwYWdlOwotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkKCkgewotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB3aXphcmQgSUQgdGhhdCBjbGllbnRzIHNob3VsZCBleHRlbmQgdG8gYWRkIHRvIHRoaXMgd2l6YXJkCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRXaXphcmRJRCgpIHsKLQkJcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldElEKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiByZXR1cm5zIHRoZSByb290IG9wZXJhdGlvbiBmb3IgdGhpcyB3aXphcmQuCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBnZXRSb290T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbilnZXREYXRhTW9kZWwoKS5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBmaW5hbGl6ZWQgdG8gaGFuZGxlIHRoZSBhZGRpbmcgb2YgZXh0ZW5kZWQgcGFnZXMuIENsaWVudHMgc2hvdWxkIG92ZXJyaWRlCi0JICogZG9BZGRQYWdlcygpIHRvIGFkZCB0aGVpciBwYWdlcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRQYWdlcygpIHsKLQkJaW5pdCgpOwotCQlkb0FkZFBhZ2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHBhZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JfQotCi0JLy8gVE9ETyBtYWtlIHRoaXMgZmluYWwKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCkgewotCQlwYWdlR3JvdXBNYW5hZ2VyLnJlc2V0KCk7Ci0JCXJldHVybiBnZXROZXh0UGFnZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHdpc2hpbmcgdG8gY29udHJvbCB0aGUgcGFnZSBvcmRlcmluZyBzaG91bGQgZG8gc28gYnkgb3ZlcnJpZGluZwotCSAqIGdldE5leHRQYWdlKFN0cmluZywgU3RyaW5nKSBhbmQgZ2V0UHJldmlvdXNQYWdlKFN0cmluZywgU3RyaW5nKQotCSAqIAotCSAqIEBsaW5rICNnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiBAbGluayAjZ2V0UHJldmlvdXNQYWdlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCS8vIFRPRE8gbWFrZSB0aGlzIGZpbmFsCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQotCQlJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCi0JCUlXaXphcmRQYWdlIG5leHRQYWdlID0gcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpOwotCi0JCS8vIElmIGFuIGVycm9yIG9jY3VyZWQgdGhlbiB0aGUgY3VycmVudCBwYWdlIGFuZCB0aGUgbmV4dCBwYWdlIHdpbGwgYmUgdGhlIHNhbWUuCi0JCWlmIChjdXJyZW50UGFnZSAhPSBuZXh0UGFnZSAmJiBuZXh0UGFnZSAhPSBudWxsKSB7Ci0JCQluZXh0UGFnZS5zZXRXaXphcmQodGhpcyk7Ci0JCQluZXh0UGFnZS5zZXRQcmV2aW91c1BhZ2UoY3VycmVudFBhZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnJlbnRQYWdlID09IG5leHRQYWdlID8gbnVsbCA6IG5leHRQYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkTmV4dFBhZ2VOYW1lKSB7Ci0JCXJldHVybiBleHBlY3RlZE5leHRQYWdlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHdpc2hpbmcgdG8gY29udHJvbCB0aGUgcGFnZSBvcmRlcmluZyBzaG91bGQgZG8gc28gYnkgb3ZlcnJpZGluZwotCSAqIGdldE5leHRQYWdlKFN0cmluZywgU3RyaW5nKSBhbmQgZ2V0UHJldmlvdXNQYWdlKFN0cmluZywgU3RyaW5nKQotCSAqIAotCSAqIEBsaW5rICNnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiBAbGluayAjZ2V0UHJldmlvdXNQYWdlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCS8vIFRPRE8gbWFrZSB0aGlzIGZpbmFsCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXJldHVybiBwYWdlICE9IG51bGwgPyBwYWdlLmdldFByZXZpb3VzUGFnZSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lKSB7Ci0JCXJldHVybiBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAoIXN1cGVyLmNhbkZpbmlzaCgpIHx8ICFnZXREYXRhTW9kZWwoKS5pc1ZhbGlkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBQYWdlR3JvdXBNYW5hZ2VyIGdldFBhZ2VHcm91cE1hbmFnZXIoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBNYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgUGFnZUV4dGVuc2lvbk1hbmFnZXIgZ2V0UGFnZUV4dGVuc2lvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBwYWdlRXh0ZW5zaW9uTWFuYWdlcjsKLQl9Ci0KLQkvLyBUT0RPIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMuIFBlcmhhcHMgaW4gdGhlIFBhZ2VHcm91cE1hbmFnZXIKLQkvLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0QWZ0ZXJGaW5pc2hFcnJvcigpIHsKLQkJLy8gSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJLy8gRGF0YU1vZGVsV2l6YXJkUGFnZSB3dHBQYWdlID0gKERhdGFNb2RlbFdpemFyZFBhZ2UpIHBhZ2VzW2ldOwotCQkvLyB3dHBQYWdlLnZhbGlkYXRlUGFnZSh0cnVlKTsKLQkJLy8gfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhlY3V0aW5nKCkgewotCQlyZXR1cm4gZXhlY3V0aW5nOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZXhlY3V0aW5nID0gZmFsc2U7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQl0cnkgewotCQkJZXhlY3V0aW5nID0gdHJ1ZTsKLQkJCWlmIChwcmVQZXJmb3JtRmluaXNoKCkpIHsKLQkJCQlzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCi0JCQkJZmluYWwgSVN0YXR1cyBzdCA9IHJ1bk9wZXJhdGlvbnMoKTsKLQotCQkJCWlmIChzdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJV1RQVUlQbHVnaW4ubG9nKHN0KTsKLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMCwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8xLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCBuZXcgQ29yZUV4Y2VwdGlvbihzdCksIDAsIGZhbHNlKTsKLQkJCQl9IGVsc2UgaWYoc3QuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpewotCQkJCQlXYXJuaW5nRGlhbG9nLm9wZW5XYXJuaW5nKGdldFNoZWxsKCksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMiwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgc3QuZ2V0TWVzc2FnZSgpLCBzdCwgSVN0YXR1cy5XQVJOSU5HKTsKLQkJCQl9Ci0KLQkJCQlwb3N0UGVyZm9ybUZpbmlzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2coZXhjKTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgZXhjLCAwLCBmYWxzZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlleGVjdXRpbmcgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBydW5PcGVyYXRpb25zKCkgewotCQlmaW5hbCBJU3RhdHVzW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07Ci0JCWNsYXNzIENhdGNoVGhyb3dhYmxlUnVubmFibGVXaXRoUHJvZ3Jlc3MgaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCQkJcHVibGljIFRocm93YWJsZSBjYXVnaHQgPSBudWxsOwotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChyb290T3BlcmF0aW9uID09IG51bGwpIHsKLQkJCQkJCS8vVGhpcyB3aWxsIGJlIHRoZSB0eXBpY2FsIGNhc2UgYmVjYXVzZSBtb3N0IHdpemFyZHMgd2lsbAotCQkJCQkJLy9ub3QgaW5pdGlhbGl6ZSB0aGUgcm9vdCBvcGVyYXRpb24gZHVyaW5nIGluaXQuCi0JCQkJCQlyb290T3BlcmF0aW9uID0gZ2V0Um9vdE9wZXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJCXN0YXR1c1swXSA9IHJvb3RPcGVyYXRpb24uZXhlY3V0ZShwbSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJY2F1Z2h0ID0gZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ2F0Y2hUaHJvd2FibGVSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBDYXRjaFRocm93YWJsZVJ1bm5hYmxlV2l0aFByb2dyZXNzKCk7Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bihydW5Gb3JrZWQoKSwgaXNDYW5jZWxhYmxlKCksIHJ1bm5hYmxlKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCXJ1bm5hYmxlLmNhdWdodCA9IGU7Ci0JCX0KLQkJaWYgKHJ1bm5hYmxlLmNhdWdodCAhPSBudWxsKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihydW5uYWJsZS5jYXVnaHQpOwotCQkJc3RhdHVzWzBdID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBydW5uYWJsZS5jYXVnaHQuZ2V0TWVzc2FnZSgpLCBydW5uYWJsZS5jYXVnaHQpOyAvLyROT04tTkxTLTEkCi0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8wLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzEsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIHJ1bm5hYmxlLmNhdWdodCwgMCwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBzdGF0dXNbMF07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJcGFnZUdyb3VwTWFuYWdlci51bmRvQWxsQ3VycmVudE9wZXJhdGlvbnMoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdG8gcGVyZm9ybSBhbnkgdGFza3MgcHJpb3IgdG8gcnVubmluZyB0aGUgb3BlcmF0aW9uLiBSZXR1cm4gdHJ1ZSB0bwotCSAqIGhhdmUgdGhlIG9wZXJhdGlvbiBydW4gYW5kIGZhbHNlIHRvIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgb3BlcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVQZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBwZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc2FyeSBhZnRlciBwZXJmb3JtaW5nIEZpbmlzaC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0UGVyZm9ybUZpbmlzaCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJcGFnZUdyb3VwTWFuYWdlci5zdG9yZURlZmF1bHRTZXR0aW5ncyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncyhJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCWlmIChwYWdlIGluc3RhbmNlb2YgRGF0YU1vZGVsV2l6YXJkUGFnZSkKLQkJCSgoRGF0YU1vZGVsV2l6YXJkUGFnZSkgcGFnZSkuc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGlmIHRoZXkgbmVlZCB0byBkbyBzb21ldGhpbmcgc3BlY2lhbCB3aGVuIHN0b3JpbmcgdGhlIGRlZmF1bHQKLQkgKiBzZXR0aW5ncyBmb3IgYSBwYXJ0aWN1bGFyIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiBAcGFyYW0gcGFnZUluZGV4Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoSVdpemFyZFBhZ2UgcGFnZSwgaW50IHBhZ2VJbmRleCkgewotCQlzdG9yZURlZmF1bHRTZXR0aW5ncyhwYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiB0aGUgcnVubmluZyBvcGVyYXRpb24gaXMgYWxsb3dlZCB0byBiZSBjYW5jZWxsZWQuIFRoZSBkZWZhdWx0Ci0JICogaXMgZmFsc2UuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FuY2VsYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHJldHVybiBmYWxzZSBpZiB0aGUgcnVubmluZyBvcGVyYXRpb24gY2Fubm90IGJlIHJ1biBmb3JrZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJ1bkZvcmtlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJaWYgKG51bGwgPT0gZGF0YU1vZGVsKSB7Ci0JCQlkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChnZXREZWZhdWx0UHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG51bGwgIT0gcm9vdFBhZ2VHcm91cCkgewotCQkJTGlzdCBwYWdlcyA9IHJvb3RQYWdlR3JvdXAuZ2V0UGFnZXMoZGF0YU1vZGVsKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJewotCQkJCU9iamVjdCBwYWdlID0gaXQubmV4dCgpOwotCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgSVdpemFyZFBhZ2UpCi0JCQkJewotCQkJCQkoKElXaXphcmRQYWdlKXBhZ2UpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG51bGwgIT0gZGF0YU1vZGVsKSB7Ci0JCQlkYXRhTW9kZWwuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gcmV0dXJuIGEgU2ltcGxlUGFnZUdyb3VwLiBTdWJjbGFzc2VzIG1heSB3YW50IHRvIG92ZXJyaWRlZCB0aGlzIG1ldGhvZCB0bwotCSAqIHJldHVybiBhIGRpZmZlcmVudCByb290IHBhZ2UgZ3JvdXAgZm9yIHRoZSB3aXphcmQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBBZGRhYmxlUGFnZUdyb3VwIGNyZWF0ZVJvb3RQYWdlR3JvdXAoKSB7Ci0JCVN0cmluZyBpZCA9IGdldFdpemFyZElEKCk7Ci0JCS8vIEZvciB0aGUgcm9vdCBwYWdlIGdyb3VwIHRoZSB3aXphcmQgaWQgYW5kIHRoZSBncm91cCBpZCBhcmUgdGhlIHNhbWUuCi0JCVNpbXBsZVBhZ2VHcm91cCBwYWdlR3JvdXAgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKGlkLCBpZCk7Ci0JCXBhZ2VHcm91cC5zZXRQYWdlSGFuZGxlcih0aGlzKTsKLQkJcmV0dXJuIHBhZ2VHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aGlzIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElFbnZpcm9ubWVudCBjcmVhdGVFbnZpcm9ubWVudCgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJcm9vdFBhZ2VHcm91cC5hZGRQYWdlKHBhZ2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlyb290UGFnZUdyb3VwID0gY3JlYXRlUm9vdFBhZ2VHcm91cCgpOwotCQlpZiAobmVlZHNUb1J1bk9wZXJhdGlvbnNCZWZvcmVGaW5pc2goKSkgewotCQkJcm9vdE9wZXJhdGlvbiA9IGdldFJvb3RPcGVyYXRpb24oKTsKLQkJCXBhZ2VHcm91cE1hbmFnZXIgPSBuZXcgUGFnZUdyb3VwTWFuYWdlcihyb290T3BlcmF0aW9uLCByb290UGFnZUdyb3VwKTsKLQkJfSBlbHNlIHsKLQkJCXBhZ2VHcm91cE1hbmFnZXIgPSBuZXcgUGFnZUdyb3VwTWFuYWdlcihnZXREYXRhTW9kZWwoKSwgcm9vdFBhZ2VHcm91cCk7Ci0JCX0KLQkJcGFnZUV4dGVuc2lvbk1hbmFnZXIgPSBuZXcgUGFnZUV4dGVuc2lvbk1hbmFnZXIodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHJldHVybiB0cnVlIGlmIHRoZXkgcmVxdWlyZSB0aGUgcnVubmluZwotCSAqIG9mIHRoZSBvcGVyYXRpb24gZHVyaW5nIHBhZ2UgdHVybmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgYm9vbGVhbiBkZWZhdWx0ZWQgdG8gZmFsc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmVlZHNUb1J1bk9wZXJhdGlvbnNCZWZvcmVGaW5pc2goKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKSB7Ci0JCXJldHVybiBzdXBlci5uZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKSB8fCBnZXRQYWdlR3JvdXBNYW5hZ2VyKCkuaGFzTXVsdGlwbGVQYWdlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWM3NmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvblJlYWRlcjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFdpemFyZEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyIHJlYWRlcjsKLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBEYXRhTW9kZWxXaXphcmQgYnkgdGhlIHNwZWNpZmllZCBpZCBhbmQKLQkgKiBjb25zdHJ1Y3RzIGEgbmV3IERhdGFNb2RlbFdpemFyZCB1c2luZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSURhdGFNb2RlbAotCSAqIGxvb2tlZCB1cCB3aXRoIHRoZSBzYW1lIGlkLiBJZiB0aGUgRGF0YU1vZGVsV2l6YXJkIGlzIG5vdCBmb3VuZCB0aGVuIGEKLQkgKiBSdW50aW1lRXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgRGF0YU1vZGVsV2l6YXJkCi0JICogQHJldHVybiBhIG5ldyBEYXRhTW9kZWxXaXphcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGFNb2RlbFdpemFyZCBjcmVhdGVXaXphcmQoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBjcmVhdGVXaXphcmQoRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgRGF0YU1vZGVsV2l6YXJkIHVzaW5nIHRoZSBpZCByZXR1cmVkIGZyb20KLQkgKiA8Y29kZT5kYXRhTW9kZWwuZ2V0SUQoKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqIEByZXR1cm4gYSBuZXcgRGF0YU1vZGVsV2l6YXJkCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxXaXphcmQgY3JlYXRlV2l6YXJkKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBsb2FkV2l6YXJkKGRhdGFNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkIGxvYWRXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKG51bGwgPT0gcmVhZGVyKSB7Ci0JCQlyZWFkZXIgPSBuZXcgRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlci5nZXRXaXphcmQoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgRGF0YU1vZGVsV2l6YXJkIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBjbGFzcyBhcyB0aGUgaWQuIFRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG8KLQkgKiA8Y29kZT5jcmVhdGVXaXphcmQoY2xhc3NJRC5nZXROYW1lKCkpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NJRAotCSAqICAgICAgICAgICAgdGhlIGNsYXNzIHdob3NlIG5hbWUgaXMgdGhlIGlkIG9mIHRoZSBEYXRhTW9kZWxXaXphcmQKLQkgKiBAcmV0dXJuIGEgbmV3IERhdGFNb2RlbFdpemFyZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkIGNyZWF0ZVdpemFyZChDbGFzcyBkYXRhTW9kZWxQcm92aWRlcklEKSB7Ci0JCXJldHVybiBjcmVhdGVXaXphcmQoZGF0YU1vZGVsUHJvdmlkZXJJRC5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2ZDc1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjEzOTI3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuVmFsaWRhdGlvblN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YU1vZGVsV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciwgSURhdGFNb2RlbExpc3RlbmVyIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBORVhUID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQUkVWSU9VUyA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9TSVRFX0JPUkRFUiA9IFNXVC5OVUxMOwotCXByaXZhdGUgVmFsaWRhdGlvblN0YXR1cyBzdGF0dXMgPSBuZXcgVmFsaWRhdGlvblN0YXR1cygpOwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpcnN0VGltZVRvUGFnZSA9IHRydWU7Ci0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBNYXAgdmFsaWRhdGlvbk1hcDsKLQlwcml2YXRlIFN0cmluZ1tdIHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzOwotCXByb3RlY3RlZCBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLQlwcml2YXRlIFN0cmluZyBpbmZvcG9wSUQ7Ci0JcHJpdmF0ZSBEYXRhTW9kZWxXaXphcmQgd2l6YXJkOwotCXByaXZhdGUgSVdpemFyZFBhZ2UgcHJldmlvdXNQYWdlOwotCi0JLyoqCi0JICogSjJFRVdpemFyZFBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0YU1vZGVsV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCW1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxTeW5jaEhlbHBlciBpbml0aWFsaXplU3luY2hIZWxwZXIoSURhdGFNb2RlbCBkbSkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFN5bmNoSGVscGVyKGRtKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFV2l6YXJkUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0aXRsZUltYWdlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0YU1vZGVsV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyB0aXRsZSwgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yIHRpdGxlSW1hZ2UpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHRpdGxlLCB0aXRsZUltYWdlKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQltb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJc3luY2hIZWxwZXIgPSBpbml0aWFsaXplU3luY2hIZWxwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvcCBsZXZlbCBjb250cm9sIGZvciB0aGlzIGRpYWxvZyBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLiBUaGlzCi0JICogbWV0aG9kIGhhcyBiZWVuIGFic3RyYWN0IGFuZCBpdCB1c2VzIHRoZSB0ZW1wbGF0ZSBwYXR0ZXJuIHRvIGdldCB0aGUgY29ycmVjdCBpdGVtcyBzZXR1cCBpbgotCSAqIHRoZSBjb3JyZWN0IG9yZGVyLiBTZWUgdGhlIHNldCBvZiBtZXRob2RzIGJlbG93IHRoYXQgYXJlIGNhbGxlZCBpbiB0aGlzIG1ldGhvZC4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRvcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBjcmVhdGVkIGNvbnRyb2wgY2FuIGJlIGFjY2Vzc2VkIHZpYQotCSAqIDxjb2RlPmdldENvbnRyb2w8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0b3AgPSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQlhZGRFeHRlbmRlZENvbnRyb2xzKHRvcCk7Ci0JCXNldENvbnRyb2wodG9wKTsKLQkJc2V0dXBJbmZvcG9wKHRvcCk7Ci0JCXNldERlZmF1bHRzKCk7Ci0JCWFkZExpc3RlbmVycygpOwotCQlpbml0aWFsaXplVmFsaWRhdGlvblByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRXh0ZW5kZWRDb250cm9scyhDb21wb3NpdGUgdG9wKSB7Ci0JCUlXaXphcmQgX3dpemFyZCA9IGdldFdpemFyZCgpOwotCQlpZiAoX3dpemFyZCBpbnN0YW5jZW9mIERhdGFNb2RlbFdpemFyZCkgewotCQkJUGFnZUV4dGVuc2lvbk1hbmFnZXIgcGFnZUV4dGVuc2lvbk1hbmFnZXIgPSAoKERhdGFNb2RlbFdpemFyZCkgX3dpemFyZCkuZ2V0UGFnZUV4dGVuc2lvbk1hbmFnZXIoKTsKLQkJCXBhZ2VFeHRlbnNpb25NYW5hZ2VyLmNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyh0b3AsIG1vZGVsLCBnZXROYW1lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uUHJvcGVydGllcygpIHsKLQkJdmFsaWRhdGlvblByb3BlcnR5TmFtZXMgPSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgPT0gbnVsbCB8fCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGggPT0gMCkKLQkJCXZhbGlkYXRpb25NYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCWVsc2UgewotCQkJdmFsaWRhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKQotCQkJCXZhbGlkYXRpb25NYXAucHV0KHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzW2ldLCBuZXcgSW50ZWdlcihpKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJLy8gVE9ETyB3aHkgaXMgdGhhdCBsYXN0IGdldE5leHRQYWdlKCkgY2FsbCBoZXJlPz8/Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpICYmICgobnVsbCAhPSB3aXphcmQgJiYgd2l6YXJkLmdldFBhZ2VHcm91cE1hbmFnZXIoKS5oYXNOZXh0UGFnZSgpIHx8IG51bGwgIT0gZ2V0TmV4dFBhZ2UoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0V2l6YXJkKElXaXphcmQgbmV3V2l6YXJkKSB7Ci0JCXN1cGVyLnNldFdpemFyZChuZXdXaXphcmQpOwotCQlpZiAobmV3V2l6YXJkIGluc3RhbmNlb2YgRGF0YU1vZGVsV2l6YXJkKSB7Ci0JCQl3aXphcmQgPSAoRGF0YU1vZGVsV2l6YXJkKSBuZXdXaXphcmQ7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKCkgewotCQlyZXR1cm4gcHJldmlvdXNQYWdlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXN1cGVyLnNldFByZXZpb3VzUGFnZShwYWdlKTsKLQkJcHJldmlvdXNQYWdlID0gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBzaG91bGQgcmV0dXJuIHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lcyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkIG9uIHRoaXMgcGFnZSBpbiB0aGUKLQkgKiBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIHByZXNlbnQgdGhlaXIgbWVzc2FnZXMuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b3AgbGV2ZWwgQ29tcG9zaXRlIGZvciB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIFNldCB1cCBpbmZvIHBvcCBob29rcyBpZiBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBJbmZvcG9wKENvbnRyb2wgcGFyZW50KSB7Ci0JCWlmIChnZXRJbmZvcG9wSUQoKSAhPSBudWxsKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIGdldEluZm9wb3BJRCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXR1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoaXMgcGFnZS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhcHByb3ByaWF0ZQotCSAqIGRlZmF1bHRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRzKCkgewotCQlyZXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlmIHRoZXkgaGF2ZSBkZWZhdWx0IHNldHRpbmdzIHRoYXQgaGF2ZSBiZWVuIHN0b3JlZAotCSAqIGFuZCBuZWVkIHRvIGJlIHJlc3RvcmVkLgotCSAqIAotCSAqIEBzZWUgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JfQotCi0JLyoqCi0JICogQWRkIExpc3RlbmVycyB0byBjb250cm9scyBhdCB0aGlzIHBvaW50IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGV2ZW50cy4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0byBhZGQgbGlzdGVuZXJzIHRvIGl0cyBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhZ2UgaXMgYmVpbmcgbWFkZSBjdXJyZW50IGFuZCB2aXNpYmxlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIG1vdmluZyBiYWNrIG9uZSBwYWdlLgotCQkJaWYgKG51bGwgIT0gd2l6YXJkICYmIHdpemFyZC5nZXRQcmV2aW91c1BhZ2Uod2l6YXJkLmdldFBhZ2VHcm91cE1hbmFnZXIoKS5nZXRDdXJyZW50UGFnZSgpKSA9PSB0aGlzKSB7Ci0JCQkJd2l6YXJkLmdldFBhZ2VHcm91cE1hbmFnZXIoKS5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJCX0KLQotCQkJdmFsaWRhdGVQYWdlKHNob3dWYWxpZGF0aW9uRXJyb3JzT25FbnRlcigpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzRmlyc3RUaW1lVG9QYWdlID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gdHJ1ZSB1bmxlc3MgaXQgaXMgdGhlIGZpcnN0IHRpbWUgZW50ZXJpbmcgdGhpcyBwYWdlIGluCi0JICogd2hpY2ggY2FzZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBwYWdlIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBub3QuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaWYgdGhleSBkbyBub3Qgd2FudCB0aGlzIGRlZmF1bHQgYmVoYXZpb3IuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkgewotCQlyZXR1cm4gIWlzRmlyc3RUaW1lVG9QYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIHRydWUgdW5sZXNzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIGVudGVyaW5nIHRoaXMgcGFnZSBpbgotCSAqIHdoaWNoIGNhc2Ugd2UgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgcGFnZSBhbmQgcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbm90LgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhpcyBkZWZhdWx0IGJlaGF2aW9yLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gdXNlIHNob3dWYWxpZGF0b2luRXJyb3JzT25FbnRlciBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVPbkVudGVyKCkgewotCQlyZXR1cm4gc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRXhpdGluZyB0aGUgcGFnZS4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4aXQoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXJldHVybiBzdGF0dXMuaGFzRXJyb3Ioa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZW50IHdoZW4gYW4gZXZlbnQgdGhhdCB0aGUgcmVjZWl2ZXIgaGFzIHJlZ2lzdGVyZWQgZm9yIG9jY3Vycy4gSWYgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhpcwotCSAqIG1ldGhvZCwgaXQgbXVzdCBjYWxsIHN1cGVyLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHdoaWNoIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgcGFnZSBiYXNlZCBvbiB0aGUgbGFzdCBlcnJvciBpbiB0aGUgVmFsaWRhdGlvblN0YXR1cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBlcnJvciA9IHN0YXR1cy5nZXRMYXN0RXJyTXNnKCk7Ci0JCWlmIChlcnJvciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCQlzZXRFcnJvck1lc3NhZ2UoKFN0cmluZykgbnVsbCk7Ci0JCQlTdHJpbmcgd2FybmluZyA9IHN0YXR1cy5nZXRMYXN0V2FybmluZ01zZygpOwotCQkJaWYgKHdhcm5pbmcgPT0gbnVsbCkgewotCQkJCWlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuV0FSTklORykKLQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgaW5mbyA9IHN0YXR1cy5nZXRMYXN0SW5mb01zZygpOwotCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZ2V0TWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKQotCQkJCQkJCXNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCX0gZWxzZSBpZiAoIWluZm8uZXF1YWxzKGdldE1lc3NhZ2UoKSkpIHsKLQkJCQkJCXNldE1lc3NhZ2UoaW5mbywgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCF3YXJuaW5nLmVxdWFscyhnZXRNZXNzYWdlKCkpKQotCQkJCXNldE1lc3NhZ2Uod2FybmluZywgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfSBlbHNlIGlmICghZXJyb3IuZXF1YWxzKGdldEVycm9yTWVzc2FnZSgpKSkKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCQkJfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldEVycm9yU3RhdHVzKGtleSwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXYXJuaW5nU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgd2FybmluZ01lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldFdhcm5pbmdTdGF0dXMoa2V5LCB3YXJuaW5nTWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEluZm9TdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBpbmZvTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0SW5mb1N0YXR1cyhrZXksIGluZm9NZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPS1N0YXR1cyhJbnRlZ2VyIGtleSkgewotCQlzdGF0dXMuc2V0T0tTdGF0dXMoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+RGlhbG9nUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JRGlhbG9nUGFnZTwvY29kZT4gbWV0aG9kIHNldHMKLQkgKiB0aGUgY29udHJvbCB0byB0aGUgZ2l2ZW4gdmlzaWJpbGl0eSBzdGF0ZS4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotCSAqLwotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWVudGVyKCk7Ci0JCX0gZWxzZQotCQkJZXhpdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgV2l6YXJkIGp1c3QgcHJpb3IgdG8gcnVubmluZyB0aGUgcGVyZm9ybUZpbmlzaCBvcGVyYXRpb24uCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gc3RvcmUgdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSBpcyBub3cgYmVpbmcgdmFsaWRhdGVkLiBBdCB0aGlzIHRpbWUsIGVhY2ggY29udHJvbCBpcyB2YWxpZGF0ZWQgYW5kIHRoZW4gdGhlCi0JICogY29udHJvbHMgYXJlIHVwZGF0ZWQgYmFzZWQgb24gdGhlIHJlc3VsdHMgaW4gdGhlIFZhbGlkYXRpb25TdGF0dXMgd2hpY2ggd2FzIHVwZGF0ZWQgZHVyaW5nCi0JICogPGNvZGU+dmFsaWRhdGVDb250cm9scygpPC9jb2RlPi4gRmluYWxseSwgaXQgd2lsbCBkaXNwbGF5IHRoZSBsYXN0IGVycm9yIG1lc3NhZ2UgYW5kIGl0Ci0JICogd2lsbCBzZXQgdGhlIHBhZ2UgY29tcGxldGUuIFN1YmNsYXNzZXMgd2lsbCBub3QgdHlwaWNhbGx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLQkJdmFsaWRhdGVQYWdlKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZShib29sZWFuIHNob3dNZXNzYWdlKSB7Ci0JCWlmICghaXNWYWxpZGF0aW5nKSB7Ci0JCQlpc1ZhbGlkYXRpbmcgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQkJaWYgKHNob3dNZXNzYWdlKQotCQkJCQlzZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoc3RhdHVzLmdldExhc3RFcnJNc2coKSA9PSBudWxsKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaXNWYWxpZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBpbmRpdmlkdWFsIGNvbnRyb2xzLiBVc2UgdmFsaWRhdGlvbiBrZXlzIHRvIGtlZXAgdHJhY2sgb2YgZXJyb3JzLgotCSAqIAotCSAqIEBzZWUgc2V0T0tTdGF0dXMoSW50ZWdlcikgYW5kIHNldEVycm9yTWVzc2FnZShJbnRlZ2VyLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpIHsKLQkJaWYgKCF2YWxpZGF0aW9uTWFwLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nIHByb3BOYW1lOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXByb3BOYW1lID0gdmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV07Ci0JCQkJSW50ZWdlciB2YWxLZXkgPSAoSW50ZWdlcikgdmFsaWRhdGlvbk1hcC5nZXQocHJvcE5hbWUpOwotCQkJCWlmICh2YWxLZXkgIT0gbnVsbCkKLQkJCQkJdmFsaWRhdGVQcm9wZXJ0eShwcm9wTmFtZSwgdmFsS2V5KTsKLQkJCQlpZiAoIWdldFN0YXR1cyh2YWxLZXkpKQotCQkJCQlyZXR1cm4gcHJvcE5hbWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSB2YWxpZGF0aW9ua2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgSW50ZWdlciB2YWxpZGF0aW9uS2V5KSB7Ci0JCXNldE9LU3RhdHVzKHZhbGlkYXRpb25LZXkpOwotCQlJU3RhdHVzIHN0YXR1czEgPSBtb2RlbC52YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmICghc3RhdHVzMS5pc09LKCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gc3RhdHVzMS5pc011bHRpU3RhdHVzKCkgPyBzdGF0dXMxLmdldENoaWxkcmVuKClbMF0uZ2V0TWVzc2FnZSgpIDogc3RhdHVzMS5nZXRNZXNzYWdlKCk7Ci0JCQlzd2l0Y2ggKHN0YXR1czEuZ2V0U2V2ZXJpdHkoKSkgewotCQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJCXNldEVycm9yU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJCXNldFdhcm5pbmdTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQkJc2V0SW5mb1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGVuYWJsZW1lbnQgb2YgY29udHJvbHMgYWZ0ZXIgdmFsaWRhdGlvbi4gU3VibGNhc3NlcyBzaG91bGQgY2hlY2sgdGhlIHN0YXR1cyBvZgotCSAqIHZhbGlkYXRpb24ga2V5cyB0byBkZXRlcm1pbmUgZW5hYmxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpc0ZpcnN0VGltZVRvUGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaXJzdFRpbWVUb1BhZ2UoKSB7Ci0JCXJldHVybiBpc0ZpcnN0VGltZVRvUGFnZTsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRKYXZhU3RhdHVzTWVzc2FnZShJU3RhdHVzIGphdmFTdGF0dXMsIEludGVnZXIgc3RhdHVzS2V5LCBTdHJpbmcgbWVzc2FnZSkgewotCS8vIGlmIChqYXZhU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCS8vIHNldFdhcm5pbmdTdGF0dXMoc3RhdHVzS2V5LCBtZXNzYWdlKTsKLQkvLyBlbHNlCi0JLy8gc2V0RXJyb3JTdGF0dXMoc3RhdHVzS2V5LCBtZXNzYWdlKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpcnN0VGltZVRvUGFnZShib29sZWFuIGIpIHsKLQkJaXNGaXJzdFRpbWVUb1BhZ2UgPSBiOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnb3REYXRhTW9kZWxXaXphcmQgPSBmYWxzZTsKLQlwcml2YXRlIERhdGFNb2RlbFdpemFyZCBkYXRhTW9kZWxXaXphcmQgPSBudWxsOwotCXByb3RlY3RlZCBEYXRhTW9kZWxXaXphcmQgZ2V0RGF0YU1vZGVsV2l6YXJkKCl7Ci0JCWlmKCFnb3REYXRhTW9kZWxXaXphcmQpewotCQkJZ290RGF0YU1vZGVsV2l6YXJkID0gdHJ1ZTsKLQkJCUlXaXphcmQgd2l6YXJkID0gZ2V0V2l6YXJkKCk7Ci0JCQlpZih3aXphcmQgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmQpewotCQkJCWRhdGFNb2RlbFdpemFyZCA9IChEYXRhTW9kZWxXaXphcmQpd2l6YXJkOwotCQkJfQotCQl9Ci0JCXJldHVybiBkYXRhTW9kZWxXaXphcmQ7Ci0JfQotCQotCQotCS8qCi0JICogSWYgYSBwcm9wZXJ0eSBjaGFuZ2VzIHRoYXQgd2Ugd2FudCB0byB2YWxpZGF0ZSwgZm9yY2UgdmFsaWRhdGlvbiBvbiB0aGlzIHBhZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbExpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlZChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoZmluYWwgRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJRGF0YU1vZGVsV2l6YXJkIHcgPSBnZXREYXRhTW9kZWxXaXphcmQoKTsKLQkJaWYodyA9PSBudWxsIHx8ICF3LmlzRXhlY3V0aW5nKCkpCi0JCXsKLQkJICAgIGZpbmFsIFJ1bm5hYmxlIHVpQ2hhbmdlcyA9IG5ldyBSdW5uYWJsZSgpCi0JCSAgICB7Ci0JCSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLQkJICAgICAgICB7Ci0gICAgICAgIAkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgCQkJaWYgKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzICE9IG51bGwgJiYgKGV2ZW50LmdldEZsYWcoKSA9PSBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcgfHwgKCFpc1BhZ2VDb21wbGV0ZSgpICYmIGV2ZW50LmdldEZsYWcoKSA9PSBEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHKSkpIHsKLSAgICAgICAgCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCQkJCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgCQkJCQkJdmFsaWRhdGVQYWdlKHNob3dWYWxpZGF0aW9uRXJyb3JzT25FbnRlcigpKTsKLSAgICAgICAgCQkJCQkJYnJlYWs7Ci0gICAgICAgIAkJCQkJfQotICAgICAgICAJCQkJfQotICAgICAgICAJCQl9Ci0JCSAgICAgICAgfQotCQkgICAgfTsKLQkJICAgIGlmKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0VGhyZWFkKCkpewotCQkgICAgCXVpQ2hhbmdlcy5ydW4oKTsKLQkJICAgIH0gZWxzZSB7Ci0JCSAgICAJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHVpQ2hhbmdlcyk7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWlmIChzeW5jaEhlbHBlciAhPSBudWxsKSB7Ci0JCQlzeW5jaEhlbHBlci5kaXNwb3NlKCk7Ci0JCQlzeW5jaEhlbHBlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIGluZm9wb3BJRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmZvcG9wSUQoU3RyaW5nIGluZm9wb3BJRCkgewotCQl0aGlzLmluZm9wb3BJRCA9IGluZm9wb3BJRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjEwNWM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJRE1QYWdlR3JvdXAgCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSUQoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSW5zZXJ0aW9uSUQoKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEFsbG93c0V4dGVuZGVkUGFnZXMoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKTsKLSAgCi0gIHB1YmxpYyBMaXN0IGdldFBhZ2VzKElEYXRhTW9kZWwgZGF0YU1vZGVsKTsKLSAgCi0gIHB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlciggSURhdGFNb2RlbCBkYXRhTW9kZWwgKTsKLSAgCi0gIHB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoIElEYXRhTW9kZWwgZGF0YU1vZGVsICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXBIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzBlNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotLyoqCi0gKiAKLSAqIFRoZSB3aXphcmQgZnJhbWV3b3JrIGFsbG93cyBwYWdlIGdyb3VwcyB0byBiZSBpbnNlcnRlZCBhZnRlciBvdGhlciBwYWdlIGdyb3VwLgotICogSWYgbW9yZSB0aGFuIG9uZSBwYWdlIGdyb3VwIGluc2VydHMgaXRzZWxmIGFmdGVyIGEgcGFydGljdWxhciBwYWdlIGdyb3VwIGl0IG1heQotICogbm90IGJlIGRldGVybWluaXN0aWMgd2hpY2ggcGFnZSBncm91cCBzaG91bGQgZm9sbG93IGVhY2ggb3RoZXIuICBUaGlzIGNsYXNzCi0gKiBhbGxvd3MgYSBwYXJ0aWN1bGFyIHBhZ2UgZ3JvdXAgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBzdWJzZXF1ZW50IHBhZ2UKLSAqIGdyb3VwcyBzaG91bGQgYmUgb3JkZXJlZC4KLSAqIAotICogRm9yIGV4YW1wbGU6IEEgcGFnZSBncm91cCBUIGhhcyB0aHJlZSBwYWdlIGdyb3VwcyBYLCBZLCBhbmQgWiB0aGF0IGhhdmUgcmVnaXN0ZXJlZAotICogICAgICAgICAgICAgIHZpYSB0aGUgd2l6YXJkUGFnZUdyb3VwIGV4dGVuc2lvbiBwb2ludCB0byBmb2xsb3cgaXQuCi0gKiAgICAgICAgICAgICAgVGhlIHdpemFyZCBmcmFtZXdvcmsgd2lsbCBjYWxsIGdldE5leHRHcm91cCB3aXRoOgotICogICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgIFQuZ2V0TmV4dEdyb3VwKCBudWxsLCB7ICJYIiwgIlkiLCAiWiIgfSApCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBlaXRoZXIgIlgiLCAiWSIsICJaIiwgb3IgbnVsbCBpZiBubyBwYWdlIGdyb3VwCi0gKiAgICAgICAgICAgICAgc2hvdWxkIGZvbGxvdy4gIElmICJZIiB3YXMgcmV0dXJuZWQgdGhlbiBhIHN1YmVxdWVudCBjYWxsCi0gKiAgICAgICAgICAgICAgd2lsbCBiZSBtYWRlIGJ5IHRoZSBmcmFtZXdvcmsgd2l0aDoKLSAqICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBULmdldE5leHRHcm91cCggIlkiLCB7ICJYIiwgIlkiLCAiWiIgfSApCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgQWdhaW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBlaXRoZXIgIlgiLCAiWSIsICJaIiwgb3IgbnVsbCBpZiBubyBwYWdlCi0gKiAgICAgICAgICAgICAgZ3JvdXAgc2hvdWxkIGZvbGxvdyB0aGlzIHBhZ2UgZ3JvdXAgIlkiLgotICogICAgICAgICAgICAgIAotICogTm90ZTogYW55IHBhZ2UgZ3JvdXAgY2FuIGhhdmUgYSBwYWdlIGdyb3VwIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIGl0IHNvIHRoaXMgbWV0aG9kCi0gKiAgICAgICBjYWxsIGlzIHJlY3Vyc2l2ZSBpbiBuYXR1cmUuICBGb3IgZXhhbXBsZTogdGhlIHBhZ2UgZ3JvdXAgWSBtaWdodCBoYXZlIHBhZ2UKLSAqICAgICAgIGdyb3VwcyBZMSwgWTIsIGFuZCBZMyBmb2xsb3dpbmcgaXQuICBUaGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNhbGxzOgotICogICAgICAgCi0gKiAgICAgICAgICAgICAgICAgVC5nZXROZXh0R3JvdXAoIG51bGwsIHsgIlgiLCAiWSIsICJaIiB9ICkgIC8vICJZIiBpcyBzZWxlY3RlZCB1c2luZyBUcyBoYW5kbGVyLgotICogICAgICAgICAgICAgICAgIFkuZ2V0TmV4dEdyb3VwKCBudWxsLCB7ICJZMSIsICJZMiIsICJZMyIgfSApIC8vICJZMSIgaXMgc2VsZWN0ZWQgdXNpbmcgWXMgaGFuZGxlci4KLSAqICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBGb3IgdGhpcyBleGFtcGxlIFkxIGhhcyBubyBwYWdlIGdyb3VwcyBmb2xsb3dpbmcgaXQuCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgVC5nZXROZXh0R3JvdXAoICJZIiwgeyAiWCIsICJZIiwgIloiIH0gKSAgLy8gbnVsbCBpcyBzZWxlY3RlZCB1c2luZyBUcyBoYW5kbGVyLgotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgIEZvciB0aGlzIGV4YW1wbGUsIHRoZSBUIGhhbmRsZXIgZGVjaWRlZCB0aGF0IG5vIHBhZ2UgZ3JvdXAgZm9sbG93ZWQgWSBub3QgZXZlbiBYIG9yIFouCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElETVBhZ2VHcm91cEhhbmRsZXIgCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGN1cnJlbnRQYWdlR3JvdXBJRCB0aGUgY3VycmVudCBwYWdlIGdyb3VwIElELiAgVGhpcyB2YWx1ZSB3aWxsIGJlIG51bGwgdGhlIGZpcnN0IHRpbWUgCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotICAgKiBAcGFyYW0gcGFnZUdyb3VwSURzIGEgbGlzdCBvZiBwYWdlIGdyb3VwIElEcyB0aGF0IGZvbGxvdyB0aGUgcGFnZSBncm91cCBmb3IgdGhpcyBoYW5kbGVyLgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHBhZ2UgZ3JvdXAgaWQgdGhhdCBzaG91bGQgZm9sbG93IGN1cnJlbnRQYWdlR3JvdXBJRCwgb3IgaXQKLSAgICogc2hvdWxkIHJldHVybiBudWxsIGlmIG5vIHBhZ2UgZ3JvdXAgZm9sbG93cyBjdXJyZW50UGFnZUdyb3VwSUQuCi0gICAqIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROZXh0UGFnZUdyb3VwKCBTdHJpbmcgY3VycmVudFBhZ2VHcm91cElELCBTdHJpbmdbXSBwYWdlR3JvdXBJRHMgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQxOWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRE1QYWdlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhpcyBhcyB0aGUgcGFnZSBuYW1lIGlmIHRoZSBleHBlY3RlZE5leHRQYWdlTmFtZSBvciBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWUgc2hvdWxkCi0JICogYmUgc2tpcHBlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfUEFHRSA9ICJJRE1FeHRlbmRlZFBhZ2VIYW5kbGVyLlNLSVBfUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHByZWZpeCB0aGlzIHN0cmluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwYWdlIHdoaWNoIG9jY3VycyBiZWZvcmUgdGhlIHBhZ2UgdGhhdCBzaG91bGQgYmUKLQkgKiByZXR1cm5lZC4gRS5HLiBzdXBwb3NlIHlvdXIgcGFnZSBjb250cmlidXRpb25zIGtub3cgYWJvdXQgcGFnZXMgQSwgQiBhbmQgQywgYW5kIHlvdSB3YW50IHRoZQotCSAqIHRvIHNraXAgcGFnZXMgQiBhbmQgQywgd2hlbiBnb2luZyB0byB0aGUgbmV4dCBwYWdlIGZyb20gQS4gVG8gZG8gdGhpcywgcmV0dXJuIFBBR0VfQUZURVIrQy4KLQkgKiBUaGUgZnJhbWV3b3JrIHdpbGwgdGhlbiBhc2sgdGhlIHdpemFyZCBmb3IgdGhlIHBhZ2UgdGhhdCBub3JtYWxseSBjb21lcyBhZnRlciBwYWdlIEMuCi0JICogUEFHRV9CRUZPUkUgd29ya3Mgc2ltaWxhcmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfQUZURVIgPSAiSURNRXh0ZW5kZWRQYWdlSGFuZGxlci5QQUdFX0FGVEVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogc2FtZSBhcyBQQUdFX0FGVEVSLCBleGNlcHQgZm9yIHJldHVyaW5nIHRoZSBwYWdlIGJlZm9yZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0JFRk9SRSA9ICJJRE1FeHRlbmRlZFBhZ2VIYW5kbGVyLlBBR0VfQkVGT1JFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYWdlIHRoYXQgc2hvdWxkIGJlIG5leHQKLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0aGUgd2l6YXJkIGlzIGN1cnJlbnRseSBvbgotCSAqIEBwYXJhbSBleHBlY3RlZE5leHRQYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBuZXh0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkTmV4dFBhZ2VOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFnZSB0aGF0IHNob3VsZCBiZSBwcmV2aW91cwotCSAqIAotCSAqIEBwYXJhbSBjdXJyZW50UGFnZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRoZSB3aXphcmQgaXMgY3VycmVudGx5IG9uCi0JICogQHBhcmFtIGV4cGVjdGVkTmV4dFBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHByZXZpb3VzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJldmlvdXNQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvUGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1BhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDIxMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvUGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkNvbW1vblVJUGx1Z2luQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuRE1XaXphcmRQYWdlRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG9yZ2FuaXplcyB0aGUgd2l6YXJkIHBhZ2UgZXh0ZW5zaW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHdpemFyZC4gCi0gKiAKLSAqIEBhdXRob3Iga3JhZXYKLSAqLwotcHVibGljIGNsYXNzIFBhZ2VFeHRlbnNpb25NYW5hZ2VyIHsKLQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IHdoZXJlIHRoZSB3aXphcmQgcGFnZSBleHRlbnNpb25zIGFyZQotCSAqIGNvbnRyaWJ1dGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPSU5UX1dJWkFSRF9QQUdFX0dST1VQID0gIndpemFyZFBhZ2VHcm91cCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50J3MgZWxlbWVudCB3aGVyZSB0aGUgd2l6YXJkIHBhZ2UKLQkgKiBleHRlbnNpb25zIGFyZSBjb250cmlidXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1dJWkFSRF9QQUdFID0gIndpemFyZFBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTdHJpbmcgd2l6YXJkSUQ7Ci0JcHJpdmF0ZSBETVdpemFyZFBhZ2VFbGVtZW50W10gZWxlbWVudHM7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBwYWdlIGV4dGVuc2lvbiBtYW5hZ2VyIGZvciB0aGUgc3BlY2lmaWVkIHdpemFyZC4KLQkgKiAKLQkgKiBAcGFyYW0gd2l6YXJkIC0KLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgdG8gY29uc3RydWN0IHRoZSBtYW5hZ2VyIGZvci4KLQkgKi8KLQlwdWJsaWMgUGFnZUV4dGVuc2lvbk1hbmFnZXIoRGF0YU1vZGVsV2l6YXJkIHdpemFyZCkgewotCQl0aGlzLndpemFyZElEID0gd2l6YXJkLmdldFdpemFyZElEKCk7Ci0JCWxvYWRFbGVtZW50cygpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYWRkaXRpb25hbCBjb250cm9scyBmb3IgdGhlIHNwZWNpZmllZCB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGUgYWRkaXRpb25hbCBjb250cm9scyBhcmUgY29udHJpYnV0ZWQgYnkgdGhlIHdpemFyZCBwYWdlIGV4dGVuc2lvbnMKLQkgKiB0aGF0IGFyZSByZWdpc3RlcmVkIGluIHRoZSA8Y2l0ZT53aXphcmRQYWdlPC9jaXRlPiBlbGVtZW50IG9mIHRoZQotCSAqIDxjaXRlPndpemFyZFBhZ2VHcm91cDwvY2l0ZT4gZXh0ZW5zaW9uIHBvaW50IGFuZCB0aGUgPGNpdGU+d2l6YXJkSUQ8L2NpdGU+Ci0JICogYXR0cmlidXRlIHBvaW50cyB0byB0aGUgY3VycmVudCB3aXphcmQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgLQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUgd2hlcmUgdGhlIGFkZGl0aW9uYWwgY29udHJvbHMgd2lsbCBiZQotCSAqICAgICAgICAgICAgYWRkZWQgdG8uCi0JICogQHBhcmFtIG1vZGVsIC0KLQkgKiAgICAgICAgICAgIHRoZSBkYXRhIG1vZGVsIG9mIHRoZSB3aXphcmQuCi0JICogQHBhcmFtIHBhZ2VOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBleHRlbmRlZCB3aXphcmQgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCURNV2l6YXJkUGFnZUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJaWYgKHdpemFyZElELmVxdWFscyhlbGVtZW50LmdldFdpemFyZElEKCkpKSB7Ci0JCQkJZWxlbWVudC5jcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMocGFyZW50LCBtb2RlbCwgcGFnZU5hbWUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkRWxlbWVudHMoKSB7IAotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoQ29tbW9uVUlQbHVnaW5Db25zdGFudHMuUExVR0lOX0lELCBQT0lOVF9XSVpBUkRfUEFHRV9HUk9VUCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGFsbEVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gYWxsRWxlbWVudHNbaV07Ci0JCQlpZiAoRUxFTUVOVF9XSVpBUkRfUEFHRS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXcgRE1XaXphcmRQYWdlRWxlbWVudChlbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWVsZW1lbnRzID0gKERNV2l6YXJkUGFnZUVsZW1lbnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IERNV2l6YXJkUGFnZUVsZW1lbnRbXSB7IH0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvU2ltcGxlUGFnZUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9TaW1wbGVQYWdlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5MzZlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9TaW1wbGVQYWdlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGFnZUdyb3VwIGltcGxlbWVudHMgQWRkYWJsZVBhZ2VHcm91cCB7Ci0JcHJpdmF0ZSBTdHJpbmcgZ3JvdXBJRDsKLQlwcml2YXRlIFN0cmluZyB3aXphcmRJRDsKLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dFeHRlbmRlZFBhZ2VzOwotCXByaXZhdGUgU3RyaW5nIHJlcXVpcmVkRGF0YU9wZXJhdGlvbjsKLQlwcml2YXRlIFNldCAgICBkYXRhTW9kZWxJRHM7Ci0KLQlwcml2YXRlIElETVBhZ2VIYW5kbGVyIHBhZ2VIYW5kbGVyOwotCXByaXZhdGUgSURNUGFnZUdyb3VwSGFuZGxlciBwYWdlR3JvdXBIYW5kbGVyOwotCXByaXZhdGUgVmVjdG9yIHBhZ2VzOwotCi0JcHVibGljIFNpbXBsZVBhZ2VHcm91cChTdHJpbmcgZ3JvdXBJRCwgU3RyaW5nIHdpemFyZElELCBib29sZWFuIGFsbG93RXh0ZW5kZWRQYWdlcywgU3RyaW5nIHJlcXVpcmVEYXRhT3BlcmF0aW9uKSB7Ci0JCXRoaXMuZ3JvdXBJRCA9IGdyb3VwSUQ7Ci0JCXRoaXMud2l6YXJkSUQgPSB3aXphcmRJRDsKLQkJdGhpcy5hbGxvd0V4dGVuZGVkUGFnZXMgPSBhbGxvd0V4dGVuZGVkUGFnZXM7Ci0JCXRoaXMucmVxdWlyZWREYXRhT3BlcmF0aW9uID0gcmVxdWlyZURhdGFPcGVyYXRpb247Ci0JCXBhZ2VzID0gbmV3IFZlY3RvcigpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVQYWdlR3JvdXAoU3RyaW5nIGdyb3VwSUQsIFN0cmluZyB3aXphcmRJRCkgewotCQl0aGlzKGdyb3VwSUQsIHdpemFyZElELCB0cnVlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJcGFnZXMuYWRkKHBhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKElXaXphcmRQYWdlW10gbmV3UGFnZXMpIHsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5ld1BhZ2VzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJcGFnZXMuYWRkKG5ld1BhZ2VzW2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCkgewotCQlyZXR1cm4gYWxsb3dFeHRlbmRlZFBhZ2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhZ2VHcm91cEhhbmRsZXIoSURNUGFnZUdyb3VwSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXBhZ2VHcm91cEhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEhhbmRsZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFnZUhhbmRsZXIoSURNUGFnZUhhbmRsZXIgaGFuZGxlcikgewotCQlwYWdlSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGdldFBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBwYWdlSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQYWdlcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCQotCXB1YmxpYyBJV2l6YXJkUGFnZVtdIGdldEV4dGVuZGVkUGFnZXMoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIChJV2l6YXJkUGFnZVtdKSBwYWdlcy50b0FycmF5KG5ldyBJV2l6YXJkUGFnZVswXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlR3JvdXBJRCgpIHsKLQkJcmV0dXJuIGdyb3VwSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlR3JvdXBJbnNlcnRpb25JRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZERhdGFPcGVyYXRpb25Ub1J1bigpIHsKLQkJcmV0dXJuIHJlcXVpcmVkRGF0YU9wZXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZElEKCkgewotCQlyZXR1cm4gd2l6YXJkSUQ7Ci0JfQotCi0JcHVibGljIFNldCBnZXREYXRhTW9kZWxJRHMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWxJRHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsSURzKFNldCBkYXRhTW9kZWxJRHMpIHsKLQkJdGhpcy5kYXRhTW9kZWxJRHMgPSBkYXRhTW9kZWxJRHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvRXJyb3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0Vycm9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODZmOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVycm9yRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBFcnJvckRpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSB8fCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvSW5mb0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvSW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE4OWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0luZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEluZm9EaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBJbmZvRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBAT3ZlcnJpZGUKLXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBPSyBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpICkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9NZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9NZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NmFlYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvTWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURpYWxvZyBleHRlbmRzIERpYWxvZwotewotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotICAvKioKLSAgICogUmVzZXJ2ZSByb29tIGZvciB0aGlzIG1hbnkgbGlzdCBpdGVtcy4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExJU1RfSVRFTV9DT1VOVCA9IDc7Ci0KLSAgLyoqCi0gICAqIFRoZSBEZXRhaWxzIGJ1dHRvbi4KLSAgICovCi0gIHByb3RlY3RlZCBCdXR0b24gZGV0YWlsc0J1dHRvbjsKLQotICAvKioKLSAgICogVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0gIC8qKgotICAgKiBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotCi0gIC8qKgotICAgKiBUaGUgU1dUIGxpc3QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBlcnJvciBkZXRhaWxzLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLSAgcHJvdGVjdGVkIFRleHQgZGV0YWlsczsKLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIGRldGFpbHMgdmlld2VyIGlzIGN1cnJlbnRseSBjcmVhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsc0NyZWF0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogRmlsdGVyIG1hc2sgZm9yIGRldGVybWluaW5nIHdoaWNoIHN0YXR1cyBpdGVtcyB0byBkaXNwbGF5LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBkaXNwbGF5TWFzayA9IDB4RkZGRjsKLQotICAvKioKLSAgICogVGhlIG1haW4gc3RhdHVzIG9iamVjdC4KLSAgICovCi0gIHByb3RlY3RlZCBJU3RhdHVzIHN0YXR1czsKLSAgCi0gIHByaXZhdGUgUG9pbnQgc2F2ZWRTaXplID0gbnVsbDsKLQotICAvKioKLSAgICogTGlzdCBvZiB0aGUgbWFpbiBlcnJvciBvYmplY3QncyBkZXRhaWxlZCBlcnJvcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+U3RhdHVzPC9jb2RlPikuCi0gICAqLwotICBwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Qgc3RhdHVzTGlzdDsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICAgIHRoaXMudGl0bGUgPSBkaWFsb2dUaXRsZSA9PSBudWxsID8gSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9ibGVtX09jY3VycmVkIikgOiAvLyROT04tTkxTLTEkCi0gIGRpYWxvZ1RpdGxlOwotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/IHN0YXR1cy5nZXRNZXNzYWdlKCkgOiBKRmFjZVJlc291cmNlcy5mb3JtYXQoIlJlYXNvbiIsIG5ldyBPYmplY3RbXSB7IG1lc3NhZ2UsIHN0YXR1cy5nZXRNZXNzYWdlKCl9KTsgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICAgIHN0YXR1c0xpc3QgPSBBcnJheXMuYXNMaXN0KHN0YXR1cy5nZXRDaGlsZHJlbigpKTsKLSAgICB0aGlzLmRpc3BsYXlNYXNrID0gZGlzcGxheU1hc2s7Ci0gICAgc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIEhhbmRsZXMgdGhlIHByZXNzaW5nIG9mIHRoZSBPayBvcgotICAgKiBEZXRhaWxzIGJ1dHRvbiBpbiB0aGlzIGRpYWxvZy4gSWYgdGhlIE9rIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIGNsb3NlCi0gICAqIHRoaXMgZGlhbG9nLiBJZiB0aGUgRGV0YWlscyBidXR0b24gd2FzIHByZXNzZWQgdGhlbiB0b2dnbGUgdGhlIGRpc3BsYXlpbmcKLSAgICogb2YgdGhlIGVycm9yIGRldGFpbHMgYXJlYS4gTm90ZSB0aGF0IHRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIG9ubHkgYmUKLSAgICogdmlzaWJsZSBpZiB0aGUgZXJyb3IgYmVpbmcgZGlzcGxheWVkIHNwZWNpZmllcyBjaGlsZCBkZXRhaWxzLgotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkKLSAgewotICAgIGlmIChpZCA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkKLSAgICB7IC8vIHdhcyB0aGUgZGV0YWlscyBidXR0b24gcHJlc3NlZD8KLSAgICAgIHRvZ2dsZURldGFpbHNBcmVhKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLSAgICB9Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgfHwgc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkpOwotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzCi0gICAqIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLSAgICovCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLSAgICAvLyBjcmVhdGUgY29tcG9zaXRlCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBDb21wb3NpdGUgaW1hZ2VBbmRMYWJlbCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgaW1hZ2VBbmRMYWJlbC5zZXRMYXlvdXQoZ2wpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApKTsKLSAgICAKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICBJbWFnZSBpbWFnZSA9IGdldERpYWxvZ0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgewotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaW1hZ2VBbmRMYWJlbCwgMCk7Ci0gICAgICBpbWFnZS5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICBsYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0gICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKAotICAgICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIKLSAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIG1lc3NhZ2UKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KGltYWdlQW5kTGFiZWwsIFNXVC5SRUFEX09OTFl8U1dULldSQVApOwotICAgICAgdGV4dC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgR3JpZERhdGEgZGF0YSA9Ci0gICAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTAotICAgICAgICAgICAgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLSAgICAgIGRhdGEud2lkdGhIaW50ID0KLSAgICAgICAgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0gICAgIAotICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgdGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgIH0KLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVEcm9wRG93bkxpc3QoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSB0aGUgbGlzdAotICAgIGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgLy8gZmlsbCB0aGUgbGlzdAotICAgIHBvcHVsYXRlTGlzdChsaXN0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCkgKiBMSVNUX0lURU1fQ09VTlQ7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGxpc3RDcmVhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICBwcm90ZWN0ZWQgVGV4dCBjcmVhdGVEcm9wRG93bkRldGFpbHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGRldGFpbHMgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAvL2RldGFpbHMuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIENvbG9yIGNvbG9yID0gbmV3IENvbG9yKHBhcmVudC5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgMjU1LCAyNTUsIDI1NSk7Ci0gICAgZGV0YWlscy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLSAgICBwb3B1bGF0ZURldGFpbHMoZGV0YWlscywgc3RhdHVzLCAwKTsKLSAgICBHcmlkRGF0YSBkYXRhID0KLSAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGRldGFpbHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBkZXRhaWxzLnNldFNlbGVjdGlvbigwKTsKLSAgICBkZXRhaWxzQ3JlYXRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIGRldGFpbHM7Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgKi8KLSAgLyoqCi0gICAqIEV4dGVuZHMgPGNvZGU+V2luZG93Lm9wZW4oKTwvY29kZT4uIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5Ci0gICAqIHRoZSBlcnJvci4gSWYgeW91IHNwZWNpZmllZCBhIG1hc2sgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0gICAqIGNoaWxkcmVuLCB0aGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gICAqIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGludCBvcGVuKCkKLSAgewotICAgIGlmIChzaG91bGREaXNwbGF5KHN0YXR1cywgZGlzcGxheU1hc2spKQotICAgIHsKLSAgICAgIHJldHVybiBzdXBlci5vcGVuKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0gIC8qKgotICAgKiBUaGlzIGVzc2VudGlhbGx5IGRvZXMgdGhlIHdvcmsgb2YgYSBmYWN0b3J5IE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0bwotICAgKiBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcKLSAgICogZGlzcGxheWVkIGRvZXMgbm90IGNvbnRhaW4gY2hpbGQgaXRlbXMsIG9yIGlmIHlvdSB3aXNoIHRvIGRpc3BsYXkgYWxsIHN1Y2gKLSAgICogaXRlbXMgd2l0aG91dCBmaWx0ZXJpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cgY2xvc2luZy4gVGhpcyB3aWxsIGJlIDxjb2RlPkRpYWxvZy5PSzwvY29kZT4gaWYgdGhlIE9LCi0gICAqICAgICAgICAgYnV0dG9uIHdhcyBwcmVzc2VkLCBvciA8Y29kZT5EaWFsb2cuQ0FOQ0VMPC9jb2RlPiBpZiB0aGlzCi0gICAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBvcGVuTWVzc2FnZSgKLSAgICBTaGVsbCBwYXJlbnQsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzKQotICB7Ci0KLSAgICBzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKQotICAgIHsKLSAgICAgIGNhc2UgSVN0YXR1cy5JTkZPIDoKLSAgICAgICAgcmV0dXJuIG9wZW5JbmZvKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBkaWFsb2dUaXRsZSwKLSAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7Ci0gICAgICBjYXNlIElTdGF0dXMuV0FSTklORyA6Ci0gICAgICAgIHJldHVybiBvcGVuV2FybmluZygKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHJldHVybiBvcGVuRXJyb3IoCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5NZXNzYWdlKAotICAgIFNoZWxsIHBhcmVudCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgQ2hvaWNlW10gb3B0aW9ucykKLSAgewotCi0gICAgcmV0dXJuIG9wZW5PcHRpb25zKAotICAgICAgcGFyZW50LAotICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICBtZXNzYWdlLAotICAgICAgc3RhdHVzLAotICAgICAgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IsCi0gICAgICBvcHRpb25zKTsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUKLSAgICogZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZCBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IHdpc2gKLSAgICogdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZQotICAgKiBjaGlsZHJlbi4gVGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotICAgKiBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cgY2xvc2luZy4gVGhpcyB3aWxsIGJlIDxjb2RlPkRpYWxvZy5PSzwvY29kZT4gaWYgdGhlIE9LCi0gICAqICAgICAgICAgYnV0dG9uIHdhcyBwcmVzc2VkLCBvciA8Y29kZT5EaWFsb2cuQ0FOQ0VMPC9jb2RlPiBpZiB0aGlzCi0gICAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBvcGVuRXJyb3IoCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIEVycm9yRGlhbG9nIGRpYWxvZyA9Ci0gICAgICBuZXcgRXJyb3JEaWFsb2cocGFyZW50U2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICByZXR1cm4gZGlhbG9nLm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5JbmZvKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBJbmZvRGlhbG9nIGRpYWxvZyA9Ci0gICAgICBuZXcgSW5mb0RpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbldhcm5pbmcoCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIFdhcm5pbmdEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBXYXJuaW5nRGlhbG9nKHBhcmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuT3B0aW9ucygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrLAotICAgIENob2ljZVtdIG9wdGlvbnMpCi0gIHsKLSAgICBPcHRpb25zRGlhbG9nIGRpYWxvZyA9Ci0gICAgICBuZXcgT3B0aW9uc0RpYWxvZygKLSAgICAgICAgcGFyZW50U2hlbGwsCi0gICAgICAgIHRpdGxlLAotICAgICAgICBtZXNzYWdlLAotICAgICAgICBzdGF0dXMsCi0gICAgICAgIGRpc3BsYXlNYXNrLAotICAgICAgICBvcHRpb25zKTsKLSAgICBkaWFsb2cub3BlbigpOwotICAgIHJldHVybiBkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcHVsYXRlcyB0aGUgbGlzdCB1c2luZyB0aGlzIGVycm9yIGRpYWxvZydzIHN0YXR1cyBvYmplY3QuIFRoaXMgd2Fsa3MgdGhlCi0gICAqIGNoaWxkIHN0YXRpIG9mIHRoZSBzdGF0dXMgb2JqZWN0IGFuZCBkaXNwbGF5cyB0aGVtIGluIGEgbGlzdC4gVGhlIGZvcm1hdAotICAgKiBmb3IgZWFjaCBlbnRyeSBpcyBzdGF0dXNfcGF0aCA6IHN0YXR1c19tZXNzYWdlIElmIHRoZSBzdGF0dXMncyBwYXRoIHdhcwotICAgKiBudWxsIHRoZW4gaXQgKGFuZCB0aGUgY29sb24pIGFyZSBvbWl0dGVkLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0IGxpc3QpCi0gIHsKLSAgICBJdGVyYXRvciBlbnVtZXJhdGlvbiA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIElTdGF0dXMgY2hpbGRTdGF0dXMgPSAoSVN0YXR1cykgZW51bWVyYXRpb24ubmV4dCgpOwotICAgICAgcG9wdWxhdGVMaXN0KGxpc3QsIGNoaWxkU3RhdHVzLCAwKTsKLSAgICB9Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0IGxpc3QsIElTdGF0dXMgc3RhdHVzLCBpbnQgbmVzdGluZykKLSAgewotICAgIGlmICghc3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGluZzsgaSsrKQotICAgIHsKLSAgICAgIHNiLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBzYi5hcHBlbmQoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0gICAgbGlzdC5hZGQoc2IudG9TdHJpbmcoKSk7Ci0gICAgSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBwb3B1bGF0ZUxpc3QobGlzdCwgY2hpbGRyZW5baV0sIG5lc3RpbmcgKyAxKTsKLSAgICB9Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGV0YWlscyhUZXh0IHRleHQsIElTdGF0dXMgc3RhdHVzLCBpbnQgbmVzdGluZykKLSAgewotICAgIGlmICghc3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICAgIFN0cmluZyAgICB0YWJDaGFycyAgICA9IHJlcGVhdCggJyAnLCBuZXN0aW5nICogMiApOwotICAgIFN0cmluZyAgICBtZXNzYWdlTGluZSA9IHRhYkNoYXJzICsgc3RhdHVzLmdldE1lc3NhZ2UoKSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotICAgIFRocm93YWJsZSBleGNlcHQgICAgICA9IHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLSAgICAKLSAgICB0ZXh0LmFwcGVuZCggbWVzc2FnZUxpbmUgKTsKLSAgICAKLSAgICBpZiggZXhjZXB0ICE9IG51bGwgKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHRyYWNlID0gZ2V0U3RhY2tUcmFjZSggZXhjZXB0ICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCB0cmFjZS5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICB0ZXh0LmFwcGVuZCggdGFiQ2hhcnMgKyAiICAgICIgKyB0cmFjZVtpbmRleF0gKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcG9wdWxhdGVEZXRhaWxzKHRleHQsIGNoaWxkcmVuW2ldLCBuZXN0aW5nICsgMSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHN0YXR1cyBvYmplY3Qgc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICBhIHN0YXR1cyBvYmplY3QKLSAgICogQHBhcmFtIG1hc2sKLSAgICogICAgICAgICAgICBhIG1hc2sgYXMgcGVyIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdGF0dXMgc2hvdWxkIGJlIGRpc3BsYXllZCwgYW5kCi0gICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVN0YXR1cyBzdGF0dXMsIGludCBtYXNrKQotICB7Ci0gICAgSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcmV0dXJuIHN0YXR1cy5tYXRjaGVzKG1hc2spOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChjaGlsZHJlbltpXS5tYXRjaGVzKG1hc2spKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIKLSAgICogcHJlc3NpbmcgdGhlIGRldGFpbHMgYnV0dG9uLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkKLSAgewotICAgIFBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLSAgICBpbnQgICBuZXdIZWlnaHQgID0gLTE7Ci0gICAgCi0gICAgaWYgKGRldGFpbHNDcmVhdGVkKQotICAgIHsKLSAgICAgIGRldGFpbHMuZGlzcG9zZSgpOwotICAgICAgZGV0YWlsc0NyZWF0ZWQgPSBmYWxzZTsKLSAgICAgIGRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0gICAgICAKLSAgICAgIC8vIFdpdGhvdXQgdGhlIGZvbGxvd2luZyBjb21wdXRlU2l6ZSBjYWxsIHRoZSBzZXRTaXplIGNhbGwgYmVsb3cgdGhyb3dzIGFuIGFycmF5IG91dCBvZiBib3VuZHMgZXhjZXB0aW9uLgotICAgICAgLy8gVmVyeSB3ZWlyZC4KLSAgICAgIGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgIAotICAgICAgbmV3SGVpZ2h0ID0gc2F2ZWRTaXplLnk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiggc2F2ZWRTaXplID09IG51bGwgKSBzYXZlZFNpemUgPSB3aW5kb3dTaXplOwotICAgICAgICAKLSAgICAgIGRldGFpbHMgPSBjcmVhdGVEcm9wRG93bkRldGFpbHMoKENvbXBvc2l0ZSkgZ2V0Q29udGVudHMoKSk7Ci0gICAgICBkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotICAgICAgbmV3SGVpZ2h0ID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0gICAgfQotCi0KLSAgICBuZXdIZWlnaHQgPSBuZXdIZWlnaHQgPiA0MDAgPyA0MDAgOiBuZXdIZWlnaHQ7Ci0gICAgCi0gICAgZ2V0U2hlbGwoKS5zZXRTaXplKCBuZXcgUG9pbnQod2luZG93U2l6ZS54LCBuZXdIZWlnaHQpICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0U3RhY2tUcmFjZSggVGhyb3dhYmxlIGV4YyApCi0gIHsKLSAgICBWZWN0b3IgICAgICAgbGluZXMgICAgICAgID0gbmV3IFZlY3RvcigpOwotICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgIHByaW50V3JpdGVyICA9IG5ldyBQcmludFdyaXRlciggc3RyaW5nV3JpdGVyICk7Ci0gICAgCi0gICAgZXhjLnByaW50U3RhY2tUcmFjZSggcHJpbnRXcml0ZXIgKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwcmludFdyaXRlci5jbG9zZSgpOwotICAgICAgc3RyaW5nV3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gbmVzdGVkRXhjICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nUmVhZGVyIHN0cmluZ1JlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoIHN0cmluZ1dyaXRlci50b1N0cmluZygpICk7Ci0gICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyICAgICA9IG5ldyBCdWZmZXJlZFJlYWRlciggc3RyaW5nUmVhZGVyICk7Ci0gICAgU3RyaW5nICAgICAgICAgbGluZSAgICAgICA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgIAotICAgICAgd2hpbGUoIGxpbmUgIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIGxpbmVzLmFkZCggbGluZS50cmltKCkgKTsKLSAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggRXhjZXB0aW9uIG5lc3RlZEV4YyApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgfQotICAgIAotICAgIHJldHVybiAoU3RyaW5nW10pbGluZXMudG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyByZXBlYXQoIGNoYXIgdGhlX2NoYXIsIGludCBjb3VudCApCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlciggY291bnQgKTsKLQotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKyApCi0gICAgewotICAgICAgYnVmLmFwcGVuZCggdGhlX2NoYXIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9PcHRpb25zRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9PcHRpb25zRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYWY5YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvT3B0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9uc0RpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cKLXsKLSAgcHJpdmF0ZSBDaG9pY2VbXSBjaG9pY2VzOwotICBwcml2YXRlIGludCByZXR1cm5Db2RlXzsKLQotICBwdWJsaWMgT3B0aW9uc0RpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrLAotICAgIENob2ljZVtdIGNob2ljZXMpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHRoaXMuY2hvaWNlcyA9IGNob2ljZXM7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIGEgYnV0dG9uIGZvciBlYWNoIG9wdGlvbnMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgY2hvaWNlc1tpXS5nZXRTaG9ydGN1dCgpLCBjaG9pY2VzW2ldLmdldExhYmVsKCksIHRydWUpOwotICAgIH0KLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpCi0gIHsKLSAgICBpZiAoaWQgPT0gU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpCi0gICAgICAvLyB3YXMgdGhlIERldGFpbHMgYnV0dG9uIHByZXNzZWQ/Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0UmV0dXJuQ29kZShpZCk7Ci0gICAgICBjbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIHZvaWQgc2V0UmV0dXJuQ29kZShpbnQgaWQpCi0gIHsKLSAgICByZXR1cm5Db2RlXyA9IGlkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi1wdWJsaWMgaW50IGdldFJldHVybkNvZGUoKQotICB7Ci0gICAgcmV0dXJuIHJldHVybkNvZGVfOwotICB9Ci0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgY2FzZSBJU3RhdHVzLklORk8gOgotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pOwotICAgICAgY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9TdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjYTM2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9TdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi0vKioKLSogQ29uc3RhbnRzIGZvciBzdGF0dXMgZGlhbG9ncwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzRGlhbG9nQ29uc3RhbnRzIHsKLQotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfSUQgPSAyOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX1RPX0FMTF9JRCA9IDQ7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JRCA9IDE7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIk9LIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfSUQgPSAwOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJEZXRhaWxzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMU19JRCA9IDEzOwotCi0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyIgYnV0dG9uCi0gICovCi0gLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX0xBQkVMID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19ZRVNfTEFCRUwiKTsKLSAgLyoKLSAgKiBCdXR0b24gbGFiZWwgZm9yIHRoZSAiWWVzIHRvIGFsbCIgYnV0dG9uCi0gICovCi0gLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX1RPX0FMTF9MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX1RPX0FMTF9MQUJFTCIpOwotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJDYW5jZWwiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTkNFTF9MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfQ0FOQ0VMX0xBQkVMIik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9XYXJuaW5nRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9XYXJuaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYmRhMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvV2FybmluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgV2FybmluZ0RpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIFdhcm5pbmdEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LLCBDYW5jZWwgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsCi0gICAgICBmYWxzZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZUVudmlyb25tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTkxMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL0VjbGlwc2VFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGFuIElFbnZpcm9ubWVudCBjbGFzcyBmb3IgdGhlIEVjbGlwc2UgSUVudmlyb25tZW50LgotICogVGhpcyBJRW52aXJvbm1lbnQgY3VycmVudGx5IHN1cHBvcnRzIHRoZSAicGxhdGZvcm0iIHByb3RvY29sIGFuZCB0aGUgImZpbGUiCi0gKiBwcm90b2NvbC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlRW52aXJvbm1lbnQgaW1wbGVtZW50cyBJRW52aXJvbm1lbnQKLXsKLSAgcHJpdmF0ZSBTaW1wbGVVUklGYWN0b3J5IHVyaUZhY3RvcnlfICAgICAgPSBudWxsOwotICBwcml2YXRlIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXJfICAgPSBudWxsOwotICBwcml2YXRlIElMb2cgICAgICAgICAgICAgIGxvZ2dlcl8gICAgICAgICAgPSBudWxsOwotICAKLSAgcHVibGljIEVjbGlwc2VFbnZpcm9ubWVudCgpCi0gIHsKLSAgICB0aGlzKCBuZXcgRWNsaXBzZVN0YXR1c0hhbmRsZXIoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFY2xpcHNlRW52aXJvbm1lbnQoIElTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0gIHsKLSAgICBJVVJJU2NoZW1lIGVjbGlwc2VTY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgIElVUklTY2hlbWUgZmlsZVNjaGVtZSAgICA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgCi0gICAgdXJpRmFjdG9yeV8gICAgICA9IG5ldyBTaW1wbGVVUklGYWN0b3J5KCk7Ci0gICAgc3RhdHVzSGFuZGxlcl8gICA9IHN0YXR1c0hhbmRsZXI7Ci0gICAgCi0gICAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJwbGF0Zm9ybSIsIGVjbGlwc2VTY2hlbWUgKTsgLy8kTk9OLU5MUy0xJAotICAgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIGZpbGVTY2hlbWUgKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRMb2coKQotICAgKi8KLSAgcHVibGljIElMb2cgZ2V0TG9nKCkKLSAgewotCSAgaWYoIGxvZ2dlcl8gPT0gbnVsbCApCi0gICAgeyAgCi0gICAgICBsb2dnZXJfID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VMb2coKTsgCi0gICAgfQotCQotICAgIHJldHVybiBsb2dnZXJfOwotICB9Ci0gICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0U3RhdHVzSGFuZGxlcigpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1c0hhbmRsZXIgZ2V0U3RhdHVzSGFuZGxlcigpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzSGFuZGxlcl87Ci0gIH0KLQotICAvKiogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldFVSSUZhY3RvcnkoKQotICAgKi8KLSAgcHVibGljIElVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIHVyaUZhY3RvcnlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZVN0YXR1c0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGRjODJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aS5TdGF0dXNEaWFsb2dDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBFY2xpcHNlIFVJIHZlcnNpb24gb2YgdGhlIElTdGF0dXNIYW5kbGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlU3RhdHVzSGFuZGxlciBpbXBsZW1lbnRzIElTdGF0dXNIYW5kbGVyCi17Ci0gIHByaXZhdGUgU2hlbGwgICAgICAgIHNoZWxsXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpCi0gIHsKLSAgICB0aGlzKCBuZXcgU2hlbGwoKSApOwotICB9Ci0KLSAgcHVibGljIEVjbGlwc2VTdGF0dXNIYW5kbGVyKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc2hlbGxfID0gc2hlbGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzLCBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkNob2ljZVtdKQotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQoSVN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMpIAotICB7Ci0gICAgaW50IHJlc3VsdCA9Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgICAgc2hlbGxfLAotICAgICAgICBNZXNzYWdlcy5USVRMRV9XQVJOSU5HLAotCQkJCW51bGwsCi0JCQkJc3RhdHVzLAotCQkJCWNob2ljZXMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykKLSAgICAgewotICAgICAgaWYgKGNob2ljZXNbaV0uZ2V0U2hvcnRjdXQoKSA9PSByZXN1bHQpCi0gICAgICAgIHJldHVybiBjaG9pY2VzW2ldOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KElTdGF0dXMgc3RhdHVzKSB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIHVzZXJPayA9IGZhbHNlOwotICAgIAotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgLy8gYW4gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgYW5kIHdlIG5lZWQgdG8gc3RvcCBleGVjdXRpbmcgdGhlIGNvbW1pbmcKLSAgICAgIC8vIGNvbW1hbmRzCi0gICAgICBjYXNlIFN0YXR1cy5FUlJPUiA6Ci0gICAgICB7Ci0gICAgICAgIHVzZXJPayA9IHJlcG9ydEVycm9yU3RhdHVzKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTdGF0dXMuV0FSTklORyA6Ci0gICAgICB7Ci0gICAgICAgIHVzZXJPayA9IHJlcG9ydFdhcm5pbmcoc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAKLSAgICAgIGNhc2UgU3RhdHVzLklORk8gOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSB0cnVlOwotICAgICAgICByZXBvcnRJbmZvKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiggIXVzZXJPayApIHRocm93IG5ldyBTdGF0dXNFeGNlcHRpb24oIHN0YXR1cyApOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0V2FybmluZyhJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIGludCB1c2VyUmVzcG9uc2UgPQotICAgICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgICAgc2hlbGxfLAotICAgICAgICBNZXNzYWdlcy5USVRMRV9XQVJOSU5HLAotICAgICAgICBudWxsLAotICAgICAgICBzdGF0dXMpOwotICAgIHJldHVybiAodXNlclJlc3BvbnNlID09IFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0RXJyb3JTdGF0dXMoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBNZXNzYWdlRGlhbG9nLm9wZW5NZXNzYWdlKAotICAgICAgc2hlbGxfLAotICAgICAgTWVzc2FnZXMuVElUTEVfRVJST1IsCi0gICAgICBudWxsLAotICAgICAgc3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJlcG9ydEVycm9yU3RhdHVzKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlciNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgTWVzc2FnZXMuVElUTEVfSU5GTywKLSAgICAgICAgbnVsbCwKLSAgICAgICAgc3RhdHVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjMjllZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWkuZW52aXJvbm1lbnQiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBUSVRMRV9XQVJOSU5HOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBUSVRMRV9FUlJPUjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVElUTEVfSU5GTzsKLSAgCi0gIHN0YXRpYwotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyggQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL2Vudmlyb25tZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmRlOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL2Vudmlyb25tZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dBUk5JTkc9V2FybmluZzoKLVRJVExFX0VSUk9SPUVycm9yOgotVElUTEVfSU5GTz1JbmZvOgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvQ29tbW9uVUlQbHVnaW5Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0NvbW1vblVJUGx1Z2luQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjU1ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvQ29tbW9uVUlQbHVnaW5Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uVUlQbHVnaW5Db25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjBjZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkgewotCi0JcHVibGljIERNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRGF0YU1vZGVsV2l6YXJkUGFnZVtdIGNyZWF0ZVBhZ2VHcm91cChJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VHcm91cElEKTsKLQotCS8qCi0JICogdGhpcyBpcyBvcHRpb25hbAotCSAqLwotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBjcmVhdGVQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VHcm91cElEKSAKLQl7Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIFRoaXMgcGFnZSBncm91cCBoYW5kbGVyIGNhbiBiZSBvcHRpb25hbGx5IG92ZXJyaWRlbi4KLQkgKi8KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBjcmVhdGVQYWdlR3JvdXBIYW5kbGVyKCBJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VHcm91cElEICkKLQl7Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZWFjNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBjb252ZW5pZW50IG1ldGhvZHMgZm9yIGFjY2Vzc2luZyB0aGUgc2VtYW50aWNzIG9mIHRoZQotICogZ2l2ZW4gPGNvZGU+SUNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPiBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhlCi0gKiA8Y2l0ZT53aXphcmRQYWdlPC9jaXRlPiBlbGVtZW50IG9mIHRoZSA8Y2l0ZT53aXphcmRQYWdlR3JvdXA8L2NpdGU+Ci0gKiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3Iga3JhZXYKLSAqLwotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciB7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHBvaW50cyB0byB0aGUgd2l6YXJkLCB3aGljaCBwYWdlcyBhcmUKLQkgKiBleHRlbmRlZCBieSB0aGUgY3VycmVudCBjb250cmlidXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1dJWkFSRF9JRCA9ICJ3aXphcmRJRCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBmYWN0b3J5IGNsYXNzIG5hbWUsIHdoZXJlIGlzCi0JICogdGhlIEphdmEgY29kZSB0aGF0IGNvbnRyaWJ1dGVzIHRoZSBuZXcgY29udHJvbHMgdG8gdGhlIHdpemFyZCBwYWdlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZBQ1RPUlkgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHdpemFyZElEOwotCXByb3RlY3RlZCBETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCBmYWN0b3J5RWxlbWVudDsKLQkKLQlwcml2YXRlIGludCBsb2FkT3JkZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvYWRPcmRlckNvdW50ZXI7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5ETVdpemFyZFBhZ2VFbGVtZW50PC9jb2RlPiBmcm9tIHRoZSBnaXZlbgotCSAqIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gdG8gd3JhcC4KLQkgKi8KLQlwdWJsaWMgRE1XaXphcmRQYWdlRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50KTsKLQkJCi0JCXdpemFyZElEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1dJWkFSRF9JRCk7Ci0JCXJlYWRGYWN0b3J5KGVsZW1lbnQpOwotCQkKLQkJbG9hZE9yZGVyID0gbG9hZE9yZGVyQ291bnRlcisrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSWRlbnRpZmlhYmxlI2dldElEKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlTdHJpbmcgaWQgPSB3aXphcmRJRDsKLQkJaWYgKGZhY3RvcnlFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlkID0gaWQgKyAiQCIgKyBmYWN0b3J5RWxlbWVudC5jbGFzc05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaWQ7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgSWRlbnRpZmlhYmxlI2dldExvYWRPcmRlcigpCi0JICovCi0JcHVibGljIGludCBnZXRMb2FkT3JkZXIoKSB7Ci0JCXJldHVybiBsb2FkT3JkZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIG9mIHRoZSB3aXphcmQgd2hpY2ggcGFnZXMgdGhlIGN1cnJlbnQgZXh0ZW5zaW9uIHdpbGwKLQkgKiBjb250cmlidXRlIHRvLgotCSAqIAotCSAqIEByZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZElEKCkgewotCQlyZXR1cm4gd2l6YXJkSUQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhZGRpdGlvbmFsIGNvbnRyb2xzIGZvciB0aGUgc3BlY2lmaWVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBjdXJyZW50IGV4dGVuc2lvbiBjb250cmlidXRlcyBhZGRpdGlvbmFsIGNvbnRyb2xzIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwYXJlbnQgY29tcG9zaXRlIHRoYXQgaXMgcGFydCBvZiB0aGUgd2l6YXJkIHBhZ2UuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgLQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUgd2hlcmUgdGhlIGFkZGl0aW9uYWwgY29udHJvbHMgd2lsbCBiZQotCSAqICAgICAgICAgICAgYWRkZWQgdG8uCi0JICogQHBhcmFtIG1vZGVsIC0KLQkgKiAgICAgICAgICAgIHRoZSBkYXRhIG1vZGVsIG9mIHRoZSB3aXphcmQuCi0JICogQHBhcmFtIHBhZ2VOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBleHRlbmRlZCB3aXphcmQgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCWlmIChmYWN0b3J5RWxlbWVudCAhPSBudWxsKQotCQkJZmFjdG9yeUVsZW1lbnQuY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKHBhcmVudCwgbW9kZWwsIHBhZ2VOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRGYWN0b3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY3RvcmllcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRUxFTUVOVF9GQUNUT1JZKTsKLQkJaWYgKGZhY3RvcmllcyAhPSBudWxsICYmIGZhY3Rvcmllcy5sZW5ndGggPiAwKSB7Ci0JCQlmYWN0b3J5RWxlbWVudCA9IG5ldyBETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudChmYWN0b3JpZXNbMF0pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMmQ1ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGNsYXNzIHdoZXJlIHRoZSBhY3R1YWwgZXh0ZW5kaW5nIG9mIHRoZSB3aXphcmQgcGFnZXMgaGFwcGVuLgotICogCi0gKiA8cD4KLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoaXMgYWJzdHJhY3QgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaW4gdGhlCi0gKiA8Y2l0ZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkud2l6YXJkUGFnZUdydW9wPC9jaXRlPiBleHRlbnNpb24KLSAqIHBvaW50ID4gPGNpdGU+d2l6YXJkUGFnZTwvY2l0ZT4gPiA8Y2l0ZT5mYWN0b3J5PC9jaXRlPiA+IDxjaXRlPmNsYXNzTmFtZTwvY2l0ZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3Iga3JhZXYKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZSBhZGRpdGlvbmFsIGNvbnRyb2xzIGZvciB0aGUgc3BlY2lmaWVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgLQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUgd2hlcmUgdGhlIGFkZGl0aW9uYWwgY29udHJvbHMgd2lsbCBiZQotCSAqICAgICAgICAgICAgYWRkZWQgdG8uCi0JICogQHBhcmFtIG1vZGVsIC0KLQkgKiAgICAgICAgICAgIHRoZSBkYXRhIG1vZGVsIG9mIHRoZSB3aXphcmQuCi0JICogQHBhcmFtIHBhZ2VOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBleHRlbmRlZCB3aXphcmQgcGFnZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTQ3ZDVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfVUkgPSAib3JnLmVjbGlwc2UudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JSGFzaE1hcCB3aXphcmRQbHVnaW5JRE1hcCA9IG51bGw7Ci0KLQlUcmVlTWFwIHdpemFyZFBhZ2VFbGVtZW50cyA9IG51bGw7Ci0KLQkvLyBwcml2YXRlIFRyZWVTZXQgd2l6YXJkRXh0UGFnZUVsZW1lbnRzID0gbnVsbDsKLQlMaXN0IG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIFdpemFyZFBhZ2VFeHRlbnNpb25SZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpIHsKLQkJc2V0dXBXaXphcmRQbHVnaW5JRE1hcCgpOwotCQlyZWFkRnJvbVJlZ2lzdHJ5KCk7Ci0JCXBvc3RSZWFkRnJvbVJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldHVwV2l6YXJkUGx1Z2luSURNYXAoKSB7Ci0JCXdpemFyZFBsdWdpbklETWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gZ2V0IGVkaXRvciBwbHVnaW4gYW5kIHNhdmUgaXQgdG8gYSBoYXNoIG1hcAotCQkvLyBOb3RlOiBlZGl0b3JzIGV4dGVuc2lvbiBpZCBpcyBkaWZmZXJlbnQgZnJvbSBlZGl0b3IgaWQKLQotCQlJRXh0ZW5zaW9uUG9pbnRbXSBwb2ludCA9IG5ldyBJRXh0ZW5zaW9uUG9pbnRbXXtQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KE9SR19FQ0xJUFNFX1VJLCAiZXhwb3J0V2l6YXJkcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoT1JHX0VDTElQU0VfVUksICJpbXBvcnRXaXphcmRzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChPUkdfRUNMSVBTRV9VSSwgIm5ld1dpemFyZHMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiLCAiZXh0ZW5kYWJsZVdpemFyZCIpfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwb2ludC5sZW5ndGg7IHgrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludFt4XS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgd2l6YXJkSUQgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGx1Z2luSUQgPSBlbGVtZW50c1tpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCQl3aXphcmRQbHVnaW5JRE1hcC5wdXQod2l6YXJkSUQsIHBsdWdpbklEKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRnJvbVJlZ2lzdHJ5KCkgewotCQl3aXphcmRQYWdlRWxlbWVudHMgPSBuZXcgVHJlZU1hcCgpOwotCQkvLyB3aXphcmRFeHRQYWdlRWxlbWVudHMgPSBuZXcgVHJlZVNldCgpOwotCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFJlYWQgYWxsIHBhZ2UgZXh0ZW5zaW9ucyBpbnRvIGVkaXRvclBhZ2VFbGVtZW50cwotCQlyZWFkZXIgPSBuZXcgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlcigpOwotCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwdWJsaWMgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlcigpIHsKLQkJCXN1cGVyKENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LkVMRU1FTlRfUEFHRV9HUk9VUCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmICghRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LkVMRU1FTlRfUEFHRV9HUk9VUC5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCURNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50ID0gbmV3IERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudChlbGVtZW50KTsKLQotCQkJLy8gcHV0IHRoZSBlbGVtZW50IGludG8gYSBoYXNobWFwLCB3aXphcmRJRCBhcyBrZXksCi0JCQkvLyBsaXN0IG9mIHBhZ2UgZWxlbWVudHMgYXMgb2JqZWN0Ci0JCQlTdHJpbmcgd2l6YXJkSUQgPSBuZXdFbGVtZW50LmdldFdpemFyZElEKCk7Ci0JCQlpZiAoIXdpemFyZFBhZ2VFbGVtZW50cy5jb250YWluc0tleSh3aXphcmRJRCkpIHsKLQkJCQl3aXphcmRQYWdlRWxlbWVudHMucHV0KHdpemFyZElELCBjcmVhdGVQYWdlTWFwRW50cnkobmV3RWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQkJCQlUcmVlTWFwIHBhZ2VNYXAgPSAoVHJlZU1hcCkgd2l6YXJkUGFnZUVsZW1lbnRzLmdldCh3aXphcmRJRCk7Ci0JCQkJaW5zZXJ0UGFnZUVsZW1lbnQocGFnZU1hcCwgbmV3RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5zZXJ0UGFnZUVsZW1lbnQoVHJlZU1hcCBwYWdlTWFwLCBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQkJaWYgKG5ld0VsZW1lbnQucGFnZUluc2VydGlvbklEID09IG51bGwpIHsKLQkJCQlwYWdlTWFwLnB1dChuZXdFbGVtZW50LCBuZXcgVHJlZVNldCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gbmV3RWxlbWVudC5wYWdlSW5zZXJ0aW9uSUQ7Ci0JCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBnZXRQYWdlRWxlbWVudChlbGVtZW50TmFtZSwgcGFnZU1hcCk7Ci0JCQkJaW5zZXJ0RXh0UGFnZUVsZW1lbnQocGFnZU1hcCwgcGFyZW50RWxlbWVudCwgbmV3RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCW5ld0VsZW1lbnQuZ2V0UGFnZUluc2VydGlvbklEKCk7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbnNlcnRFeHRQYWdlRWxlbWVudChUcmVlTWFwIHBhZ2VNYXAsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBwYXJlbnRFbGVtZW50LCBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5hZGQobmV3RWxlbWVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKCFwYXJlbnRFbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcigpKSB7Ci0JCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzAsIG5ldyBPYmplY3RbXXtwYXJlbnRFbGVtZW50LmdldFBhZ2VJRCgpfSkpOwotCQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8xLCBuZXcgT2JqZWN0W117bmV3RWxlbWVudC5nZXRQYWdlSUQoKX0pKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlUcmVlU2V0IHNldCA9IChUcmVlU2V0KSBwYWdlTWFwLmdldChwYXJlbnRFbGVtZW50KTsKLQkJCXNldC5hZGQobmV3RWxlbWVudCk7Ci0KLQkJCWlmIChuZXdFbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcikKLQkJCQlwYWdlTWFwLnB1dChuZXdFbGVtZW50LCBuZXcgVHJlZVNldCgpKTsKLQotCQkJaWYgKG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jb250YWlucyhuZXdFbGVtZW50KSkKLQkJCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QucmVtb3ZlKG5ld0VsZW1lbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZ2V0UGFnZUVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBUcmVlTWFwIG1hcCkgewotCQkJU2V0IGtleVNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleVNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50LmdldFBhZ2VJRCgpLmVxdWFscyhlbGVtZW50TmFtZSkpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfQotCi0JCXByaXZhdGUgVHJlZU1hcCBjcmVhdGVQYWdlTWFwRW50cnkoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJCVRyZWVNYXAgcGFnZU1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0JCQlUcmVlU2V0IHBhZ2VFeHRlbnNpb25TZXQgPSBuZXcgVHJlZVNldCgpOwotCQkJcGFnZU1hcC5wdXQobmV3RWxlbWVudCwgcGFnZUV4dGVuc2lvblNldCk7Ci0JCQlyZXR1cm4gcGFnZU1hcDsKLQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb25FbGVtZW50cyhTdHJpbmcgd2l6YXJkSUQpIHsKLQkJVHJlZU1hcCB0cmVlTWFwID0gKFRyZWVNYXApIHdpemFyZFBhZ2VFbGVtZW50cy5nZXQod2l6YXJkSUQpOwotCQlyZXR1cm4gdHJlZU1hcC5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudFtdIGdldFBhZ2VFbGVtZW50cyhTdHJpbmcgd2l6YXJkSUQpIHsKLQkJVHJlZU1hcCBlbGVtZW50TWFwID0gKFRyZWVNYXApIHdpemFyZFBhZ2VFbGVtZW50cy5nZXQod2l6YXJkSUQpOwotCQlpZiAoZWxlbWVudE1hcCA9PSBudWxsIHx8IGVsZW1lbnRNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbmV3IERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudFswXTsKLQkJfQotCQlBcnJheUxpc3QgYWxyZWFkeVZpc3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRNYXAuc2l6ZSgpKTsKLQkJU2V0IGFsbFBhZ2VFbGVtZW50c0xpc3QgPSBlbGVtZW50TWFwLmtleVNldCgpOwotCQlBcnJheUxpc3Qgb3JkZXJlZFBhZ2VMaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50TWFwLnNpemUoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsUGFnZUVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBlbGVtZW50ID0gKERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWxyZWFkeVZpc3RlZExpc3QuY29udGFpbnMoZWxlbWVudCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcihlbGVtZW50LmdldElEKCksIG51bGwpLmlzRW5hYmxlZCgpKSB7Ci0JCQkJb3JkZXJlZFBhZ2VMaXN0LmFkZChlbGVtZW50KTsKLQkJCQlUcmVlU2V0IHRyZWVTZXQgPSAoVHJlZVNldCkgZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJaWYgKHRyZWVTZXQgIT0gbnVsbCAmJiAhdHJlZVNldC5pc0VtcHR5KCkpCi0JCQkJCWZsYXRlblRyZWVTZXQodHJlZVNldCwgYWxsUGFnZUVsZW1lbnRzTGlzdCwgYWxyZWFkeVZpc3RlZExpc3QsIG9yZGVyZWRQYWdlTGlzdCwgZWxlbWVudE1hcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFBhZ2VBcnJheShvcmRlcmVkUGFnZUxpc3QpOwotCi0JfQotCi0JcHJpdmF0ZSBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnRbXSBnZXRQYWdlQXJyYXkoQXJyYXlMaXN0IG9yZGVyZWRQYWdlTGlzdCkgewotCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnRbXSBwYWdlRWxlbWVudHMgPSBuZXcgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50W29yZGVyZWRQYWdlTGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyZWRQYWdlTGlzdC5zaXplKCk7IGkrKykgewotCQkJcGFnZUVsZW1lbnRzW2ldID0gKERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCkgb3JkZXJlZFBhZ2VMaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gcGFnZUVsZW1lbnRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBmbGF0ZW5UcmVlU2V0KFRyZWVTZXQgdHJlZVNldCwgU2V0IGFsbFBhZ2VFbGVtZW50c0xpc3QsIEFycmF5TGlzdCBhbHJlYWR5VmlzdGVkTGlzdCwgQXJyYXlMaXN0IG9yZGVyZWRQYWdlTGlzdCwgVHJlZU1hcCBlbGVtZW50TWFwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRyZWVTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFscmVhZHlWaXN0ZWRMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzIsIG5ldyBPYmplY3RbXXtlbGVtZW50LmdldFBhZ2VJRCgpLCBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuQVRUX1BBR0VfSU5TRVJUSU9OX0lEfSkpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoYWxsUGFnZUVsZW1lbnRzTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCVRyZWVTZXQgc2V0ID0gKFRyZWVTZXQpIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCW9yZGVyZWRQYWdlTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJYWxyZWFkeVZpc3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQkJCWZsYXRlblRyZWVTZXQoc2V0LCBhbGxQYWdlRWxlbWVudHNMaXN0LCBhbHJlYWR5VmlzdGVkTGlzdCwgb3JkZXJlZFBhZ2VMaXN0LCBlbGVtZW50TWFwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3JkZXJlZFBhZ2VMaXN0LmFkZChlbGVtZW50KTsKLQkJCQlhbHJlYWR5VmlzdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLy8gaWYgY2hpbGQgZWxlbWVudHMgYXJlIHJlYWQgaW4gYmVmb3JlIHBhcmVudCBlbGVtZW50LiBEbyBwb3N0IHJlYWQuCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBsaXN0UmVtb3ZlT2JqZWN0czsKLQotCXByaXZhdGUgdm9pZCBwb3N0UmVhZEZyb21SZWdpc3RyeSgpIHsKLQkJbGlzdFJlbW92ZU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5zaXplKCk7IGkrKykgewotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBub25TeW5jZWRQYWdlRWxlbWVudExpc3QuZ2V0KGkpOwotCQkJVHJlZU1hcCBwYWdlTWFwID0gKFRyZWVNYXApIHdpemFyZFBhZ2VFbGVtZW50cy5nZXQoZWxlbWVudC53aXphcmRJRCk7Ci0JCQlpZiAoZWxlbWVudC5wYWdlSW5zZXJ0aW9uSUQgPT0gbnVsbCkgewotCQkJCWFkZFRvRmlyc3RBdmlhbGlhYmxlKHBhZ2VNYXAsIGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChyZWFkZXIgIT0gbnVsbCAmJiBwYWdlTWFwICE9IG51bGwpCi0JCQkJcmVhZGVyLmluc2VydFBhZ2VFbGVtZW50KHBhZ2VNYXAsIGVsZW1lbnQpOwotCQl9Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5yZW1vdmVBbGwobGlzdFJlbW92ZU9iamVjdHMpOwotCQlpZiAoIW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5pc0VtcHR5KCkpCi0JCQlsb2dNaXNzaW5nQ2xhc3NFcnJvcigpOwotCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QuY2xlYXIoKTsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlTWFwCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9GaXJzdEF2aWFsaWFibGUoVHJlZU1hcCBwYWdlTWFwLCBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQlib29sZWFuIGluc2VydE5vdEZvdW5kID0gdHJ1ZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFnZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBlbGVtZW50ID0gKERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5hbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIpIHsKLQkJCQlUcmVlU2V0IHNldCA9IChUcmVlU2V0KSBwYWdlTWFwLmdldChlbGVtZW50KTsKLQkJCQlzZXQuYWRkKG5ld0VsZW1lbnQpOwotCQkJCWxpc3RSZW1vdmVPYmplY3RzLmFkZChuZXdFbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKGluc2VydE5vdEZvdW5kKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8zKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ01pc3NpbmdDbGFzc0Vycm9yKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5zaXplKCk7IGkrKykgewotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBub25TeW5jZWRQYWdlRWxlbWVudExpc3QuZ2V0KGkpOwotCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzQsIG5ldyBPYmplY3RbXXtlbGVtZW50LnBhZ2VJbnNlcnRpb25JRCwgZWxlbWVudC5nZXRQYWdlSUQoKSwgZWxlbWVudC5wbHVnaW5JRH0pKTsKLQkJfQotCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QuY2xlYXIoKTsKLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEVqYlBhZ2VFeHRlbnNpb25SZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMGQ0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udmVuaWVudCBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAqIGdpdmVuIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gaW4gdGhlIGNvbnRleHQgb2YgdGhlCi0gKiA8Y2l0ZT5mYWN0b3J5PC9jaXRlPiBlbGVtZW50IGFzIGEgY2hpbGQgZWxlbWVudCBvZiB0aGUgPGNpdGU+d2l6YXJkUGFnZTwvY2l0ZT4KLSAqIGVsZW1lbnQgb2YgdGhlIDxjaXRlPndpemFyZFBhZ2VHcm91cDwvY2l0ZT4gZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIGtyYWV2Ci0gKi8KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCBleHRlbmRzIENvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlciB7Ci0JCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHBvaW50cyB0byBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUKLQkgKiBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIDxjb2RlPkRNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3Rvcnk8L2NvZGU+Ci0JICogYWJzdHJhY3QgY2xhc3MuIFRoaXMgY2xhc3MgZG9lcyB0aGUgYWN0dWFsIGpvYiBvbiBleHRlbmRpbmcgYSB3aXphcmQKLQkgKiBwYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTU19OQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcm90ZWN0ZWQgRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB3aXphcmRQYWdlRmFjdG9yeTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhZ2VGYWN0b3J5SW5pdGlhbGl6ZWQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkRNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50PC9jb2RlPiBmcm9tIHRoZSBnaXZlbgotCSAqIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPklDb25maWd1cmF0aW9uRWxlbWVudDwvY29kZT4gdG8gd3JhcC4KLQkgKi8KLQlwdWJsaWMgRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCWNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU19OQU1FKTsKLQkJCi0JCWlzUGFnZUZhY3RvcnlJbml0aWFsaXplZCA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYWRkaXRpb25hbCBjb250cm9scyBmb3IgdGhlIHNwZWNpZmllZCB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotCSAqIDxjb2RlPkRNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3Rvcnk8L2NvZGU+IGFic3RyYWN0IGNsYXNzLCB0aGF0IGlzCi0JICogZGVmaW5lZCBpbiB0aGUgPGNpdGU+Y2xhc3NOYW1lPC9jaXRlPiBhdHRyaWJ1dGUsIGlzIGluaXRpYWxpemVkLiBUaGVuCi0JICogdGhlIG1ldGhvZCBmb3J3YXJkcyB0aGUgY2FsbCB0byB0aGUgZmFjdG9yeSBjbGFzcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJaWYgKCFpc1BhZ2VGYWN0b3J5SW5pdGlhbGl6ZWQpCi0JCQlpbml0UGFnZUZhY3RvcnkoKTsKLQotCQlpZiAod2l6YXJkUGFnZUZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXdpemFyZFBhZ2VGYWN0b3J5LmNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhwYXJlbnQsIG1vZGVsLCBwYWdlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UGFnZUZhY3RvcnkoKSB7Ci0JCXRyeSB7Ci0JCQl3aXphcmRQYWdlRmFjdG9yeSA9IChETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTX05BTUUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKCJFcnJvciBnZXR0aW5nIHBhZ2UgZmFjdG9yeTogIiArIGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzUGFnZUZhY3RvcnlJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUdyb3VwRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NWY0MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjEzOTI3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFHRV9HUk9VUCA9ICJ3aXphcmRQYWdlR3JvdXAiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUEFHRV9JRCA9ICJwYWdlR3JvdXBJRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9XSVpBUkRfSUQgPSAid2l6YXJkSUQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVRVUlSRVNfREFUQV9PUEVSQVRJT05fSUQgPSAicmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfREFUQV9NT0RFTF9JRFMgPSAiZGF0YU1vZGVsSWRzIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0FMTE9XU19FWFRFTkRFRF9QQUdFU19BRlRFUiA9ICJhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUEFHRV9JTlNFUlRJT05fSUQgPSAicGFnZUdyb3VwSW5zZXJ0aW9uSUQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZBQ1RPUlkgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBsdWdpbklEOwotCXByb3RlY3RlZCBTdHJpbmcgd2l6YXJkSUQ7Ci0JcHVibGljIFN0cmluZyBwYWdlR3JvdXBJRDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHdpemFyZEZhY3RvcnlFbGVtZW50OwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVpcmVzRGF0YU9wZXJhdGlvbklkOwotCXByb3RlY3RlZCBTZXQgZGF0YU1vZGVsSURzOwotCXByb3RlY3RlZCBTdHJpbmcgcGFnZUluc2VydGlvbklEOwotCXByaXZhdGUgaW50IGxvYWRPcmRlcjsKLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9hZE9yZGVyQ291bnRlcjsKLQotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQotCXB1YmxpYyBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCXN1cGVyKGVsZW1lbnQxKTsKLQkJcGx1Z2luSUQgPSBlbGVtZW50MS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJd2l6YXJkSUQgPSBlbGVtZW50MS5nZXRBdHRyaWJ1dGUoQVRUX1dJWkFSRF9JRCk7Ci0JCXBhZ2VHcm91cElEID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9QQUdFX0lEKTsKLQkJcmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQgPSBlbGVtZW50MS5nZXRBdHRyaWJ1dGUoQVRUX1JFUVVJUkVTX0RBVEFfT1BFUkFUSU9OX0lEKTsKLQkJZGF0YU1vZGVsSURzID0gZ2V0RGF0YU1vZGVsSWRzKCBlbGVtZW50MSApOwotCQlyZWFkQWxsb3dzRXh0ZW5kZWRQYWdlQWZ0ZXIoZWxlbWVudDEpOwotCQlwYWdlSW5zZXJ0aW9uSUQgPSBlbGVtZW50MS5nZXRBdHRyaWJ1dGUoQVRUX1BBR0VfSU5TRVJUSU9OX0lEKTsKLQkJcmVhZEZhY3RvcnkoZWxlbWVudDEpOwotCQl2YWxpZGF0ZVNldHRpbmdzKCk7Ci0JCWxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKLQl9Ci0KLSAgcHJpdmF0ZSBTZXQgZ2V0RGF0YU1vZGVsSWRzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ICkKLSAgewotICAgIEhhc2hTZXQgaWRzICAgID0gbmV3IEhhc2hTZXQoKTsKLSAgICBTdHJpbmcgIGlkTGlzdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9EQVRBX01PREVMX0lEUyk7Ci0gICAgCi0gICAgaWYoIGlkTGlzdCAhPSBudWxsICkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBkYXRhTW9kZWxJRHMgPSBpZExpc3Quc3BsaXQoICIgKiIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YU1vZGVsSURzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIGlkcy5hZGQoIGRhdGFNb2RlbElEc1tpbmRleF0gKTsgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaWRzOwotICB9Ci0gIAotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVNldHRpbmdzKCkgewotCQlpZiAod2l6YXJkSUQgPT0gbnVsbCB8fCB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgPT0gbnVsbCkgewotCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoIkluY29tcGxldGUgcGFnZSBleHRlbnNpb24gc3BlY2lmaWNhdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgcmVhZEFsbG93c0V4dGVuZGVkUGFnZUFmdGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50MSkgewotCQlTdHJpbmcgYWxsb3dzUGFnZUFmdGVyVmFsdWUgPSBlbGVtZW50MS5nZXRBdHRyaWJ1dGUoQVRUX0FMTE9XU19FWFRFTkRFRF9QQUdFU19BRlRFUik7Ci0JCWFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciA9IGFsbG93c1BhZ2VBZnRlclZhbHVlID09IG51bGwgPyBmYWxzZSA6IEJvb2xlYW4udmFsdWVPZihhbGxvd3NQYWdlQWZ0ZXJWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRGYWN0b3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50MSkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmYWN0b3JpZXMgPSBlbGVtZW50MS5nZXRDaGlsZHJlbihFTEVNRU5UX0ZBQ1RPUlkpOwotCQlpZiAoZmFjdG9yaWVzICE9IG51bGwgJiYgZmFjdG9yaWVzLmxlbmd0aCA+IDApIHsKLQkJCXdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCA9IG5ldyBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50KGZhY3Rvcmllc1swXSwgcGFnZUdyb3VwSUQpOwotCQl9Ci0JfQotCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGNyZWF0ZVBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWlmICh3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgIT0gbnVsbCkKLQkJCXJldHVybiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuY3JlYXRlUGFnZUhhbmRsZXIoZGF0YU1vZGVsKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCAhPSBudWxsKQotCQkJcmV0dXJuIHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5jcmVhdGVQYWdlR3JvdXAoZGF0YU1vZGVsKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgY3JlYXRlUGFnZUdyb3VwSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID09IG51bGwgPyBudWxsIDogd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cEhhbmRsZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQlyZXR1cm4gSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcywgbyk7Ci0JCS8qCi0JCSAqIGlmIChvID09IG51bGwpIHJldHVybiBHUkVBVEVSX1RIQU47IFdpemFyZFBhZ2VFbGVtZW50IGVsZW1lbnQgPSAoV2l6YXJkUGFnZUVsZW1lbnQpIG87IGlmCi0JCSAqIChnZXRJRCgpID09IG51bGwgJiYgZWxlbWVudC5nZXRJRCgpID09IG51bGwpIHJldHVybiBjb21wYXJlTG9hZE9yZGVyKGVsZW1lbnQpOyBpZgotCQkgKiAoZ2V0SUQoKSA9PSBudWxsKSByZXR1cm4gR1JFQVRFUl9USEFOOyBlbHNlIGlmIChlbGVtZW50LmdldElEKCkgPT0gbnVsbCkgcmV0dXJuCi0JCSAqIExFU1NfVEhBTjsKLQkJICogCi0JCSAqIGludCBwcmlvcml0eSA9IGdldFByaW9yaXR5KCk7IGludCBlbGVtZW50UHJpb3JpdHkgPWVsZW1lbnQuZ2V0UHJpb3JpdHkoKTsKLQkJICogCi0JCSAqIGlmIChwcmlvcml0eSA9PSBlbGVtZW50UHJpb3JpdHkpIHJldHVybiBjb21wYXJlTG9hZE9yZGVyKGVsZW1lbnQpOyBpZiAocHJpb3JpdHkgPAotCQkgKiBlbGVtZW50UHJpb3JpdHkpIHJldHVybiBHUkVBVEVSX1RIQU47IGlmIChwcmlvcml0eSA+IGVsZW1lbnRQcmlvcml0eSkgcmV0dXJuIExFU1NfVEhBTjsKLQkJICogcmV0dXJuIEVRVUFMOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKCkgewotCQlyZXR1cm4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gcGx1Z2luSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUlEKCkgewotCQlyZXR1cm4gcGFnZUdyb3VwSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUluc2VydGlvbklEKCkgewotCQlyZXR1cm4gcGFnZUluc2VydGlvbklEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKCkgewotCQlyZXR1cm4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIKLQkgKiAgICAgICAgICAgIFRoZSBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcihib29sZWFuIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcikgewotCQl0aGlzLmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciA9IGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVzRGF0YU9wZXJhdGlvbklkKCkgewotCQlyZXR1cm4gcmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQ7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlc0RhdGFPcGVyYXRpb25JZChTdHJpbmcgZGF0YU9wZXJhdGlvbklkKSB7Ci0JCXJlcXVpcmVzRGF0YU9wZXJhdGlvbklkID0gZGF0YU9wZXJhdGlvbklkOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RGF0YU1vZGVsSURzKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsSURzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbElEKFNldCBuZXdEYXRhTW9kZWxJRHMpIHsKLQkJZGF0YU1vZGVsSURzID0gbmV3RGF0YU1vZGVsSURzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2l6YXJkRmFjdG9yeUVsZW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRGYWN0b3J5RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdpemFyZEZhY3RvcnlFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aXphcmRGYWN0b3J5RWxlbWVudAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZEZhY3RvcnlFbGVtZW50IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaXphcmRGYWN0b3J5RWxlbWVudChTdHJpbmcgd2l6YXJkRmFjdG9yeUVsZW1lbnQpIHsKLQkJdGhpcy53aXphcmRGYWN0b3J5RWxlbWVudCA9IHdpemFyZEZhY3RvcnlFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2l6YXJkSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRJRCgpIHsKLQkJcmV0dXJuIHdpemFyZElEOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aXphcmRJRAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZElEIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaXphcmRJRChTdHJpbmcgd2l6YXJkSUQpIHsKLQkJdGhpcy53aXphcmRJRCA9IHdpemFyZElEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50LgotCSAqLwotCXB1YmxpYyBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50IGdldFdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQoRE1XaXphcmRQYWdlR3JvdXBGYWN0b3J5RWxlbWVudCB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQpIHsKLQkJdGhpcy53aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgPSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gcGFnZUlECi0JICogICAgICAgICAgICBUaGUgcGFnZUlEIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlSUQoU3RyaW5nIHBhZ2VJRCkgewotCQl0aGlzLnBhZ2VHcm91cElEID0gcGFnZUlEOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yI2dldElEKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gZ2V0UGFnZUlEKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGE0NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlR3JvdXBGYWN0b3J5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjEzOTI3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50IGV4dGVuZHMgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJvdGVjdGVkIERNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeSB3aXphcmRQYWdlR3JvdXBGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZUdyb3VwRmFjdG9yeUluaXRpYWxpemVkOwotCXByb3RlY3RlZCBTdHJpbmcgcGFnZUdyb3VwSUQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcGFnZUdyb3VwSUQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JCWNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU19OQU1FKTsKLQkJdGhpcy5wYWdlR3JvdXBJRCA9IHBhZ2VHcm91cElEOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBjcmVhdGVQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoIWlzUGFnZUdyb3VwRmFjdG9yeUluaXRpYWxpemVkKQotCQkJaW5pdFBhZ2VGYWN0b3J5KCk7Ci0JCWlmICh3aXphcmRQYWdlR3JvdXBGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJRE1QYWdlSGFuZGxlciBoYW5kbGVyID0gd2l6YXJkUGFnZUdyb3VwRmFjdG9yeS5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwsIHBhZ2VHcm91cElEKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKCFpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCkKLQkJCWluaXRQYWdlRmFjdG9yeSgpOwotCi0JCWlmICh3aXphcmRQYWdlR3JvdXBGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlEYXRhTW9kZWxXaXphcmRQYWdlW10gcGFnZXMgPSB3aXphcmRQYWdlR3JvdXBGYWN0b3J5LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwsIHBhZ2VHcm91cElEKTsKLQkJCi0JCXJldHVybiBwYWdlczsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBjcmVhdGVQYWdlR3JvdXBIYW5kbGVyKCBJRGF0YU1vZGVsIGRhdGFNb2RlbCApCi0JewotCSAgaWYgKCFpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCkgaW5pdFBhZ2VGYWN0b3J5KCk7Ci0JCQotCSAgaWYoIHdpemFyZFBhZ2VHcm91cEZhY3RvcnkgPT0gbnVsbCApIHJldHVybiBudWxsOwotCSAgCi0JICByZXR1cm4gd2l6YXJkUGFnZUdyb3VwRmFjdG9yeS5jcmVhdGVQYWdlR3JvdXBIYW5kbGVyKCBkYXRhTW9kZWwsIHBhZ2VHcm91cElEICk7Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgaW5pdFBhZ2VGYWN0b3J5KCkgewotCQl0cnkgewotCQkJd2l6YXJkUGFnZUdyb3VwRmFjdG9yeSA9IChETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1NfTkFNRSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoIkVycm9yIGdldHRpbmcgcGFnZSBmYWN0b3J5OiAiICsgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJCAKLQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaXNQYWdlR3JvdXBGYWN0b3J5SW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RhdGFNb2RlbFdpemFyZEV4dGVuc2lvblJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWMwNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTiA9ICJEYXRhTW9kZWxXaXphcmRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlQgPSAiRGF0YU1vZGVsV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSGFzaE1hcCBleHRlbnNpb25zOwotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZEV4dGVuc2lvblJlYWRlcigpIHsKLQkJc3VwZXIoV1RQVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT04pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQpOwotCQlpZiAobnVsbCA9PSBpZCB8fCBpZC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBFTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfSUQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0NMQVNTKTsKLQkJaWYgKG51bGwgPT0gY2xhc3NOYW1lIHx8IGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBFTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlhZGRFeHRlbnNpb24oaWQsIGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRXh0ZW5zaW9uKFN0cmluZyBpZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGV4dGVuc2lvbnMuY29udGFpbnNLZXkoaWQpKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRHVwbGljYXRlICIgKyBFTEVNRU5UICsgIiAiICsgQVRUUklCVVRFX0lEICsgIiAiICsgaWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlleHRlbnNpb25zLnB1dChpZCwgZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCWlmIChleHRlbnNpb25zID09IG51bGwpIHsKLQkJCWV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBleHRlbnNpb25zLmdldChpZCk7Ci0JCWlmIChudWxsID09IGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgRUxFTUVOVCArICIgbm90IGZvdW5kIGZvciAiICsgQVRUUklCVVRFX0lEICsgIjogIiArIGlkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWxXaXphcmQgZ2V0V2l6YXJkKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCURhdGFNb2RlbFdpemFyZCB3aXphcmQgPSBudWxsOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGdldEV4dGVuc2lvbihkYXRhTW9kZWwuZ2V0SUQoKSk7Ci0KLQkJdHJ5IHsKLQkJCXdpemFyZCA9IChEYXRhTW9kZWxXaXphcmQpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSSUJVVEVfQ0xBU1MpOwotCQkJd2l6YXJkLnNldERhdGFNb2RlbChkYXRhTW9kZWwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHdpemFyZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9FeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9FeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTc1MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZXh0ZW5kZWRWaWV3ZXJNYXAgPSBudWxsOwotCXByaXZhdGUgTWFwIGRlc2NyaXB0b3JNYXAgPSBudWxsOwotCi0JcHJvdGVjdGVkIGludGVyZmFjZSBFbGVtZW50cyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOREVEX1ZJRVdFUiA9ICJleHRlbmRlZFZpZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV0VSX0lEID0gInZpZXdlcklEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfVklFV0VSX0lEID0gInBhcmVudFZpZXdlcklEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NMQVNTID0gImZhY3RvcnlDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05fR1JPVVBfSUQgPSAiZnVuY3Rpb25Hcm91cElEIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIEV4dGVuc2libGVWaWV3UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKFdUUFVJUGx1Z2luLlBMVUdJTl9JRCwgV1RQVUlQbHVnaW4uRVhURU5ERURfVklFV0VSX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeSgpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIHZpZXdlcklEKSB7Ci0JCXJldHVybiAoRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvck1hcCgpLmdldCh2aWV3ZXJJRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRWxlbWVudHMuRVhURU5ERURfVklFV0VSKSkgewotCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlnZXREZXNjcmlwdG9yTWFwKCkucHV0KGRlc2NyaXB0b3IuZ2V0Vmlld2VySUQoKSwgZGVzY3JpcHRvcik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbmRlZFZpZXdlck1hcC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldEV4dGVuZGVkVmlld2VyTWFwKCkgewotCQlpZiAoZXh0ZW5kZWRWaWV3ZXJNYXAgPT0gbnVsbCkKLQkJCWV4dGVuZGVkVmlld2VyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGV4dGVuZGVkVmlld2VyTWFwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRvck1hcC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldERlc2NyaXB0b3JNYXAoKSB7Ci0JCWlmIChkZXNjcmlwdG9yTWFwID09IG51bGwpCi0JCQlkZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JNYXA7Ci0JfQotCi0JcHVibGljIGNsYXNzIERlc2NyaXB0b3IgewotCi0JCXByaXZhdGUgU3RyaW5nIHZpZXdlcklEID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50Vmlld2VySUQgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBmYWN0b3J5Q2xhc3MgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBpY29uID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgbGFiZWwgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBmdW5jdGlvbkdyb3VwSUQgPSBudWxsOwotCi0JCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nQ2FjaGUgPSBudWxsOwotCQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQotCQkvKioKLQkJICogIAotCQkgKi8KLQkJcHVibGljIERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLQkJCXRoaXMudmlld2VySUQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2libGVWaWV3UmVnaXN0cnkuRWxlbWVudHMuVklFV0VSX0lEKTsKLQkJCXRoaXMucGFyZW50Vmlld2VySUQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2libGVWaWV3UmVnaXN0cnkuRWxlbWVudHMuUEFSRU5UX1ZJRVdFUl9JRCk7Ci0JCQl0aGlzLmZhY3RvcnlDbGFzcyA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5GQUNUT1JZX0NMQVNTKTsKLQkJCXRoaXMuaWNvbiA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5JQ09OKTsKLQkJCXRoaXMubGFiZWwgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2libGVWaWV3UmVnaXN0cnkuRWxlbWVudHMuTEFCRUwpOwotCQkJdGhpcy5mdW5jdGlvbkdyb3VwSUQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2libGVWaWV3UmVnaXN0cnkuRWxlbWVudHMuRlVOQ1RJT05fR1JPVVBfSUQpOwotCQl9Ci0KLQkJcHVibGljIElFeHRlbnNpYmxlVmlld0ZhY3RvcnkgY3JlYXRlRmFjdG9yeUluc3RhbmNlKCkgewotCQkJSUV4dGVuc2libGVWaWV3RmFjdG9yeSBmYWN0b3J5SW5zdGFuY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlmYWN0b3J5SW5zdGFuY2UgPSAoSUV4dGVuc2libGVWaWV3RmFjdG9yeSkgdGhpcy5lbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFjdG9yeUluc3RhbmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmFjdG9yeUNsYXNzLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3MoKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeUNsYXNzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZnVuY3Rpb25Hcm91cElELgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRGdW5jdGlvbkdyb3VwSUQoKSB7Ci0JCQlyZXR1cm4gZnVuY3Rpb25Hcm91cElEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWNvbi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsKLQkJCXJldHVybiBpY29uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFiZWwuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50Vmlld2VySUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudFZpZXdlcklEKCkgewotCQkJcmV0dXJuIHBhcmVudFZpZXdlcklEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlld2VySUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFZpZXdlcklEKCkgewotCQkJcmV0dXJuIHZpZXdlcklEOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlpZiAodG9TdHJpbmdDYWNoZSA9PSBudWxsKQotCQkJCXRvU3RyaW5nQ2FjaGUgPSAiRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5JbmZvIFt2aWV3ZXJJRD1cIiIgKyBnZXRWaWV3ZXJJRCgpICsgIlwiLHBhcmVudFZpZXdlcklEPVwiIiArIGdldFBhcmVudFZpZXdlcklEKCkgKyAiXCIsZmFjdG9yeUNsYXNzPSIgKyBnZXRGYWN0b3J5Q2xhc3MoKSArICJcIixmdW5jdGlvbkdyb3VwSUQ9XCIiICsgZ2V0RnVuY3Rpb25Hcm91cElEKCkgKyAiXCJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQlyZXR1cm4gdG9TdHJpbmdDYWNoZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSUV4dGVuc2libGVWaWV3RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSUV4dGVuc2libGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE5MzhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lFeHRlbnNpYmxlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXh0ZW5zaWJsZVZpZXdGYWN0b3J5IHsKLQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JT3BlcmF0aW9uTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSU9wZXJhdGlvbk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllZWE3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JT3BlcmF0aW9uTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNSwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdGlvbk5vZGUgewotCi0JcHVibGljIElPcGVyYXRpb25Ob2RlW10gZ2V0Q2hpbGRyZW4oKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpOwotCi0JLyoqCi0JICogU2FtZSBhcyBjYWxsaW5nIHNldENoZWNrZWQoY2hlY2tlZCwgdHJ1ZSkKLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JcHVibGljIElPcGVyYXRpb25Ob2RlIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWx3YXlzRXhlY3V0ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQWJzdHJhY3RXVFBVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9BYnN0cmFjdFdUUFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzAzNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9BYnN0cmFjdFdUUFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxMCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXVFBVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcm90ZWN0ZWQgc3RhdGljIEFic3RyYWN0V1RQVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOyAKLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEFic3RyYWN0V1RQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklEKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQ2xvc2FibGVXaXphcmREaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQ2xvc2FibGVXaXphcmREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNmM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Nsb3NhYmxlV2l6YXJkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENsb3NhYmxlV2l6YXJkRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gbmV3V2l6YXJkCi0JICovCi0JcHVibGljIENsb3NhYmxlV2l6YXJkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJV2l6YXJkIG5ld1dpemFyZCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgbmV3V2l6YXJkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaW5pc2hBbmRDbG9zZSgpIHsKLQkJc3VwZXIuZmluaXNoUHJlc3NlZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0RNUGFnZUdyb3VwRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRE1QYWdlR3JvdXBFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFlZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRE1QYWdlR3JvdXBFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjEzOTI3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBETVBhZ2VHcm91cEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSURNUGFnZUdyb3VwIHsKLQlwcml2YXRlIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBwYWdlR3JvdXBFbGVtZW50OwotCi0JcHJpdmF0ZSBMaXN0IHBhZ2VzOwotCQotCXB1YmxpYyBETVBhZ2VHcm91cEVsZW1lbnRJbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXBhZ2VHcm91cEVsZW1lbnQgPSBuZXcgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFJlcXVpcmVzRGF0YU9wZXJhdGlvbklkKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXREYXRhTW9kZWxJRHMoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldERhdGFNb2RlbElEcygpOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuY3JlYXRlUGFnZUdyb3VwSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFBhZ2VzKElEYXRhTW9kZWwgZGF0YU1vZGVsKXsKLQkJaWYgKHBhZ2VzID09IG51bGwpIHsKLQkJCXBhZ2VzID0gQXJyYXlzLmFzTGlzdChwYWdlR3JvdXBFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwpKTsKLQkJfQotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCQotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZUdyb3VwRWxlbWVudC5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFBhZ2VJRCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSW5zZXJ0aW9uSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFBhZ2VJbnNlcnRpb25JRCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmdldFdpemFyZElEKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhY2E0MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9EaXNwbGF5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTksIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRGlzcGxheVV0aWxpdHkgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCi0JCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZCA9PSBudWxsKQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJZWxzZQotCQkJcnVubmFibGUucnVuKCk7Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Vycm9yRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Vycm9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZmEyNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FcnJvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEFkZGVkIGEgRGV0YWlscyBidXR0b24gdG8gdGhlIE1lc3NhZ2VEaWFsb2cgdG8gc2hvdyB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlLgotICogCi0gKiBCb3Jyb3dlZCBmcm9tIGFuIGVjbGlwc2UgSW50ZXJuYWxFcnJvckRpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PSyA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19DQU5DRUwgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFCRUxTX09LX0RFVEFJTFMgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUx9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFCRUxTX09LX0NBTkNFTF9ERVRBSUxTID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTH07Ci0JcHJpdmF0ZSBUaHJvd2FibGUgZGV0YWlsOwotCXByaXZhdGUgaW50IGRldGFpbEJ1dHRvbklEID0gLTE7Ci0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQkvL1dvcmthcm91bmQuIFNXVCBkb2VzIG5vdCBzZWVtIHRvIHNldCB0aGUgZGVmYXVsdCBidXR0b24gaWYKLQkvL3RoZXJlIGlzIG5vdCBjb250cm9sIHdpdGggZm9jdXMuIEJ1ZzogMTQ2NjgKLQlwcml2YXRlIGludCBkZWZhdWx0QnV0dG9uSW5kZXggPSAwOwotCS8qKgotCSAqIFNpemUgb2YgdGhlIHRleHQgaW4gbGluZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRfTElORV9DT1VOVCA9IDE1OwotCi0JcHVibGljIEVycm9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIEltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBUaHJvd2FibGUgZGV0YWlsLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBTdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJZGVmYXVsdEJ1dHRvbkluZGV4ID0gZGVmYXVsdEluZGV4OwotCQl0aGlzLmRldGFpbCA9IGRldGFpbDsKLQkJbWVzc2FnZSA9IGRpYWxvZ01lc3NhZ2U7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7Ci0JfQotCi0JLy9Xb3JrYXJvdW5kLiBTV1QgZG9lcyBub3Qgc2VlbSB0byBzZXQgcmlndGggdGhlIGRlZmF1bHQgYnV0dG9uIGlmCi0JLy90aGVyZSBpcyBub3QgY29udHJvbCB3aXRoIGZvY3VzLiBCdWc6IDE0NjY4Ci0JQE92ZXJyaWRlCi0JcHVibGljIGludCBvcGVuKCkgewotCQljcmVhdGUoKTsKLQkJQnV0dG9uIGIgPSBnZXRCdXR0b24oZGVmYXVsdEJ1dHRvbkluZGV4KTsKLQkJYi5zZXRGb2N1cygpOwotCQliLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihiKTsKLQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRldGFpbCBidXR0b247Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGV0YWlsQnV0dG9uKGludCBpbmRleCkgewotCQlkZXRhaWxCdXR0b25JRCA9IGluZGV4OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBkZXRhaWxCdXR0b25JRCkgewotCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfSBlbHNlIHsKLQkJCXNldFJldHVybkNvZGUoYnV0dG9uSWQpOwotCQkJY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwcmVzc2luZyB0aGUgZGV0YWlscwotCSAqIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKSB7Ci0JCVBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJUG9pbnQgb2xkU2l6ZSA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQl0ZXh0ID0gbnVsbDsKLQkJCWdldEJ1dHRvbihkZXRhaWxCdXR0b25JRCkuc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVEcm9wRG93blRleHQoKENvbXBvc2l0ZSkgZ2V0Q29udGVudHMoKSk7Ci0JCQlnZXRCdXR0b24oZGV0YWlsQnV0dG9uSUQpLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotCQl9Ci0JCVBvaW50IG5ld1NpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWdldFNoZWxsKCkuc2V0U2l6ZShuZXcgUG9pbnQod2luZG93U2l6ZS54LCB3aW5kb3dTaXplLnkgKyAobmV3U2l6ZS55IC0gb2xkU2l6ZS55KSkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGlzIGRpYWxvZydzIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURyb3BEb3duVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlzdAotCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJLy8gcHJpbnQgdGhlIHN0YWNrdHJhY2UgaW4gdGhlIHRleHQgZmllbGQKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oYmFvcyk7Ci0JCQlkZXRhaWwucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCWlmICgoZGV0YWlsIGluc3RhbmNlb2YgU1dURXJyb3IpICYmICgoKFNXVEVycm9yKSBkZXRhaWwpLnRocm93YWJsZSAhPSBudWxsKSkgewotCQkJCXBzLnByaW50bG4oIlxuKioqIFN0YWNrIHRyYWNlIG9mIGNvbnRhaW5lZCBleGNlcHRpb24gKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkoKFNXVEVycm9yKSBkZXRhaWwpLnRocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHMpOwotCQkJfSBlbHNlIGlmICgoZGV0YWlsIGluc3RhbmNlb2YgU1dURXhjZXB0aW9uKSAmJiAoKChTV1RFeGNlcHRpb24pIGRldGFpbCkudGhyb3dhYmxlICE9IG51bGwpKSB7Ci0JCQkJcHMucHJpbnRsbigiXG4qKiogU3RhY2sgdHJhY2Ugb2YgY29udGFpbmVkIGV4Y2VwdGlvbiAqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCSgoU1dURXhjZXB0aW9uKSBkZXRhaWwpLnRocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHMpOwotCQkJfQotCQkJcHMuZmx1c2goKTsKLQkJCWJhb3MuZmx1c2goKTsKLQkJCXRleHQuc2V0VGV4dChiYW9zLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHRleHQuZ2V0TGluZUhlaWdodCgpICogVEVYVF9MSU5FX0NPVU5UOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5FcnJvcihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBkZXRhaWwsIGludCBkZWZhdWx0SW5kZXgsIGJvb2xlYW4gc2hvd0NhbmNlbCkgewotCQlTdHJpbmdbXSBsYWJlbHM7Ci0JCWlmIChkZXRhaWwgPT0gbnVsbCkKLQkJCWxhYmVscyA9IHNob3dDYW5jZWwgPyBMQUJFTFNfT0tfQ0FOQ0VMIDogTEFCRUxTX09LOwotCQllbHNlCi0JCQlsYWJlbHMgPSBzaG93Q2FuY2VsID8gTEFCRUxTX09LX0NBTkNFTF9ERVRBSUxTIDogTEFCRUxTX09LX0RFVEFJTFM7Ci0JCUVycm9yRGlhbG9nIGRpYWxvZyA9IG5ldyBFcnJvckRpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93Ci0JCQkJCS8vIGljb24KLQkJCQkJbWVzc2FnZSwgZGV0YWlsLCBFUlJPUiwgbGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCQlpZiAoZGV0YWlsICE9IG51bGwpCi0JCQlkaWFsb2cuc2V0RGV0YWlsQnV0dG9uKGxhYmVscy5sZW5ndGggLSAxKTsKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCSgoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQkJLy8gY3JlYXRlIGltYWdlCi0JCUltYWdlIGltYWdlID0gY29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIDApOwotCQkJaW1hZ2Uuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJfQotCQkvLyBjcmVhdGUgbWVzc2FnZQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQl9Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FeGVjdXRpb25MaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FeGVjdXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2M3NzhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXhlY3V0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRXhlY3V0aW9uTGlzdGVuZXIKLXsKLSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSgpOwotICAKLSAgcHVibGljIHZvaWQgdW5kb0V4ZWN1dGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvR2VuZXJpY1dpemFyZE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvR2VuZXJpY1dpemFyZE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3NjljMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0dlbmVyaWNXaXphcmROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLS8qKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljV2l6YXJkTm9kZSBpbXBsZW1lbnRzIElXaXphcmROb2RlIHsKLQotCXByb3RlY3RlZCBJV2l6YXJkIHdpemFyZDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBHZW5lcmljV2l6YXJkTm9kZS4KLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1dpemFyZE5vZGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElXaXphcmROb2RlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh3aXphcmQgIT0gbnVsbCkKLQkJCXdpemFyZC5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElXaXphcmROb2RlI2dldENvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0Q29udGVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBmaW5hbCBJV2l6YXJkIGdldFdpemFyZCgpIHsKLQkJaWYgKHdpemFyZCA9PSBudWxsKQotCQkJd2l6YXJkID0gY3JlYXRlV2l6YXJkKCk7Ci0JCXJldHVybiB3aXphcmQ7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRvIGNyZWF0ZSB0aGUgd2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElXaXphcmQgY3JlYXRlV2l6YXJkKCk7Ci0KLQkvKgotCSAqIEBzZWUgSVdpemFyZE5vZGUjaXNDb250ZW50Q3JlYXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250ZW50Q3JlYXRlZCgpIHsKLQkJcmV0dXJuIHdpemFyZCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmROb2RlI2dldEV4dGVudCgpCi0JICovCi0JcHVibGljIFBvaW50IGdldEV4dGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9JbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0ludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmYjZmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0ludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAibWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3VzZURlZmF1bHRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2xvY2F0aW9uTGFiZWw7Ci0KLQotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTGlzdE1lc3NhZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTGlzdE1lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxMWNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNSwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEBhdXRob3IgZGZob2x0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TWVzc2FnZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmdbXSBsaXN0SXRlbXM7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCS8qKgotCSAqIEVKQlNlbGVjdGl2ZUltcG9ydERpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTGlzdE1lc3NhZ2VEaWFsb2cob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBqYXZhLmxhbmcuU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogTGlzdE1lc3NhZ2VEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGRpYWxvZ0J1dHRvbkxhYmVscwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIGRlZmF1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIExpc3RNZXNzYWdlRGlhbG9nKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgamF2YS5sYW5nLlN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCwgU3RyaW5nW10gbmFtZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJbGlzdEl0ZW1zID0gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgYW4gYXJlYSBvZiB0aGUgZGlhbG9nIHdoaWNoIGFwcGVhcnMgYmVsb3cgdGhlIG1lc3NhZ2UgYW5kCi0JICogYWJvdmUgdGhlIGJ1dHRvbiBiYXIuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uIFN1YmNsYXNzZXMKLQkgKiBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgY3VzdG9tIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBjdXN0b20gYXJlYSBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgMCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJaWYgKGxpc3RJdGVtcyAhPSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IExpc3QoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsaXN0LnNldEl0ZW1zKGxpc3RJdGVtcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgY29uZmlybSAoT0svQ2FuY2VsKSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHByZXNzZXMgdGhlIE9LIGJ1dHRvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuQ29uZmlybShTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gT0sKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIGVycm9yIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcykgewotCQlMaXN0TWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdyBpY29uCi0JCQkJCW1lc3NhZ2UsIEVSUk9SLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gb2sgaXMgdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgaW5mb3JtYXRpb24gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmZvcm1hdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgSU5GT1JNQVRJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgaXRlbXMpOwotCQkvLyBvayBpcyB0aGUgZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgWWVzL05vIHF1ZXN0aW9uIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5RdWVzdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCB3YXJuaW5nIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuV2FybmluZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgV0FSTklORywgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBpdGVtcyk7IC8vIG9rIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTGlzdGVuZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzJlYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3QgewotCXByaXZhdGUgZmluYWwgc3RhdGljIEFjdGlvbkxpc3RlbmVyW10gTlVMTF9BUlJBWSA9IG5ldyBBY3Rpb25MaXN0ZW5lclswXTsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IEFjdGlvbkxpc3RlbmVyW10gbGlzdGVuZXJMaXN0ID0gTlVMTF9BUlJBWTsKLQotCS8qKgotCSAqIEFkZCB0aGUgbGlzdGVuZXIgYXMgYSBsaXN0ZW5lciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHQKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZAotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEFjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKGwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGxpc3RlbmVyTGlzdCA9PSBOVUxMX0FSUkFZKSB7Ci0JCQkvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBsaXN0ZW5lciBhZGRlZCwKLQkJCS8vIGluaXRpYWxpemUgdGhlIGxpc3RzCi0JCQlsaXN0ZW5lckxpc3QgPSBuZXcgQWN0aW9uTGlzdGVuZXJbXXtsfTsKLQkJfSBlbHNlIHsKLQkJCS8vIE90aGVyd2lzZSBjb3B5IHRoZSBhcnJheSBhbmQgYWRkIHRoZSBuZXcgbGlzdGVuZXIKLQkJCWludCBpID0gbGlzdGVuZXJMaXN0Lmxlbmd0aDsKLQkJCUFjdGlvbkxpc3RlbmVyW10gdG1wID0gbmV3IEFjdGlvbkxpc3RlbmVyW2kgKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJMaXN0LCAwLCB0bXAsIDAsIGkpOwotCi0JCQl0bXBbaSArIDFdID0gbDsKLQotCQkJbGlzdGVuZXJMaXN0ID0gdG1wOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGlzIGxpc3RlbmVybGlzdAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGlzdGVuZXJDb3VudCgpIHsKLQkJcmV0dXJuIGxpc3RlbmVyTGlzdC5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEFjdGlvbkxpc3RlbmVyW10gZ2V0TGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbGlzdGVuZXJMaXN0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAobCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVyTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgewotCQkJaWYgKGxpc3RlbmVyTGlzdFtpXS5lcXVhbHMobCkpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlBY3Rpb25MaXN0ZW5lcltdIHRtcCA9IG5ldyBBY3Rpb25MaXN0ZW5lcltsaXN0ZW5lckxpc3QubGVuZ3RoIC0gMV07Ci0JCQkvLyBDb3B5IHRoZSBsaXN0IHVwIHRvIGluZGV4Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVyTGlzdCwgMCwgdG1wLCAwLCBpbmRleCk7Ci0JCQkvLyBDb3B5IGZyb20gdHdvIHBhc3QgdGhlIGluZGV4LCB1cCB0bwotCQkJLy8gdGhlIGVuZCBvZiB0bXAgKHdoaWNoIGlzIHR3byBlbGVtZW50cwotCQkJLy8gc2hvcnRlciB0aGFuIHRoZSBvbGQgbGlzdCkKLQkJCWlmIChpbmRleCA8IHRtcC5sZW5ndGgpCi0JCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lckxpc3QsIGluZGV4ICsgMSwgdG1wLCBpbmRleCwgdG1wLmxlbmd0aCAtIGluZGV4KTsKLQkJCS8vIHNldCB0aGUgbGlzdGVuZXIgYXJyYXkgdG8gdGhlIG5ldyBhcnJheSBvciBudWxsCi0JCQlsaXN0ZW5lckxpc3QgPSAodG1wLmxlbmd0aCA9PSAwKSA/IE5VTExfQVJSQVkgOiB0bXA7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTmV3UHJvamVjdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTUwODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3OwotCi1wdWJsaWMgY2xhc3MgTmV3UHJvamVjdEdyb3VwIGltcGxlbWVudHMgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcgewotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQlwdWJsaWMgVGV4dCBwcm9qZWN0TmFtZUZpZWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dCBsb2NhdGlvblBhdGhGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b24gPSBudWxsOwotCS8vIGNvbnN0YW50cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDMwNTsKLQkvLyBkZWZhdWx0IHZhbHVlcwotCXByaXZhdGUgU3RyaW5nIGRlZlByb2plY3ROYW1lTGFiZWwgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5OYW1lXzsKLQlwcml2YXRlIFN0cmluZyBkZWZCcm93c2VCdXR0b25MYWJlbCA9IFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLkJyb3dzZV87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZkRpckRpYWxvZ0xhYmVsID0gIkRpcmVjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0KLQlwdWJsaWMgTmV3UHJvamVjdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQlzeW5jaEhlbHBlciA9IG5ldyBEYXRhTW9kZWxTeW5jaEhlbHBlcihtb2RlbCk7Ci0JCWJ1aWxkQ29tcG9zaXRlcyhwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY29udHJvbHMgd2l0aGluIHRoaXMgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlUHJvamVjdE5hbWVHcm91cChwYXJlbnQpOwotCQljcmVhdGVQcm9qZWN0TG9jYXRpb25Hcm91cChwYXJlbnQpOwotCQlwcm9qZWN0TmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCQkvLyBwcm9qZWN0IHNwZWNpZmljYXRpb24gZ3JvdXAKLQkJQ29tcG9zaXRlIHByb2plY3RHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBuZXcgcHJvamVjdCBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TGFiZWwgPSBuZXcgTGFiZWwocHJvamVjdEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXByb2plY3RMYWJlbC5zZXRGb250KGZvbnQpOwotCQlwcm9qZWN0TGFiZWwuc2V0VGV4dChkZWZQcm9qZWN0TmFtZUxhYmVsKTsKLQotCQkvLyBuZXcgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lRmllbGQgPSBuZXcgVGV4dChwcm9qZWN0R3JvdXAsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb250KGZvbnQpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQocHJvamVjdE5hbWVGaWVsZCwgUFJPSkVDVF9OQU1FLCBuZXcgQ29udHJvbFtde3Byb2plY3RMYWJlbH0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHByb2plY3QgbG9jYXRpb24gc3BlY2lmaWNhdGlvbiBjb250cm9scy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVQcm9qZWN0TG9jYXRpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0JCUdyb3VwIHByb2plY3RHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXByb2plY3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcHJvamVjdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9qZWN0R3JvdXAuc2V0Rm9udChmb250KTsKLQkJcHJvamVjdEdyb3VwLnNldFRleHQoSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RDb250ZW50c0xhYmVsKTsKLQotCQlmaW5hbCBCdXR0b24gdXNlRGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uKHByb2plY3RHcm91cCwgU1dULkNIRUNLIHwgU1dULlJJR0hUKTsKLQkJR3JpZERhdGFGYWN0b3J5LmRlZmF1bHRzRm9yKHVzZURlZmF1bHRzQnV0dG9uKS5zcGFuKDMsMSkuYXBwbHlUbyh1c2VEZWZhdWx0c0J1dHRvbik7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldFRleHQoSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3VzZURlZmF1bHRMYWJlbCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godXNlRGVmYXVsdHNCdXR0b24sIFVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBudWxsKTsKLQotCQljcmVhdGVVc2VyU3BlY2lmaWVkUHJvamVjdExvY2F0aW9uR3JvdXAocHJvamVjdEdyb3VwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVXNlclNwZWNpZmllZFByb2plY3RMb2NhdGlvbkdyb3VwKENvbXBvc2l0ZSBwcm9qZWN0R3JvdXApIHsKLQkJRm9udCBmb250ID0gcHJvamVjdEdyb3VwLmdldEZvbnQoKTsKLQkJLy8gbG9jYXRpb24gbGFiZWwKLQkJZmluYWwgTGFiZWwgbG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChwcm9qZWN0R3JvdXAsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25MYWJlbC5zZXRGb250KGZvbnQpOwotCQlsb2NhdGlvbkxhYmVsLnNldFRleHQoSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2xvY2F0aW9uTGFiZWwpOwotCi0JCS8vIHByb2plY3QgbG9jYXRpb24gZW50cnkgZmllbGQKLQkJbG9jYXRpb25QYXRoRmllbGQgPSBuZXcgVGV4dChwcm9qZWN0R3JvdXAsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCWxvY2F0aW9uUGF0aEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxvY2F0aW9uUGF0aEZpZWxkLnNldEZvbnQoZm9udCk7Ci0KLQkJLy8gYnJvd3NlIGJ1dHRvbgotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHByb2plY3RHcm91cCwgU1dULlBVU0gpOwotCQlHcmlkRGF0YUZhY3RvcnkuZGVmYXVsdHNGb3IoYnJvd3NlQnV0dG9uKS5hcHBseVRvKGJyb3dzZUJ1dHRvbik7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmluYWwgSURhdGFNb2RlbCBsb2NhbE1vZGVsID0gbW9kZWw7Ci0KLQkJY2xhc3MgTG9jYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBJRGF0YU1vZGVsTGlzdGVuZXIgewotCQkJcHJpdmF0ZSBib29sZWFuIHR5cGluZyA9IGZhbHNlOwotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoIWxvY2FsTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9ERUZBVUxUX0xPQ0FUSU9OKSkgewotCQkJCQl0cnkgewotCQkJCQkJdHlwaW5nID0gdHJ1ZTsKLQkJCQkJCWxvY2FsTW9kZWwuc2V0UHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OLCBsb2NhdGlvblBhdGhGaWVsZC5nZXRUZXh0KCkpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJdHlwaW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gdXNlRGVmYXVsdCA9IGxvY2FsTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9ERUZBVUxUX0xPQ0FUSU9OKTsKLQkJCQlpZiAoVVNFX0RFRkFVTFRfTE9DQVRJT04uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlsb2NhdGlvbkxhYmVsLnNldEVuYWJsZWQoIXVzZURlZmF1bHQpOwotCQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoIXVzZURlZmF1bHQpOwotCQkJCQlpZiAodXNlRGVmYXVsdCkgewotCQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dChsb2NhbE1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KERFRkFVTFRfTE9DQVRJT04pKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQobG9jYWxNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVU0VSX0RFRklORURfTE9DQVRJT04pKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIXR5cGluZykgewotCQkJCQlpZiAoKHVzZURlZmF1bHQgJiYgREVGQVVMVF9MT0NBVElPTi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB8fCAoIXVzZURlZmF1bHQgJiYgVVNFUl9ERUZJTkVEX0xPQ0FUSU9OLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpKSB7Ci0JCQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KChTdHJpbmcpIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhdGlvbkxpc3RlbmVyKCk7Ci0KLQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKG5ldyBEYXRhTW9kZWxFdmVudChtb2RlbCwgVVNFX0RFRkFVTFRfTE9DQVRJT04sIElEYXRhTW9kZWwuVkFMVUVfQ0hHKSk7Ci0KLQkJbG9jYXRpb25QYXRoRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQltb2RlbC5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobG9jYXRpb25QYXRoRmllbGQuZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKGRlZkRpckRpYWxvZ0xhYmVsKTsKLQkJU3RyaW5nIGRpck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVU0VSX0RFRklORURfTE9DQVRJT04pOwotCQlpZiAoZGlyTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZGlyTmFtZSA9IG5ldyBQYXRoKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KERFRkFVTFRfTE9DQVRJT04pKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9PU1N0cmluZygpOwotCQl9Ci0KLQkJaWYgKChkaXJOYW1lICE9IG51bGwpICYmIChkaXJOYW1lLmxlbmd0aCgpICE9IDApKSB7Ci0JCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkaXJOYW1lKTsKLQkJCWlmIChwYXRoLmV4aXN0cygpKSB7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCW1vZGVsLnNldFByb3BlcnR5KFVTRVJfREVGSU5FRF9MT0NBVElPTiwgc2VsZWN0ZWREaXJlY3RvcnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbW9kZWwucmVtb3ZlTGlzdGVuZXIoc3luY2hIZWxwZXIpOwotCQlzeW5jaEhlbHBlci5kaXNwb3NlKCk7Ci0JCW1vZGVsID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL092ZXJsYXlJY29uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL092ZXJsYXlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjNlZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLXB1YmxpYyBjbGFzcyBPdmVybGF5SWNvbiBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDE2OwotCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQgPSAxNjsKLQlwcml2YXRlIFBvaW50IGZTaXplID0gbnVsbDsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmQmFzZTsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmT3ZlcmxheXNbXVtdOwotCi0JcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzKSB7Ci0JCWZCYXNlID0gYmFzZTsKLQkJaWYgKGZCYXNlID09IG51bGwpCi0JCQlmQmFzZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCWZPdmVybGF5cyA9IG92ZXJsYXlzOwotCQlmU2l6ZSA9IG5ldyBQb2ludChERUZBVUxUX1dJRFRILCBERUZBVUxUX0hFSUdIVCk7Ci0JfQotCi0JcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7Ci0JCWZCYXNlID0gYmFzZTsKLQkJaWYgKGZCYXNlID09IG51bGwpCi0JCQlmQmFzZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCWZPdmVybGF5cyA9IG92ZXJsYXlzOwotCQlmU2l6ZSA9IHNpemU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbUxlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCQl4ICs9IGlkLndpZHRoOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbVJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IGdldFNpemUoKS54OwotCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQl4IC09IGlkLndpZHRoOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnkgLSBpZC5oZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlJbWFnZURhdGEgYmcgPSBmQmFzZS5nZXRJbWFnZURhdGEoKTsKLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQotCQlpZiAoZk92ZXJsYXlzICE9IG51bGwpIHsKLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMCkKLQkJCQlkcmF3VG9wUmlnaHQoZk92ZXJsYXlzWzBdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAxKQotCQkJCWRyYXdCb3R0b21SaWdodChmT3ZlcmxheXNbMV0pOwotCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpCi0JCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAzKQotCQkJCWRyYXdUb3BMZWZ0KGZPdmVybGF5c1szXSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7Ci0JCQkJeCArPSBpZC53aWR0aDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdUb3BSaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSBnZXRTaXplKCkueDsKLQkJZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJeCAtPSBpZC53aWR0aDsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUGFnZUdyb3VwTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZkOTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUGFnZUdyb3VwTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gYnVnIDIxMzkyNwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkNvbW1vblVJUGx1Z2luQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgUGFnZUdyb3VwTWFuYWdlciB7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQlwcml2YXRlIElETVBhZ2VHcm91cCByb290UGFnZUdyb3VwOwotCXByaXZhdGUgSGFzaE1hcCBncm91cFRhYmxlOwotCXByaXZhdGUgSGFzaFNldCBvcGVyYXRpb25zUnVuOwotCXByaXZhdGUgU3RhY2sgcGFnZUdyb3VwU3RhY2s7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQlwcml2YXRlIFN0YWNrRW50cnkgc2F2ZWRUb3BFbnRyeTsKLQlwcml2YXRlIGludCBzYXZlZFN0YWNrU2l6ZTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfR1JPVVAgPSAid2l6YXJkUGFnZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgcGF1c2VBZnRlckV4ZWN1dGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgUGFnZUdyb3VwTWFuYWdlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCwgSURNUGFnZUdyb3VwIHJvb3RQYWdlR3JvdXApIHsKLQotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQkJdGhpcy5ncm91cFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy5wYWdlR3JvdXBTdGFjayA9IG5ldyBTdGFjaygpOwotCQl0aGlzLnJvb3RQYWdlR3JvdXAgPSByb290UGFnZUdyb3VwOwotCi0KLQkJUGFnZUdyb3VwRW50cnkgcm9vdFBhZ2VHcm91cEVudHJ5ID0gbmV3IFBhZ2VHcm91cEVudHJ5KHJvb3RQYWdlR3JvdXApOwotCQllbGVtZW50cyA9IGdldFBhZ2VHcm91cEV4dGVuc2lvbnMoKTsKLQkJZ3JvdXBUYWJsZS5wdXQodGhpcy5yb290UGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCksIHJvb3RQYWdlR3JvdXBFbnRyeSk7Ci0KLQkJaWYgKHRoaXMucm9vdFBhZ2VHcm91cC5nZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCkpIHsKLQkJCS8vIEZpbmQgYWxsIHRoZSBwYWdlIGdyb3VwcyB0aGF0IGZvbGxvdyB0aGlzIHJvb3QgcGFnZSBncm91cC4KLQkJCWxvYWRFeHRlbmRlZFBhZ2VzKHJvb3RQYWdlR3JvdXApOwotCQl9Ci0JfQotCi0JcHVibGljIFBhZ2VHcm91cE1hbmFnZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIHJvb3RPcGVyYXRpb24sIElETVBhZ2VHcm91cCByb290UGFnZUdyb3VwKSB7Ci0JCXRoaXMocm9vdE9wZXJhdGlvbi5nZXREYXRhTW9kZWwoKSwgcm9vdFBhZ2VHcm91cCk7Ci0JCXRoaXMub3BlcmF0aW9uc1J1biA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcm9vdE9wZXJhdGlvbi5hZGRPcGVyYXRpb25MaXN0ZW5lcihuZXcgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgaW50IG5vdGlmeShJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCBldmVudCkgewotCQkJCXN3aXRjaCAoZXZlbnQuZ2V0RXhlY3V0aW9uVHlwZSgpKSB7Ci0JCQkJCWNhc2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUk9MTEJBQ0sgOgotCQkJCQkJaWYgKGV2ZW50LmdldE9wZXJhdGlvblR5cGUoKSA9PSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVEKSB7Ci0JCQkJCQkJb3BlcmF0aW9uc1J1bi5yZW1vdmUoZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFIDoKLQkJCQkJCWlmIChldmVudC5nZXRPcGVyYXRpb25UeXBlKCkgPT0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCkgewotCQkJCQkJCW9wZXJhdGlvbnNSdW4uYWRkKGV2ZW50LmdldE9wZXJhdGlvbigpLmdldElEKCkpOwotCQkJCQkJCWlmIChudWxsICE9IHBhdXNlQWZ0ZXJFeGVjdXRpb24gJiYgZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKS5lcXVhbHMocGF1c2VBZnRlckV4ZWN1dGlvbikpIHsKLQkJCQkJCQkJcmV0dXJuIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm4gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEdyb3VwQWZ0ZXIoU3RyaW5nIHBhZ2VHcm91cElELCBJRE1QYWdlR3JvdXAgcGFnZUluc2VydEdyb3VwKSB7Ci0JCVBhZ2VHcm91cEVudHJ5IHBhZ2VHcm91cEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChwYWdlR3JvdXBJRCk7Ci0KLQkJaWYgKHBhZ2VHcm91cEVudHJ5LnBhZ2VHcm91cC5nZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCkpIHsKLQkJCWFkZFBhZ2VHcm91cChwYWdlR3JvdXBFbnRyeS5wYWdlR3JvdXAsIHBhZ2VJbnNlcnRHcm91cCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRm9yd2FyZE9uZVBhZ2UoKSB7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJaWYgKHBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VHcm91cFN0YWNrLnB1c2gobmV3IFN0YWNrRW50cnkocm9vdEVudHJ5LCAtMSkpOwotCQl9Ci0KLQkJc2F2ZVN0YWNrSW5mbygpOwotCi0JCXRyeSB7Ci0JCQlwYWdlRm91bmQgPSBmaW5kTmV4dFBhZ2UodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKGV4Yyk7Ci0JCQlpZiAocm9vdE9wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcm9vdE9wZXJhdGlvbi5yb2xsQmFjayhudWxsLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwYWdlRm91bmQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChwYWdlRm91bmQgPT0gZmFsc2UpIHsKLQkJCS8vIElmIHdlIG1vdmVkIGZvcndhcmQgYW5kIHRoZXJlIHdhc24ndCBhIHBhZ2UgdGhlbiB3ZSB3aWxsIHJlc3RvcmUgdGhlIHN0YWNrLgotCQkJLy8gTm9ybWFsbHksIHRoaXMgd291bGRuJ3QgaGFwcGVuIHNpbmNlIGEgY2FsbCB0byBoYXNOZXh0UGFnZSB3b3VsZCBoYXZlIGluZGljYXRlZAotCQkJLy8gdGhhdCB0aGVyZSB3YXNuJ3QgYSBwYWdlLgotCQkJcmVzdG9yZVN0YWNrSW5mbygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUJhY2tPbmVQYWdlKCkgewotCQlpZiAocGFnZUdyb3VwU3RhY2suZW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlTdGFja0VudHJ5IHRvcEVudHJ5ID0gKFN0YWNrRW50cnkpIHBhZ2VHcm91cFN0YWNrLnBlZWsoKTsKLQotCQkvLyBQb3AgdGhlIGxhc3QgcGFnZS4KLQkJaWYgKCF0b3BFbnRyeS5wYWdlc1JldHVybmVkLmVtcHR5KCkpCi0JCQl0b3BFbnRyeS5wYWdlc1JldHVybmVkLnBvcCgpOwotCi0JCS8vIE5vdyBmaW5kIHRoZSBwcmV2aW91cyBwYWdlLgotCQlib29sZWFuIGZvdW5kUHJldmlvdXNQYWdlID0gZmluZFByZXZpb3VzUGFnZUluR3JvdXAoKTsKLQotCQl3aGlsZSAoIWZvdW5kUHJldmlvdXNQYWdlICYmICFwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQlpZiAocm9vdE9wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHRvcEVudHJ5LnJhbk9wZXJhdGlvbnMpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJvb3RPcGVyYXRpb24ucm9sbEJhY2sobnVsbCwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcGFnZUdyb3VwU3RhY2sucG9wKCk7Ci0KLQkJCWlmICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJCWZvdW5kUHJldmlvdXNQYWdlID0gZmluZFByZXZpb3VzUGFnZUluR3JvdXAoKTsKLQkJCQl0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJcGFnZUdyb3VwU3RhY2suY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0Q3VycmVudFBhZ2UoKSB7Ci0JCUlXaXphcmRQYWdlIHBhZ2UgPSBudWxsOwotCi0JCWlmICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCQlpbnQgcGFnZUluZGV4ID0gdG9wRW50cnkuZ2V0VG9wUGFnZUluZGV4KCk7Ci0KLQkJCXBhZ2UgPSBwYWdlSW5kZXggPT0gLTEgPyBudWxsIDogKElXaXphcmRQYWdlKSB0b3BFbnRyeS5wYWdlR3JvdXBFbnRyeS5nZXRQYWdlcygpLmdldChwYWdlSW5kZXgpOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGhhc011bGl0cGxlUGFnZXM7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNdWx0aXBsZVBhZ2VzKCkgewotCQlpZiAobnVsbCA9PSBoYXNNdWxpdHBsZVBhZ2VzKSB7Ci0JCQlpbnQgcGFnZUNvdW50ID0gMDsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VDb3VudCArPSByb290RW50cnkuZ2V0UGFnZXMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgcGFnZUNvdW50IDwgMiAmJiBpIDwgcm9vdEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuc2l6ZSgpOyBpKyspIHsKLQkJCQlwYWdlQ291bnQgKz0gKChQYWdlR3JvdXBFbnRyeSkgcm9vdEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuZ2V0KGkpKS5nZXRQYWdlcygpLnNpemUoKTsKLQkJCX0KLQkJCWhhc011bGl0cGxlUGFnZXMgPSBwYWdlQ291bnQgPiAxID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gaGFzTXVsaXRwbGVQYWdlcy5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0UGFnZSgpIHsKLQkJYm9vbGVhbiBwYWdlRm91bmQgPSBmYWxzZTsKLQotCQlzYXZlU3RhY2tJbmZvKCk7Ci0KLQkJaWYgKHBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCVBhZ2VHcm91cEVudHJ5IHJvb3RFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJCXBhZ2VHcm91cFN0YWNrLnB1c2gobmV3IFN0YWNrRW50cnkocm9vdEVudHJ5LCAtMSkpOwotCQl9Ci0KLQkJcGFnZUZvdW5kID0gZmluZE5leHRQYWdlKGZhbHNlKTsKLQkJcmVzdG9yZVN0YWNrSW5mbygpOwotCi0JCXJldHVybiBwYWdlRm91bmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kb0FsbEN1cnJlbnRPcGVyYXRpb25zKCkgewotCQl3aGlsZSAoIXBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCW1vdmVCYWNrT25lUGFnZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0UGFnZUdyb3VwRXh0ZW5zaW9ucygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgRUxFTUVOVF9QQUdFX0dST1VQKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYWxsRWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBhbGxFbGVtZW50c1tpXTsKLQkJCWlmIChFTEVNRU5UX1BBR0VfR1JPVVAuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB7IH0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaW5kUHJldmlvdXNQYWdlSW5Hcm91cCgpIHsKLQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJaWYgKCF0b3BFbnRyeS5wYWdlc1JldHVybmVkLmVtcHR5KCkpIHsKLQkJCXRvcEVudHJ5LnBhZ2VzQ29tcGxldGUgPSBmYWxzZTsKLQkJCXBhZ2VGb3VuZCA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gcGFnZUZvdW5kOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaW5kTmV4dFBhZ2UoYm9vbGVhbiBydW5PcGVyYXRpb25zKSB7Ci0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCQlpbnQgbmV3UGFnZUluZGV4ID0gdG9wRW50cnkuZmluZE5leHRQYWdlSW5kZXgoKTsKLQkJYm9vbGVhbiBwYWdlRm91bmQgPSBmYWxzZTsKLQotCQlpZiAobmV3UGFnZUluZGV4ID09IC0xKSB7Ci0JCQkvLyBPdXIgcGFnZSBoYW5kbGVyIGRpZG4ndCBmaW5kIGEgcGFnZSBzbyB3ZSB3aWxsIHNlZSBpZiB0aGVyZSBpcyBhIHBhZ2UgZ3JvdXAgdGhhdAotCQkJLy8gZm9sbG93cyB0aGlzIHBhZ2UgZ3JvdXAgdGhhdCBjYW4gZmluZCBhIHBhZ2UuCi0JCQl0b3BFbnRyeS5wYWdlc0NvbXBsZXRlID0gdHJ1ZTsKLQotCQkJU3RhY2tFbnRyeSBuZXh0U3RhY2tFbnRyeSA9IGZpbmROZXh0UGFnZUdyb3VwKHBhZ2VHcm91cFN0YWNrKTsKLQotCQkJaWYgKG5leHRTdGFja0VudHJ5ICE9IG51bGwpIHsKLQkJCQlJRE1QYWdlR3JvdXAgcGFnZUdyb3VwID0gbmV4dFN0YWNrRW50cnkucGFnZUdyb3VwRW50cnkucGFnZUdyb3VwOwotCQkJCVN0cmluZyByZXF1aXJlc09wZXJhdGlvbnNJZCA9IHBhZ2VHcm91cC5nZXRSZXF1aXJlZERhdGFPcGVyYXRpb25Ub1J1bigpOwotCi0JCQkJLy8gSWYgdGhpcyBncm91cCByZXF1aXJlcyBhbiBvcGVyYXRpb24gYW5kIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIHJ1bgotCQkJCS8vIHRoZW4gd2UgbmVlZCB0byBydW4gaXQuCi0JCQkJaWYgKHJvb3RPcGVyYXRpb24gIT0gbnVsbCAmJiBydW5PcGVyYXRpb25zICYmIHJlcXVpcmVzT3BlcmF0aW9uc0lkICE9IG51bGwgJiYgIW9wZXJhdGlvbnNSdW4uY29udGFpbnMocmVxdWlyZXNPcGVyYXRpb25zSWQpKSB7Ci0JCQkJCXBhdXNlQWZ0ZXJFeGVjdXRpb24gPSByZXF1aXJlc09wZXJhdGlvbnNJZDsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJc3RhdHVzID0gcm9vdE9wZXJhdGlvbi5yZXN1bWUobnVsbCwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCQluZXh0U3RhY2tFbnRyeS5yYW5PcGVyYXRpb25zID0gdHJ1ZTsKLQkJCQkJCi0JCQkJCS8vIFRPRE8gbmVlZCBhIGJldHRlciBlcnJvciBmZWVkYmFjayBtZWNoYW5pc20gaGVyZS4KLQkJCQkJaWYoc3RhdHVzID09IG51bGwpewotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCQl9IGVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwYWdlR3JvdXBTdGFjay5wdXNoKG5leHRTdGFja0VudHJ5KTsKLQkJCQlwYWdlRm91bmQgPSBmaW5kTmV4dFBhZ2UocnVuT3BlcmF0aW9ucyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBmb3VuZCBhIG5ldyBwYWdlIGluIHRoZSBwYWdlIGhhbmRsZXIuCi0JCQlwYWdlRm91bmQgPSB0cnVlOwotCQkJdG9wRW50cnkucGFnZXNSZXR1cm5lZC5wdXNoKG5ldyBJbnRlZ2VyKG5ld1BhZ2VJbmRleCkpOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2VGb3VuZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZVN0YWNrSW5mbygpIHsKLQkJaWYgKCFwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQlzYXZlZFRvcEVudHJ5ID0gbmV3IFN0YWNrRW50cnkoKFN0YWNrRW50cnkpIHBhZ2VHcm91cFN0YWNrLnBlZWsoKSk7Ci0JCX0KLQkJc2F2ZWRTdGFja1NpemUgPSBwYWdlR3JvdXBTdGFjay5zaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVTdGFja0luZm8oKSB7Ci0JCWlmIChzYXZlZFN0YWNrU2l6ZSA9PSAwKSB7Ci0JCQlwYWdlR3JvdXBTdGFjay5yZW1vdmVBbGxFbGVtZW50cygpOwotCQl9IGVsc2UgewotCQkJcGFnZUdyb3VwU3RhY2suc2V0U2l6ZShzYXZlZFN0YWNrU2l6ZSAtIDEpOwotCQkJcGFnZUdyb3VwU3RhY2sucHVzaChzYXZlZFRvcEVudHJ5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRXh0ZW5kZWRQYWdlcyhJRE1QYWdlR3JvdXAgcGFnZUdyb3VwKSB7Ci0JCVN0cmluZyB3aXphcmRJZCA9IHJvb3RQYWdlR3JvdXAuZ2V0V2l6YXJkSUQoKTsKLQkJU3RyaW5nIHBhZ2VHcm91cElkID0gcGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCk7Ci0JCWludCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotCQkJRE1QYWdlR3JvdXBFbGVtZW50SW1wbCBwYWdlSW5zZXJ0R3JvdXAgPSBuZXcgRE1QYWdlR3JvdXBFbGVtZW50SW1wbChlbGVtZW50c1tpbmRleF0pOwotCQkJU3RyaW5nIHBhZ2VJbnNlcnRHcm91cElkID0gcGFnZUluc2VydEdyb3VwLmdldFBhZ2VHcm91cEluc2VydGlvbklEKCk7Ci0JCQlpZiAocGFnZUluc2VydEdyb3VwLmdldFdpemFyZElEKCkuZXF1YWxzKHdpemFyZElkKSAmJiAobnVsbCA9PSBwYWdlSW5zZXJ0R3JvdXBJZCB8fCBwYWdlSW5zZXJ0R3JvdXBJZC5lcXVhbHMocGFnZUdyb3VwSWQpKSkgewotCQkJCWFkZFBhZ2VHcm91cChwYWdlR3JvdXAsIHBhZ2VJbnNlcnRHcm91cCk7Ci0KLQkJCQkvLyBJZiB0aGlzIHBhZ2UgZ3JvdXAgaGFzIHBhZ2UgdGhlbiBhZGQgdGhlbQotCQkJCWlmIChwYWdlSW5zZXJ0R3JvdXAuZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpKSB7Ci0JCQkJCWxvYWRFeHRlbmRlZFBhZ2VzKHBhZ2VJbnNlcnRHcm91cCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBhZ2VHcm91cChJRE1QYWdlR3JvdXAgcGFnZUdyb3VwLCBJRE1QYWdlR3JvdXAgaW5zZXJ0ZWRQYWdlR3JvdXApIHsKLQkJUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwRW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KHBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQkJUGFnZUdyb3VwRW50cnkgbmV4dEdyb3VwRW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KGluc2VydGVkUGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCkpOwotCi0JCWlmIChwYWdlR3JvdXBFbnRyeSA9PSBudWxsKSB7Ci0JCQlwYWdlR3JvdXBFbnRyeSA9IG5ldyBQYWdlR3JvdXBFbnRyeShwYWdlR3JvdXApOwotCQkJZ3JvdXBUYWJsZS5wdXQocGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCksIHBhZ2VHcm91cEVudHJ5KTsKLQkJfQotCi0JCWlmIChuZXh0R3JvdXBFbnRyeSA9PSBudWxsKSB7Ci0JCQluZXh0R3JvdXBFbnRyeSA9IG5ldyBQYWdlR3JvdXBFbnRyeShpbnNlcnRlZFBhZ2VHcm91cCk7Ci0JCQlncm91cFRhYmxlLnB1dChpbnNlcnRlZFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpLCBuZXh0R3JvdXBFbnRyeSk7Ci0JCX0KLQotCQlwYWdlR3JvdXBFbnRyeS5ncm91cHNUaGF0Rm9sbG93LmFkZChuZXh0R3JvdXBFbnRyeSk7Ci0JfQotCi0JcHVibGljIFN0YWNrRW50cnkgZmluZE5leHRQYWdlR3JvdXAoU3RhY2sgc3RhY2spIHsKLQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBzdGFjay5wZWVrKCk7Ci0JCVBhZ2VHcm91cEVudHJ5IG5leHRQYWdlR3JvdXAgPSB0b3BFbnRyeS5nZXROZXh0UGFnZUdyb3VwKG51bGwpOwotCQlpbnQgcGFyZW50SW5kZXggPSB0b3BFbnRyeS5wYXJlbnRHcm91cEluZGV4OwotCQlpbnQgcHJldlBhcmVudEluZGV4ID0gc3RhY2suc2l6ZSgpIC0gMTsKLQotCQkvLyBSZWN1cnNlIHVwIHRocm91Z2ggdGhlIHBhcmVudHMgdG8gZmluZCB0aGUgbmV4dCBncm91cCBpZiBuZWVkZWQuCi0JCXdoaWxlIChwYXJlbnRJbmRleCAhPSAtMSAmJiBuZXh0UGFnZUdyb3VwID09IG51bGwpIHsKLQkJCVN0YWNrRW50cnkgcGFyZW50U3RhY2tFbnRyeSA9IChTdGFja0VudHJ5KSBzdGFjay5lbGVtZW50QXQocGFyZW50SW5kZXgpOwotCi0JCQluZXh0UGFnZUdyb3VwID0gcGFyZW50U3RhY2tFbnRyeS5nZXROZXh0UGFnZUdyb3VwKHRvcEVudHJ5LmdldElkKCkpOwotCQkJcHJldlBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7Ci0JCQlwYXJlbnRJbmRleCA9IHBhcmVudFN0YWNrRW50cnkucGFyZW50R3JvdXBJbmRleDsKLQkJCXRvcEVudHJ5ID0gcGFyZW50U3RhY2tFbnRyeTsKLQkJfQotCi0JCXJldHVybiBuZXh0UGFnZUdyb3VwID09IG51bGwgPyBudWxsIDogbmV3IFN0YWNrRW50cnkobmV4dFBhZ2VHcm91cCwgcHJldlBhcmVudEluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFN0YWNrRW50cnkgewotCQlwdWJsaWMgUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwRW50cnk7Ci0JCXB1YmxpYyBTdGFjayBwYWdlc1JldHVybmVkOyAvLyBFbGVtZW50ID0gSW50ZXJnZXIgb2YgcGFnZSBpbmRleGVzLgotCQlwdWJsaWMgYm9vbGVhbiBwYWdlc0NvbXBsZXRlOwotCQlwdWJsaWMgaW50IHBhcmVudEdyb3VwSW5kZXg7Ci0JCXB1YmxpYyBib29sZWFuIHJhbk9wZXJhdGlvbnM7Ci0KLQkJcHVibGljIFN0YWNrRW50cnkoUGFnZUdyb3VwRW50cnkgbmV3UGFnZUdyb3VwRW50cnksIGludCBwYXJlbnRJbmRleCkgewotCQkJcGFnZUdyb3VwRW50cnkgPSBuZXdQYWdlR3JvdXBFbnRyeTsKLQkJCXBhZ2VzUmV0dXJuZWQgPSBuZXcgU3RhY2soKTsKLQkJCXBhZ2VzQ29tcGxldGUgPSBmYWxzZTsKLQkJCXBhcmVudEdyb3VwSW5kZXggPSBwYXJlbnRJbmRleDsKLQkJCXJhbk9wZXJhdGlvbnMgPSBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBTdGFja0VudHJ5KFN0YWNrRW50cnkgc3RhY2tFbnRyeSkgewotCQkJcGFnZUdyb3VwRW50cnkgPSBzdGFja0VudHJ5LnBhZ2VHcm91cEVudHJ5OwotCQkJcGFnZXNSZXR1cm5lZCA9IG5ldyBTdGFjaygpOwotCQkJcGFnZXNDb21wbGV0ZSA9IHN0YWNrRW50cnkucGFnZXNDb21wbGV0ZTsKLQkJCXBhcmVudEdyb3VwSW5kZXggPSBzdGFja0VudHJ5LnBhcmVudEdyb3VwSW5kZXg7Ci0JCQlyYW5PcGVyYXRpb25zID0gc3RhY2tFbnRyeS5yYW5PcGVyYXRpb25zOwotCQkJcGFnZXNSZXR1cm5lZC5hZGRBbGwoc3RhY2tFbnRyeS5wYWdlc1JldHVybmVkKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gcGFnZUdyb3VwRW50cnkucGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGZpbmROZXh0UGFnZUluZGV4KCkgewotCQkJaW50IHJlc3VsdCA9IC0xOwotCi0JCQlpZiAoIXBhZ2VzQ29tcGxldGUpIHsKLQkJCQlMaXN0IHBhZ2VzID0gcGFnZUdyb3VwRW50cnkuZ2V0UGFnZXMoKTsKLQotCQkJCWludCBwYWdlSW5kZXggPSBnZXRUb3BQYWdlSW5kZXgoKTsKLQkJCQlTdHJpbmcgcGFnZUlkID0gcGFnZUluZGV4ID09IC0xID8gbnVsbCA6ICgoSVdpemFyZFBhZ2UpIHBhZ2VzLmdldChwYWdlSW5kZXgpKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGV4cGVjdGVkSWQgPSBwYWdlSW5kZXggKyAxID49IHBhZ2VzLnNpemUoKSA/IG51bGwgOiAoKElXaXphcmRQYWdlKSBwYWdlcy5nZXQocGFnZUluZGV4ICsgMSkpLmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmV3UGFnZUlkID0gbnVsbDsKLQotCQkJCXRyeSB7Ci0JCQkJCW5ld1BhZ2VJZCA9IHBhZ2VHcm91cEVudHJ5LmdldFBhZ2VIYW5kbGVyKCkuZ2V0TmV4dFBhZ2UocGFnZUlkLCBleHBlY3RlZElkKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKGV4Yyk7Ci0JCQkJfQotCi0JCQkJaWYgKG5ld1BhZ2VJZCAhPSBudWxsICYmIG5ld1BhZ2VJZC5lcXVhbHMoSURNUGFnZUhhbmRsZXIuU0tJUF9QQUdFKSAmJiBwYWdlSW5kZXggPj0gMCAmJiBwYWdlSW5kZXggPCBwYWdlcy5zaXplKCkgLSAyKSB7Ci0JCQkJCXJlc3VsdCA9IHBhZ2VJbmRleCArIDI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gcGFnZUdyb3VwRW50cnkuY2hlY2tGb3JTcGVjaWFsSWRzKG5ld1BhZ2VJZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFBhZ2VHcm91cEVudHJ5IGdldE5leHRQYWdlR3JvdXAoU3RyaW5nIGFmdGVySWQpIHsKLQkJCVBhZ2VHcm91cEVudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCQlTdHJpbmcgbmV4dEdyb3VwSUQgPSBudWxsOwotCQkJU3RyaW5nW10gZ3JvdXBJRExpc3QgPSBnZXRHcm91cElETGlzdCgpOwotCi0JCQl0cnkgewotCQkJCW5leHRHcm91cElEID0gcGFnZUdyb3VwRW50cnkuZ2V0UGFnZUdyb3VwSGFuZGxlcigpLmdldE5leHRQYWdlR3JvdXAoYWZ0ZXJJZCwgZ3JvdXBJRExpc3QpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKGV4Yyk7Ci0JCQl9Ci0KLQkJCWlmIChuZXh0R3JvdXBJRCAhPSBudWxsKSB7Ci0JCQkJLy8gRmluZCB0aGlzIHN0cmluZyBpbiB0aGUgbGlzdC4KLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZ3JvdXBJRExpc3QubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCWlmIChncm91cElETGlzdFtpbmRleF0uZXF1YWxzKG5leHRHcm91cElEKSkgewotCQkJCQkJcmVzdWx0ID0gKFBhZ2VHcm91cEVudHJ5KSBwYWdlR3JvdXBFbnRyeS5ncm91cHNUaGF0Rm9sbG93LmVsZW1lbnRBdChpbmRleCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nW10gZ2V0R3JvdXBJRExpc3QoKSB7Ci0JCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3BhZ2VHcm91cEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuc2l6ZSgpXTsKLQotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhZ2VHcm91cEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQkJUGFnZUdyb3VwRW50cnkgZW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIHBhZ2VHcm91cEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuZWxlbWVudEF0KGluZGV4KTsKLQotCQkJCXJlc3VsdFtpbmRleF0gPSBlbnRyeS5wYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXByaXZhdGUgaW50IGdldFRvcFBhZ2VJbmRleCgpIHsKLQkJCXJldHVybiBwYWdlc1JldHVybmVkLmVtcHR5KCkgPyAtMSA6ICgoSW50ZWdlcikgcGFnZXNSZXR1cm5lZC5wZWVrKCkpLmludFZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFBhZ2VHcm91cEVudHJ5IHsKLQkJcHVibGljIElETVBhZ2VHcm91cCBwYWdlR3JvdXA7Ci0JCXB1YmxpYyBWZWN0b3IgZ3JvdXBzVGhhdEZvbGxvdzsKLQkJcHJpdmF0ZSBJRE1QYWdlSGFuZGxlciBwYWdlSGFuZGxlcjsKLQkJcHJpdmF0ZSBJRE1QYWdlR3JvdXBIYW5kbGVyIHBhZ2VHcm91cEhhbmRsZXI7Ci0JCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKLQotCQlwdWJsaWMgUGFnZUdyb3VwRW50cnkoSURNUGFnZUdyb3VwIG5ld1BhZ2VHcm91cCkgewotCQkJcGFnZUdyb3VwID0gbmV3UGFnZUdyb3VwOwotCQkJZ3JvdXBzVGhhdEZvbGxvdyA9IG5ldyBWZWN0b3IoKTsKLQkJCWluaXRpYWxpemVkID0gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgSURNUGFnZUhhbmRsZXIgZ2V0UGFnZUhhbmRsZXIoKSB7Ci0JCQlpZiAoIWluaXRpYWxpemVkKQotCQkJCWluaXQoKTsKLQotCQkJcmV0dXJuIHBhZ2VIYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgZ2V0UGFnZUdyb3VwSGFuZGxlcigpIHsKLQkJCWlmICghaW5pdGlhbGl6ZWQpCi0JCQkJaW5pdCgpOwotCi0JCQlyZXR1cm4gcGFnZUdyb3VwSGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldFBhZ2VzKCkgewotCQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCQlpbml0KCk7Ci0KLQkJCXJldHVybiBwYWdlR3JvdXAuZ2V0UGFnZXMoZGF0YU1vZGVsKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQkJdHJ5IHsKLQkJCQlwYWdlSGFuZGxlciA9IHBhZ2VHcm91cC5nZXRQYWdlSGFuZGxlcihkYXRhTW9kZWwpOwotCQkJCXBhZ2VHcm91cEhhbmRsZXIgPSBwYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSGFuZGxlcihkYXRhTW9kZWwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKGV4Yyk7Ci0JCQl9Ci0KLQkJCWlmIChwYWdlSGFuZGxlciA9PSBudWxsKQotCQkJCXBhZ2VIYW5kbGVyID0gbmV3IFNpbXBsZVBhZ2VIYW5kbGVyKCk7Ci0KLQkJCWlmIChwYWdlR3JvdXBIYW5kbGVyID09IG51bGwpCi0JCQkJcGFnZUdyb3VwSGFuZGxlciA9IG5ldyBTaW1wbGVQYWdlR3JvdXBIYW5kbGVyKCk7Ci0KLQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgaW50IGNoZWNrRm9yU3BlY2lhbElkcyhTdHJpbmcgcGFnZUlkKSB7Ci0JCQlpbnQgcmVzdWx0ID0gLTE7Ci0KLQkJCUxpc3QgcGFnZXMgPSBnZXRQYWdlcygpOwotCi0JCQlpZiAocGFnZXMuaXNFbXB0eSgpIHx8IHBhZ2VJZCA9PSBudWxsKQotCQkJCXJldHVybiAtMTsKLQotCQkJaWYgKHBhZ2VJZC5zdGFydHNXaXRoKElETVBhZ2VIYW5kbGVyLlBBR0VfQUZURVIpKSB7Ci0JCQkJU3RyaW5nIGFmdGVySUQgPSBwYWdlSWQuc3Vic3RyaW5nKElETVBhZ2VIYW5kbGVyLlBBR0VfQUZURVIubGVuZ3RoKCksIHBhZ2VJZC5sZW5ndGgoKSk7Ci0JCQkJcmVzdWx0ID0gZ2V0SW5kZXhPZihhZnRlcklEKTsKLQkJCQlyZXN1bHQgPSByZXN1bHQgPj0gMCAmJiByZXN1bHQgPCBwYWdlcy5zaXplKCkgLSAxID8gcmVzdWx0ICsgMSA6IC0xOwotCQkJfSBlbHNlIGlmIChwYWdlSWQuc3RhcnRzV2l0aChJRE1QYWdlSGFuZGxlci5QQUdFX0JFRk9SRSkpIHsKLQkJCQlTdHJpbmcgYmVmb3JlSUQgPSBwYWdlSWQuc3Vic3RyaW5nKElETVBhZ2VIYW5kbGVyLlBBR0VfQkVGT1JFLmxlbmd0aCgpLCBwYWdlSWQubGVuZ3RoKCkpOwotCQkJCXJlc3VsdCA9IGdldEluZGV4T2YoYmVmb3JlSUQpOwotCQkJCXJlc3VsdCA9IHJlc3VsdCA+PSAxICYmIHJlc3VsdCA8IHBhZ2VzLnNpemUoKSA/IHJlc3VsdCAtIDEgOiAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZ2V0SW5kZXhPZihwYWdlSWQpOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZ2V0SW5kZXhPZihTdHJpbmcgcGFnZUlkKSB7Ci0JCQlpbnQgcmVzdWx0ID0gLTE7Ci0KLQkJCUxpc3QgcGFnZXMgPSBnZXRQYWdlcygpOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhZ2VzLnNpemUoKTsgaW5kZXgrKykgewotCQkJCWlmICgoKElXaXphcmRQYWdlKSBwYWdlcy5nZXQoaW5kZXgpKS5nZXROYW1lKCkuZXF1YWxzKHBhZ2VJZCkpIHsKLQkJCQkJcmVzdWx0ID0gaW5kZXg7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0JCQlyZXR1cm4gaW5pdGlhbGl6ZWQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncyhEYXRhTW9kZWxXaXphcmQgd2l6YXJkKSB7Ci0JCUl0ZXJhdG9yIHBhZ2VHcm91cHMgPSBncm91cFRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChwYWdlR3JvdXBzLmhhc05leHQoKSkgewotCQkJUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwID0gKFBhZ2VHcm91cEVudHJ5KSBwYWdlR3JvdXBzLm5leHQoKTsKLQkJCWlmIChwYWdlR3JvdXAuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkJSXRlcmF0b3IgcGFnZXMgPSBwYWdlR3JvdXAuZ2V0UGFnZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChwYWdlcy5oYXNOZXh0KCkpIHsKLQkJCQkJSVdpemFyZFBhZ2UgcGFnZSA9IChJV2l6YXJkUGFnZSkgcGFnZXMubmV4dCgpOwotCQkJCQl3aXphcmQuc3RvcmVEZWZhdWx0U2V0dGluZ3MocGFnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVPcGVyYXRpb25XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjYwMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi1wdWJsaWMgY2xhc3MgUnVubmFibGVPcGVyYXRpb25XcmFwcGVyIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgSVVuZG9hYmxlT3BlcmF0aW9uIHVuZG9hYmxlT3BlcmF0aW9uOwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQlwdWJsaWMgUnVubmFibGVPcGVyYXRpb25XcmFwcGVyKElVbmRvYWJsZU9wZXJhdGlvbiB1bmRvYWJsZU9wZXJhdGlvbikgewotCQl0aGlzLnVuZG9hYmxlT3BlcmF0aW9uID0gdW5kb2FibGVPcGVyYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXN0YXR1cyA9IHVuZG9hYmxlT3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKXsKLQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmMzkwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3Igb3VyIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIHRvIHRoZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuIFRoaXMgY2xhc3MKLSAqIG5lZWRzIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBvcGVyYXRpb24gZnJvbSBhIElSdW5uYWJsZUNvbnRleHQuCi0gKiAKLSAqIEBzZWUgSVJ1bm5hYmxlQ29udGV4dAotICogQHNlZSBKYXZhVUlQbHVnaW4jZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MgQ3JlYXRpb24gZGF0ZTogKDUvOC8yMDAxIDE6Mjg6NDUgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBoZWFkbGVzc1J1bm5hYmxlOwotCi0JLyoqCi0JICogUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlcihJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcykgewotCQlzZXRIZWFkbGVzc1J1bm5hYmxlKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzgvMjAwMSAxOjI5OjUyIFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzCi0JICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGdldEhlYWRsZXNzUnVubmFibGUoKSB7Ci0JCXJldHVybiBoZWFkbGVzc1J1bm5hYmxlOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhpcyBvcGVyYXRpb24uIFByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4gVGhpcyBtZXRob2QKLQkgKiBpcyB1c3VhbGx5IGludm9rZWQgYnkgYW4gPGNvZGU+SVJ1bm5hYmxlQ29udGV4dDwvY29kZT4nczxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kLCB3aGljaAotCSAqIHN1cHBsaWVzIHRoZSBwcm9ncmVzcyBtb25pdG9yLiBBIHJlcXVlc3QgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGhvbm9yZWQgYW5kCi0JICogYWNrbm93bGVkZ2VkIGJ5IHRocm93aW5nIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUgcmVxdWVzdHMgZm9yCi0JICogICAgICAgICAgICBjYW5jZWxhdGlvbgotCSAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sIGl0IHNob3VsZCB3cmFwIGl0IGluc2lkZQotCSAqICAgICAgICAgICAgICAgIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlCi0JICogICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSB3cmFwcGVkIGluIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+IGJ5IHRoZQotCSAqICAgICAgICAgICAgICAgIGNhbGxpbmcgY29udGV4dAotCSAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgdXNpbmcKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nCi0JICogICAgICAgICAgICAgICAgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+Ci0JICogCi0JICogQHNlZSBJUnVubmFibGVDb250ZXh0I3J1bgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZ2V0SGVhZGxlc3NSdW5uYWJsZSgpLnJ1bihtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzgvMjAwMSAxOjI5OjUyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdIZWFkbGVzc1J1bm5hYmxlCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRIZWFkbGVzc1J1bm5hYmxlKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIG5ld0hlYWRsZXNzUnVubmFibGUpIHsKLQkJaGVhZGxlc3NSdW5uYWJsZSA9IG5ld0hlYWRsZXNzUnVubmFibGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TYXZlSGFuZGxlclVJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NhdmVIYW5kbGVyVUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxNjIxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NhdmVIYW5kbGVyVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2F2ZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFNhdmVIYW5kbGVyVUkgaW1wbGVtZW50cyBJU2F2ZUhhbmRsZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfRkFJTEVEID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIxNiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVHSU5OSU5HX01FU1NBR0UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjE3Iik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1llc1RvQWxsID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGludCByZWZlcmVuY2VDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBTYXZlSGFuZGxlclVJIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNhdmVIYW5kbGVyVUkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYWNjZXNzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VzcygpIHsKLQkJcmVmZXJlbmNlQ291bnQrKzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgZ2V0UGFyZW50U2hlbGxGb3JEaWFsb2coKSB7Ci0JCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJRGlzcGxheSByZXN1bHQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gRGlzcGxheS5nZXREZWZhdWx0KCkgOiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlZmVyZW5jZUNvdW50ID4gMSkKLQkJCS8vTGV0IHRoZSBvdXRlcm1vc3QgcmVmZXJlbmNlIGhhbmRsZSBpdAotCQkJdGhyb3cgZXg7Ci0JCVN0cmluZyBleE1zZyA9IGV4LmdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpID09IG51bGwgPyBleC5nZXRNZXNzYWdlKCkgOiBleC5nZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0JCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gQkVHSU5OSU5HX01FU1NBR0UgKyAiOlxuIiArIGV4TXNnOy8vJE5PTi1OTFMtMSQKLQkJZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRQYXJlbnRTaGVsbEZvckRpYWxvZygpLCBTQVZFX0ZBSUxFRCwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0pOwotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJZWxzZQotCQkJdGhyb3cgZXg7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0VXNlclRvU2F2ZVJlYWRPbmx5KElGaWxlIGFGaWxlKSB7Ci0KLQkJU3RyaW5nW10gYnV0dG9uU3RyaW5ncyA9IHtXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIlllc19VSV8iKSwgV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJZZXNfVG9fQWxsX1VJXyIpLCBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIk5vX1VJXyIpfTsgLy8kTk9OLU5MUy0zJCA9ICJObyIgLy8kTk9OLU5MUy0yJCA9ICJZZXMgVG8gQWxsIiAvLyROT04tTkxTLTEkID0gIlllcyIKLQkJU3RyaW5nIHRpdGxlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJTYXZpbmdfUmVhZC1Pbmx5X0ZpbGVfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiU2F2aW5nIFJlYWQtT25seSBGaWxlIgotCQlTdHJpbmcgbWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiMmNvbmNhdF9JTkZPXyIsIChuZXcgT2JqZWN0W117YUZpbGUuZ2V0RnVsbFBhdGgoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZmlsZSB7MH0gaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2F2ZWQuICBXb3VsZCB5b3UgbGlrZSB0byBtYWtlIGl0IGVkaXRhYmxlIGFuZCBzYXZlIGFueXdheT8iCi0KLQkJZmluYWwgTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRQYXJlbnRTaGVsbEZvckRpYWxvZygpLCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIGJ1dHRvblN0cmluZ3MsIDApOyAvLyBZZXMgaXMgdGhlIGRlZmF1bHQKLQotCQlmaW5hbCBpbnRbXSByZXQgPSBuZXcgaW50WzFdOwotCQlnZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlyZXRbMF0gPSBkaWFsb2cub3BlbigpOwotCQkJfQotCQl9KTsKLQotCQlzd2l0Y2ggKHJldFswXSkgewotCQkJY2FzZSAwIDogewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJY2FzZSAxIDogewotCQkJCWlzWWVzVG9BbGwgPSB0cnVlOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJY2FzZSAyIDogewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcmVsZWFzZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlyZWZlcmVuY2VDb3VudC0tOwotCQlpZiAocmVmZXJlbmNlQ291bnQgPT0gMCkKLQkJCWlzWWVzVG9BbGwgPSBmYWxzZTsKLQotCX0KLQotCS8qKgotCSAqIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUoSUZpbGUgYUZpbGUpIHsKLQkJYm9vbGVhbiB5ZXMgPSBpc1llc1RvQWxsIHx8IHByb21wdFVzZXJUb1NhdmVSZWFkT25seShhRmlsZSk7Ci0JCWlmICh5ZXMpCi0JCQlhRmlsZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5zZXRSZWFkT25seShmYWxzZSk7Ci0JCXJldHVybiB5ZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlUGFnZUdyb3VwSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlR3JvdXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYWQwNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlR3JvdXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBhZ2VHcm91cEhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlR3JvdXBIYW5kbGVyIHsKLQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlR3JvdXAoU3RyaW5nIGN1cnJlbnRQYWdlR3JvdXBJRCwgU3RyaW5nW10gcGFnZUdyb3VwSURzKSB7Ci0JCWlmIChwYWdlR3JvdXBJRHMgPT0gbnVsbCB8fCBwYWdlR3JvdXBJRHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoY3VycmVudFBhZ2VHcm91cElEID09IG51bGwpCi0JCQlyZXR1cm4gcGFnZUdyb3VwSURzWzBdOwotCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwYWdlR3JvdXBJRHMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAocGFnZUdyb3VwSURzW2luZGV4XS5lcXVhbHMoY3VycmVudFBhZ2VHcm91cElEKSkgewotCQkJCS8vIFdlIGZvdW5kIHRoZSBjdXJyZW50UGFnZUdyb3VwSUQsIHNvIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBuZXh0IG9uZSBpbiB0aGUKLQkJCQkvLyBhcnJheSBpZiB0aGVyZSBpcyBvbmUuCi0JCQkJaWYgKGluZGV4ICsgMSA8IHBhZ2VHcm91cElEcy5sZW5ndGgpIHsKLQkJCQkJcmVzdWx0ID0gcGFnZUdyb3VwSURzW2luZGV4ICsgMV07Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGIzOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGFnZUhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlSGFuZGxlcgotewotICBwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZE5leHRQYWdlTmFtZSkgCi0gIHsKLSAgICByZXR1cm4gZXhwZWN0ZWROZXh0UGFnZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lKSAKLSAgewotCXJldHVybiBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk5YWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRIZWFkbGVzczsKLQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSSBleHRlbmRzIFNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRIZWFkbGVzcyB7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXRJbXBsKGZpbmFsIElGaWxlW10gZmlsZXNUb1ZhbGlkYXRlKSB7Ci0JCWZpbmFsIElTdGF0dXMgW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzdGF0dXNbMF0gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzVG9WYWxpZGF0ZSwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gc3RhdHVzWzBdOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZEtleUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkS2V5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlZTE4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkS2V5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvMzAvMjAwMSA0OjAwOjI4IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lZEtleUxpc3RlbmVyIGV4dGVuZHMgVGltZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciwgTW91c2VMaXN0ZW5lciwgTW91c2VUcmFja0xpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgV2lkZ2V0IG1vbml0b3JpbmdUYXJnZXQ7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVElNRV9MSU1JVCA9IDIwMDsKLQotCS8qKgotCSAqIEoyRUVUaW1lZEtleUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlbGF5Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkS2V5TGlzdGVuZXIoaW50IGRlbGF5LCBBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihkZWxheSwgbGlzdGVuZXIpOwotCQlzZXRSZXBlYXRzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzMwLzIwMDEgNDo0MzozMyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYQotCSAqICAgICAgICAgICAgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgVGltZWRLZXlMaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzKFRJTUVfTElNSVQsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZW50IHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBvbiB0aGUgc3lzdGVtIGtleWJvYXJkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXkgcHJlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIFNlbnQgd2hlbiBhIGtleSBpcyByZWxlYXNlZCBvbiB0aGUgc3lzdGVtIGtleWJvYXJkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXkgcmVsZWFzZQotCSAqLwotCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQgZSkgewotCQkvLyBSZXBsYWNlZCB3aXRoIFNXVC5Nb2RpZnkgLS0gc2VlIG1vZGlmeVRleHQoKSBpbiB0aGlzIGNsYXNzCi0JCS8vICAgICAgICBtb25pdG9yaW5nVGFyZ2V0ID0gKFdpZGdldCkgZS5nZXRTb3VyY2UoKTsKLQkJLy8gICAgICAgIHJlc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvd24oTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VVcChNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCW1vbml0b3JpbmdUYXJnZXQgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQlyZXN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lciNtb3VzZUVudGVyKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyI21vdXNlRXhpdChNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyI21vdXNlSG92ZXIoTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLnV0aWwuVGltZXIjZ2V0U291cmNlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG1vbml0b3JpbmdUYXJnZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJbW9uaXRvcmluZ1RhcmdldCA9IChXaWRnZXQpIGUuZ2V0U291cmNlKCk7Ci0JCXJlc3RhcnQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZE1vZGlmeUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkTW9kaWZ5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0MGM0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVkTW9kaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGVyZm9ybSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgSjJFRVRpbWVkS2V5TGlzdGVuZXIgYnV0IHVzaW5nIHRoZSBNb2RpZnkgU1dUIGV2ZW50Ci0gKiBpbnN0ZWFkIG9mIHRoZSBLZXlVcC4gQ3JlYXRpb24gZGF0ZTogKDkvMTAvMjAwMSAxMTo0Njo1MSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBUaW1lZE1vZGlmeUxpc3RlbmVyIGV4dGVuZHMgVGltZWRLZXlMaXN0ZW5lciB7Ci0JLyoqCi0JICogSjJFRVRpbWVkTW9kZWZ5TGlzdGVuZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsYXkKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgVGltZWRNb2RpZnlMaXN0ZW5lcihpbnQgZGVsYXksIEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKGRlbGF5LCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogSjJFRVRpbWVkTW9kZWZ5TGlzdGVuZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkTW9kaWZ5TGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogUmUvU3RhcnQgdGhlIHRpbWVyCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50IGUpIHsKLQkJbW9uaXRvcmluZ1RhcmdldCA9IChXaWRnZXQpIGUuZ2V0U291cmNlKCk7Ci0JCXJlc3RhcnQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmIxMWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLQotCi1wdWJsaWMgY2xhc3MgVGltZXIgewotCS8qKgotCSAqIERvUG9zdEV2ZW50IGlzIGEgcnVubmFibGUgY2xhc3MgdGhhdCBmaXJlcyBhY3Rpb25FdmVudHMgdG8gdGhlIGxpc3RlbmVycyBvbiB0aGUKLQkgKiBFdmVudERpc3BhdGNoVGhyZWFkLCB2aWEgaW52b2tlTGF0ZXIuCi0JICogCi0JICogQHNlZSAjcG9zdAotCSAqLwotCWNsYXNzIERvUG9zdEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoZXZlbnRRdWV1ZWQpIHsKLQkJCQlmaXJlQWN0aW9uUGVyZm9ybWVkKG5ldyBBY3Rpb25FdmVudChnZXRTb3VyY2UoKSwgMCwgbnVsbCkpOwotCQkJCWNhbmNlbEV2ZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlUaW1lciBnZXRUaW1lcigpIHsKLQkJCXJldHVybiBUaW1lci50aGlzOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JYm9vbGVhbiBldmVudFF1ZXVlZCA9IGZhbHNlOwotCWludCBpbml0aWFsRGVsYXksIGRlbGF5OwotCWJvb2xlYW4gcmVwZWF0cyA9IHRydWUsIGNvYWxlc2NlID0gdHJ1ZTsKLQlwcml2YXRlIFJ1bm5hYmxlIGRvUG9zdEV2ZW50OwotCS8vIFRoZXNlIGZpZWxkcyBhcmUgbWFpbnRhaW5lZCBieSBUaW1lclF1ZXVlLgotCS8vIGV2ZW50UXVldWVkIGNhbiBhbHNvIGJlIHJlc2V0IGJ5IHRoZSBUaW1lclF1ZXVlLCBidXQgd2lsbCBvbmx5IGV2ZXIKLQkvLyBoYXBwZW4gaW4gYXBwbGV0IGNhc2Ugd2hlbiBUaW1lclF1ZXVlcyB0aHJlYWQgaXMgZGVzdHJveWVkLgotCWxvbmcgZXhwaXJhdGlvblRpbWU7Ci0JVGltZXIgbmV4dFRpbWVyOwotCWJvb2xlYW4gcnVubmluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUaW1lciB0aGF0IHdpbGwgbm90aWZ5IGl0cyBsaXN0ZW5lcnMgZXZlcnkgPGk+ZGVsYXkgPC9pPiBtaWxsaXNlY29uZHMuCi0JICogCi0JICogQHBhcmFtIGRlbGF5Ci0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGxpc3RlbmVyIG5vdGlmaWNhdGlvbgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgQW4gaW5pdGlhbCBsaXN0ZW5lcgotCSAqIEBzZWUgI3NldEluaXRpYWxEZWxheQotCSAqIEBzZWUgI3NldFJlcGVhdHMKLQkgKi8KLQlwdWJsaWMgVGltZXIoaW50IGRlbGF5LCBBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQl0aGlzLmRlbGF5ID0gZGVsYXk7Ci0JCXRoaXMuaW5pdGlhbERlbGF5ID0gZGVsYXk7Ci0KLQkJZG9Qb3N0RXZlbnQgPSBuZXcgRG9Qb3N0RXZlbnQoKTsKLQotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBhY3Rpb25MaXN0ZW5lciB0byB0aGUgVGltZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb25MaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBjYW5jZWxFdmVudCgpIHsKLQkJZXZlbnRRdWV1ZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgYWxsIGxpc3RlbmVycyB0aGF0IGhhdmUgcmVnaXN0ZXJlZCBpbnRlcmVzdCBmb3Igbm90aWZpY2F0aW9uIG9uIHRoaXMgZXZlbnQgdHlwZS4gVGhlCi0JICogZXZlbnQgaW5zdGFuY2UgaXMgbGF6aWx5IGNyZWF0ZWQgdXNpbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIGludG8gdGhlIGZpcmUgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgRXZlbnRMaXN0ZW5lckxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQkJLy8gR3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlBY3Rpb25MaXN0ZW5lcltdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQotCQkvLyBQcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uYWN0aW9uUGVyZm9ybWVkKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVGltZXIncyBkZWxheS4KLQkgKiAKLQkgKiBAc2VlICNzZXREZWxheQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVsYXkoKSB7Ci0JCXJldHVybiBkZWxheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBUaW1lcidzIGluaXRpYWwgZGVsYXkuCi0JICogCi0JICogQHNlZSAjc2V0RGVsYXkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluaXRpYWxEZWxheSgpIHsKLQkJcmV0dXJuIGluaXRpYWxEZWxheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxiPnRydWUgPC9iPiBpZiB0aGUgVGltZXIgY29hbGVzY2VzIG11bHRpcGxlIHBlbmRpbmcgPGI+cGVyZm9ybUNvbW1hbmQoKSA8L2I+Ci0JICogbWVzc2FnZXMuCi0JICogCi0JICogQHNlZSAjc2V0Q29hbGVzY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvYWxlc2NlKCkgewotCQlyZXR1cm4gY29hbGVzY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Yj50cnVlIDwvYj4gaWYgdGhlIFRpbWVyIHdpbGwgc2VuZCBhIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZSB0byBpdHMKLQkgKiBsaXN0ZW5lcnMgbXVsdGlwbGUgdGltZXMuCi0JICogCi0JICogQHNlZSAjc2V0UmVwZWF0cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVwZWF0cygpIHsKLQkJcmV0dXJuIHJlcGVhdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Yj50cnVlIDwvYj4gaWYgdGhlIFRpbWVyIGlzIHJ1bm5pbmcuCi0JICogCi0JICogQHNlZSAjc3RhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JCXJldHVybiB0aW1lclF1ZXVlKCkuY29udGFpbnNUaW1lcih0aGlzKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBwb3N0KCkgewotCQlpZiAoIWV2ZW50UXVldWVkKSB7Ci0JCQlldmVudFF1ZXVlZCA9IHRydWU7Ci0JCQlvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoZG9Qb3N0RXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbiBBY3Rpb25MaXN0ZW5lciBmcm9tIHRoZSBUaW1lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBY3Rpb25MaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0YXJ0cyBhIFRpbWVyLCBjYW5jZWxpbmcgYW55IHBlbmRpbmcgZmlyaW5ncywgYW5kIGNhdXNpbmcgaXQgdG8gZmlyZSB3aXRoIGl0cyBpbml0aWFsCi0JICogZGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KCkgewotCQlzdG9wKCk7Ci0JCXN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoZSBUaW1lciBjb2FsZXNjZXMgbXVsdGlwbGUgcGVuZGluZyBBY3Rpb25FdmVudCBmaXJpbmdzLiBBIGJ1c3kgYXBwbGljYXRpb24gbWF5Ci0JICogbm90IGJlIGFibGUgdG8ga2VlcCB1cCB3aXRoIGEgVGltZXIncyBtZXNzYWdlIGdlbmVyYXRpb24sIGNhdXNpbmcgbXVsdGlwbGUKLQkgKiA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2Ugc2VuZHMgdG8gYmUgcXVldWVkLiBXaGVuIHByb2Nlc3NlZCwgdGhlIGFwcGxpY2F0aW9uIHNlbmRzCi0JICogdGhlc2UgbWVzc2FnZXMgb25lIGFmdGVyIHRoZSBvdGhlciwgY2F1c2luZyB0aGUgVGltZXIncyBsaXN0ZW5lcnMgdG8gcmVjZWl2ZSBhIHNlcXVlbmNlIG9mCi0JICogPGI+YWN0aW9uUGVyZm9ybWVkKCkgPC9iPiBtZXNzYWdlcyB3aXRoIG5vIGRlbGF5IGJldHdlZW4gdGhlbS4gQ29hbGVzY2luZyBhdm9pZHMgdGhpcwotCSAqIHNpdHVhdGlvbiBieSByZWR1Y2luZyBtdWx0aXBsZSBwZW5kaW5nIG1lc3NhZ2VzIHRvIGEgc2luZ2xlIG1lc3NhZ2Ugc2VuZC4gVGltZXJzIGNvYWxlc2NlCi0JICogdGhlaXIgbWVzc2FnZSBzZW5kcyBieSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvYWxlc2NlKGJvb2xlYW4gZmxhZykgewotCQljb2FsZXNjZSA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgVGltZXIncyBkZWxheSwgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIDxiPmFjdGlvblBlcmZvbWVkKCkKLQkgKiA8L2I+IG1lc3NhZ2VzIHRvIGl0cyBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlICNzZXRJbml0aWFsRGVsYXkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWxheShpbnQgZGVsYXkpIHsKLQkJaWYgKGRlbGF5IDwgMCkgewotCQkJU3RyaW5nIG1zZyA9IFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5UaW1lcl9VSV8wLCBuZXcgT2JqZWN0W117SW50ZWdlci50b1N0cmluZyhkZWxheSl9KTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obXNnKTsKLQkJfQotCQl0aGlzLmRlbGF5ID0gZGVsYXk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgVGltZXIncyBpbml0aWFsIGRlbGF5LiBUaGlzIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGZpcnN0ICJyaW5naW5nIiBvZiB0aGUgVGltZXIgb25seS4KLQkgKiBTdWJzZXF1ZW50IHJpbmdpbmdzIHdpbGwgYmUgc3BhY2VkIHVzaW5nIHRoZSBkZWxheSBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAc2VlICNzZXREZWxheQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxEZWxheShpbnQgaW5pdGlhbERlbGF5KSB7Ci0JCWlmIChpbml0aWFsRGVsYXkgPCAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLlRpbWVyX1VJXzEsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnRvU3RyaW5nKGluaXRpYWxEZWxheSl9KTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obXNnKTsKLQkJfQotCQl0aGlzLmluaXRpYWxEZWxheSA9IGluaXRpYWxEZWxheTsKLQl9Ci0KLQkvKioKLQkgKiBJZiA8Yj5mbGFnIDwvYj4gaXMgPGI+ZmFsc2UgPC9iPiwgaW5zdHJ1Y3RzIHRoZSBUaW1lciB0byBzZW5kIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gdG8KLQkgKiBpdHMgbGlzdGVuZXJzIG9ubHkgb25jZSwgYW5kIHRoZW4gc3RvcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBlYXRzKGJvb2xlYW4gZmxhZykgewotCQlyZXBlYXRzID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIFRpbWVyLCBjYXVzaW5nIGl0IHRvIHNlbmQgPGI+YWN0aW9uUGVyZm9ybWVkKCkgPC9iPiBtZXNzYWdlcyB0byBpdHMgbGlzdGVuZXJzLgotCSAqIAotCSAqIEBzZWUgI3N0b3AKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJdGltZXJRdWV1ZSgpLmFkZFRpbWVyKHRoaXMsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgZ2V0SW5pdGlhbERlbGF5KCkpOwotCX0KLQotCS8qKgotCSAqIFN0b3BzIGEgVGltZXIsIGNhdXNpbmcgaXQgdG8gc3RvcCBzZW5kaW5nIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZXMgdG8gaXRzIFRhcmdldC4KLQkgKiAKLQkgKiBAc2VlICNzdGFydAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCXRpbWVyUXVldWUoKS5yZW1vdmVUaW1lcih0aGlzKTsKLQkJY2FuY2VsRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aW1lciBxdWV1ZS4KLQkgKi8KLQlUaW1lclF1ZXVlIHRpbWVyUXVldWUoKSB7Ci0JCXJldHVybiBUaW1lclF1ZXVlLnNpbmdsZXRvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIGZvciB0aGUgQWN0aW9uRXZlbnQgdGhhdCBpcyBmaXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXJRdWV1ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lclF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NmEwZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lclF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotCi0KLQotY2xhc3MgVGltZXJRdWV1ZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQlwcml2YXRlIHN0YXRpYyBUaW1lclF1ZXVlIHNpbmdsZXRvbjsKLQlUaW1lciBmaXJzdFRpbWVyOwotCWJvb2xlYW4gcnVubmluZzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgY2xhc3NMb2NrID0gbmV3IE9iamVjdCgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRpbWVyUXVldWUuCi0JICovCi0JcHVibGljIFRpbWVyUXVldWUoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gTm93IHN0YXJ0IHRoZSBUaW1lclF1ZXVlIHRocmVhZC4KLQkJc3RhcnQoKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBhZGRUaW1lcihUaW1lciB0aW1lciwgbG9uZyBleHBpcmF0aW9uVGltZSkgewotCQlUaW1lciBwcmV2aW91c1RpbWVyOwotCQlUaW1lciBuZXh0VGltZXI7Ci0KLQkJLy8gSWYgdGhlIFRpbWVyIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLCB0aGVuIGlnbm9yZSB0aGUgYWRkLgotCQlpZiAodGltZXIucnVubmluZykgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHJldmlvdXNUaW1lciA9IG51bGw7Ci0JCW5leHRUaW1lciA9IGZpcnN0VGltZXI7Ci0KLQkJLy8gSW5zZXJ0IHRoZSBUaW1lciBpbnRvIHRoZSBsaW5rZWQgbGlzdCBpbiB0aGUgb3JkZXIgdGhleSB3aWxsCi0JCS8vIGV4cGlyZS4gSWYgdHdvIHRpbWVycyBleHBpcmUgYXQgdGhlIHNhbWUgdGltZSwgcHV0IHRoZSBuZXdlciBlbnRyeQotCQkvLyBsYXRlciBzbyB0aGV5IGV4cGlyZSBpbiB0aGUgb3JkZXIgdGhleSBjYW1lIGluLgotCi0JCXdoaWxlIChuZXh0VGltZXIgIT0gbnVsbCkgewotCQkJaWYgKG5leHRUaW1lci5leHBpcmF0aW9uVGltZSA+IGV4cGlyYXRpb25UaW1lKQotCQkJCWJyZWFrOwotCi0JCQlwcmV2aW91c1RpbWVyID0gbmV4dFRpbWVyOwotCQkJbmV4dFRpbWVyID0gbmV4dFRpbWVyLm5leHRUaW1lcjsKLQkJfQotCi0JCWlmIChwcmV2aW91c1RpbWVyID09IG51bGwpIHsKLQkJCWZpcnN0VGltZXIgPSB0aW1lcjsKLQkJfSBlbHNlIHsKLQkJCXByZXZpb3VzVGltZXIubmV4dFRpbWVyID0gdGltZXI7Ci0JCX0KLQotCQl0aW1lci5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lOwotCQl0aW1lci5uZXh0VGltZXIgPSBuZXh0VGltZXI7Ci0JCXRpbWVyLnJ1bm5pbmcgPSB0cnVlOwotCQlub3RpZnkoKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWluc1RpbWVyKFRpbWVyIHRpbWVyKSB7Ci0JCXJldHVybiB0aW1lci5ydW5uaW5nOwotCX0KLQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBhIHRvbiBvZiB0aW1lcnMsIHRoaXMgbWV0aG9kIG1heSBuZXZlciByZXR1cm4uIEl0IGxvb3BzIGNoZWNraW5nIHRvIHNlZSBpZiB0aGUKLQkgKiBoZWFkIG9mIHRoZSBUaW1lciBsaXN0IGhhcyBleHBpcmVkLiBJZiBpdCBoYXMsIGl0IHBvc3RzIHRoZSBUaW1lciBhbmQgcmVzY2hlZHVsZXMgaXQgaWYKLQkgKiBuZWNlc3NhcnkuCi0JICovCi0Jc3luY2hyb25pemVkIGxvbmcgcG9zdEV4cGlyZWRUaW1lcnMoKSB7Ci0JCVRpbWVyIHRpbWVyOwotCQlsb25nIGN1cnJlbnRUaW1lOwotCQlsb25nIHRpbWVUb1dhaXQ7Ci0KLQkJLy8gVGhlIHRpbWVUb1dhaXQgd2UgcmV0dXJuIHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZSBhbmQgb25seSBiZSB6ZXJvCi0JCS8vIHdoZW4gd2UgaGF2ZSBubyBUaW1lcnMgdG8gd2FpdCBmb3IuCi0KLQkJZG8gewotCQkJdGltZXIgPSBmaXJzdFRpbWVyOwotCQkJaWYgKHRpbWVyID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCWN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl0aW1lVG9XYWl0ID0gdGltZXIuZXhwaXJhdGlvblRpbWUgLSBjdXJyZW50VGltZTsKLQotCQkJaWYgKHRpbWVUb1dhaXQgPD0gMCkgewotCQkJCXRyeSB7Ci0JCQkJCXRpbWVyLnBvc3QoKTsgLy8gaGF2ZSB0aW1lciBwb3N0IGFuIGV2ZW50Ci0JCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCX0KLQotCQkJCS8vIFJlbW92ZSB0aGUgdGltZXIgZnJvbSB0aGUgcXVldWUKLQkJCQlyZW1vdmVUaW1lcih0aW1lcik7Ci0KLQkJCQkvLyBUaGlzIHRyaWVzIHRvIGtlZXAgdGhlIGludGVydmFsIHVuaWZvcm0gYXQKLQkJCQkvLyB0aGUgY29zdCBvZiBkcmlmdC4KLQkJCQlpZiAodGltZXIuaXNSZXBlYXRzKCkpIHsKLQkJCQkJYWRkVGltZXIodGltZXIsIGN1cnJlbnRUaW1lICsgdGltZXIuZ2V0RGVsYXkoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBBbGxvdyBvdGhlciB0aHJlYWRzIHRvIGNhbGwgYWRkVGltZXIoKSBhbmQgcmVtb3ZlVGltZXIoKQotCQkJLy8gZXZlbiB3aGVuIHdlIGFyZSBwb3N0aW5nIFRpbWVycyBsaWtlIG1hZC4gU2luY2UgdGhlIHdhaXQoKQotCQkJLy8gcmVsZWFzZXMgdGhlIGxvY2ssIGJlIHN1cmUgbm90IHRvIG1haW50YWluIGFueSBzdGF0ZQotCQkJLy8gYmV0d2VlbiBpdGVyYXRpb25zIG9mIHRoZSBsb29wLgotCi0JCQl0cnkgewotCQkJCXdhaXQoMSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0gd2hpbGUgKHRpbWVUb1dhaXQgPD0gMCk7Ci0KLQkJcmV0dXJuIHRpbWVUb1dhaXQ7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlVGltZXIoVGltZXIgdGltZXIpIHsKLQkJVGltZXIgcHJldmlvdXNUaW1lcjsKLQkJVGltZXIgbmV4dFRpbWVyOwotCQlib29sZWFuIGZvdW5kOwotCi0JCWlmICghdGltZXIucnVubmluZykKLQkJCXJldHVybjsKLQotCQlwcmV2aW91c1RpbWVyID0gbnVsbDsKLQkJbmV4dFRpbWVyID0gZmlyc3RUaW1lcjsKLQkJZm91bmQgPSBmYWxzZTsKLQotCQl3aGlsZSAobmV4dFRpbWVyICE9IG51bGwpIHsKLQkJCWlmIChuZXh0VGltZXIgPT0gdGltZXIpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXByZXZpb3VzVGltZXIgPSBuZXh0VGltZXI7Ci0JCQluZXh0VGltZXIgPSBuZXh0VGltZXIubmV4dFRpbWVyOwotCQl9Ci0KLQkJaWYgKCFmb3VuZCkKLQkJCXJldHVybjsKLQotCQlpZiAocHJldmlvdXNUaW1lciA9PSBudWxsKSB7Ci0JCQlmaXJzdFRpbWVyID0gdGltZXIubmV4dFRpbWVyOwotCQl9IGVsc2UgewotCQkJcHJldmlvdXNUaW1lci5uZXh0VGltZXIgPSB0aW1lci5uZXh0VGltZXI7Ci0JCX0KLQotCQl0aW1lci5leHBpcmF0aW9uVGltZSA9IDA7Ci0JCXRpbWVyLm5leHRUaW1lciA9IG51bGw7Ci0JCXRpbWVyLnJ1bm5pbmcgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcnVuKCkgewotCQlsb25nIHRpbWVUb1dhaXQ7Ci0KLQkJdHJ5IHsKLQkJCXdoaWxlIChydW5uaW5nKSB7Ci0JCQkJdGltZVRvV2FpdCA9IHBvc3RFeHBpcmVkVGltZXJzKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJd2FpdCh0aW1lVG9XYWl0KTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChUaHJlYWREZWF0aCB0ZCkgewotCQkJcnVubmluZyA9IGZhbHNlOwotCQkJLy8gTWFyayBhbGwgdGhlIHRpbWVycyB3ZSBjb250YWluIGFzIG5vdCBiZWluZyBxdWV1ZWQuCi0JCQlUaW1lciB0aW1lciA9IGZpcnN0VGltZXI7Ci0JCQl3aGlsZSAodGltZXIgIT0gbnVsbCkgewotCQkJCXRpbWVyLmV2ZW50UXVldWVkID0gZmFsc2U7Ci0JCQkJdGltZXIgPSB0aW1lci5uZXh0VGltZXI7Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAoIXRoaXMucnVubmluZykKLQkJCQkJc3RhcnQoKTsKLQkJCX0KLQkJCXRocm93IHRkOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUaW1lclF1ZXVlIHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQkJc3luY2hyb25pemVkIChjbGFzc0xvY2spIHsKLQkJCQlzaW5nbGV0b24gPSBuZXcgVGltZXJRdWV1ZSgpOwotCQkJfQotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQlpZiAocnVubmluZykgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuVGltZXJRdWV1ZV9FUlJPUl8wKTsKLQkJfQotCQlUaHJlYWQgdGltZXJUaHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsICJUaW1lclF1ZXVlIik7Ly8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJdGltZXJUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJdGltZXJUaHJlYWQuc3RhcnQoKTsKLQkJcnVubmluZyA9IHRydWU7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJcnVubmluZyA9IGZhbHNlOwotCQlub3RpZnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZjsKLQkJVGltZXIgbmV4dFRpbWVyOwotCi0JCWJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiVGltZXJRdWV1ZSAoIik7Ly8kTk9OLU5MUy0xJAotCi0JCW5leHRUaW1lciA9IGZpcnN0VGltZXI7Ci0JCXdoaWxlIChuZXh0VGltZXIgIT0gbnVsbCkgewotCQkJYnVmLmFwcGVuZChuZXh0VGltZXIudG9TdHJpbmcoKSk7Ci0KLQkJCW5leHRUaW1lciA9IG5leHRUaW1lci5uZXh0VGltZXI7Ci0JCQlpZiAobmV4dFRpbWVyICE9IG51bGwpCi0JCQkJYnVmLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCi0JCX0KLQotCQlidWYuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJRW5hYmxlbWVudElkZW50aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5OTlmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJRW5hYmxlbWVudElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudE1hbmFnZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLWNsYXNzIFVJRW5hYmxlbWVudElkZW50aWZpZXIgZXh0ZW5kcyBFbmFibGVtZW50SWRlbnRpZmllciBpbXBsZW1lbnRzIElJZGVudGlmaWVyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJSWRlbnRpZmllciBhY3Rpdml0eUlkZW50aWZpZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCXB1YmxpYyBVSUVuYWJsZW1lbnRJZGVudGlmaWVyKFN0cmluZyBpZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihpZCwgcHJvamVjdCk7Ci0JCUlBY3Rpdml0eU1hbmFnZXIgbWFuYWdlciA9IGdldEFjdGl2aXR5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0eUlkZW50aWZpZXIgPSBnZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXRJZGVudGlmaWVyKGlkKTsKLQkJCWFjdGl2aXR5SWRlbnRpZmllci5hZGRJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXJMaXN0ZW5lciNpZGVudGlmaWVyQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklkZW50aWZpZXJFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpZGVudGlmaWVyQ2hhbmdlZChJZGVudGlmaWVyRXZlbnQgaWRlbnRpZmllckV2ZW50KSB7Ci0JCWJvb2xlYW4gZW5hYmxlZENoYW5nZWQgPSByZXNldEVuYWJsZWQoKTsKLQkJRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBldnQgPSBuZXcgRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCh0aGlzLCBmYWxzZSwgZW5hYmxlZENoYW5nZWQpOwotCQlmaXJlSWRlbnRpZmllckNoYW5nZWQoZXZ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGl2aXR5TWFuYWdlciBnZXRBY3Rpdml0eU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoKFVJRW5hYmxlbWVudE1hbmFnZXIpIElFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRSkuZ2V0QWN0aXZpdHlNYW5hZ2VyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXNwZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllciNnZXROZXdFbmFibGVkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXROZXdFbmFibGVkKCkgewotCQlJSWRlbnRpZmllciBpZGVudGlmaWVyID0gZ2V0QWN0aXZpdHlJZGVudGlmaWVyKCk7Ci0JCWlmIChpZGVudGlmaWVyICE9IG51bGwpCi0JCQlyZXR1cm4gaWRlbnRpZmllci5pc0VuYWJsZWQoKSAmJiBzdXBlci5nZXROZXdFbmFibGVkKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgSUlkZW50aWZpZXIgZ2V0QWN0aXZpdHlJZGVudGlmaWVyKCkgewotCQlpZiAoYWN0aXZpdHlJZGVudGlmaWVyID09IG51bGwpewotCQkJSUFjdGl2aXR5TWFuYWdlciBtYW5hZ2VyID0gZ2V0QWN0aXZpdHlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJYWN0aXZpdHlJZGVudGlmaWVyID0gZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0SWRlbnRpZmllcihnZXRJZCgpKTsKLQkJCQlhY3Rpdml0eUlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpdml0eUlkZW50aWZpZXI7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJRW5hYmxlbWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzZjkzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJRW5hYmxlbWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUVuYWJsZW1lbnRNYW5hZ2VyIGV4dGVuZHMgRW5hYmxlbWVudE1hbmFnZXIgewotCi0JcHJpdmF0ZSBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IGFjdGl2aXR5U3VwcG9ydCA9IG51bGw7Ci0KLQlwdWJsaWMgVUlFbmFibGVtZW50TWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGl2aXR5TWFuYWdlciBnZXRBY3Rpdml0eU1hbmFnZXIoKSB7Ci0JCWlmIChnZXRBY3Rpdml0eVN1cHBvcnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldEFjdGl2aXR5U3VwcG9ydCgpLmdldEFjdGl2aXR5TWFuYWdlcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFjdGl2aXR5U3VwcG9ydC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCBnZXRBY3Rpdml0eVN1cHBvcnQoKSB7Ci0JCWlmIChhY3Rpdml0eVN1cHBvcnQgPT0gbnVsbCkKLQkJCWFjdGl2aXR5U3VwcG9ydCA9IGluaXRBY3Rpdml0eVN1cHBvcnQoKTsKLQkJcmV0dXJuIGFjdGl2aXR5U3VwcG9ydDsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgaW5pdEFjdGl2aXR5U3VwcG9ydCgpIHsKLQkJSVdvcmtiZW5jaCB3b3JrID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXdvcmsgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCS8vTm90IGluaXRpYWxpemVkIHlldAotCQl9Ci0JCXJldHVybiAod29yayAhPSBudWxsKSA/IHdvcmsuZ2V0QWN0aXZpdHlTdXBwb3J0KCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXIjY3JlYXRlSWRlbnRpZmllcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVuYWJsZW1lbnRJZGVudGlmaWVyIGNyZWF0ZUlkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXJJZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IFVJRW5hYmxlbWVudElkZW50aWZpZXIoaWRlbnRpZmllcklkLCBwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJT3BlcmF0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSU9wZXJhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyMDZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJT3BlcmF0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNSwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdAotICovCi1wdWJsaWMgY2xhc3MgVUlPcGVyYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSU9wZXJhdGlvbkhhbmRsZXIgewotCXByb3RlY3RlZCBTaGVsbCBwYXJlbnRTaGVsbDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0lORk9STUFUSU9OID0gIkluZm9ybWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfRVJST1IgPSAiRXJyb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT05GSVJNID0gIkNvbmZpcm0iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBpbmZvcm1hdGlvblRpdGxlID0gREVGQVVMVF9JTkZPUk1BVElPTjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpcm1UaXRsZSA9IERFRkFVTFRfQ09ORklSTTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yVGl0bGUgPSBERUZBVUxUX0VSUk9SOwotCi0JLyoqCi0JICogVUlPcGVyYXRpb25IYW5kbGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJT3BlcmF0aW9uSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVSU9wZXJhdGlvbkhhbmRsZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVUlPcGVyYXRpb25IYW5kbGVyKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcigpOwotCQlwYXJlbnRTaGVsbCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJcmV0dXJuIExpc3RNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbWVzc2FnZSwgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlLiBUaGUgYm9vbGVhbiBhcnJheQotCSAqIHdpbGwgcmV0dXJuIHR3byBib29sZWFucy4gVGhlIGZpcnN0IGluZGljYXRlcyB0aGVpciByZXNwb25zZSB0byB0aGUgb3JpZ2luYWwgcXVlc3Rpb24gYW5kIHRoZQotCSAqIHNlY29uZCBpbmRpY2F0ZXMgaWYgdGhleSBzZWxlY3RlZCB0aGUgYXBwbHkgdG8gYWxsIGNoZWNrIGJveC4KLQkgKiAKLQkgKiBSZXR1cm4gdGhlIHJldHVybiBjb2RlIGZvciB0aGUgZGlhbG9nLiAwID0gWWVzLCAxID0gWWVzIHRvIGFsbCwgMiA9IE5vCi0JICovCi0JcHVibGljIGludCBjYW5Db250aW51ZVdpdGhBbGxDaGVjayhTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFBhcmVudFNoZWxsKCksIGdldENvbmZpcm1UaXRsZSgpLCBudWxsLCAvLyBhY2NlcHQKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93Ci0JCQkJCS8vIGljb24KLQkJCQkJbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9LCAxKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5vcGVyYXRpb25zLklPcGVyYXRpb25IYW5kbGVyI2NhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDEpOyAvLyB5ZXMKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQW4gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0UGFyZW50U2hlbGwoKSwgZ2V0RXJyb3JUaXRsZSgpLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHRpdGxlIHRvIGJlIHVzZWQgZm9yIGNvbmZpcm1hdGlvbnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb25maXJtVGl0bGUoKSB7Ci0JCXJldHVybiBjb25maXJtVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRpYWxvZyB0aXRsZSB0byBiZSB1c2VkIGZvciBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFcnJvclRpdGxlKCkgewotCQlyZXR1cm4gZXJyb3JUaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHRpdGxlIHRvIGJlIHVzZWQgZm9yIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5mb3JtYXRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIGluZm9ybWF0aW9uVGl0bGU7Ci0JfQotCi0JcHVibGljIFNoZWxsIGdldFBhcmVudFNoZWxsKCkgewotCQlpZiAocGFyZW50U2hlbGwgPT0gbnVsbCkKLQkJCXBhcmVudFNoZWxsID0gV1RQVUlQbHVnaW4uZ2V0UGx1Z2luV29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQotCQlyZXR1cm4gcGFyZW50U2hlbGw7Ci0JfQotCi0JLyoqCi0JICogQW4gaW5mb3JtYXRpb25hbCBtZXNzYWdlIG5lZWRzIHRvIGJlIHByZXNlbnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRQYXJlbnRTaGVsbCgpLCBnZXRJbmZvcm1hdGlvblRpdGxlKCksIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvOS8yMDAxIDExOjUxOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdDb25maXJtVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maXJtVGl0bGUoamF2YS5sYW5nLlN0cmluZyBuZXdDb25maXJtVGl0bGUpIHsKLQkJY29uZmlybVRpdGxlID0gbmV3Q29uZmlybVRpdGxlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvOS8yMDAxIDExOjUxOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFcnJvclRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JUaXRsZShqYXZhLmxhbmcuU3RyaW5nIG5ld0Vycm9yVGl0bGUpIHsKLQkJZXJyb3JUaXRsZSA9IG5ld0Vycm9yVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC85LzIwMDEgMTE6NTE6MzYgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0luZm9ybWF0aW9uVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvblRpdGxlKGphdmEubGFuZy5TdHJpbmcgbmV3SW5mb3JtYXRpb25UaXRsZSkgewotCQlpbmZvcm1hdGlvblRpdGxlID0gbmV3SW5mb3JtYXRpb25UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlciNnZXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRTaGVsbCgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJVGVzdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSVRlc3RlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyYTZjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJVGVzdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSVRlc3RlcjsKLQotcHVibGljIGNsYXNzIFVJVGVzdGVySW1wbCBpbXBsZW1lbnRzIFVJVGVzdGVyIHsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgVUlUZXN0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlVJVGVzdGVyI2lzQ3VycmVudENvbnRleHRVSSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDdXJyZW50Q29udGV4dFVJKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkgfHwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlLCB3b3JrYmVuY2ggbXVzdCBub3QgYmUgcnVubmluZwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1ZhbGlkYXRpb25TdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVmFsaWRhdGlvblN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDhmNmI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVmFsaWRhdGlvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGVuY29tcGFzIGEgc2V0IG9mIFZhbGlkYXRpb24gc3RhdHVzIENyZWF0aW9uIGRhdGU6ICg5LzEwLzIwMDEgNTozNToxMiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblN0YXR1cyB7Ci0KLQkvLyBUT0RPIG1ha2UgYWxsIHRoZXNlIHZhcnMgcHJpdmF0ZSBhbmQgY2hhbmdlIGVyck1zZ3MgJiBlcnJTdGF0dXMgdG8gbWFwcyBzbyB0aGUgc2FtZSBtZXRob2RzCi0JLy8gY2FuIGJlIHVzZWQgYXMgd2l0aCB3YXJuaW5ncyAmIGluZm8KLQlIYXNodGFibGUgZXJyTXNncyA9IG5ldyBIYXNodGFibGUoKTsKLQlIYXNodGFibGUgZXJyU3RhdHVzID0gbmV3IEhhc2h0YWJsZSgpOwotCUhhc2h0YWJsZSB0Q29udHJvbHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JTWFwIHdhcm5Nc2dzOwotCU1hcCB3YXJuU3RhdHVzOwotCU1hcCBpbmZvTXNnczsKLQlNYXAgaW5mb1N0YXR1czsKLQotCS8qKgotCSAqIFZhbGlkYXRpb25TdGF0dXMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblN0YXR1cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIExvb2sgZm9yIGFueSBlcnJvci4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgcmV0dXJuIGVycm9ycyBhY2NvcmRpbmcgdG8gdGhlaXIga2V5LiBpLmUuLAotCSAqIGxvd2VyIGtleSBlcnJvcnMgd2lsbCBiZSByZXR1cm5lZCBmaXJzdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhc3RFcnJNc2coKSB7Ci0JCS8vVE9ETyBvbmNlIGl2YXJzIGFyZSBjaGFuZ2VkIHRvIG1hcHMsIHBhc3MgdGhpcyB0byBnZXRMYXN0TXNnKCkKLQkJRW51bWVyYXRpb24gZSA9IGVyclN0YXR1cy5rZXlzKCk7Ci0JCVN0cmluZ1tdIGVycnMgPSBuZXcgU3RyaW5nW2VyclN0YXR1cy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVycnMubGVuZ3RoOyBpKyspCi0JCQllcnJzW2ldID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZE9uZSA9IGZhbHNlOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSW50ZWdlciBrZXkgPSAoSW50ZWdlcikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCEoKEJvb2xlYW4pIGVyclN0YXR1cy5nZXQoa2V5KSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQllcnJzW2tleS5pbnRWYWx1ZSgpICUgZXJycy5sZW5ndGhdID0gKFN0cmluZykgZXJyTXNncy5nZXQoa2V5KTsKLQkJCQlmb3VuZE9uZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvdW5kT25lKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJzLmxlbmd0aDsgaSsrKQotCQkJCWlmIChlcnJzW2ldICE9IG51bGwpCi0JCQkJCXJldHVybiBlcnJzW2ldOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRXYXJuaW5nTXNncygpIHsKLQkJaWYgKHdhcm5Nc2dzID09IG51bGwpCi0JCQl3YXJuTXNncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiB3YXJuTXNnczsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRXYXJuaW5nU3RhdHVzTWFwKCkgewotCQlpZiAod2FyblN0YXR1cyA9PSBudWxsKQotCQkJd2FyblN0YXR1cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiB3YXJuU3RhdHVzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldEluZm9Nc2dzKCkgewotCQlpZiAoaW5mb01zZ3MgPT0gbnVsbCkKLQkJCWluZm9Nc2dzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGluZm9Nc2dzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldEluZm9TdGF0dXNNYXAoKSB7Ci0JCWlmIChpbmZvU3RhdHVzID09IG51bGwpCi0JCQlpbmZvU3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGluZm9TdGF0dXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXN0V2FybmluZ01zZygpIHsKLQkJcmV0dXJuIGdldExhc3RNc2cod2FyblN0YXR1cywgd2Fybk1zZ3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdEluZm9Nc2coKSB7Ci0JCXJldHVybiBnZXRMYXN0TXNnKGluZm9TdGF0dXMsIGluZm9Nc2dzKTsKLQl9Ci0KLQkvKgotCSAqIExvb2sgZm9yIGFueSBzdGF0dXMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIHJldHVybiBzdGF0dXMgYWNjb3JkaW5nIHRvIHRoZWlyIGtleS4gaS5lLiwKLQkgKiBsb3dlciBrZXkgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQgZmlyc3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGFzdE1zZyhNYXAgc3RhdHVzTWFwLCBNYXAgbXNnTWFwKSB7Ci0JCWlmIChzdGF0dXNNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJdGVyYXRvciBlID0gc3RhdHVzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIGluZm9zID0gbmV3IFN0cmluZ1tzdGF0dXNNYXAuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykKLQkJCWluZm9zW2ldID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZE9uZSA9IGZhbHNlOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUludGVnZXIga2V5ID0gKEludGVnZXIpIGUubmV4dCgpOwotCQkJaWYgKCEoKEJvb2xlYW4pIHN0YXR1c01hcC5nZXQoa2V5KSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpbmZvc1trZXkuaW50VmFsdWUoKSAlIGluZm9zLmxlbmd0aF0gPSAoU3RyaW5nKSBtc2dNYXAuZ2V0KGtleSk7Ci0JCQkJZm91bmRPbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZE9uZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGluZm9zW2ldICE9IG51bGwpCi0JCQkJCXJldHVybiBpbmZvc1tpXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXN0RXJyTXNnQW5kRm9jdXMoKSB7Ci0KLQkJRW51bWVyYXRpb24gZSA9IGVyclN0YXR1cy5rZXlzKCk7Ci0KLQkJSW50ZWdlciB0aGVPbmUgPSBudWxsOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSW50ZWdlciBrZXkgPSAoSW50ZWdlcikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCEoKEJvb2xlYW4pIGVyclN0YXR1cy5nZXQoa2V5KSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAodGhlT25lID09IG51bGwgfHwga2V5LmludFZhbHVlKCkgPCB0aGVPbmUuaW50VmFsdWUoKSkgewotCQkJCQl0aGVPbmUgPSBrZXk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0aGVPbmUgIT0gbnVsbCkgewotCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHRDb250cm9scy5nZXQodGhlT25lKTsKLQkJCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCQljb250cm9sLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gKChTdHJpbmcpIGVyck1zZ3MuZ2V0KHRoZU9uZSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0Vycm9yKEludGVnZXIga2V5KSB7Ci0JCUJvb2xlYW4gc3RhdCA9IChCb29sZWFuKSBlcnJTdGF0dXMuZ2V0KGtleSk7Ci0JCWlmIChzdGF0ICE9IG51bGwpCi0JCQlyZXR1cm4gc3RhdC5ib29sZWFuVmFsdWUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udHJvbChJbnRlZ2VyIGtleSwgQ29udHJvbCBjb250cm9sKSB7Ci0JCXRDb250cm9scy5wdXQoa2V5LCBjb250cm9sKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclN0YXR1cyhJbnRlZ2VyIGtleSwgQm9vbGVhbiBzdGF0dXMsIFN0cmluZyBtc2cpIHsKLQkJZXJyTXNncy5wdXQoa2V5LCBtc2cpOwotCQllcnJTdGF0dXMucHV0KGtleSwgc3RhdHVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclN0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIG1zZykgewotCQllcnJNc2dzLnB1dChrZXksIG1zZyk7Ci0JCWVyclN0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdhcm5pbmdTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBtc2cpIHsKLQkJZ2V0V2FybmluZ01zZ3MoKS5wdXQoa2V5LCBtc2cpOwotCQlnZXRXYXJuaW5nU3RhdHVzTWFwKCkucHV0KGtleSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmZvU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgbXNnKSB7Ci0JCWdldEluZm9Nc2dzKCkucHV0KGtleSwgbXNnKTsKLQkJZ2V0SW5mb1N0YXR1c01hcCgpLnB1dChrZXksIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T0tTdGF0dXMoSW50ZWdlciBrZXkpIHsKLQkJZXJyTXNncy5wdXQoa2V5LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZXJyU3RhdHVzLnB1dChrZXksIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJaWYgKHdhcm5Nc2dzICE9IG51bGwpCi0JCQl3YXJuTXNncy5wdXQoa2V5LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHdhcm5TdGF0dXMgIT0gbnVsbCkKLQkJCXdhcm5TdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQlpZiAoaW5mb01zZ3MgIT0gbnVsbCkKLQkJCWluZm9Nc2dzLnB1dChrZXksICIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5mb1N0YXR1cyAhPSBudWxsKQotCQkJaW5mb1N0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzKEludGVnZXIga2V5LCBib29sZWFuIG9rLCBTdHJpbmcgbXNnKSB7Ci0JCWVyck1zZ3MucHV0KGtleSwgbXNnKTsKLQkJZXJyU3RhdHVzLnB1dChrZXksIG5ldyBCb29sZWFuKG9rKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNGM5N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQbHVnaW5Db250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5Xb3JrYmVuY2hBY3Rpdml0eUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuYWN0aXZpdGllcy5XVFBBY3Rpdml0eUJyaWRnZUhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwgaW1wbGVtZW50cyBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0ID0gbnVsbDsKLQlwcml2YXRlIElBY3Rpdml0eU1hbmFnZXIgYWN0aXZpdHlNYW5hZ2VyID0gbnVsbDsKLQotCXB1YmxpYyBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwoKSB7Ci0JCXdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCk7Ci0JCWFjdGl2aXR5TWFuYWdlciA9IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydC5nZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVBY3Rpdml0eShTdHJpbmcgYWN0aXZpdHlJRCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCVNldCBlbmFibGVkQWN0aXZpdGllcyA9IGFjdGl2aXR5TWFuYWdlci5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKTsKLQkJU2V0IG5ld0VuYWJsZWRBY3Rpdml0aWVzID0gbnVsbDsKLQkJaWYgKGVuYWJsZWQgJiYgIWVuYWJsZWRBY3Rpdml0aWVzLmNvbnRhaW5zKGFjdGl2aXR5SUQpKSB7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcy5hZGRBbGwoZW5hYmxlZEFjdGl2aXRpZXMpOwotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5SUQpOwotCQl9Ci0JCWlmICghZW5hYmxlZCAmJiBlbmFibGVkQWN0aXZpdGllcy5jb250YWlucyhhY3Rpdml0eUlEKSkgewotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMuYWRkQWxsKGVuYWJsZWRBY3Rpdml0aWVzKTsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzLnJlbW92ZShhY3Rpdml0eUlEKTsKLQkJfQotCQlpZiAobnVsbCAhPSBuZXdFbmFibGVkQWN0aXZpdGllcykgewotCQkJc2V0RW5hYmxlZEFjdGl2aXR5SWRzKG5ld0VuYWJsZWRBY3Rpdml0aWVzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCkgewotCQlyZXR1cm4gYWN0aXZpdHlNYW5hZ2VyLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRBY3Rpdml0eUlkcyhTZXQgYWN0aXZpdHlJRHMpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCXdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydC5zZXRFbmFibGVkQWN0aXZpdHlJZHMoYWN0aXZpdHlJRHMpOwotCQl9IGVsc2UgewotCQkJZmluYWwgU2V0IG5ld0FjdGl2aXR5SURzID0gYWN0aXZpdHlJRHM7IAotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0LnNldEVuYWJsZWRBY3Rpdml0eUlkcyhuZXdBY3Rpdml0eUlEcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEFjdGl2aXR5SURzRnJvbUNvbnRyaWJ1dGlvbihmaW5hbCBTdHJpbmcgbG9jYWxJRCwgZmluYWwgU3RyaW5nIHBsdWdpbklEKSB7Ci0JCUlJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBhY3Rpdml0eU1hbmFnZXIuZ2V0SWRlbnRpZmllcihXb3JrYmVuY2hBY3Rpdml0eUhlbHBlci5jcmVhdGVVbmlmaWVkSWQobmV3IElQbHVnaW5Db250cmlidXRpb24oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldExvY2FsSWQoKSB7Ci0JCQkJcmV0dXJuIGxvY2FsSUQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCQkJcmV0dXJuIHBsdWdpbklEOwotCQkJfQotCQl9KSk7Ci0JCXJldHVybiBpZGVudGlmaWVyLmdldEFjdGl2aXR5SWRzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhMDIyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciA5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGx1Z2luQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQ7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV1RQQWN0aXZpdHlIZWxwZXIgewotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBVSSBpcyBzZXQgdXAgdG8gZmlsdGVyIGNvbnRyaWJ1dGlvbnMgKGhhcyBkZWZpbmVkIGFjdGl2aXR5IGNhdGVnb3JpZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0ZpbHRlcmluZygpIHsKLQkJcmV0dXJuICFQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpLmdldEFjdGl2aXR5TWFuYWdlcigpLmdldERlZmluZWRBY3Rpdml0eUlkcygpLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsb3dVc2VPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghaXNGaWx0ZXJpbmcoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVBsdWdpbkNvbnRyaWJ1dGlvbikgewotCQkJSVBsdWdpbkNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSAoSVBsdWdpbkNvbnRyaWJ1dGlvbikgb2JqZWN0OwotCQkJaWYgKGNvbnRyaWJ1dGlvbi5nZXRQbHVnaW5JZCgpICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCk7Ci0JCQkJSUlkZW50aWZpZXIgaWRlbnRpZmllciA9IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydC5nZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXRJZGVudGlmaWVyKGNyZWF0ZVVuaWZpZWRJZChjb250cmlidXRpb24pKTsKLQkJCQlyZXR1cm4gaWRlbnRpZmllci5pc0VuYWJsZWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNyZWF0ZVVuaWZpZWRJZChJUGx1Z2luQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbikgewotCQlpZiAoY29udHJpYnV0aW9uLmdldFBsdWdpbklkKCkgIT0gbnVsbCkKLQkJCXJldHVybiBjb250cmlidXRpb24uZ2V0UGx1Z2luSWQoKSArICcvJyArIGNvbnRyaWJ1dGlvbi5nZXRMb2NhbElkKCk7Ci0JCXJldHVybiBjb250cmlidXRpb24uZ2V0TG9jYWxJZCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3Nzk2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDIzLCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICovCi1wdWJsaWMgY2xhc3MgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJ3dHBjb21tb251aSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdF9sb2NhdGlvbl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQT3BlcmF0aW9uQWN0aW9uX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFzdGVyRGVzY3JpcHRvcl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUE9wdGlvbmFsT3BlcmF0aW9uRGF0YU1vZGVsX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQT3BlcmF0aW9uQWN0aW9uX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQT3B0aW9uYWxPcGVyYXRpb25EYXRhTW9kZWxfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNVUxUSVBMRV9NT0RVTEVfUFJFRl9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElBY3Rpb25XVFBPcGVyYXRpb25fVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXN0ZXJEZXNjcmlwdG9yX0VSUk9SXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQV2l6YXJkX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQV2l6YXJkX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQV2l6YXJkX1VJXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJvd3NlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlbmRhYmxlV2l6YXJkX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZW5kZWRXaXphcmRQYWdlX0VSUk9SXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZW5kZWRXaXphcmRQYWdlX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQQWN0aW9uRGlhbG9nX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGltZXJRdWV1ZV9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpbWVyX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGltZXJfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlX1VJXzA7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBHZW5lcmljQWN0aW9uSWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEdlbmVyaWNBY3Rpb25JZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxYjhlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEdlbmVyaWNBY3Rpb25JZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE2LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdUUEdlbmVyaWNBY3Rpb25JZHMgewotCi0JU3RyaW5nIENVVCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuQ3V0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT1BZID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZ2VuZXJpYy5Db3B5IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQVNURSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuUGFzdGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuUmVuYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5nZW5lcmljLkRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTY5YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgamF2YS5sYW5nLlRocm93YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdUUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOREVEX1ZJRVdFUl9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiZXh0ZW5kZWRWaWV3ZXIiOyAvLyROT04tTkxTLTEkCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXVFBVSVBsdWdpbiBwbHVnaW47Ci0JLy8gUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFdUUFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlRXJyb3JTdGF0dXMobWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAtMSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXVFBVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya2JlbmNoCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIGoyZWUgcGx1Z2luIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2ggZ2V0UGx1Z2luV29ya2JlbmNoKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBSdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIgZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoZmluYWwgSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlT3BlcmF0aW9uV3JhcHBlcihvcGVyYXRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXVFBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgVGhyb3dhYmxlIGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICsgIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgZSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgSVN0YXR1cyBzdGF0dXMgKQotICAgIHsKLSAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyggc3RhdHVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCApICk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBleGNlcHRpb24uZ2V0U3RhdHVzKCkgKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKSk7Ci0JfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdiNmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBBbiBvcGVyYXRpb24gd2hpY2ggZGVsZWdhdGVzIGl0cyB3b3JrIHRvIGEgcnVubmFibGUgdGhhdCBtb2RpZmllcyB0aGUgd29ya3NwYWNlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBMaXN0IGZSdW5uYWJsZXM7Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJc3VwZXIocnVsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdHMgd29yayB0byB0aGUgZ2l2ZW4gcnVubmFibGUuCi0JICovCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJU2NoZWR1bGluZ1J1bGUgcnVsZSwgTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIocnVsZSk7Ci0JCWdldFJ1bm5hYmxlcygpLmFkZEFsbChuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihMaXN0IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzcykgewotCQlzdXBlcigpOwotCQlnZXRSdW5uYWJsZXMoKS5hZGRBbGwobmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiB3aGljaCB3aWxsIGRlbGVnYXRlIGl0cyB3b3JrIHRvIHRoZSBnaXZlbiBydW5uYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqICAgICAgICAgICAgdGhlIHJ1bm5hYmxlIHRvIGRlbGVnYXRlIHRvIHdoZW4gdGhpcyBvcGVyYXRpb24gaXMgZXhlY3V0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXN1cGVyKCk7Ci0JCWdldFJ1bm5hYmxlcygpLmFkZChuZXN0ZWRPcCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkUnVubmFibGUoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXJldHVybiBnZXRSdW5uYWJsZXMoKS5hZGQobmVzdGVkT3ApOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnl7Ci0JCQlMaXN0IHJ1bm5hYmxlcyA9IGdldFJ1bm5hYmxlcygpOwotCQkJaWYocnVubmFibGVzLnNpemUoKSA9PSAwKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcnVubmFibGVzLnNpemUoKSk7Ly8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW5uYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSAoSVJ1bm5hYmxlV2l0aFByb2dyZXNzKSBydW5uYWJsZXMuZ2V0KGkpOwotCQkJCW9wLnJ1bihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSdW5uYWJsZXMoKSB7Ci0JCWlmIChmUnVubmFibGVzID09IG51bGwpCi0JCQlmUnVubmFibGVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJcmV0dXJuIGZSdW5uYWJsZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOGZlMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+d3RwIG9wZXJhdGlvbiBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD4KLQkJCVRoZSBXVFAgV2l6YXJkIEFQSSBhbGxvd3MgY2xpZW50cyB0byBidWlsZCB3aXphcmRzIGluIGNvbmp1bmN0aW9uIHdpdGgKLQkJCXRoZSBXVFAgT3BlcmF0aW9uIEZyYW1ld29yayBxdWlja2x5IGFuZCB3aXRoIG1pbmltYWwgZWZmb3J0LgotCQk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5VbmRlciBDb25zdHJ1Y3Rpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEwIj4KLTx0cj4KLTx0ZD4KLTxwPgotPGltZyBzcmM9ImVzY2FwZV9vdXRfdG9fc291cmNlX2ZvbGRlciBsZXZlbC9vdmVydmlldy95b3VyX2ltYWdlLmpwZyI+PC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpPkZpZ3VyZSAxOiBJbWFnZSBkZXNjcmlwdGlvbjwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE3YTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0JPGhlYWQ+Ci0JCTxtZXRhCi0JCQluYW1lPSJyb290IgotCQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCQk8dGl0bGU+d3RwIG9wZXJhdGlvbiBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotCTwvaGVhZD4KLQotCTxib2R5PgotCQk8YWJzdHJhY3Q+Ci0JCQlUaGUgV1RQIFdpemFyZCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gYnVpbGQgd2l6YXJkcyBpbiBjb25qdW5jdGlvbiB3aXRoCi0JCQl0aGUgV1RQIE9wZXJhdGlvbiBGcmFtZXdvcmsgcXVpY2tseSBhbmQgd2l0aCBtaW5pbWFsIGVmZm9ydC4KLQkJPC9hYnN0cmFjdD4KLQkJPHA+VW5kZXIgQ29uc3RydWN0aW9uLjwvcD4KLQkJPGltZyBzcmM9ImVzY2FwZV9vdXRfdG9fc291cmNlX2ZvbGRlciBsZXZlbC9vdmVydmlldy95b3VyX2ltYWdlLmpwZyIgY2FwdGlvbj0iSW1hZ2UgZGVzY3JpcHRpb24iIC8+Ci0JPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNGQ5MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1ub25fd29ya2JlbmNoLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Mjg1ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotY29tbW9uX2NvcmUuamFyCi1jb21tb24uamFyCi1jb21tb25fY29yZXNyYy56aXAKLWNvbW1vbnNyYy56aXAKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYWFiOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW9yZy5lY2xpcHNlLnd0cC5jb21tb24vZGVidWcvbG9ndHJhY2U9ZmFsc2UKLW9yZy5lY2xpcHNlLnd0cC5jb21tb24vZGVidWcvbG9ndHJhY2VmaWxlPWZhbHNlCi1vcmcuZWNsaXBzZS53dHAuY29tbW9uL2RlYnVnL2xvZ2xldmVsPVdBUk5JTkcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY0NThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3YTRlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0jTW9uIEp1biAwOCAxNTozNTo0NSBFRFQgMjAwOQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZVVuY2hlY2tlZEV4Y2VwdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTI1YWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrczsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuYWN0aXZpdGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwMCwyLjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDExMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzcmMtbm9uX3dvcmtiZW5jaC8sXAotICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNTI2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+Ci0gIDxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLSAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0KLSAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Ci0gICAgPHR5cGUgbmFtZT0iQ2hvaWNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJFbnZpcm9ubWVudEV4Y2VwdGlvbiIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iRW52aXJvbm1lbnRTZXJ2aWNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJRW52aXJvbm1lbnQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iSUxvZyIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJU3RhdHVzSGFuZGxlciIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJOdWxsU3RhdHVzSGFuZGxlciIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iU3RhdHVzRXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgPC9wYWNrYWdlPgotIAotICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+Ci0gICAgPHR5cGUgbmFtZT0iSVVSSSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJVVJJRmFjdG9yeSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJVVJJRmlsdGVyIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklVUklTY2hlbWUiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iSVVSSVZpc2l0b3IiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iU2ltcGxlVVJJRmFjdG9yeSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iVVJJRXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgPC9wYWNrYWdlPgotCi0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwiPjwvcGFja2FnZT4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2ZDIwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXI9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9Q29tbW9uIEZyYW1ld29ya3MKLU9wZXJhdGlvbkV4dGVuc2lvbj1PcGVyYXRpb25FeHRlbnNpb24KLUZ1bmN0aW9uX0V4dGVuc2lvbl9Hcm91cD1GdW5jdGlvbiBFeHRlbnNpb24gR3JvdXAKLVdUUEFjdGl2aXR5QnJpZGdlSGVscGVyPVdUUEFjdGl2aXR5QnJpZGdlSGVscGVyCi1EYXRhTW9kZWxQcm92aWRlcj1EYXRhTW9kZWxQcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MTdlNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJPcGVyYXRpb25FeHRlbnNpb24iIG5hbWU9IiVPcGVyYXRpb25FeHRlbnNpb24iIHNjaGVtYT0ic2NoZW1hL09wZXJhdGlvbkV4dGVuc2lvbi5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJmdW5jdGlvbkdyb3VwIiBuYW1lPSIlRnVuY3Rpb25fRXh0ZW5zaW9uX0dyb3VwIiBzY2hlbWE9InNjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IldUUEFjdGl2aXR5QnJpZGdlSGVscGVyIiBuYW1lPSIlV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiIHNjaGVtYT0ic2NoZW1hL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIiBuYW1lPSIlRGF0YU1vZGVsUHJvdmlkZXIiIHNjaGVtYT0ic2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLnNhdmVIYW5kbGVyIgotICAgICAgICAgbmFtZT0iU2F2ZSBIYW5kbGVyIC0gSGVhZGxlc3MgQ29udGV4dCBDbGFzcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9InNhdmVIYW5kbGVyIgotICAgICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlSGFuZGxlckhlYWRsZXNzIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlciI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgIGtleT0iSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzIgotICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGM3ZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5jb21tb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9zcmMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9zcmMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMTk4NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIGlkPSJEYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiIgbmFtZT0iRGF0YSBNb2RlbCBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGV4dGVuZCBhbiBleGlzdGluZyBkYXRhIG1vZGVsIHByb3ZpZGVyIHdpdGggYSBjdXN0b20gZGF0YSBtb2RlbCBwcm92aWRlci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iRGF0YU1vZGVsUHJvdmlkZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IlByb3ZpZGVyRGVmaW5lc1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IlByb3ZpZGVySW1wbGVtZW50c1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIG1vZGVsIHByb3ZpZGVyIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgdG8gZXh0ZW5kCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IlByb3ZpZGVyRGVmaW5lc1R5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlclR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgZGVmaW5lcwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVySUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaWRlbnRpZmllciBmb3IgdGhlIGRlZmluZWQgdHlwZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJQcm92aWRlckltcGxlbWVudHNUeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdmlkZXJUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCB0eXBlIHRoZSBkYXRhIG1vZGVsIHByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlcklEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGlkZW50aWZpZXIgZm9yIHRoZSBpbXBsZW1lbnRlZCB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9PcGVyYXRpb25FeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9PcGVyYXRpb25FeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmMWVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvT3BlcmF0aW9uRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgaWQ9Ik9wZXJhdGlvbkV4dGVuc2lvbiIgbmFtZT0iT3BlcmF0aW9uIEV4dGVuc2lvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGlzIHRoZSBtZXRob2RvbG9neSBmb3IgZXh0ZW5kaW5nIGFuIGV4aXN0aW5nIG9wZXJhdGlvbiBieSBhZGRpbmcgZWl0aGVyIGEgcHJlIG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCBwcmlvciwgb3IgYSBwb3N0IG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3BlcmF0aW9uRXh0ZW5zaW9uIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJvcGVyYXRpb25FeHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByZU9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwcmUtb3BlcmF0aW9uIGNsYXNzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvc3RPcGVyYXRpb25DbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcG9zdC1vcGVyYXRpb24gY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaWQgb2YgdGhlIG9wZXJhdGlvbiB0byBleHRlbmQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkNTBlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBpZD0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiIG5hbWU9IldUUCBBY3Rpdml0eSBCcmlkZ2UgSGVscGVyIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgaXMgdXNlZCB0byBkZWNsYXJlIGFuIGFjdGl2aXR5IGJyaWRnZSBoZWxwZXIgd2hpY2ggaXMgdXNlZnVsIHdoZW4gZW5hYmxpbmcgY2FwYWJpbGl0aWVzLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IldUUEFjdGl2aXR5QnJpZGdlSGVscGVyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyIGNsYXNzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvZnVuY3Rpb25Hcm91cC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA5NTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgaWQ9ImZ1bmN0aW9uR3JvdXAiIG5hbWU9IkZ1bmN0aW9uIEV4dGVuc2lvbiBHcm91cCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBBIGZ1bmN0aW9uR3JvdXAgcHJvdmlkZXMgYSBncm91cGluZyBvZiByZWxhdGVkIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNvbnRyaWJ1dGVkIHRvIHRoZSB0b29scy4gIEZvciBleGFtcGxlLCBhIHRoaXJkIHBhcnR5IGNvbXBvbmVudCBtYXkgd2FudCB0byBjb250cmlidXRlIGFjdGlvbnMsIGVkaXRvciBwYWdlcywgZWRpdCBtb2RlbCByZXNvdXJjZXMsIGFuZCBtYW55IG90aGVyIGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBhIGdpdmVuIHByb2R1Y3QuICBCeSBhc3NvY2lhdGluZyBhbGwgdGhlc2UgZnVuY3Rpb25zIHdpdGggYSBncm91cCBpZCwgYSBtZWNoYW5pc20gaXMgZXhwb3NlZCBmb3IgdXNlcnMgdG8gc2VsZWN0aXZlbHkgZW5hYmxlIGFuZCBkaXNhYmxlIGJhc2tldHMgb2YgZnVuY3Rpb24uICBFeHRlbnNpb24gcG9pbnRzIHRoYXQgYWxsb3cgZm9yIGEgJnF1b3Q7Z3JvdXBJRCZxdW90OyBhdHRyaWJ1dGUgZ2VuZXJhbGx5IHdpbGwgaGlkZSB0aG9zZSBmdW5jdGlvbnMgd2hlbiB0aGUgZ3JvdXAgaWQgaXMgZGlzYWJsZWQuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZnVuY3Rpb25Hcm91cCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZnVuY3Rpb25Hcm91cCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IGRlZmluaXRpb24gZm9yIGEgZ3JvdXAuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbkdyb3VwSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSB1bmlxdWUgaWQgZm9yIHRoZSBncm91cC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIGh1bWFuIHJlYWRhYmxlIG5hbWUuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGdyb3VwLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHBhdGggdG8gYW4gaWNvbiBpbWFnZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHVybCBmb3IgdGhlIGZ1bmN0aW9uIGdyb3VwLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBPcmRlcmluZyBtYWduaXR1ZGUgb2YgcGx1Z2lucw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsaXplckNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBDbGFzcyB1c2VkIHRvIGRldGVybWluZSBwbHVnaW4gZW5hYmxlbWVudA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgYWxsb3dzIG9uZSB0byBiaW5kIGZ1bmN0aW9uIGdyb3VwcyB0byBwYXR0ZXJucy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uR3JvdXBJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZ1bmN0aW9uIGdyb3VwIHRvIGJpbmQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdHRlcm4iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHBhdHRlcm4gdG8gYmUgYm91bmQuIFBhdHRlcm5zIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zIHdoaWNoIG1hdGNoIHVuaXF1ZSBpZGVudGlmaWVycy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5mdW5jdGlvbkdyb3VwJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtmdW5jdGlvbkdyb3VwDQotICAgICAgICAgICAgbmFtZT0mcXVvdDtBY21lIENvLiBGdW5jdGlvbiBFeHRlbnNpb24mcXVvdDsNCi0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9JnF1b3Q7Y29tLmFjbWUuYWNtZXBybyZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O1RoZSBBY21lUHJvIEV4dGVuc2lvbnMgYWRkIGludGVncmF0aW9uIHRvIHRoZSBBY21lIFdlYiBTZXJ2ZXIuJnF1b3Q7DQotICAgICAgICAgICAgZW5hYmxlZEJ5RGVmYXVsdD0mcXVvdDt0cnVlJnF1b3Q7DQotICAgICAgICAgICAgaWNvbj0mcXVvdDsuLi4mcXVvdDsNCi0gICAgICAgICAgICB1cmw9JnF1b3Q7aHR0cDovL3d3dy5hY21lLmNvbS8mcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvSVdGVFdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL0lXRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MmJhZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvSVdGVFdyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aTsKLQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciBBcmNoaXZlUnVudGltZSBhbmQgQXJjaGl2ZVdyYXBwZWQgZXhjZXB0aW9ucywgd2hpY2ggY2FuIGNvbnRhaW4gbmVzdGVkCi0gKiBleGNlcHRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdGVFdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRBbGxNZXNzYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8KLQkgKiBpbm5lcm1vc3QsIGNvbmNhdGVuYXRlZCBhcyBvbmUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCk7Ci0KLQlwdWJsaWMgRXhjZXB0aW9uIGdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCk7Ci0KLQlwdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcyk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9XRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9XRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOTkwZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvV0ZUV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpOwotCi0vL2ltcG9ydCBjb20uaWJtLmV0b29scy53ZnQubmxzLldGVFV0aWxzUmVzb3VyY2VIYW5kbGVyOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDQvMDMvMDEgMTE6MTI6NTEgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFdGVFdyYXBwZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02ODg1MDQ0Mjc3Mzc3Nzg0NDI5TDsKLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgV0ZUV3JhcHBlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqLwotCXB1YmxpYyBXRlRXcmFwcGVkRXhjZXB0aW9uKFRocm93YWJsZSB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFdGVFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCwgU3RyaW5nIHMpIHsKLQkJc3VwZXIodGFyZ2V0LCBzKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCBvdXQgYSBzdGFjayB0cmFjZSB0byB0aGUgc3lzdGVtIGVyci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCXByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCS8vVE9ETyBhZGQgdGhpcyBiYWNrIGluCi0JCQkvLyBzLnByaW50bG4oV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl8iKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkID0gIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246IgotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7Ci0JCWlmIChnZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQlzLnByaW50bG4odGhpcyk7Ci0JCQkvL1RPRE8gYWRkIHRoaXMgYmFjayBpbgotCQkJLy8gcy5wcmludGxuKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2VfRVJST1JfIikpOwotCQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIKLQkJCWdldFRhcmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9Xb3JrYmVuY2hVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9Xb3JrYmVuY2hVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Y2FjNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvV29ya2JlbmNoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aTsKLQotcHVibGljIGNsYXNzIFdvcmtiZW5jaFV0aWwgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIFdvcmtiZW5jaFJ1bm5pbmcgPSBmYWxzZTsKLQotCXByaXZhdGUgV29ya2JlbmNoVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB3b3JrYmVuY2hJc1J1bm5pbmcoKSAtIHRlc3Qgd2hldGhlciBvciBub3Qgd2UgYXJlIHJ1bm5pbmcgaW4gdGhlIHdvcmtiZW5jaCBlbnZpcm9ubWVudC4KLQkgKiAKLQkgKiBAc2VlIEphdmFQbHVnaW4uc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdvcmtiZW5jaElzUnVubmluZygpIHsKLQkJcmV0dXJuIFdvcmtiZW5jaFJ1bm5pbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgaWYgeW91IGFyZSBydW5uaW5nIGluIGEgV29ya2JlbmNoIGVudmlyb25tZW50LgotCSAqIAotCSAqIEBzZWUgSmF2YVBsdWdpbi5zdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya2JlbmNoSXNSdW5uaW5nKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJV29ya2JlbmNoUnVubmluZyA9IGFCb29sZWFuOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGY4NzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotLyoqCi0gKiA8cD4KLSAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIGZvciBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIGltcGxlbWVudHMgSURhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBJU3RhdHVzLk9LLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgT0tfU1RBVFVTID0gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgSUVudmlyb25tZW50IGVudmlyb25tZW50OwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIElEYXRhTW9kZWwgdXNlZCBieSB0aGlzIElEYXRhTW9kZWxPcGVyYXRpb24KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWw7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmlkID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RydWN0b3IgdGFraW5nIGFuIElEYXRhTW9kZWwKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICB0aGUgSURhdGFNb2RlbCB1c2VkIHRvIGRyaXZlIHRoaXMgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoIiIpOyAvLyROT04tTkxTLTEkIC8vIFRPRE8gYWRkIGEgbGFiZWwgcHJvcGVydHkgdG8gSURhdGFNb2RlbD8/PwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuaWQgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHNldElEKCkuCi0JICogPHA+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI3NldElEKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ2V0SUQoKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI2dldElEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBzZXREYXRhTW9kZWwoKQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ2V0RGF0YU1vZGVsKCkKLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI2dldERhdGFNb2RlbCgpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRTY2hlZHVsaW5nUnVsZSgpIHJldHVybnMKLQkgKiA8Y29kZT5SZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI2dldFNjaGVkdWxpbmdSdWxlKCkKLQkgKi8KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkgcmV0dXJucwotCSAqIDxjb2RlPklXb3Jrc3BhY2UuQVZPSURfVVBEQVRFPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsT3BlcmF0aW9uI2dldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkgewotCQlyZXR1cm4gSVdvcmtzcGFjZS5BVk9JRF9VUERBVEU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGZyYW1ld29yayB3aWxsIHNldCB0aGUgZW52aXJvbm1lbnQgb24gdGhpcyBvcGVyYXRpb24gYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLiBUaGUgb3BlcmF0aW9uCi0JICogY2FuIHRoZW4gdXNlIHRoZSBlbnZpcm9ubWVudCB0byByZXBvcnQgc3RhdHVzLCBsb2cgaW5mb3JtYXRpb24sIGFuZCBhY2Nlc3MgcmVzb3VyY2VzIGluIGFuCi0JICogZW52aXJvbm1lbnQgbmV1dHJhbCB3YXkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbnYKLQkgKiAgICAgICAgICAgIHRoZSBlbnZpcm9ubWVudC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQgZW52KSB7Ci0JCWVudmlyb25tZW50ID0gZW52OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFuIG9wZXJhdGlvbiBjYW4gY2FsbCB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIGVudmlyb25tZW50IHRoYXQgaGFzIGJlZW4gc2V0IGJ5IHRoZSBvcGVyYXRpb25zCi0JICogZnJhbWV3b3JrLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybnMgYW4gZW52aXJvbm1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIElFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpIHsKLQkJcmV0dXJuIGVudmlyb25tZW50OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgZW1wdHkgaW1wbGVtZW50YXRpb24gb2YgcmVkby4KLQkgKiA8L3A+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgZW1wdHkgaW1wbGVtZW50YXRpb24gb2YgdW5kby4KLQkgKiA8L3A+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmMzMwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklEYXRhTW9kZWxQcm92aWRlcjwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIElEYXRhTW9kZWwgZm9yIHRoaXMgcHJvdmlkZXIuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIG1vZGVsID0gbnVsbDsKLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBIYXNoU2V0KCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0KCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjaW5pdCgpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiA8L3A+Ci0JICogQW4gaW1wbGVtZW5hdGlvbiBvZiBzZXREYXRhTW9kZWwoKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQW4gaW1wbGVtZW5hdGlvbiBvZiBnZXREYXRhTW9kZWwoKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGF0YU1vZGVsKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQotCS8qKgotCSAqIDwvcD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVuZWF0aW9uIG9mIHByb3BlcnR5U2V0KCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaGFzIGJlZW4gc2V0Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjcHJvcGVydHlTZXQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0RGVmYXVsdFByb3BlcnR5KCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZihBTExPV19FWFRFTlNJT05TLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZihSRVNUUklDVF9FWFRFTlNJT05TLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGlzUHJvcGVydHlFbmFibGVkKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIHZhbGlkYXRlKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvciBuZXN0ZWQgSURhdGFNb2RlbCBiZWluZyB2YWxpZGF0ZWQuCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGdldFByb3BlcnR5RGVzY3JpcHRvcigpLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzCi0JICogbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0RXh0ZW5kZWRDb250ZXh0KCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RXh0ZW5kZWRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZENvbnRleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGdldERlZmF1bHRPcGVyYXRpb24oKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0T3BlcmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXROYW1lKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGRpc3Bvc2UoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhIHByb3BlcnR5IGZyb20gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhIHByb3BlcnR5IG9uIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQltb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhIGJvb2xlYW4gcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhIGJvb2xlYW4gcHJvcGVydHkgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBwcm9wZXJ0eVZhbHVlKSB7Ci0JCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhbiBpbnQgcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0SW50UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0SW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbW9kZWwuZ2V0SW50UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNldHRpbmcgYW4gaW50IHByb3BlcnR5IG9uIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBpbnQgcHJvcGVydHkgdmFsdWUKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjc2V0SW50UHJvcGVydHkoU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0SW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IHByb3BlcnR5VmFsdWUpIHsKLQkJbW9kZWwuc2V0SW50UHJvcGVydHkocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYSBTdHJpbmcgcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIGlmIGEgcHJvcGVydHkgaXMgc2V0IGZyb20gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5pc1Byb3BlcnR5U2V0KHByb3BlcnR5TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyYjBiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGV2ZW50IGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgcHJvcGVydHkgY2hhbmdlcyBmcm9tIElEYXRhTW9kZWxzIHRvIHRoZWlyIElEYXRhTW9kZWxMaXN0ZW5lcnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2FkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lcikKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXIKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGF0YU1vZGVsRXZlbnQgewotCi0JLyoqCi0JICogPHA+Ci0JICogQSBmbGFnIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkncyB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNnZXRGbGFnKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9DSEcgPSAxOwotCi0JLyoqCi0JICogSW50ZXJuYWwuIENsaWVudHMgc2hvdWxkIG5vdCB1c2UuCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NIRyA9IDI7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGZsYWcgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcm9wZXJ0eSdzIGVuYWJsbWVudCBoYXMgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRGbGFnKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfQ0hHID0gMzsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZmxhZyB1c2VkIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5J3MgdmFsaWQgdmFsdWVzIGhhdmUgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpCi0JICogQHNlZSAjZ2V0RmxhZygpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURfVkFMVUVTX0NIRyA9IDQ7Ci0KLQotCXByaXZhdGUgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotCXByaXZhdGUgaW50IGZsYWc7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGF0YU1vZGVsRXZlbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKLQkgKiBAcGFyYW0gZmxhZwotCSAqICAgICAgICAgICAgY29udGFpbnMgYSBmbGFnIHNwZWNpZml5aW5nIHRoZSBldmVudCB0eXBlCi0JICovCi0JcHVibGljIERhdGFNb2RlbEV2ZW50KElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZykgewotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCXRoaXMuZmxhZyA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgSURhdGFNb2RlbCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgSURhdGFNb2RlbCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBmbGFnIGluZGljYXRpbmcgdGhlIGV2ZW50IHR5cGUuIFZhbGlkIHR5cGVzIGFyZToKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPlBST1BFUlRZX0NIRzwvY29kZT48L2xpPgotCSAqIDxsaT48Y29kZT5WQUxJRF9WQUxVRVNfQ0hHPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPkVOQUJMRV9DSEc8L2NvZGU+PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmbGFnIGluZGljYXRpbmcgdGhlIGV2ZW50IHR5cGUuCi0JICovCi0JcHVibGljIGludCBnZXRGbGFnKCkgewotCQlyZXR1cm4gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBJRGF0YU1vZGVsJ3MgcHJvcGVydHkuIFRoaXMgaXMgZXF1YXZhbGVudCB0bzoKLQkgKiA8Y29kZT5nZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShnZXRQcm9wZXJ0eU5hbWUoKSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkYXRhTW9kZWwncyBwcm9wZXJ0eS4KLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBJRGF0YU1vZGVsIHByb3BlcnR5J3MgZW5hYmxlbWVudCBzdGF0ZS4gVGhpcyBpcyBlcXVhdmFsZW50Ci0JICogdG86IDxjb2RlPmdldERhdGFNb2RlbCgpLmlzUHJvcGVydHlFbmFibGVkKGdldFByb3BlcnR5TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGFNb2RlbCBwcm9wZXJ0eSdzIGVuYWJsZW1lbnQgc3RhdGUuCi0JICogQHNlZSBJRGF0YU1vZGVsI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZCgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIElEYXRhTW9kZWwgcHJvcGVydHkncyB2YWxpZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4gVGhpcyBpcwotCSAqIGVxdWF2YWxlbnQgdG86IDxjb2RlPmdldERhdGFNb2RlbCgpLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhnZXRQcm9wZXJ0eU5hbWUoKSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkYXRhTW9kZWwgcHJvcGVydHkncyB2YWxpZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4MmE2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuRGF0YU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiA8cD4KLSAqIERhdGFNb2RlbEZhY3RvcnkgaXMgdXNlZCB0byBjcmVhdGUgSURhdGFNb2RlbCBpbnN0YW5jZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERhdGFNb2RlbEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyIHJlYWRlcjsKLQotCXByaXZhdGUgRGF0YU1vZGVsRmFjdG9yeSgpIHsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBMb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgSURhdGFNb2RlbFByb3ZpZGVyIGJ5IHRoZSBzcGVjaWZpZWQgaWQgYW5kIGNvbnN0cnVjdHMgYSBuZXcKLQkgKiBJRGF0YU1vZGVsLiBJZiB0aGUgSURhdGFNb2RlbFByb3ZpZGVyIGlzIG5vdCBmb3VuZCB0aGVuIGEgUnVudGltZUV4Y2VwdGlvbiBpcyBsb2dnZWQgYW5kIG51bGwKLQkgKiBpcyByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbFByb3ZpZGVySUQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgSURhdGFNb2RlbFByb3ZpZGVyCi0JICogQHJldHVybiBhIG5ldyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChTdHJpbmcgZGF0YU1vZGVsUHJvdmlkZXJJRCkgewotCQlJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBsb2FkUHJvdmlkZXIoZGF0YU1vZGVsUHJvdmlkZXJJRCk7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjcmVhdGVEYXRhTW9kZWwocHJvdmlkZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElEYXRhTW9kZWxQcm92aWRlciBsb2FkUHJvdmlkZXIoU3RyaW5nIGlkKSB7Ci0JCWlmIChudWxsID09IHJlYWRlcikgewotCQkJcmVhZGVyID0gbmV3IERhdGFNb2RlbEV4dGVuc2lvblJlYWRlcigpOwotCQl9Ci0JCXJldHVybiByZWFkZXIuZ2V0UHJvdmlkZXIoaWQpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBkYXRhTW9kZWxQcm92aWRlcklEcyBieSB0aGUgc3BlY2lmaWVkIGRhdGFNb2RlbFByb3ZpZGVyS2luZElELgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsUHJvdmlkZXJLaW5kSUQKLQkgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgaWQgb2YgdGhlIGRhdGFNb2RlbFByb3ZpZGVyS2luZElECi0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgdmFsaWQgZGF0YU1vZGVsUHJvdmlkZXJJRHMgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXREYXRhTW9kZWxQcm92aWRlcklEc0ZvcktpbmQoU3RyaW5nIGRhdGFNb2RlbFByb3ZpZGVyS2luZElEKSB7Ci0JCVN0cmluZ1tdIHZhbGlkUHJvdmlkZXJJRHMgPSBsb2FkUHJvdmlkZXJGb3JQcm92aWRlcktpbmQoZGF0YU1vZGVsUHJvdmlkZXJLaW5kSUQpOwotCQlyZXR1cm4gbnVsbCAhPSB2YWxpZFByb3ZpZGVySURzID8gdmFsaWRQcm92aWRlcklEcyA6IG5ldyBTdHJpbmdbMF07Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBsb2FkUHJvdmlkZXJGb3JQcm92aWRlcktpbmQoU3RyaW5nIHByb3ZpZGVyS2luZCkgewotCQlpZiAobnVsbCA9PSByZWFkZXIpIHsKLQkJCXJlYWRlciA9IG5ldyBEYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVhZGVyLmdldFByb3ZpZGVyRGVzY3JpcHRvcnNGb3JQcm92aWRlcktpbmQocHJvdmlkZXJLaW5kKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBCdWlsZHMgYW4ge0BsaW5rIElEYXRhTW9kZWx9IHVzaW5nIHRoZSBzcGVjaWZpZWQgQ2xhc3MuIFRoaXMgQ2xhc3Mgd2lsbAotCSAqIG5vcm1hbGx5IGJlIGEgc3ViIGludGVyZmFjZSBvZiB7QGxpbmsgSURhdGFNb2RlbFByb3BlcnRpZXN9LiBJZiB0aGUKLQkgKiBDbGFzcyBpdCBpcyBhbiB7QGxpbmsgSURhdGFNb2RlbFByb3BlcnRpZXN9LmNsYXNzIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIGF0dGVtcHQgdG8gdXNlIHRoZSB7QGxpbmsgSURhdGFNb2RlbFByb3BlcnRpZXMjX3Byb3ZpZGVyX2NsYXNzfSBmaWVsZCB0bwotCSAqIGxvYWQgdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IHdpdGggd2hpY2ggdG8gYmFjayB0aGUKLQkgKiB7QGxpbmsgSURhdGFNb2RlbH0uIElmIHRoaXMgZmFpbHMsIG9yIGlmIHRoZSBDbGFzcyBpcyBub3QgYW4gaW50ZXJmYWNlLAotCSAqIHRoZW4gdGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bwotCSAqIDxjb2RlPmNyZWF0ZURhdGFNb2RlbChhQ2xhc3MuZ2V0TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhQ2xhc3MKLQkgKiAgICAgICAgICAgIGFuIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllc30uY2xhc3Mgb3IgdGhlIGNsYXNzIHdob3NlIG5hbWUKLQkgKiAgICAgICAgICAgIGlzIHRoZSBpZCBvZiB0aGUgSURhdGFNb2RlbFByb3ZpZGVyCi0JICogQHJldHVybiBhIG5ldyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChDbGFzcyBhQ2xhc3MpIHsKLQkJaWYoYUNsYXNzLmlzSW50ZXJmYWNlKCkpewotCQkJCXRyeXsKLQkJCQkJQ2xhc3MgY2xhenogPSAoQ2xhc3MpYUNsYXNzLmdldEZpZWxkKCJfcHJvdmlkZXJfY2xhc3MiKS5nZXQobnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYoY2xhenogIT0gbnVsbCl7Ci0JCQkJCQlJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSAoSURhdGFNb2RlbFByb3ZpZGVyKWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCQkJCQlyZXR1cm4gY3JlYXRlRGF0YU1vZGVsKHByb3ZpZGVyKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmU7IHRoZSBpbnRlcmZhY2UgbWF5IG5vdCBoYXZlIGRlZmluZWQgdGhlIGZpZWxkIGFuZCBpcyByZWx5aW5nIG9uIGV4dGVuc2lvbnMuCi0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9ICAKLQkJfQotCQlyZXR1cm4gY3JlYXRlRGF0YU1vZGVsKGFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBuZXcgSURhdGFNb2RlbCB1c2luZyB0aGUgdGhlIHNwZWNpZmllZCBpbnN0YW5jZSBvZiBhbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqIEByZXR1cm4gYSBuZXcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoSURhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWlmIChudWxsID09IHByb3ZpZGVyKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IG5ldyBEYXRhTW9kZWxJbXBsKHByb3ZpZGVyKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzU3ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBwcm92aWRlcyBhIGh1bWFuIHJlYWRpYmxlIGRlc2NyaXB0aW9uIGZvciBhbiBJRGF0YU1vZGVsCi0gKiBwcm9wZXJ0eVZhbHVlLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nKQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIHJldHVybnMgYW4gYXJyYXkgb2YgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycy4gSWYKLQkgKiA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gYSAwIGxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIGZvcgotCSAqIGVhY2ggPGNvZGU+dmFsdWVzW2ldPC9jb2RlPiBpbiB0aGUgYXJyYXksIGEgbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnMgaXMgY3JlYXRlZAotCSAqIHVzaW5nIDxjb2RlPm5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzKHZhbHVlc1tpXSk7PC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcwotCSAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnMgYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGNyZWF0ZURlc2NyaXB0b3JzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAobnVsbCA9PSB2YWx1ZXMpIHsKLQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQl9Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIHJldHVybnMgYW4gYXJyYXkgb2YgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycy4gSWYKLQkgKiA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gYSAwIGxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIGZvcgotCSAqIGVhY2ggPGNvZGU+dmFsdWVzW2ldPC9jb2RlPiBhbmQgPGNvZGU+ZGVzY3JpcHRpb25zW2ldPC9jb2RlPiBpbiB0aGUgYXJyYXlzLCBhIG5ldwotCSAqIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBpcyBjcmVhdGVkIHVzaW5nCi0JICogPGNvZGU+bmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZXNbaV0sIGRlc2NyaXB0aW9uc1tpXSk7PC9jb2RlPi4gQm90aCBhcnJheXMKLQkgKiBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBkZXNjcmlwdGlvbnMgY29vcmVzcG9uZGluZyB0aGUgdmFsdWVzIGFycmF5Ci0JICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycyBhcnJheQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gY3JlYXRlRGVzY3JpcHRvcnMoT2JqZWN0W10gdmFsdWVzLCBTdHJpbmdbXSBkZXNjcmlwdGlvbnMpIHsKLQkJaWYgKG51bGwgPT0gdmFsdWVzKSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclswXTsKLQkJfQotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbdmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWRlc2NyaXB0b3JzW2ldID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZXNbaV0sIGRlc2NyaXB0aW9uc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCi0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcHJvcGVydHlWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eURlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBpcyBlcXVhdmFsZW50IHRvIGNhbGxpbmcgPGNvZGU+RGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5VmFsdWUsIG51bGwpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ5IHZhbHVlCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQl0aGlzLnByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eVZhbHVlIGFuZAotCSAqIHByb3BlcnR5RGVzY3JpcHRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKiBAcGFyYW0gcHJvcGVydHlEZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgdGhlIGh1bWFuIHJlYWRpYmxlIHByb2VwcnR5IGRlc2NyaXB0aW9uRgotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IHByb3BlcnR5VmFsdWUsIFN0cmluZyBwcm9wZXJ0eURlc2NyaXB0aW9uKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JCXRoaXMucHJvcGVydHlEZXNjcmlwdGlvbiA9IHByb3BlcnR5RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKCkgewotCQlyZXR1cm4gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGlibGUgcHJvcGVydHkgZGVzY3JpcHRpb24uIElmIGEgbm9uIG51bGwgZGVzY3JpcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLAotCSAqIHRoZW4gaXQgd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgcHJvcGVydHkgdmFsdWUncyA8Y29kZT50b1N0cmluZygpPC9jb2RlPiB3aWxsIGJlCi0JICogcmV0dXJuZWQgaWYgaXQgaXMgbm90IG51bGwuIE90aGVyd2lzZSB0aGUgZW1wdHkgU3RyaW5nICg8Y29kZT4iIjwvY29kZT4pIHdpbGwgYmUKLQkgKiByZXR1cm5lZC4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBuZXZlciBiZSByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgaHVtYW4gcmVhZGlibGUgcHJvcGVydHkgZGVzY3JpcHRpb24sIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkgewotCQlpZiAobnVsbCAhPSBwcm9wZXJ0eURlc2NyaXB0aW9uKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHlEZXNjcmlwdGlvbjsKLQkJfQotCQlTdHJpbmcgc3RyID0gKG51bGwgIT0gcHJvcGVydHlWYWx1ZSkgPyBwcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkgOiBudWxsOwotCQlyZXR1cm4gKG51bGwgIT0gc3RyKSA/IHN0ciA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJcmV0dXJuIGdldFByb3BlcnR5RGVzY3JpcHRpb24oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMxYzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxzIGFyZSB0aGUgY29yZSBwaWVjZSBvZiBhIGZyYW1ld29yayB1c2VkIHRvIHNpbXBsaWZ5IGRhdGEgY29sbGVjdGlvbiwgb3BlcmF0aW9uCi0gKiBleGVjdXRpb24sIGFuZCBXaXphcmQgZ2VuZXJhdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogSURhdGFNb2RlbHMgYXJlIHByaW1hcmlseSBhbiBpbnRlbGxpZ2VudCBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIGRhdGEuIEVhY2ggSURhdGFNb2RlbCB0cmFja3MKLSAqIHNwZWNpZmljIE9iamVjdHMga25vd24gYXMgInByb3BlcnRpZXMiLiBFYWNoIHByb3BlcnR5IG1heSBiZSBzZXQgb3IgZ2V0IHVzaW5nIGl0cyBwcm9wZXJ0eSBuYW1lLgotICogQSBDb2xsZWN0aW9uIG9mIHByb3BlcnR5IG5hbWVzIGZvciBhbiBJRGF0YU1vZGVsIGluc3RhbmNlIG1heSBiZSByZXRyZWl2ZWQgdXNpbmcKLSAqIDxjb2RlPmdldEFsbFByb3BlcnRpZXMoKTwvY29kZT4uIEluIGFkZGl0aW9uIHRvIGdldHRpbmcvc2V0dGluZyBwcm9wZXJ0aWVzLCBJRGF0YU1vZGVscyBtYXkKLSAqIGFsc28gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBmb3IgdW5zZXQgcHJvcGVydGllcywgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRvcnMgZm9yIHByb3BlcnRpZXMsCi0gKiBlbnVtZXJhdGlvbnMgb2YgdmFsaWQgcHJvcGVydHkgdmFsdWVzLCB2YWxpZGF0aW9uIGZvciBwcm9wZXJ0aWVzLCBhbmQgZW5hYmxlbWVudCBmb3IgcHJvcGVydGllcy4KLSAqIDwvcD4KLSAqIDxwPgotICogSURhdGFNb2RlbHMgbWF5IGFsc28gYmUgbmVzdGVkIChhbmQgdW5uZXN0ZWQpIHJlY3Vyc2l2ZWx5IHdpdGhpbiBhbm90aGVyLiBXaGVuIG9uZSBJRGF0YU1vZGVsIGlzCi0gKiBuZXN0ZWQgd2l0aGluIGFub3RoZXIsIHRoZW4gY2xpZW50IGNvZGUgbWF5IGFjY2VzcyBhbGwgcHJvcGVydGllcyBvbiB0aGUgZm9ybWVyIHRocm91Z2ggdGhlCi0gKiBsYXR0ZXIuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiB0aGUgc2FtZSBJRGF0YU1vZGVsICh0cmFja2luZyB0aGUgc2FtZSBwcm9wZXJ0aWVzKSBtYXkgYmUKLSAqIHVzZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHNldmVyYWwgZGlmZmVyZW50IGJyb2FkZXIgc2NlbmFyaW9zLiBOZXN0aW5nIG1heSBhcHBseSB0byBhbnkKLSAqIElEYXRhTW9kZWwsIGFuZCBtYXkgYmUgYWJpdHJhcnlseSBkZWVwIChldmVuIGN5bGljYWwgaWYgeW91IGRhcmUpLiBOZXN0aW5nIG9mZmVycyBmbGV4aWJpbGl0eSwKLSAqIGVzcGVjaWFsbHkgZm9yIGV4dGVuc2lvbiBieSAzcmQgcGFydHkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogRWFjaCBJRGF0YU1vZGVsIG1heSBhbHNvIHN1cHBseSBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uIChhIHN1YmNsYXNzIG9mCi0gKiBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uKSBmb3IgZXhlY3V0aW9uLiBXaGVuIGV4ZWN1dGVkIHdpdGhpbiB0aGUKLSAqIElEYXRhTW9kZWwgZnJhbWV3b3JrIGFsbCB0aGVzZSBvcGVyYXRpb25zIGFyZSBpbmhlcmVudGx5IGFuZCBhYml0cmFyaWx5IGV4dGVuZGFibGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEVhY2ggSURhdGFNb2RlbCBtYXkgYWxzbyBpbmRpcmVjdGx5IHN1cHBseSBhIERhdGFNb2RlbFdpemFyZC4gVGhpcyBpbmRpcmVjdGlvbiBpcyBuZWNlc3NhcnkgdG8KLSAqIHNwaWx0IFVJIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBjb3JlIElEYXRhTW9kZWwgZnJhbWV3b3JrLiBEYXRhTW9kZWxXaXphcmRzIGFyZSBhbHNvIGluaGVyZW50bHkKLSAqIGV4dGVuZGFibGUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElEYXRhTW9kZWxzIGFyZSBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LCByYXRoZXIgdGhleSBhcmUgYnVpbHQgZnJvbSBhbgotICogSURhdGFNb2RlbFByb3ZpZGVyLiBDbGllbnRzIHdpc2hpbmcgdG8gZGVmaW5lIHRoZWlyIG93biBJRGF0YU1vZGVsIG11c3QgZG8gc28gYnkgaW1wbGVtZW50aW5nIGFuCi0gKiBJRGF0YU1vZGVsUHJvdmlkZXIuIENsaWVudHMgd2lzaGluZyB0byB1dGlsaXplIGFuIElEYXRhTW9kZWwgbXVzdCBjcmVhdGUgaXQgdXNpbmcgdGhlCi0gKiBEYXRhTW9kZWxGYWN0b3J5IHdpdGggdGhlIGFzc29jaWF0ZWQgSURhdGFNb2RlbFByb3ZpZGVyLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSB1bmlxdWUgSUQgd2hpY2ggaWRlbnRpZmllcyB0aGlzIElEYXRhTW9kZWwgaW5zdGFuY2UuIFRoZSBzYW1lIElEIHNob3VsZCBiZSB1c2VkCi0JICogYnkgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIChpZiBhbnkpIGZvciBjbGllbnRzIHRvIGV4dGVuZCBvciBpbnN0YW50aWF0ZSBkaXJlY3RseSwgdGhlCi0JICogRGF0YU1vZGVsV2l6YXJkIChpZiBhbnkpIGZvciBjbGllbnRzIHRvIGV4dGVuZCBvciBpbnN0YW50aWF0ZSBkaXJlY3RseS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZSwgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgYSBoYXNoY29kZS4gTXVsdGlwbGUgSURhdGFNb2RlbCBpbnN0YW5jZXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lCi0JICogSURhdGFNb2RlbFByb3ZpZGVyIHR5cGUgd2lsbCBhbGwgaGF2ZSB0aGUgc2FtZSBJRC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRJRCgpCi0JICogCi0JICogQHJldHVybiB0aGUgdW5pcXVlIElEIGZvciB0aGlzIElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiB0byBleGVjdXRlIGFnYWluc3QgdGhpcyBJRGF0YU1vZGVsLiBUaGUgcmV0dXJuZWQgb3BlcmF0aW9uIGlzCi0JICogZGVyaXZlZCBmcm9tIHRoZSBvcGVyYXRpb24gc3VwcGxpZWQgYnkgdGhlIGJhY2tpbmcgSURhdGFNb2RlbFByb3ZpZGVyLiBUaGUgcmV0dXJuZWQgdHlwZSBpcwotCSAqIElEYXRhTW9kZWxNYW5hZ2VyT3BlcmF0aW9uIHdoaWNoIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSByZXR1cm5lZAotCSAqIElEYXRhTW9kZWxPcGVyYXRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBvbmx5IHBlcnRhaW5zIHRvIElEYXRhTW9kZWxzIGZvciBleHRlZGVuZGVkIG9wZXJhdGlvbnMuIFRoZSByZXR1cm5lZCBleHRlbmRlZAotCSAqIGNvbnRleHQgaXMgdXNlZCBieSB0aGUgSURhdGFNb2RlbE9wZXJhdGlvbiBmcmFtZXdvcmsgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyCi0JICogZXh0ZW5kZWQgb3BlcmF0aW9uIHNob3VsZCBleGVjdXRlLiBUaGUgcmV0dXJuZWQgbGlzdCBpcyBzaG91bGQgY29udGFpbiBPYmplY3RzIGFkYXB0YWJsZSB0bwotCSAqIElQcm9qZWN0LiBUaGlzIElEYXRhTW9kZWwncyBmdW5jdGlvbiBncm91cHMgYXJlIGxvb2tlZCB1cCB0aHJvdWdoIHRoZSBleHRlbnNpb24gbWVjaGFuaXNtLiBJZgotCSAqIGEgZnVuY3Rpb24gZ3JvdXAgaXMgZGVmaW5lZCwgaXQgaXMgZmlyc3QgY2hlY2tlZCBmb3IgZW5hYmxlbWVudC4gVGhlbiBlYWNoIGFkYXB0ZWQgSVByb2plY3QKLQkgKiBpcyBpbnNwZWN0ZWQgdG8gdmVyaWZ5IGl0IGhhbmRsZXMgdGhlIGZ1bmN0aW9uIGdyb3VwLiBJZiBhbGwgdGhlc2UgY29uZGl0aW9ucyBhcmUgbWV0LCB0aGVuCi0JICogdGhlIGV4dGVuZGVkIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRGF0YU1vZGVsIGlzIGV4ZWN1dGVkOyBvdGhlcndpc2UgaXQgaXMgc2tpcHBlZC4KLQkgKiBJZiBubyBmdW5jdGlvbiBncm91cCBpcyBkZWZpbmVkLCBvciBubyBleHRlbmRlZCBjb250ZXh0IGlzIGRlZmluZWQgKGkuZS4gdGhpcyBtZXRob2QgcmV0dXJucwotCSAqIGFuIGVtcHR5IGxpc3QsIG9yIHRoZSBvYmplY3RzIGluIHRoZSByZXR1cm5lZCBsaXN0IGFyZSBub3QgYWRhcHRhYmxlIHRvIElQcm9qZWN0KSB0aGVuIHRoZQotCSAqIGV4dGVuZGVkIG9wZXJhdGlvbiB3aWxsIGV4ZWN1dGUgKGl0IHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIExpc3Qgb2YgT2JqZWN0cyBhZGFwdGFibGUgdG8gSVByb2plY3QKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRFeHRlbmRlZENvbnRleHQoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBpcyBub3QgYSBwcm9wZXJ0eSB0aGVuIGEgUnVudGltZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQmVmb3JlIHRoZSBwcm9wZXJ0eSBpcyByZXR1cm5lZCwgZmlyc3QgdGhlIG93bmluZyBJRGF0YU1vZGVsIG11c3QgYmUgbG9jYXRlZC4gSWYgdGhlCi0JICogc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBpcyBhIGJhc2UgcHJvcGVydHkge0BsaW5rICNpc0Jhc2VQcm9wZXJ0eShTdHJpbmcpfSwgdGhlbiB0aGlzCi0JICogSURhdGFNb2RlbCBpcyB0aGUgb3duZXIuIE90aGVyd2lzZSwgYSByZWN1cnNpdmUgc2VhcmNoIHRocm91Z2ggdGhlIG5lc3RlZCBJRGF0YU1vZGVscyBpcwotCSAqIGNvbmR1Y3RlZCB0byBsb2NhdGUgdGhlIG93bmluZyBJRGF0YU1vZGVsLiBJZiBtb3JlIHRoYW4gb25lIG5lc3RlZCBJRGF0YU1vZGVsIGRlZmluZXMgdGhlCi0JICogcHJvcGVydHksIHRoZW4gdGhlIGZpcnN0IG9uZSBsb2NhdGVkIGlzIGNvbnNpZGVyZWQgdGhlIG93bmluZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBPbmNlIHRoZSBvd25pbmcgSURhdGFNb2RlbCBpcyBmb3VuZCB0aGUgcHJvcGVydHkgaXMgY2hlY2tlZCB0byBzZWUgaWYgaXQgaXMgc2V0Ci0JICoge0BsaW5rICNpc1Byb3BlcnR5U2V0KFN0cmluZyl9LiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0LCB0aGUgc2V0IHZhbHVlIGlzIHJldHVybmVkLiBJZiB0aGUKLQkgKiBwcm9wZXJ0eSBpcyBub3Qgc2V0LCBpdHMgZGVmYXVsdCBpcyByZXR1cm5lZCB7QGxpbmsgI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlcmUgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGdldHRpbmcgcHJpbWl0aXZlIDxjb2RlPmludDwvY29kZT4gYW5kCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdHlwZXMgYXMgd2VsbCBhcyBTdHJpbmdzLgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rICNnZXRJbnRQcm9wZXJ0eShTdHJpbmcpfTwvbGk+Ci0JICogPGxpPntAbGluayAjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpfTwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqIEBzZWUgI2dldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSAjZ2V0SW50UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgI2dldFN0cmluZ1Byb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGludHMuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50Ci0JICogdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPigoSW50ZWdlcilnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKS5pbnRWYWx1ZSgpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+LTE8L2NvZGU+IGlzIHJldHVybmVkIGlmIGEgY2FsbCB0byBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHJldHVybnMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBpbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjc2V0SW50UHJvcGVydHkoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGJvb2xlYW5zLiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0IHRoZW4gdGhpcyBtZXRob2QgaXMKLQkgKiBlcXVhdmFsZW50IHRvOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT4oKEJvb2xlYW4pZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSkuYm9vbGVhblZhbHVlKCk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQgaWYgYSBjYWxsIHRvIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBTdHJpbmdzLiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0IHRoZW4gdGhpcyBtZXRob2QgaXMKLQkgKiBlcXVhdmFsZW50IHRvOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT4oU3RyaW5nKWdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPiIiPC9jb2RlPiBpcyByZXR1cm5lZCBpZiBhIGNhbGwgdG8gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0cyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSB0byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5VmFsdWUuIFN1YnNlcXVlbnQgY2FsbHMgdG8KLQkgKiB7QGxpbmsgI2dldFByb3BlcnR5KFN0cmluZyl9IHdpbGwgcmV0dXJuIHRoZSBzYW1lIHByb3BlcnR5VmFsdWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFdoZW4gYSBwcm9wZXJ0eVZhbHVlIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gaXMgc2V0LCB0aGVuIHRoZSBwcm9wZXJ0eSBpcyBjb25zaWRlcmVkCi0JICogInNldCIgKHNlZSB7QGxpbmsgI2lzUHJvcGVydHlTZXQoU3RyaW5nKX0pLCBjb252ZXJzbHksIGEgcHJvcGVydHlWYWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlzIGNvbnNpZGVyZWQgInVuc2V0Ii4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgbm90IGEgcHJvcGVydHkgKHNlZSB7QGxpbmsgI2lzUHJvcGVydHkoU3RyaW5nKX0pIHRoZW4gYQotCSAqIFJ1bnRpbWVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZXJlIGFyZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBzZXR0aW5nIHByaW1pdGl2ZSA8Y29kZT5pbnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHR5cGVzIGFzIHdlbGwgYXMgU3RyaW5ncy4KLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayAjc2V0SW50UHJvcGVydHkoU3RyaW5nLCBpbnQpfTwvbGk+Ci0JICogPGxpPntAbGluayAjc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZywgYm9vbGVhbil9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNzZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcsIFN0cmluZyl9PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIG1heSBkZWZpbmUgYWRkaXRpb25hbCBwb3N0IHNldCBsb2dpYyBpbgotCSAqIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXIjcHJvcGVydHlTZXQoU3RyaW5nLCBPYmplY3QpfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldAotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNpc1Byb3BlcnR5U2V0KFN0cmluZykKLQkgKiBAc2VlICNpc1Byb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBpbnRzLiBUaGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50IHRvOgotCSAqIDxwPgotCSAqIDxjb2RlPnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3IEludGVnZXIocHJvcGVydHlWYWx1ZSkpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBzZWUgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqIEBzZWUgI2dldEludFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgcHJvcGVydHlWYWx1ZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBib29sZWFucy4gVGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bzoKLQkgKiA8cD4KLQkgKiA8Y29kZT5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsICh2YWx1ZSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIFN0cmluZ3MuIFRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG86Ci0JICogPHA+Ci0JICogPGNvZGU+c2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gbmVzdCB0aGUgc3BlY2lmaWVkIElEYXRhTW9kZWwgd2l0aGluIHRoaXMgSURhdGFNb2RlbC4gVGhlCi0JICogPGNvZGU+bmVzdGVkTW9kZWxOYW1lPC9jb2RlPiBhcmd1bWVudCBzaG91bGQgYmUgYSB1bmlxdWUgU3RyaW5nIHRvIGlkZW50aWZ5IHRoaXMgcGFydGljdWxhcgotCSAqIG5lc3RlZCBJRGF0YU1vZGVsLiBUaGUgc2FtZSBTdHJpbmcgaXMgcmVxdWlyZWQgd2hlbiBhY2Nlc3NpbmcgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIHVzaW5nCi0JICogZWl0aGVyIHtAbGluayAjZ2V0TmVzdGVkTW9kZWwoU3RyaW5nKX0gb3Ige0BsaW5rICNyZW1vdmVOZXN0ZWRNb2RlbChTdHJpbmcpfS4gSWYgdGhlCi0JICogc3BlY2lmaWVkIG5lc3RlZCBJRGF0YU1vZGVsIGhhcyBhbHJlYWR5IGJlZW4gbmVzdGVkIHVuZGVyIHRoaXMgSURhdGFNb2RlbCBvciBpdCBpcyB0aGUgc2FtZQotCSAqIGluc3RhbmNlIGFzIHRoaXMgSURhdGFNb2RlbCwgdGhlbiBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXN0ZWRNb2RlbE5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBJRGF0YU1vZGVsIHRvIGJlIG5lc3RlZAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHRvIGJlIG5lc3RlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5lc3Rpbmcgd2FzIHN1Y2Nlc3NmdWwsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSAjZ2V0TmVzdGVkTW9kZWwoU3RyaW5nKQotCSAqIEBzZWUgI3JlbW92ZU5lc3RlZE1vZGVsKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGROZXN0ZWRNb2RlbChTdHJpbmcgbmVzdGVkTW9kZWxOYW1lLCBJRGF0YU1vZGVsIGRhdGFNb2RlbCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBuZXN0ZWRNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5lc3RlZE1vZGVsTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIHRvIHJlbW92ZS4KLQkgKiBAcmV0dXJuIHRoZSBJRGF0YU1vZGVsIHJlbW92ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBuZXN0ZWQgbW9kZWwgZG9lcyBub3QgZXhpc3Qgb3IKLQkgKiAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBudWxsLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIHJlbW92ZU5lc3RlZE1vZGVsKFN0cmluZyBuZXN0ZWRNb2RlbE5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5lc3RlZCBtb2RlbCBleGlzdHMgKGF0IHRoZSB0b3AgbGV2ZWwgb25seSkgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZSBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5lc3RlZE1vZGVsTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIHRvIGNoZWNrLgotCSAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5lc3RlZCBtb2RlbCBleGlzdHMgKGF0IHRoZSB0b3AgbGV2ZWwgb25seSkgd2l0aCB0aGUKLQkgKiAgICAgICAgIHNwZWNpZmllZCBuYW1lIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkTW9kZWwoU3RyaW5nIG5lc3RlZE1vZGVsTmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBuZXN0ZWQgSURhdGFNb2RlbCBpZGVudGlmaWVkIHRoZSBieSB0aGUgc3BlY2lmaWVkIG5hbWUuIEEgUnVudGltZUV4Y2VwdGlvbiBpcwotCSAqIHRocm93biBpZiB0aGVyZSBpcyBubyBzdWNoIG5lc3RlZCBJRGF0YU1vZGVsIChpLmUuIGlzTmVzdGVkTW9kZWwoKSB3b3VsZCByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4pLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmVzdGVkTW9kZWxOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdG8gZ2V0LgotCSAqIEByZXR1cm4gdGhlIG5lc3RlZCBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0TmVzdGVkTW9kZWwoU3RyaW5nIG5lc3RlZE1vZGVsTmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiBhbGwgbmVzdGVkIElEYXRhTW9kZWxzLCBvciBhbiBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0ZWRNb2RlbHMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0ZWQgSURhdGFNb2RlbHMgbmFtZXMsIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RlZCBJRGF0YU1vZGVscyBuYW1lcywgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZE1vZGVsTmFtZXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0aW5nICh0aGUgaW52ZXJzZSBvZiBuZXN0ZWQpIElEYXRhTW9kZWxzLCBvciBhbiBlbXB0eQotCSAqIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RpbmcgKHRoZSBpbnZlcnNlIG9mIG5lc3RlZCkgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogICAgICAgICBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGluZ01vZGVscygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIGJhc2UgcHJvcGVydGllcyAobm90IGluY2x1ZGluZyBuZXN0ZWQgcHJvcGVydGllcyksIG9yIGFuIGVtcHR5Ci0JICogQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgYmFzZSBwcm9wZXJ0aWVzIChub3QgaW5jbHVkaW5nIG5lc3RlZCBwcm9wZXJ0aWVzKSwgb3IgYW4gZW1wdHkKLQkgKiAgICAgICAgIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRCYXNlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgb2YgcmVjdXJzaXZlbHkgbmVzdGVkIElEYXRhTW9kZWxzLCBvciBhbiBlbXB0eQotCSAqIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgb2YgcmVjdXJzaXZlbHkgbmVzdGVkIElEYXRhTW9kZWxzLCBvciBhbiBlbXB0eQotCSAqICAgICAgICAgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBwcm9wZXJ0aWVzICh0aGUgdW5pb24gb2YgZ2V0QmFzZVByb3BlcnRpZXMoKSBhbmQKLQkgKiBnZXROZXN0ZWRQcm9wZXJ0aWVzKCkpLCBvciBhbiBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIGFsbCBwcm9wZXJ0aWVzICh0aGUgdW5pb24gb2YgZ2V0QmFzZVByb3BlcnRpZXMoKSBhbmQKLQkgKiAgICAgICAgIGdldE5lc3RlZFByb3BlcnRpZXMoKSksIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBbGxQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgdmFsaWQgcHJvcGVydHlOYW1lIGZvciB0aGlzCi0JICogcm9vdCBJRGF0YU1vZGVsIG9ubHkuIE5lc3RlZCBJRGF0YU1vZGVscyBhcmUgbm90IGNoZWNrZWQsIHRob3VnaCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBuZXN0ZWQKLQkgKiBJRGF0YU1vZGVsIHRvIGNvbnRhaW4gdGhlIHNhbWUgcHJvcGVydHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHByb3BlcnR5IGlzIGEgYmFzZSBwcm9wZXJ0eSwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSAjaXNQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSAjaXNOZXN0ZWRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCYXNlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgdmFsaWQgcHJvcGVydHlOYW1lIGZvciB0aGlzCi0JICogRGF0YU1vZGVsIG9yIGFueSBvZiBpdHMgKHJlY3Vyc2l2ZWx5KSBuZXN0ZWQgSURhdGFNb2RlbHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcHJvcGVydHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSAjaXNCYXNlUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgdmFsaWQgcHJvcGVydHlOYW1lIGZvciBhbnkgb2YKLQkgKiBpdHMgKHJlY3Vyc2l2ZWx5KSBuZXN0ZWQgSURhdGFNb2RlbHMuIFRoZSByb290IElEYXRhTW9kZWwgaXMgbm90IGNoZWNrZWQsIHRob3VnaCBpdCBpcwotCSAqIHBvc3NpYmxlIGZvciB0aGUgcm9vdCBJRGF0YU1vZGVsIHRvIGNvbnRhaW4gdGhlIHNhbWUgcHJvcGVydHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgbmVzdGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIEBzZWUgI2lzQmFzZVByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBiZWVuIHNldCBvbiB0aGUgSURhdGFNb2RlbC4gSWYgaXQKLQkgKiBoYXMgbm90IGJlZW4gc2V0LCB0aGVuIGEgY2FsbCB0byBnZXQgdGhlIHNhbWUgcHJvcGVydHkgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgc2V0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgZW5hYmxlZCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2lzUHJvcGVydHlFbmFibGVkKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZSB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyBlbmFibGVkIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB0aGUgSVN0YXR1cyByZXR1cm5lZCBieSB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZykgaXMgRVJST1IKLQkgKiBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZSB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB0aGUgSVN0YXR1cyByZXR1cm5lZCBieSB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZykgaXMgRVJST1IKLQkgKiAgICAgICAgIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVZhbGlkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBJU3RhdHVzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBSZXR1bnMgYW4gSVN0YXR1cy5PSyBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMKLQkgKiB2YWxpZCB3aXRoIHJlc3BlY3QgaXRzZWxmLCBvdGhlciBwcm9wZXJpdGVzLCBhbmQgYnJvYWRlciBjb250ZXh0IG9mIHRoZSBJRGF0YU1vZGVsLgotCSAqIElTdGF0dXMuRVJST1IgaXMgcmV0dXJuZWQgaWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIGludmFsaWQuIElTdGF0dXMuV0FSTklORyBtYXkgYWxzbyBiZQotCSAqIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBpcyBub3Qgb3B0aW1hbC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBJU3RhdHVzIHJldHVybmVkIGJ5IHZhbGlkYXRlKHRydWUpIGlzIEVSUk9SIGFuZAotCSAqIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIElTdGF0dXMgcmV0dXJuZWQgYnkgdmFsaWRhdGUodHJ1ZSkgaXMgRVJST1IgYW5kCi0JICogICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogRXF1YXZhbGVudCB0byBjYWxsaW5nIDxjb2RlPnZhbGlkYXRlKHRydWUpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBJU3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEl0ZXJhdGVzIG92ZXIgYWxsIGJhc2UgcHJvcGVydGllcyBhbmQgbmVzdGVkIG1vZGVscyBJRHMgYW5kIGNhbGxzIHZhbGlkYXRlKFN0cmluZykuIFRoaXMKLQkgKiBtZXRob2QgcmV0dXJucyB3aGVuIGFueSBjYWxsIHRvIHZhbGlkYXRlKFN0cmluZykgcmV0dXJucyBhbiBJU3RhdHVzIGVycm9yIGFuZAotCSAqIHN0b3BBdEZpcnN0RmFpbHVyZSBpcyBzZXQgdG8gdHJ1ZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcEF0Rmlyc3RGYWlsdXJlCi0JICogICAgICAgICAgICB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIHN0b3AgYXQgdGhlIGZpcnN0IGZhaWx1cmUKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShib29sZWFuIHN0b3BBdEZpcnN0RmFpbHVyZSk7Ci0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gVGhlCi0JICogPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZSgpPC9jb2RlPiBtZXRob2Qgb24gdGhlIHJldHVybmVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB3aWxsIGJlCi0JICogdGhlIHNhbWUgdmFsdWUgYXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRm9sbG93aW5nIHRoZSBleGFtcGxlIGludHJvZHVjZWQgaW4ge0BsaW5rICNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKX0sIHN1cHBvc2UKLQkgKiB0aGUgPGNvZGU+U0hJUlRfU0laRTwvY29kZT4gcHJvcGVydHkgaXMgY3VycmVudGx5IHNldCB0byAxLiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgd291bGQKLQkgKiByZXR1cm4gYSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Igd2hvc2UgPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZSgpPC9jb2RlPiByZXR1cm5zCi0JICogPGNvZGU+MTwvY29kZT4gYW5kIHdob3NlIDxjb2RlPmdldFByb3BlcnR5RGVzY3JpcHRpb24oKTwvY29kZT4gcmV0dXJucyA8Y29kZT5zbWFsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFsc28sIG5vdGUgdGhhdCBldmVuIGlmIGEgcGFydGljdWxhciBwcm9wZXJ0eSBpcyBub3QgY29uZmluZWQgdG8gYSBmaW5pdGUgc2V0IG9mIHZhbHVlcyBhcwotCSAqIGRlZmluZWQgYnkge0BsaW5rICNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKX10aGlzIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gYQotCSAqIHZhbGlkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvci4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiB0aGUgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSAjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgYXJyYXkgY29uc2lzdGluZyBvZiBhbGwgdmFsaWQKLQkgKiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBFYWNoCi0JICoge0BsaW5rIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcn0gY29udGFpbnMgYSB2YWx1ZSBhbmQgYSBodW1hbiByZWFkaWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhlCi0JICogdmFsdWUuIFRoZSBzZXQgb2YgYWxsIHZhbHVlcyBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIHRob3NlIHZhbHVlcyB3aGljaCBhcmUgdmFsaWQgZm9yIHRoZQotCSAqIElEYXRhTW9kZWwuIFRoaXMgdmFsdWUgc2V0IG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiB2YWxpZCBwcm9wZXJ0eSB2YWx1ZXMgY29uZm9ybSB0byBhIHdlbGwKLQkgKiBkZWZpbmVkIGZpbml0ZSBzZXQuIElmIG5vIHN1Y2ggdmFsdWUgc2V0IGV4aXN0cyBmb3IgdGhlIHByb3BlcnR5LCB0aGVuIGEgMCBsZW5ndGggYXJyYXkgaXMKLQkgKiByZXR1cm5lZC4gPGNvZGU+bnVsbDwvY29kZT4gaXMgbmV2ZXIgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFzIGFuIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUgaXMgYSBwcm9wZXJ0eSBjYWxsZWQgPGNvZGU+U0hJUlRfU0laRTwvY29kZT4gd2hpY2ggaXMgYW4KLQkgKiA8Y29kZT5JbnRlZ2VyPC9jb2RlPiB0eXBlLiBBbHNvIHN1cHBzZSB0aGF0IHZhbGlkIHNoaXJ0IHNpemVzIGFyZSBvbmx5IHNtYWxsLCBtZWRpdW0sIG9yCi0JICogbGFyZ2UuIEhvd2V2ZXIsIHRoZSBhY3R1YWwgdmFsdWVzIHJlcHJlc2VudGluZyBzbWFsbCwgbWVkaXVtLCBhbmQgbGFyZ2UgYXJlIDEsIDIsIGFuZCAzCi0JICogcmVzcGVjdGl2ZWx5LiBBIGNhbGwgdG8gPGNvZGU+Z2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFNISVJUX1NJWkUpPC9jb2RlPiB3b3VsZCByZXR1cm4gYQotCSAqIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBhcnJheSB3aGVyZSB0aGUgdmFsdWUsIGRlc2NyaXB0aW9uIHBhaXJzIHdvdWxkIGJlIHsoMSwgc21hbGwpLAotCSAqICgyLCBtZWRpdW0pLCAoMywgbGFyZ2UpfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGVuIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgdmFsaWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycwotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcpCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBJRGF0YU1vZGVsTGlzdGVuZXIgdG8gbGlzdGVuIGZvciBEYXRhTW9kZWxFdmVudHMuIElmIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWxMaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIG5ldyBsaXN0ZW5lciB0byBhZGQuCi0JICogCi0JICogQHNlZSAjcmVtb3ZlTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBkYXRhTW9kZWxMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBJRGF0YU1vZGVsTGlzdGVuZXIuIElmIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgaXMgbm90IGEgcmVnaXN0ZXJlZAotCSAqIGxpc3RlbnIgb24gdGhpcyBJRGF0YU1vZGVsLCB0aGVuIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbExpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlLgotCSAqIEBzZWUgI2FkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIgZGF0YU1vZGVsTGlzdGVuZXIpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQjVkFMVUVfQ0hHCi0JICogQHNlZSAjbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfQ0hHID0gRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHOwotCS8qKgotCSAqIDxwPgotCSAqIEEgY29uc3RhbnQgdXNlZCBmb3Igbm90aWZpY2F0aW9uLiBUaGlzIGNvbnRhbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG90aGVycyBiZWNhdXNlIGl0IGRvZXMKLQkgKiBub3QgbWFwIHRvIGFuIGV2ZW50IHR5cGUgb24gRGF0YU1vZGVsRXZlbnQuIFdoZW4gbm90aWZ5aW5nIHdpdGggdGhpcyB0eXBlLCBhIGNoZWNrIGlzIGZpcnN0Ci0JICogZG9uZSB0byBzZWUgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc2V0LiBJZiB0aGUgcHJvcGVydHkgaXMgPGVtcGY+Tk9UPC9lbXBoPiBzZXQsIHRoZW4gYQotCSAqIDxjb2RlPlZBTFVFX0NIRzwvY29kZT4gaXMgZmlyZWQsIG90aGVyd2lzZSBub3RoaW5nIGhhcHBlbnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI25vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0hHID0gRGF0YU1vZGVsRXZlbnQuREVGQVVMVF9DSEc7Ci0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQjRU5BQkxFX0NIRwotCSAqIEBzZWUgI25vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRV9DSEcgPSBEYXRhTW9kZWxFdmVudC5FTkFCTEVfQ0hHOwotCS8qKgotCSAqIDxwPgotCSAqIEEgY29uc3RhbnQgdXNlZCBmb3Igbm90aWZpY2F0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIERhdGFNb2RlbEV2ZW50I1ZBTElEX1ZBTFVFU19DSEcKLQkgKiBAc2VlICNub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRF9WQUxVRVNfQ0hHID0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRzsKLQotCS8qKgotCSAqIDxwPgotCSAqIE5vdGlmeSBhbGwgbGlzdGVuZXJzIG9mIGEgcHJvcGVydHkgY2hhbmdlLiA8Y29kZT5ldmVudFR5cGU8L2NvZGU+IHNwZWNpZmllcyB0aGUgdHlwZSBvZgotCSAqIGNoYW5nZS4gQWNjZXB0aWJsZSB2YWx1ZXMgZm9yIGV2ZW50VHlwZSBhcmUgPGNvZGU+VkFMVUVfQ0hHPC9jb2RlPiwKLQkgKiA8Y29kZT5ERUZBVUxUX0NIRzwvY29kZT4sIDxjb2RlPkVOQUJMRV9DSEc8L2NvZGU+LCA8Y29kZT5WQUxJRF9WQUxVRVNfQ0hHPC9jb2RlPi4gSWYKLQkgKiB0aGUgZXZlbnRUeXBlIGlzIDxjb2RlPkRFRkFVTFRfQ0hHPC9jb2RlPiBhbmQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyBzZXQsIHRoZW4gdGhpcwotCSAqIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFR5cGljYWxseSB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBpbnZva2VkIGJ5IGFuIElEYXRhTW9kZWxQcm92aWRlciBmcm9tIGl0cyBwcm9wZXJ0eVNldAotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgY2hhbmdpbmcKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBmaXJlCi0JICogCi0JICogQHNlZSAjVkFMVUVfQ0hHCi0JICogQHNlZSAjREVGQVVMVF9DSEcKLQkgKiBAc2VlICNFTkFCTEVfQ0hHCi0JICogQHNlZSAjVkFMSURfVkFMVUVTX0NIRwotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZXZlbnRUeXBlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgdHlwaWNhbCBkaXNwb3NlIG1ldGhvZCB1c2VkIHRvIGNsZWFuIHVwIGFueSByZXNvdXJjZXMgbm90IGhhbmRsZWQgYnkgZ2VuZXJhbCBnYXJiYWdlCi0JICogY29sbGVjdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTBhYTRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgaW50ZXJmYWNlIHJlcXVpcmVkIHdoZW4gbGlzdGVuaW5nIGZvciBEYXRhTW9kZWxFdmVudHMgZnJvbSBhbiBJRGF0YU1vZGVsLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNhZGRMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZW50IHdoZW4gRGF0YU1vZGVsRXZlbnRzIG9jY3VyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBEYXRhTW9kZWxFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTMyYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxPcGVyYXRpb24gZGVmaW5lcyBhbiBJRGF0YU1vZGVsIGRyaXZlbiB1bmRvYWJsZSBvcGVyYXRpb24uIEV2ZXJ5IElEYXRhTW9kZWxPcGVyYXRpb24KLSAqIG1heSBiZSBleHRlbmRlZCBieSB0aGlyZCBwYXJ0eSBjbGllbnRzIHVzaW5nIHRoZSBleHRlbmRlZCBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBDbGllbnRzIHNob3VsZCBzdWJjbGFzcwotICoge0BsaW5rIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9ufS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxPcGVyYXRpb24gZXh0ZW5kcyBJVW5kb2FibGVPcGVyYXRpb24gewotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0cyB0aGUgdW5pcXVlIG9wZXJhdGlvbiBpZC4gVHlwaWNhbGx5LCBjbGllbnRzIHNob3VsZCBub3QgaW52b2tlIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUgb3BlcmF0aW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBvcGVyYXRpb24gaWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBvcGVyYXRpb24gaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSBJRGF0YU1vZGVsIGZvciB0aGlzIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICB0aGUgSURhdGFNb2RlbCB1c2VkIHRvIHJ1biB0aGlzIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbChJRGF0YU1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhpcyBvcGVyYXRpb24ncyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgb3BlcmF0aW9uJ3MgSURhdGFNb2RlbC4KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIElTY2hlZHVsaW5nUnVsZSB1c2VkIGZvciBleGVjdXRpbmcgdGhpcyBqb2IgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlLCBJU2NoZWR1bGluZ1J1bGUsIGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpfS4KLQkgKiBJZiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCwgdGhlbiBJV29ya3NwYWNlLmdldFJvb3QoKSBpcyB1c2VkIGFzIHRoZSBJU2NoZWR1bGluZ1J1bGUKLQkgKiBkdXJpbmcgZXhlY3V0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJU2NoZWR1bGluZ1J1bGUKLQkgKiAKLQkgKiBAc2VlICNnZXRPcGVyYXRpb25FeGVjdXRpb25GbGFncygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUsIElTY2hlZHVsaW5nUnVsZSwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgT3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MgdXNlZCBmb3IgZXhlY3V0aW5nIHRoaXMgT3BlcmF0aW9uIGFzIGEgd29ya3NwYWNlIGpvYi4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlLCBJU2NoZWR1bGluZ1J1bGUsIGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgT3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MKLQkgKiAKLQkgKiBAc2VlICNnZXRTY2hlZHVsaW5nUnVsZSgpCi0JICogQHNlZW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSwgSVNjaGVkdWxpbmdSdWxlLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZnJhbWV3b3JrIHdpbGwgc2V0IHRoZSBlbnZpcm9ubWVudCBvbiB0aGlzIG9wZXJhdGlvbiBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuIFRoZSBvcGVyYXRpb24KLQkgKiBjYW4gdGhlbiB1c2UgdGhlIGVudmlyb25tZW50IHRvIHJlcG9ydCBzdGF0dXMsIGxvZyBpbmZvcm1hdGlvbiwgYW5kIGFjY2VzcyByZXNvdXJjZXMgaW4gYW4KLQkgKiBlbnZpcm9ubWVudCBuZXV0cmFsIHdheS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gZW52aXJvbm1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBJRW52aXJvbm1lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRXZpcm9ubWVudCBzZXQgaW4ge0BsaW5rICNzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQpfX0KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXQgSUVudmlyb25tZW50Ci0JICogCi0JICogQHNlZSAjc2V0RW52aXJvbm1lbnQoSUVudmlyb25tZW50KQotCSAqLwotCXB1YmxpYyBJRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YmUwOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBJRGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBEYXRhIE1vZGVsCi0gKiBQcm9wZXJ0aWVzIGludGVyZmFjZXMuIFN1YiBpbnRlcmZhY2UgY2xhc3NlcyAoZS5nLgotICogPGNvZGU+c29tZS5jb21wYW55LklGb29EYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzPC9jb2RlPikgc2hvdWxkIGJlIHVzZWQgdG8KLSAqIGNyZWF0ZSBpbnN0YW5jZXMgb2YgSURhdGFNb2RlbHMgdXNpbmcgdGhlCi0gKiB7QGxpbmsgRGF0YU1vZGVsRmFjdG9yeSNjcmVhdGVEYXRhTW9kZWwoQ2xhc3MpfSBtZXRob2QuIEluIG9yZGVyIGZvciB0aGlzCi0gKiBtZWNoYW5pc20gdG8gd29yaywgdGhlIGJhY2tpbmcge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlcn0gY2xhc3MgbXVzdCBiZQotICogcmVnaXN0ZXJkIHRvIHN1cHBvcnQgdGhlIHN1YiBJRGF0YU1vZGVsUHJvcGVydGllcyBpbnRlcmZhY2UgaW4gb25lIG9mIHR3bwotICogd2F5cy4gVGhpcyByZWdpc3RyYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBieSB0aGUgbW9kZWwgZGV2ZWxvcGVyLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgZmlyc3Qgd2F5IHRvIHJlZ2lzdGVyIHRoZSBjb3JyZWN0IHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzIGlzIGZvcgotICogdGhlIGludGVyZmFjZSB0byBkZWZpbmUgYSBwdWJsaWMgc3RhdGljIENsYXNzIF9wcm92aWRlcl9jbGFzcyBmaWVsZAotICogd2hpY2ggaXMgc2V0IHRvIHRoZSB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzcywgZS5nLgotICogPC9wPgotICogPHA+Ci0gKiA8Y29kZT5wdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIF9wcm92aWRlcl9jbGFzcyA9IHNvbWUuY29tcGFueS5Gb29EYXRhTW9kZWxQcm92aWRlci5jbGFzczwvY29kZT4KLSAqIDwvcD4KLSAqIFRoZSBhYm92ZSBtZWNoYW5pc20gaXMgcmVjb21tZW5kZWQgd2hlbmV2ZXIgdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllc30gYW5kCi0gKiB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzc2VzIGFyZSBib3RoIGRlZmluZWQgaW4gdGhlIHNhbWUgcGx1Z2luIHNjb3BlLgotICogQSBzZWNvbmQgbWVjaGFuaXNtIHVzaW5nIHRoZSBEYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiBleHRlbnNpb24gcG9pbnQgaXMKLSAqIGF2YWlsYWJsZSB3aGVuIHRoZSB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzcyBpcyBkZWZpbmVuZCBvdXRzaWRlIHRoZQotICoge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfSBwbHVnaW4gc2NvcGUuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBBIGJvb2xlYW4gcHJvcGVydHkgZGVmYXVsdHMgdG8gQm9vbGVhbi5UUlVFLiBJZiB0aGlzIGlzIHNldCB0byBCb29sZWFuLkZBTFNFIG5vIGV4dGVuZGVkCi0JICogb3BlcmF0aW9ucyB3aWxsIGJlIGV4ZWN1dGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9XX0VYVEVOU0lPTlMgPSAiSURhdGFNb2RlbFByb3BlcnRpZXMuQUxMT1dfRVhURU5TSU9OUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIExpc3QgY29udGFpbmluZyBTdHJpbmcgb2JqZWN0cywgZGVmYXV0bHMgdG8gYW4gZW1wdHkgTGlzdC4gSWYgdGhpcyBsaXN0IGNvbnRhaW5zIGVsZW1lbnRzCi0JICogYW5kIEFMTE9XX0VYVEVOU0lPTlMgaXMgc2V0IHRvIEJvb2xlYW4uVFJVRSwgdGhlbiBvbmx5IGV4dGVuZGVkIG9wZXJhdGlvbnMgbm90IGlkZW50aWZpZWQgaW4KLQkgKiB0aGlzIGxpc3Qgd2lsbCBiZSBleGVjdXRlZC4gVGhlc2Ugc3RyaW5ncyBzaG91bGQgZWl0aGVyIGJlIHRoZSBvcGVyYXRpb24gaWQgb3IgdGhlIGZ1bGx5Ci0JICogcXVhbGlmaWVkIG9wZXJhdGlvbiBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNUX0VYVEVOU0lPTlMgPSAiSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUyI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWJmZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIElEYXRhTW9kZWxQcm92aWRlcnMgYXJlIHVzZWQgYnkgdGhlIERhdGFNZG9lbEZhY3RvcnkgdG8gY29uc3RydWN0IElEYXRhTW9kZWxzLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBDbGllbnRzIHNob3VsZCBzdWJjbGFzcwotICoge0BsaW5rIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXJ9LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbCIsIDAsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBiYWNraW5nIElEYXRhTW9kZWwgZm9yIHRoaXMgcHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhY2tpbmcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMgZm9yIHdoaWNoIHRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUuIFRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkIG9ubHkgb25jZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHZhbGlkIHByb3BlcnR5IG5hbWVzLgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUHJvdmlkZXJzIHNob3VsZCBwZXJmb3JtIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBpcyB3aGVyZSB0aGUgcHJvdmlkZXIgc2hvdWxkIGRlZmluZSBob3cgZGVmYXVsdCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb21wdXRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBpcyB3aGVyZSB0aGUgcHJvdmlkZXIgc2hvdWxkIGRlZmluZSBob3cgcHJvcGVydHkgZW5hYmxlbWVudHMgYXJlIGNvbXB1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIElEYXRhTW9kZWxQcm92aWRlcnMgc2hvdWxkIHBlcmZvcm0gcHJvcGVydHkgdmFsaWRhdGlvbiBoZXJlLiBBbGwgY2FsbHMgdG8KLQkgKiBJRGF0YU1vZGVsLnZhbGlkYXRlUHJvcGVydHkoU3RyaW5nKSBhcmUgcm91dGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBJRGF0TW9kZWxQcm92aWRlci4gV2hlbgotCSAqIElEYXRhTW9kZWwudmFsaWRhdGUoKSBvciBJRGF0YU1vZGVsLnZhbGlkYXRlKGJvb2xlYW4pIGFyZSBjYWxsZWQgdG8gdmFsaWRhdGUgdGhlIGVudGlyZQotCSAqIElEYXRhTW9kZWwsIGFueSBuZXN0ZWQgbW9kZWwgbmFtZXMgYXJlIGFsc28gcGFzc2VkIHRocm91Z2ggdG8gdGhlIElEYXRhTW9kZWxQcm92aWRlciBmb3IgYQotCSAqIGNoYW5jZSB0byB2YWxpZGF0ZSB0aGUgbmVzdGVkIElEYXRhTW9kZWwgaW4gYW4gYXBwcm9wcmlhdGUgbWFubmVyLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBhbiBJU3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIHNwZWNpYWwgY2FsbGJhY2sgaG9vayBmb3IgdGhlIElEYXRhTW9kZWwgcHJvdmlkZXIgdG8gYmUgbm90aWZpZWQgb2YgYSBzZXRQcm9wZXJ0eSgpCi0JICogY2FsbCBpbnZva2VkIG9uIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgYWN0dWFsIHZhbHVlIGhhcyBiZWVuCi0JICogc3RvcmVkIGJ5IHRoZSBJRGF0YU1vZGVsIGJ1dCBiZWZvcmUgYW55IGdlbmVyYWwgbm90aWZpY2F0aW9ucyBhcmUgZmlyZWQgdG8gaXRzIGxpc3RlbmVycy4KLQkgKiBUaHVzIHRoaXMgSURhdGFNb2RlbFByb3ZpZGVyIG1heSByZWFjdCB0byB1cGRhdGVzIGFwcm9wcmlhdGVseSBieSBzZXR0aW5nIG90aGVyIHByb3BlcnRpZXMsCi0JICogbm90aWZ5aW5nIGRlZmF1bHQgY2hhbmdlcywgbm90aWZ5aW5nIHZhbGlkIHZhbHVlIGNoYW5nZXMsIGV0Yy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBmaXJlIGEgVkFMVUVfQ0hHIERhdGFNb2RlbEV2ZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKTsKLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpOwotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVlN2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkNvbXBvbmVudCBjcmVhdGlvbiBhbmQgUmVmZXJlbmNlZCBDb21wb25lbnQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyBBUEkgIGZvciBEYXRhIE1vZGVsIFByb3ZpZGVyIGZyYW1ld29yayBmb3IgYnVpbGluZyBleGVjdXRhYmxlCi0gICAgICAgIGFuZCB1bmRvYWJsZSBvcGVyYXRpb25zIHVzaW5nIGRhdGEgbW9kZWxzLCB0aGVpciBwcm92aWRlcnMgYW5kIHByb3ZpZGVyIGludGVyZmFjZXMgdGhhdAotICAgICAgICBjb250YWluIHRoZSBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIHByb3ZpZGVycyB0byBzZXQgYW5kIHJldHJpZXZlIHRoZXNlIHByb3BlcnRpZXNlLiAKLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWFmNzc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Q29tcG9uZW50IGNyZWF0aW9uIGFuZCBSZWZlcmVuY2VkIENvbXBvbmVudCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIEFQSSB0aGF0IGRlZmluZXMgdGhlIHByb3BldGllcyB0aGF0IGNhbiBiZSBzZXQgb24gYSBmbGV4aWJsZQotICAgICAgICBwcm9qZWN0IGRhdGFtb2RlbCB0byBkcml2ZSB0aGUgdGhlIHdpemFyZCBhbmQgb3BlcmF0aW9ucy4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwNjljNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0Fic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEyLCAyMDA0Ci0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBDb21tb24gc3VwZXJjbGFzcyBmb3IgZW5hYmxlbWVudC1hd2FyZSAoZS5nLiwgdXNpbmcgZnVuY3Rpb24gZ3JvdXBzIG9yIGFjdGl2aWl0aWVzKSBleHRlbnNpb24KLSAqIHBvaW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlIHsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHByaW9yaXR5OwotCi0JcHVibGljIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBhbkVsZW1lbnQpIHsKLQkJc3VwZXIoYW5FbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSUVuYWJsZW1lbnRJZGVudGlmaWVyIGdldEVuYWJsZW1lbnRJZGVudGlmaWVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIElFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKGdldElEKCksIHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SUQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCWlmIChwcmlvcml0eSA9PSBudWxsKQotCQkJcHJpb3JpdHkgPSBuZXcgSW50ZWdlcihGdW5jdGlvbkdyb3VwUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRGdW5jdGlvblByaW9yaXR5KGdldElEKCkpKTsKLQkJcmV0dXJuIHByaW9yaXR5LmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHApIHsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkID0gZ2V0RW5hYmxlbWVudElkZW50aWZpZXIocCk7Ci0JCXJldHVybiBpZC5pc0VuYWJsZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0FkYXB0YWJpbGl0eVV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZThhMTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0YWJpbGl0eVV0aWxpdHkgewotCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBlbGVtZW50LCBDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXR1cm4gKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQllbHNlCi0JCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGVsZW1lbnQsIGFkYXB0ZXIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0NvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjM1NzJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyIHsKLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luIGlkIG9mIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0KLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCXBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpOwotCQkJCS8vIFRPRE8ganNob2xsIGlzIHRoaXMgY29ycmVjdD8/PwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0RvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDczMzIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLS8qKgotICogT3RoZXIgdGhpbmdzIHRvIGRlbGV0ZToKLSAqIAotICogVGhlIHd0cHVpQWN0aW9uIGV4dGVuc2lvbiBwb2ludCBhbmQgc2NoZW1hIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aQotICovCi0KLQotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIHNsYXRlZCBmb3IgcmVtb3ZhbCBwb3N0IFdUUCAxLjUuIERvIG5vdCB1c2UgdGhpcyBjbGFzcy9pbnRlcmZhY2UvbWV0aG9kL2ZpZWxkCi0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKiAKLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGJlaW5nIHVzZWQgdG8gdHJhY2sgY29kZSBzbGF0ZWQgZm9yIHJlbW92YWwuIEFueSBjbGFzcyBvciBpbnRlcmZhY2UKLSAqIGltcGxlbWVudGluZyBvciBleHRlbmRpbmcgdGhpcyBpbnRlcmZhY2UgcmVzcGVjdGl2ZWx5IHNob3VsZCBub3QgYmUgdXNlZC4gQWxsIHN1Y2ggY2xhc3NlcyBhbmQKLSAqIGludGVyZmFjZXMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMS41LgotICogCi0gKiBBbnkgbWV0aG9kIG9yIGZpZWxkIHdpdGggamF2YWRvYyByZWZlcmVuY2luZyB0aGlzIGludGVyZmFjZSBzaG91bGQgbm90IGJlIHVzZWQgYW5kIHdpbGwgYmUKLSAqIGRlbGV0ZWQgcG9zdCBXVFAgMS41Ci0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1IHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0V4Y2VwdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTdkNjViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBmYWN0b3IgY29tbW9uIGNvZGUgZm9yIGltcGxlbWVudGVycyBvZiBJQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhlbHBlciB7Ci0JLyoqCi0JICogVXRpbGl0eSBjbGFzczsgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotCSAqLwotCXByaXZhdGUgRXhjZXB0aW9uSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbQotCSAqIAotCSAqIEBleGNlcHRpb24gYW5kCi0JICogICAgICAgICAgICAgICAgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcyhJV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0JCW1lc3NhZ2VzLmFkZChleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4Y2VwdGlvbi5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJd2hpbGUgKG5lc3RlZCAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQobmVzdGVkLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAobmVzdGVkIGluc3RhbmNlb2YgSVdyYXBwZWRFeGNlcHRpb24pCi0JCQkJbmVzdGVkID0gKChJV3JhcHBlZEV4Y2VwdGlvbikgbmVzdGVkKS5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCWVsc2UKLQkJCQluZXN0ZWQgPSBudWxsOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIG1lc3NhZ2VzLnRvQXJyYXkobmV3IFN0cmluZ1ttZXNzYWdlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGFuZAotCSAqICAgICAgICAgICAgICAgIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMKLQkgKiAgICAgICAgICAgICAgICBvbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcyhJV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSBnZXRBbGxNZXNzYWdlcyhleGNlcHRpb24pOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDI1Nik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNiLmFwcGVuZChtZXNzYWdlc1tpXSk7Ci0JCQlpZiAoaSA8IG1lc3NhZ2VzLmxlbmd0aCAtIDEpCi0JCQkJc2IuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0hhc2hVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0hhc2hVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGEyN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9IYXNoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIEhhc2hVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IFNFRUQgPSAxMTsKLQlwcml2YXRlIHN0YXRpYyBpbnQgTVVMVEkgPSAzMTsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBoYXNoKGludCBzZWVkLCBpbnQgaSl7Ci0JCXJldHVybiBzZWVkICogTVVMVEkgKyBpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBoYXNoKGludCBzZWVkLCBPYmplY3Qgb2JqKXsKLQkJcmV0dXJuIGhhc2goc2VlZCwgbnVsbCAhPSBvYmogPyBvYmouaGFzaENvZGUoKSA6IFNFRUQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBoYXNoKGludCBzZWVkLCBib29sZWFuIGIpewotCQlyZXR1cm4gaGFzaChzZWVkLCBiID8gMSA6IFNFRUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNhdmVIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lTYXZlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjdjZTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNhdmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIERlZmluZXMgdGhlIEFQSSBmb3IgY29waW5nIHdpdGggYXR0ZW1wdHMgdG8gb3ZlcndyaXRlIHJlYWQtb25seSBmaWxlcyBvciBzYXZlIGZhaWx1cmVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNhdmVIYW5kbGVyIHsKLQlwdWJsaWMgdm9pZCBhY2Nlc3MoKTsKLQotCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVGYWlsZWQoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLQotCXB1YmxpYyBib29sZWFuIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZShJRmlsZSBhRmlsZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjIxZDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGludGVyZmFjZSBJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19LRVkgPSAiSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KElGaWxlIFtdIGZpbGVzKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNmM2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVdyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIEFyY2hpdmVSdW50aW1lIGFuZCBBcmNoaXZlV3JhcHBlZCBleGNlcHRpb25zLCB3aGljaCBjYW4gY29udGFpbiBuZXN0ZWQKLSAqIGV4Y2VwdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0bwotCSAqIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzIG9uZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKTsKLQotCXB1YmxpYyBFeGNlcHRpb24gZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3NTZhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXNzYWdlcyB7Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlcygpIHsKLQkJaW5pdGlhbGl6ZUJ1bmRsZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVCdW5kbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRvR2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsID8gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRvR2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlTdHJpbmcgcGF0dGVybiA9IGRvR2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmdzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlRmFpbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NjM1MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotLyoqCi0gKiBSdW50aW1lIGV4Y2VwdGlvbiB0aGF0IGNvdWxkIGdldCB0aHJvd24gZHVyaW5nIHNhdmUgb2YgYW4gZWRpdCBtb2RlbDsgY2xpZW50cyBzaG91bGQgdXNlCi0gKiB7QGxpbmsgI2dldENvbmNhdGVuYXRlZE1lc3NhZ2VzfXRvIGdldCBhbGwgdGhlIG1lc3NhZ2VzIG9mIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucyB0bwotICogcmVwb3J0IHRoZSBmYWlsdXJlLgotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjQwMDE4OTAxOTEwNzMxMjQwTDsKLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWxlZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlSGFuZGxlckhlYWRsZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVySGVhZGxlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlMTUwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVySGVhZGxlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5JV0ZUV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMTkvMjAwMSAxMTo0MDo1OSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUhhbmRsZXJIZWFkbGVzcyBpbXBsZW1lbnRzIElTYXZlSGFuZGxlciB7Ci0JLyoqCi0JICogSGVhZGxlc3NTYXZlSGFuZGxlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlSGFuZGxlckhlYWRsZXNzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGFjY2VzcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3MoKSB7Ci0JfQotCi0JLyoqCi0JICogaGFuZGxlU2F2ZUZhaWxlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhyb3cgZXg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShJV0ZUV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQlFeGNlcHRpb24gbmVzdGVkID0gZXguZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCWlmIChuZXN0ZWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKG5lc3RlZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShFeGNlcHRpb24gZXgpIHsKLQkJaWYgKGV4IGluc3RhbmNlb2YgSVdGVFdyYXBwZWRFeGNlcHRpb24pCi0JCQlyZXR1cm4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKChJV0ZUV3JhcHBlZEV4Y2VwdGlvbikgZXgpOwotCQllbHNlIGlmIChleCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQlyZXR1cm4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKChDb3JlRXhjZXB0aW9uKSBleCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgc3RhdHVzID0gZXguZ2V0U3RhdHVzKCk7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJVGhyb3dhYmxlIG5lc3RlZCA9IHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJaWYgKG5lc3RlZCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQlyZXR1cm4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKChDb3JlRXhjZXB0aW9uKSBuZXN0ZWQpOwotCQlyZXR1cm4gc3RhdHVzLmdldENvZGUoKSA9PSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1dSSVRFX0xPQ0FMOwotCX0KLQotCS8qKgotCSAqIHJlbGVhc2UgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBzaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIGFGaWxlKSB7Ci0JCWlmIChhRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgZXJyb3IgPSBXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVbmFibGVfdG9fc2F2ZV9yZWFkLW9ubHlfZl9FUlJPUl8iLCBuZXcgT2JqZWN0W117YUZpbGUuZ2V0RnVsbFBhdGgoKX0pOyAvLyROT04tTkxTLTEkID0gIlVuYWJsZSB0byBzYXZlIHJlYWQtb25seSBmaWxlOiAiCi0JCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihlcnJvcik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlSGFuZGxlclJlZ2lzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVyUmVnaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhZWYwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVyUmVnaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci0KLS8qKgotICogQSByZWdpc3RyeSBmb3IgdGhlIGRlZmF1bHQgSVNhdmVIYW5kbGVyIHRvIHVzZSB3aGVuIHNhdmluZyBlZGl0IG1vZGVscwotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUhhbmRsZXJSZWdpc3RlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSVNhdmVIYW5kbGVyIHNhdmVIYW5kbGVyOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgYW5kIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNhdmVIYW5kbGVyUmVnaXN0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2F2ZUhhbmRsZXIgZ2V0U2F2ZUhhbmRsZXIoKSB7Ci0JCWlmIChzYXZlSGFuZGxlciA9PSBudWxsKQotCQkJc2F2ZUhhbmRsZXIgPSAoSVNhdmVIYW5kbGVyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCJzYXZlSGFuZGxlciIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYXZlSGFuZGxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkNmFjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRlRWRpdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZXMgbXVzdCBjb250YWluIG9ubHkge0BsaW5rIElGaWxlfXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlRWRpdChMaXN0IGZpbGVzKXsKLQkJaWYoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5zaXplKCkgPT0gMCl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVFZGl0KCAoSUZpbGUgW10pZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KElGaWxlW10gZmlsZXMpIHsKLQkJaWYoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZUVkaXQoZmlsZXMpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsKQotCQkJCXJldHVybiBzdGF0dXMuaXNPSygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOGZlNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzIGltcGxlbWVudHMgSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQgewotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KElGaWxlW10gZmlsZXMpIHsKLQkJZmluYWwgTGlzdCBmaWxlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaT0wO2k8ZmlsZXMubGVuZ3RoOyBpKyspewotCQkJaWYoZmlsZXNbaV0uZXhpc3RzKCkgJiYgZmlsZXNbaV0uaXNSZWFkT25seSgpKXsKLQkJCQlmaWxlc0xpc3QuYWRkKGZpbGVzW2ldKTsKLQkJCX0KLQkJfQotCQlpZihmaWxlc0xpc3Quc2l6ZSgpID4gMCl7Ci0JCQlJRmlsZSBbXSBmaWxlc1RvVmFsaWRhdGUgPSAoSUZpbGUgW10pZmlsZXNMaXN0LnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzTGlzdC5zaXplKCldKTsKLQkJCXJldHVybiB2YWxpZGF0ZUVkaXRJbXBsKGZpbGVzVG9WYWxpZGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIElEYXRhTW9kZWxQcm92aWRlci5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFZGl0SW1wbChJRmlsZVtdIGZpbGVzVG9WYWxpZGF0ZSkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlc1RvVmFsaWRhdGUsIG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzk4YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5Xb3JrYmVuY2hVdGlsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1RQUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFdUUFBsdWdpbiBpbnN0YW5jZSA9IG51bGw7IAotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIFdUUFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLk9TX01BQ09TWC5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkgPyBmYWxzZSA6IG5ldwotCQkJCWphdmEuaW8uRmlsZSgiYSIpLmNvbXBhcmVUbyhuZXcgamF2YS5pby5GaWxlKCJBIikpICE9IDA7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UGx1Z2luSUQoKTsKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlXb3JrYmVuY2hVdGlsLnNldFdvcmtiZW5jaElzUnVubmluZyh0cnVlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFByb2plY3RVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUHJvamVjdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc0ZWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUFByb2plY3RVdGlsaXRpZXMgewotCi0JLyoqCi0JICogQWRkcyBhIG9sZCBuYXV0dXJlIHRvIGEgcHJvamVjdCwgRklSU1QsIHRoaXMgaXMgdXNlZCB0byBtYWtlIHByb2plY3QgYmFja3dhcmQgY29tcGF0aWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPbGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0KLQkJLy9jaGVjayBpZiB0aGUgb2xkIG5hdHVyZSBkb2VzIG5vdCBleGlzdAotCQlib29sZWFuIGFkZE5hdHVyZSA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJldk5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYXR1cmUgPSBwcmV2TmF0dXJlc1tpXTsKLQkJCWlmIChuYXR1cmUuZXF1YWxzKG5hdHVyZUlkKSkgewotCQkJCWFkZE5hdHVyZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChhZGROYXR1cmUpIHsKLQkJCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJCW5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIElSZXNvdXJjZS5BVk9JRF9OQVRVUkVfQ09ORklHLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuYXR1cmUgaW4gdGhlIHByb2plY3QgaW4gdGhlIGluZGV4IHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPbGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkLCBpbnQgaW5kZXgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQotCQkvL2NoZWNrIGlmIHRoZSBvbGQgbmF0dXJlIGRvZXMgbm90IGV4aXN0Ci0JCWJvb2xlYW4gYWRkTmF0dXJlID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmV2TmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hdHVyZSA9IHByZXZOYXR1cmVzW2ldOwotCQkJaWYgKG5hdHVyZS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJYWRkTmF0dXJlID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkZE5hdHVyZSkgewotCQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBpbmRleCk7Ci0KLQkJCW5ld05hdHVyZXNbaW5kZXhdID0gbmF0dXJlSWQ7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCBpbmRleCwgbmV3TmF0dXJlcywgaW5kZXggKyAxLCBwcmV2TmF0dXJlcy5sZW5ndGggLSBpbmRleCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUmVzb3VyY2UuQVZPSURfTkFUVVJFX0NPTkZJRywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmF1dHVyZSB0byBhIHByb2plY3QsIEZJUlNUCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDEsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmF0dXJlIHRvIGEgcHJvamVjdCwgTEFTVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3RMYXN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIGEgbmF0dXJlIGZyb20gdGhlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCWludCBzaXplID0gcHJldk5hdHVyZXMubGVuZ3RoOwotCQlpbnQgbmV3c2l6ZSA9IDA7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlib29sZWFuIG1hdGNoZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwcmV2TmF0dXJlc1tpXS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJbWF0Y2hmb3VuZCA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQluZXdOYXR1cmVzW25ld3NpemUrK10gPSBwcmV2TmF0dXJlc1tpXTsKLQkJfQotCQlpZiAoIW1hdGNoZm91bmQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsICJUaGUgbmF0dXJlIGlkICIgKyBuYXR1cmVJZCArICIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmdbXSB0ZW1wID0gbmV3TmF0dXJlczsKLQkJbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbbmV3c2l6ZV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgbmV3TmF0dXJlcywgMCwgbmV3c2l6ZSk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXROYXR1cmVEZXNjcmlwdG9yKG5hdHVyZUlkKSA9PSBudWxsKSB7Ci0JCQkvLyBUaGUgbmF0dXJlIGRvZXMgbm90IGV4aXN0LCBzbyBkbyBub3QgYXR0ZW1wdCB0byBkZS1jb25maWd1cmUgaXQgd2hpbGUgcmVtb3ZpbmcgaXQuCi0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUmVzb3VyY2UuQVZPSURfTkFUVVJFX0NPTkZJRyB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIG51bGwpOwotCQl9IGVsc2UgewotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IG9iamVjdCkgewotCQlJUHJvamVjdCByZXN1bHQgPSBudWxsOwotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJlc3VsdCA9IChJUHJvamVjdCkgb2JqZWN0OwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQlyZXN1bHQgPSAoKElSZXNvdXJjZSkgb2JqZWN0KS5nZXRQcm9qZWN0KCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXN1bHQgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgb2JqZWN0KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4MmQ2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJ3dHBfY29tbW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncywgaW50IHgpIHsKLQotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxODJkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkyMjE5MjU1ODE2MDM2NDg1MzhMOwotCi0JLyoqCi0JICogV0ZUV3JhcHBlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBXcmFwcGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICovCi0JcHVibGljIFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgV3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgdGFyZ2V0LCBTdHJpbmcgcykgewotCQlzdXBlcih0YXJnZXQsIHMpOwotCX0KLQotCS8qKgotCSAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQkJcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewotCQlpZiAoZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJcy5wcmludGxuKCJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkCi0JCQlnZXRUYXJnZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCXMucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5ODk1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLXB1YmxpYyBjbGFzcyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNjg0NjM3NzQ2Mjc1NjIwMTAxTDsKLQkvKiogVGhlIGV4Y2VwdGlvbiB3aGljaCBuZWNlc3NpdGF0ZWQgdGhpcyBydW50aW1lIGV4Y2VwdGlvbiwgaWYgb25lIGV4aXN0cyAqLwotCXByb3RlY3RlZCBFeGNlcHRpb24gbmVzdGVkRXhjZXB0aW9uOwotCi0JcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcigpOwotCQlzZXROZXN0ZWRFeGNlcHRpb24oZSk7Ci0JfQotCi0JcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocyk7Ci0JCXNldE5lc3RlZEV4Y2VwdGlvbihlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gRXhjZXB0aW9uSGVscGVyLmdldEFsbE1lc3NhZ2VzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvCi0JICogaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMgb25lCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSB7Ci0JCXJldHVybiBFeGNlcHRpb25IZWxwZXIuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXModGhpcyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpIHsKLQkJRXhjZXB0aW9uIG4gPSBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJaWYgKG4gPT0gbnVsbCkKLQkJCXJldHVybiB0aGlzOwotCQllbHNlIGlmIChuIGluc3RhbmNlb2YgSVdyYXBwZWRFeGNlcHRpb24pCi0JCQlyZXR1cm4gKChJV3JhcHBlZEV4Y2VwdGlvbikgbikuZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIG5lc3RlZEV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGRlZCB0byBwcm92aWRlIGNvbXBhdGliaWxpdHkgZm9yIHRoZSBKYXZhIDEuNC4yIGFkZGl0aW9uIG9mCi0JICogPGNvZGU+VGhyb3dhYmxlLmdldENhdXNlKCk8L2NvZGU+LgotCSAqIEByZXR1cm4gVGhlIG5lc3RlZCBleGNlcHRpb24gaGVsZCBieSB0aGUgcmVjZWl2ZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgZ2V0Q2F1c2UoKSB7Ci0JCXJldHVybiBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgb3V0IGEgc3RhY2sgdHJhY2UgdG8gdGhlIHN5c3RlbSBlcnIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotCQlwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKSB7Ci0JCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJcy5wcmludGxuKCJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkCi0JCQluZXN0ZWRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7Ci0JCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJcy5wcmludGxuKCJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkCi0JCQluZXN0ZWRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld05lc3RlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5lc3RlZEV4Y2VwdGlvbihqYXZhLmxhbmcuRXhjZXB0aW9uIG5ld05lc3RlZEV4Y2VwdGlvbikgewotCQluZXN0ZWRFeGNlcHRpb24gPSBuZXdOZXN0ZWRFeGNlcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9hY3Rpdml0aWVzL1dUUEFjdGl2aXR5QnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ZmEyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmFjdGl2aXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBBY3Rpdml0eUJyaWRnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVCA9ICJXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVEVORVJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBXVFBBY3Rpdml0eUJyaWRnZSBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlcltdIGxpc3RlbmVyczsKLQotCXB1YmxpYyBzdGF0aWMgV1RQQWN0aXZpdHlCcmlkZ2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChudWxsID09IElOU1RBTkNFKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBXVFBBY3Rpdml0eUJyaWRnZSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIFdUUEFjdGl2aXR5QnJpZGdlKCkgewotCQlsb2FkRXh0ZW5zaW9uUG9pbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5hYmxlQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5SUQsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJbGlzdGVuZXJzW2ldLmVuYWJsZUFjdGl2aXR5KGFjdGl2aXR5SUQsIGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRFbmFibGVkQWN0aXZpdHlJZHMoKSB7Ci0JCWlmKGxpc3RlbmVycy5sZW5ndGggPiAwKXsKLQkJCXJldHVybiBsaXN0ZW5lcnNbMF0uZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkQWN0aXZpdHlJZHMoU2V0IGFjdGl2aXR5SURzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uc2V0RW5hYmxlZEFjdGl2aXR5SWRzKGFjdGl2aXR5SURzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWN0aXZpdHlJRHNGcm9tQ29udHJpYnV0aW9uKFN0cmluZyBsb2NhbElELCBTdHJpbmcgcGx1Z2luSUQpIHsKLQkJaWYobGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBsaXN0ZW5lcnNbMF0uZ2V0QWN0aXZpdHlJRHNGcm9tQ29udHJpYnV0aW9uKGxvY2FsSUQsIHBsdWdpbklEKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRXh0ZW5zaW9uUG9pbnRzKCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UKTsKLQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWxpc3RlbmVycyA9IG5ldyBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlcltlbGVtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobnVsbCA9PSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoTElTVEVORVJfQ0xBU1MpKSB7Ci0JCQkJbG9nRXJyb3IoZWxlbWVudHNbaV0sICJObyAiICsgTElTVEVORVJfQ0xBU1MgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJdHJ5IHsKLQkJCQlsaXN0ZW5lcnNbaV0gPSAoV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIpIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oTElTVEVORVJfQ0xBU1MpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nRXJyb3IoZWxlbWVudHNbaV0sICJFcnJvciBsb2FkaW5nICIgKyBMSVNURU5FUl9DTEFTUyArICI6IiArIGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShMSVNURU5FUl9DTEFTUykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvYWN0aXZpdGllcy9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzc4ZGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvYWN0aXZpdGllcy9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuYWN0aXZpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIgewotCi0JcHVibGljIHZvaWQgZW5hYmxlQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5SUQsIGJvb2xlYW4gZW5hYmxlZCk7Ci0KLQlwdWJsaWMgU2V0IGdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZEFjdGl2aXR5SWRzKFNldCBhY3Rpdml0eUlEcyk7Ci0KLQlwdWJsaWMgU2V0IGdldEFjdGl2aXR5SURzRnJvbUNvbnRyaWJ1dGlvbihTdHJpbmcgbG9jYWxJRCwgU3RyaW5nIHBsdWdpbklEKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbEV4dGVuc2lvblJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjFmZTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbEV4dGVuc2lvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OID0gIkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX0VMRU1FTlQgPSAiRGF0YU1vZGVsUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklORVNfVFlQRV9FTEVNRU5UID0gIlByb3ZpZGVyRGVmaW5lc1R5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVFNfVFlQRV9FTEVNRU5UID0gIlByb3ZpZGVySW1wbGVtZW50c1R5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFID0gInByb3ZpZGVyVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1BST1ZJREVSX0lEID0gInByb3ZpZGVySUQiOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZHID0gImZ1bmN0aW9uR3JvdXBJRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSGFzaE1hcCBwcm92aWRlckV4dGVuc2lvbnM7Ci0JcHJpdmF0ZSBIYXNoTWFwIGRlZmluZXNFeHRlbnNpb25zOwotCXByaXZhdGUgSGFzaE1hcCBpbXBsZW1lbnRzRXh0ZW5zaW9uczsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHVibGljIERhdGFNb2RlbEV4dGVuc2lvblJlYWRlcigpIHsKLQkJc3VwZXIoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFBST1ZJREVSX0VMRU1FTlQpKSB7Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQpOwotCQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBQUk9WSURFUl9FTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfSUQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfQ0xBU1MpOwotCQkJaWYgKG51bGwgPT0gY2xhc3NOYW1lIHx8IGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIFBST1ZJREVSX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9DTEFTUykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJYWRkUHJvdmlkZXJFeHRlbnNpb24oaWQsIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhERUZJTkVTX1RZUEVfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1BST1ZJREVSX1RZUEUpOwotCQkJaWYgKG51bGwgPT0gdHlwZSB8fCB0eXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgREVGSU5FU19UWVBFX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUFJPVklERVJfSUQpOwotCQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBERUZJTkVTX1RZUEVfRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX1BST1ZJREVSX0lEKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlhZGREZWZpbmVzRXh0ZW5zaW9uKHR5cGUsIGlkKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoSU1QTEVNRU5UU19UWVBFX0VMRU1FTlQpKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9QUk9WSURFUl9UWVBFKTsKLQkJCWlmIChudWxsID09IHR5cGUgfHwgdHlwZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIERFRklORVNfVFlQRV9FTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfUFJPVklERVJfVFlQRSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1BST1ZJREVSX0lEKTsKLQkJCWlmIChudWxsID09IGlkIHx8IGlkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgREVGSU5FU19UWVBFX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9QUk9WSURFUl9JRCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJYWRkSW1wbGVtZW50c0V4dGVuc2lvbih0eXBlLCBpZCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3ZpZGVyRXh0ZW5zaW9uKFN0cmluZyBpZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHByb3ZpZGVyRXh0ZW5zaW9ucy5jb250YWluc0tleShpZCkpIHsKLQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRHVwbGljYXRlICIgKyBQUk9WSURFUl9FTEVNRU5UICsgIiAiICsgQVRUUklCVVRFX0lEICsgIiAiICsgaWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlwcm92aWRlckV4dGVuc2lvbnMucHV0KGlkLCBlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVmaW5lc0V4dGVuc2lvbihTdHJpbmcgdHlwZSwgU3RyaW5nIGlkKSB7Ci0JCWlmIChkZWZpbmVzRXh0ZW5zaW9ucy5jb250YWluc0tleSh0eXBlKSkgewotCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEdXBsaWNhdGUgIiArIFBST1ZJREVSX0VMRU1FTlQgKyAiICIgKyBBVFRSSUJVVEVfUFJPVklERVJfVFlQRSArICIgIiArIHR5cGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlkZWZpbmVzRXh0ZW5zaW9ucy5wdXQodHlwZSwgaWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbXBsZW1lbnRzRXh0ZW5zaW9uKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLQkJTGlzdCBjYWNoZTsKLQkJaWYgKGltcGxlbWVudHNFeHRlbnNpb25zLmNvbnRhaW5zS2V5KHR5cGUpKQotCQkJY2FjaGUgPSAoTGlzdCkgaW1wbGVtZW50c0V4dGVuc2lvbnMuZ2V0KHR5cGUpOwotCQllbHNlCi0JCQljYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2FjaGUuYWRkKGlkKTsKLQkJaW1wbGVtZW50c0V4dGVuc2lvbnMucHV0KHR5cGUsIGNhY2hlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldFByb3ZpZGVyRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQlyZWFkUmVnaXN0cnlJZk5lY2Vzc2FyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHByb3ZpZGVyRXh0ZW5zaW9ucy5nZXQoaWQpOwotCQlpZiAobnVsbCA9PSBlbGVtZW50KSB7Ci0JCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBQUk9WSURFUl9FTEVNRU5UICsgIiBub3QgZm91bmQgZm9yICIgKyBBVFRSSUJVVEVfSUQgKyAiOiAiICsgaWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmaW5lc0V4dGVuc2lvbihTdHJpbmcgcHJvdmlkZXJUeXBlKSB7Ci0JCXJlYWRSZWdpc3RyeUlmTmVjZXNzYXJ5KCk7Ci0JCVN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgZGVmaW5lc0V4dGVuc2lvbnMuZ2V0KHByb3ZpZGVyVHlwZSk7Ci0JCWlmIChudWxsID09IGVsZW1lbnQpIHsKLQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIERFRklORVNfVFlQRV9FTEVNRU5UICsgIiBub3QgZm91bmQgZm9yICIgKyBBVFRSSUJVVEVfUFJPVklERVJfVFlQRSArICI6ICIgKyBwcm92aWRlclR5cGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm92aWRlckRlc2NyaXB0b3JzRm9yUHJvdmlkZXJLaW5kKFN0cmluZyBwcm92aWRlclR5cGUpIHsKLQkJcmVhZFJlZ2lzdHJ5SWZOZWNlc3NhcnkoKTsKLQkJTGlzdCBwcm92aWRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByb3ZpZGVyTGlzdC5hZGQoZ2V0RGVmaW5lc0V4dGVuc2lvbihwcm92aWRlclR5cGUpKTsKLQkJaWYgKGltcGxlbWVudHNFeHRlbnNpb25zLmNvbnRhaW5zS2V5KHByb3ZpZGVyVHlwZSkpIHsKLQkJCUxpc3QgaW1wbGVtZW50c0lkcyA9IChMaXN0KSBpbXBsZW1lbnRzRXh0ZW5zaW9ucy5nZXQocHJvdmlkZXJUeXBlKTsKLQkJCWlmIChpbXBsZW1lbnRzSWRzICE9IG51bGwgJiYgIWltcGxlbWVudHNJZHMuaXNFbXB0eSgpKSB7Ci0JCQkJcHJvdmlkZXJMaXN0LmFkZEFsbChpbXBsZW1lbnRzSWRzKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBwcm92aWRlckFycmF5ID0gbmV3IFN0cmluZ1twcm92aWRlckxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlckFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm92aWRlckFycmF5W2ldID0gKFN0cmluZykgcHJvdmlkZXJMaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXJBcnJheTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZFJlZ2lzdHJ5SWZOZWNlc3NhcnkoKSB7Ci0JCWlmICghaGFzSW5pdGlhbGl6ZWQpIHsKLQkJCXByb3ZpZGVyRXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkZWZpbmVzRXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlpbXBsZW1lbnRzRXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZWFkUmVnaXN0cnkoKTsKLQkJCWhhc0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0UHJvdmlkZXIoU3RyaW5nIGlkKSB7Ci0JCUlEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0UHJvdmlkZXJFeHRlbnNpb24oaWQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm92aWRlciA9IChJRGF0YU1vZGVsUHJvdmlkZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSSUJVVEVfQ0xBU1MpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRlMzEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBSZXNvdXJjZUhhbmRsZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhTW9kZWxJbXBsIGltcGxlbWVudHMgSURhdGFNb2RlbCwgSURhdGFNb2RlbExpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OT1RfTE9DQVRFRF8gPSBXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyMCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RFRF9NT0RFTF9OT1RfTE9DQVRFRCA9IFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIxIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIE5PX0RFU0NSSVBUT1JTID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclswXTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBiYXNlUHJvcGVydHlOYW1lczsKLQlwcml2YXRlIENvbGxlY3Rpb24gYWxsUHJvcGVydHlOYW1lczsKLQlwcml2YXRlIENvbGxlY3Rpb24gbmVzdGVkUHJvcGVydHlOYW1lczsgLy8gbGF6aWx5IGluaXRpYWx6ZWQgd2hlbiBuZXN0ZWQgbW9kZWxzIGFkZGVkCi0JcHJpdmF0ZSBNYXAgcHJvcGVydHlWYWx1ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBNYXAgbmVzdGVkTW9kZWxzOwotCXByaXZhdGUgU2V0IG5lc3RpbmdNb2RlbHM7Ci0JcHJpdmF0ZSBMaXN0IGxpc3RlbmVyczsKLQotCXByaXZhdGUgSURhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyOwotCi0JcHVibGljIERhdGFNb2RlbEltcGwoSURhdGFNb2RlbFByb3ZpZGVyIGRhdGFNb2RlbFByb3ZpZGVyKSB7Ci0JCWluaXQoZGF0YU1vZGVsUHJvdmlkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KElEYXRhTW9kZWxQcm92aWRlciBkYXRhTW9kZWxQcm92aWRlcikgewotCQl0aGlzLnByb3ZpZGVyID0gZGF0YU1vZGVsUHJvdmlkZXI7Ci0JCWRhdGFNb2RlbFByb3ZpZGVyLnNldERhdGFNb2RlbCh0aGlzKTsKLQkJQ29sbGVjdGlvbiBwcm9wZXJ0eU5hbWVzID0gZGF0YU1vZGVsUHJvdmlkZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlIYXNoU2V0IHByb3BlcnRpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlwcm9wZXJ0aWVzLmFkZEFsbChwcm9wZXJ0eU5hbWVzKTsKLQotCQlwcm9wZXJ0aWVzLmFkZChJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TKTsKLQkJcHJvcGVydGllcy5hZGQoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUyk7Ci0JCWJhc2VQcm9wZXJ0eU5hbWVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihwcm9wZXJ0aWVzKTsKLQkJYWxsUHJvcGVydHlOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWFsbFByb3BlcnR5TmFtZXMuYWRkQWxsKGJhc2VQcm9wZXJ0eU5hbWVzKTsKLQkJZGF0YU1vZGVsUHJvdmlkZXIuaW5pdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQmFzZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGJhc2VQcm9wZXJ0eU5hbWVzLmNvbnRhaW5zKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QmFzZVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGJhc2VQcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGFsbFByb3BlcnR5TmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBbGxQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihhbGxQcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGwgIT0gbmVzdGVkUHJvcGVydHlOYW1lcyAmJiBuZXN0ZWRQcm9wZXJ0eU5hbWVzLmNvbnRhaW5zKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obmVzdGVkUHJvcGVydHlOYW1lcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrVmFsaWRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoIWlzUHJvcGVydHkocHJvcGVydHlOYW1lKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oUFJPUEVSVFlfTk9UX0xPQ0FURURfICsgcHJvcGVydHlOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRGF0YU1vZGVsSW1wbCBnZXRPd25pbmdEYXRhTW9kZWwoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQljaGVja1ZhbGlkUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBzZWFyY2hOZXN0ZWRNb2RlbHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIERhdGFNb2RlbEltcGwgc2VhcmNoTmVzdGVkTW9kZWxzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKGlzQmFzZVByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9IGVsc2UgaWYgKG5lc3RlZE1vZGVscyAhPSBudWxsKSB7Ci0JCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCQlPYmplY3RbXSBrZXlzID0gbmVzdGVkTW9kZWxzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJCWRhdGFNb2RlbCA9IChEYXRhTW9kZWxJbXBsKSBuZXN0ZWRNb2RlbHMuZ2V0KGtleXNbaV0pOwotCQkJCWlmIChkYXRhTW9kZWwuaXNQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJCXJldHVybiBkYXRhTW9kZWwuc2VhcmNoTmVzdGVkTW9kZWxzKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFBST1BFUlRZX05PVF9MT0NBVEVEXyArIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChkYXRhTW9kZWwucHJvcGVydHlWYWx1ZXMuY29udGFpbnNLZXkocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGRhdGFNb2RlbC5wcm9wZXJ0eVZhbHVlcy5nZXQocHJvcGVydHlOYW1lKTsKLQkJfQotCQlyZXR1cm4gZGF0YU1vZGVsLnByb3ZpZGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIGRhdGFNb2RlbC5wcm92aWRlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJT2JqZWN0IHByb3AgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocHJvcCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gKChJbnRlZ2VyKSBwcm9wKS5pbnRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCU9iamVjdCBwcm9wID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKHByb3AgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgcHJvcCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCU9iamVjdCBwcm9wID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKHByb3AgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKFN0cmluZykgcHJvcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIGRhdGFNb2RlbC5wcm9wZXJ0eVZhbHVlcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIGRhdGFNb2RlbC5wcm92aWRlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJZGF0YU1vZGVsLmludGVybmFsU2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxTZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSBwcm9wZXJ0eVZhbHVlcy5nZXQocHJvcGVydHlOYW1lKTsKLQkJaWYgKHZhbHVlQ2hhbmdlZChwcm9wZXJ0eVZhbHVlLCBvbGRWYWx1ZSkpIHsKLQkJCWlmIChudWxsICE9IHByb3BlcnR5VmFsdWUpCi0JCQkJcHJvcGVydHlWYWx1ZXMucHV0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQllbHNlIGlmIChwcm9wZXJ0eVZhbHVlcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKQotCQkJCXByb3BlcnR5VmFsdWVzLnJlbW92ZShwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHByb3ZpZGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSkpIHsKLQkJCQlub3RpZnlQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsdWVDaGFuZ2VkKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCXJldHVybiBvMSAhPSBvMiAmJiAoKG8xICE9IG51bGwgJiYgIW8xLmVxdWFscyhvMikpIHx8ICFvMi5lcXVhbHMobzEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgdmFsdWUpIHsKLQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXcgSW50ZWdlcih2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgKHZhbHVlKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGROZXN0ZWRNb2RlbChTdHJpbmcgbW9kZWxOYW1lLCBJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAodGhpcyA9PSBkYXRhTW9kZWwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobnVsbCA9PSBuZXN0ZWRNb2RlbHMpIHsKLQkJCW5lc3RlZE1vZGVscyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5lc3RlZFByb3BlcnR5TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCURhdGFNb2RlbEltcGwgbmVzdGVkRGF0YU1vZGVsID0gKERhdGFNb2RlbEltcGwpIGRhdGFNb2RlbDsKLQkJaWYgKG51bGwgPT0gbmVzdGVkRGF0YU1vZGVsLm5lc3RpbmdNb2RlbHMpIHsKLQkJCW5lc3RlZERhdGFNb2RlbC5uZXN0aW5nTW9kZWxzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQlpZiAobmVzdGVkRGF0YU1vZGVsLm5lc3RpbmdNb2RlbHMuY29udGFpbnModGhpcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQluZXN0ZWREYXRhTW9kZWwubmVzdGluZ01vZGVscy5hZGQodGhpcyk7Ci0KLQkJbmVzdGVkTW9kZWxzLnB1dChtb2RlbE5hbWUsIG5lc3RlZERhdGFNb2RlbCk7Ci0KLQkJYWRkTmVzdGVkUHJvcGVydGllcyhuZXN0ZWREYXRhTW9kZWwuYWxsUHJvcGVydHlOYW1lcyk7Ci0JCW5lc3RlZERhdGFNb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RlZFByb3BlcnRpZXMoQ29sbGVjdGlvbiBuZXN0ZWRQcm9wZXJ0aWVzKSB7Ci0JCWJvb2xlYW4gcHJvcGVydGllc0FkZGVkID0gYWxsUHJvcGVydHlOYW1lcy5hZGRBbGwobmVzdGVkUHJvcGVydGllcyk7Ci0JCXByb3BlcnRpZXNBZGRlZCA9IG5lc3RlZFByb3BlcnR5TmFtZXMuYWRkQWxsKG5lc3RlZFByb3BlcnRpZXMpIHx8IHByb3BlcnRpZXNBZGRlZDsKLQkJLy8gUGFzcyB0aGUgbmV3IHByb3BlcnRpZXMgdXAgdGhlIG5lc3RpbmcgY2hhaW4KLQkJaWYgKHByb3BlcnRpZXNBZGRlZCAmJiBuZXN0aW5nTW9kZWxzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmVzdGluZ01vZGVscy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCSgoRGF0YU1vZGVsSW1wbCkgaXRlcmF0b3IubmV4dCgpKS5hZGROZXN0ZWRQcm9wZXJ0aWVzKG5lc3RlZFByb3BlcnRpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkTW9kZWxzKCkgewotCQlyZXR1cm4gbmVzdGVkTW9kZWxzICE9IG51bGwgPyBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG5lc3RlZE1vZGVscy52YWx1ZXMoKSkgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkTW9kZWxOYW1lcygpIHsKLQkJcmV0dXJuIG5lc3RlZE1vZGVscyAhPSBudWxsID8gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihuZXN0ZWRNb2RlbHMua2V5U2V0KCkpIDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RpbmdNb2RlbHMoKSB7Ci0JCXJldHVybiBuZXN0aW5nTW9kZWxzICE9IG51bGwgPyBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG5lc3RpbmdNb2RlbHMpIDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsIHJlbW92ZU5lc3RlZE1vZGVsKFN0cmluZyBtb2RlbE5hbWUpIHsKLQkJaWYgKCFpc05lc3RlZE1vZGVsKG1vZGVsTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCURhdGFNb2RlbEltcGwgbW9kZWwgPSAoRGF0YU1vZGVsSW1wbCkgbmVzdGVkTW9kZWxzLnJlbW92ZShtb2RlbE5hbWUpOwotCQltb2RlbC5uZXN0aW5nTW9kZWxzLnJlbW92ZSh0aGlzKTsKLQkJcmVtb3ZlTmVzdGVkUHJvcGVydGllcyhtb2RlbC5hbGxQcm9wZXJ0eU5hbWVzKTsKLQkJbW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCWlmIChuZXN0ZWRNb2RlbHMuaXNFbXB0eSgpKSB7Ci0JCQluZXN0ZWRNb2RlbHMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTmVzdGVkUHJvcGVydGllcyhDb2xsZWN0aW9uIG5lc3RlZFByb3BlcnRpZXMpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXN0ZWRQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IG51bGw7Ci0JCWJvb2xlYW4ga2VlcFByb3BlcnR5ID0gZmFsc2U7Ci0JCVNldCBuZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlrZWVwUHJvcGVydHkgPSBmYWxzZTsKLQkJCXByb3BlcnR5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGJhc2VQcm9wZXJ0eU5hbWVzLmNvbnRhaW5zKHByb3BlcnR5KSkgewotCQkJCWtlZXBQcm9wZXJ0eSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoIWtlZXBQcm9wZXJ0eSAmJiBuZXN0ZWRNb2RlbHMgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIG5lc3RlZE1vZGVsc0l0ZXJhdG9yID0gbmVzdGVkTW9kZWxzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKCFrZWVwUHJvcGVydHkgJiYgbmVzdGVkTW9kZWxzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCURhdGFNb2RlbEltcGwgbmVzdGVkTW9kZWwgPSAoRGF0YU1vZGVsSW1wbCkgbmVzdGVkTW9kZWxzSXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAobmVzdGVkTW9kZWwuaXNQcm9wZXJ0eShwcm9wZXJ0eSkpIHsKLQkJCQkJCWtlZXBQcm9wZXJ0eSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWtlZXBQcm9wZXJ0eSkgewotCQkJCWlmIChudWxsID09IG5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSkgewotCQkJCQluZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUgPSBuZXcgSGFzaFNldCgpOwotCQkJCX0KLQkJCQluZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUuYWRkKHByb3BlcnR5KTsKLQkJCX0KLQkJfQotCi0JCWlmIChudWxsICE9IG5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSkgewotCQkJYWxsUHJvcGVydHlOYW1lcy5yZW1vdmVBbGwobmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlKTsKLQkJCW5lc3RlZFByb3BlcnR5TmFtZXMucmVtb3ZlQWxsKG5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSk7Ci0JCQlpZiAobmVzdGluZ01vZGVscyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgbmVzdGluZ01vZGVsc0l0ZXJhdG9yID0gbmVzdGluZ01vZGVscy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChuZXN0aW5nTW9kZWxzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCSgoRGF0YU1vZGVsSW1wbCkgbmVzdGluZ01vZGVsc0l0ZXJhdG9yLm5leHQoKSkucmVtb3ZlTmVzdGVkUHJvcGVydGllcyhuZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkTW9kZWwoU3RyaW5nIG1vZGVsTmFtZSkgewotCQlyZXR1cm4gbW9kZWxOYW1lICE9IG51bGwgJiYgbnVsbCAhPSBuZXN0ZWRNb2RlbHMgJiYgbmVzdGVkTW9kZWxzLmNvbnRhaW5zS2V5KG1vZGVsTmFtZSk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0TmVzdGVkTW9kZWwoU3RyaW5nIG1vZGVsTmFtZSkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChudWxsICE9IG5lc3RlZE1vZGVscyAmJiBudWxsICE9IG1vZGVsTmFtZSkgPyAoSURhdGFNb2RlbCkgbmVzdGVkTW9kZWxzLmdldChtb2RlbE5hbWUpIDogbnVsbDsKLQkJaWYgKG51bGwgPT0gZGF0YU1vZGVsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihORVNURURfTU9ERUxfTk9UX0xPQ0FURUQgKyBtb2RlbE5hbWUpOwotCQl9Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZGF0YU1vZGVsLnByb3ZpZGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGVzY3JpcHRvcnMgPT0gbnVsbCA/IE5PX0RFU0NSSVBUT1JTIDogZGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRhdGFNb2RlbC5wcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3IgPT0gbnVsbCA/IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSkgOiBkZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGludCBmbGFnKSB7Ci0JCWludCBpbm5lckZsYWcgPSBmbGFnOwotCQlpZiAoaW5uZXJGbGFnID09IERFRkFVTFRfQ0hHKSB7Ci0JCQlpZiAoaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW5uZXJGbGFnID0gVkFMVUVfQ0hHOwotCQl9Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgRGF0YU1vZGVsRXZlbnQodGhpcywgcHJvcGVydHlOYW1lLCBpbm5lckZsYWcpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCAmJiAhbGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJSURhdGFNb2RlbExpc3RlbmVyIGxpc3RlbmVyOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlsaXN0ZW5lciA9IChJRGF0YU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoaSk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IGV2ZW50LmdldERhdGFNb2RlbCgpKSB7Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCXJldHVybiB2YWxpZGF0ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShib29sZWFuIHN0b3BPbkZpcnN0RmFpbHVyZSkgewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCUlTdGF0dXMgcHJvcFN0YXR1czsKLQkJU3RyaW5nIHByb3BOYW1lOwotCQlJdGVyYXRvciBpdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWl0ID0gYmFzZVByb3BlcnR5TmFtZXMuaXRlcmF0b3IoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaXQgPSBnZXROZXN0ZWRNb2RlbE5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlwcm9wTmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlwcm9wU3RhdHVzID0gcHJvdmlkZXIudmFsaWRhdGUocHJvcE5hbWUpOwotCQkJCWlmIChwcm9wU3RhdHVzICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCXN0YXR1cyA9IHByb3BTdGF0dXM7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJCQkJCSgoTXVsdGlTdGF0dXMpIHN0YXR1cykubWVyZ2UocHJvcFN0YXR1cyk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwiLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW11bHRpLm1lcmdlKHN0YXR1cyk7Ci0JCQkJCQkJbXVsdGkubWVyZ2UocHJvcFN0YXR1cyk7Ci0JCQkJCQkJc3RhdHVzID0gbXVsdGk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHN0b3BPbkZpcnN0RmFpbHVyZSAmJiAhc3RhdHVzLmlzT0soKSAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3RhdHVzID09IG51bGwpCi0JCQlyZXR1cm4gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJCX0gZWxzZSBpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsICYmIGxpc3RlbmVyICE9IG51bGwpCi0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgZG9lc24ndCBoYXZlIGFueSBlcnJvcnMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlKHRydWUpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5VmFsaWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUjsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBkYXRhTW9kZWwucHJvdmlkZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHN0YXR1cyA9PSBudWxsID8gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUyA6IHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZENvbnRleHQoKSB7Ci0JCUxpc3QgZXh0ZW5kZWRDb250ZXh0ID0gcHJvdmlkZXIuZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0JCXJldHVybiBleHRlbmRlZENvbnRleHQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBleHRlbmRlZENvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldFJhd09wZXJhdGlvbigpIHsKLQkJSURhdGFNb2RlbE9wZXJhdGlvbiBwcm92aWRlck9wID0gcHJvdmlkZXIuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQlpZiAobnVsbCA9PSBwcm92aWRlck9wKSB7Ci0JCQlwcm92aWRlck9wID0gbmV3IEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uKHRoaXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJcmV0dXJuIE9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBwcm92aWRlck9wOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsKGdldFJhd09wZXJhdGlvbigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIklEYXRhTW9kZWwsIHByb3ZpZGVyPSIgKyBwcm92aWRlci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJU3RyaW5nIGlkID0gcHJvdmlkZXIuZ2V0SUQoKTsKLQkJcmV0dXJuIG51bGwgIT0gaWQgPyBpZCA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzhhZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBpbXBsZW1lbnRzIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50IHsKLQotCXByaXZhdGUgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb247Ci0JcHJpdmF0ZSBpbnQgb3BlcmF0aW9uVHlwZTsKLQlwcml2YXRlIGludCBleGVjdXRpb25UeXBlOwotCi0JcHVibGljIERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKElEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uLCBpbnQgb3BlcmF0aW9uVHlwZSwgaW50IGV4ZWN1dGlvblR5cGUpIHsKLQkJdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0JCXRoaXMub3BlcmF0aW9uVHlwZSA9IG9wZXJhdGlvblR5cGU7Ci0JCXRoaXMuZXhlY3V0aW9uVHlwZSA9IGV4ZWN1dGlvblR5cGU7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gb3BlcmF0aW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIG9wZXJhdGlvblR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFeGVjdXRpb25UeXBlKCkgewotCQlyZXR1cm4gZXhlY3V0aW9uVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWQwNzhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLkNvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsIGV4dGVuZHMgV3JhcHBlZE9wZXJhdGlvbiBpbXBsZW1lbnRzIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiB7Ci0KLQkvLyBTdGFjayBvZiBTdGFja0VudHJpZXMgdG8gYmUgZXhlY3V0ZWQKLQlwcm90ZWN0ZWQgU3RhY2sgb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUgPSBudWxsOwotCi0JLy8gU3RhY2sgb2YgU3RhY2tFbnRyaWVzIGFscmVhZHkgZXhlY3V0ZWQKLQlwcm90ZWN0ZWQgU3RhY2sgdW5kb1N0YWNrID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RhY2sgcmVkb1N0YWNrID0gbnVsbDsKLQotCXByb3RlY3RlZCBPcGVyYXRpb25TdGFja0VudHJ5IHJvb3RTdGFja0VudHJ5ID0gbnVsbDsKLQotCXByb3RlY3RlZCBMaXN0IG9wZXJhdGlvbkxpc3RlbmVyczsKLQotCXByb3RlY3RlZCBpbnQgZXhlY3V0aW9uU3RhdGUgPSBOT1RfU1RBUlRFRDsKLQotCXB1YmxpYyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwoSURhdGFNb2RlbE9wZXJhdGlvbiByb290T3BlcmF0aW9uKSB7Ci0JCXN1cGVyKHJvb3RPcGVyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbkxpc3RlbmVyKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyIG9wZXJhdGlvbkxpc3RlbmVyKSB7Ci0JCWlmIChudWxsID09IG9wZXJhdGlvbkxpc3RlbmVycykgewotCQkJb3BlcmF0aW9uTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCW9wZXJhdGlvbkxpc3RlbmVycy5hZGQob3BlcmF0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU9wZXJhdGlvbkxpc3RlbmVyKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyIG9wZXJhdGlvbkxpc3RlbmVyKSB7Ci0JCWlmIChudWxsICE9IG9wZXJhdGlvbkxpc3RlbmVycykgewotCQkJb3BlcmF0aW9uTGlzdGVuZXJzLnJlbW92ZShvcGVyYXRpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldEV4ZWN1dGlvblN0YXRlKCkgewotCQlyZXR1cm4gZXhlY3V0aW9uU3RhdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURV9JTVBMID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBVTkRPX0lNUEwgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJFRE9fSU1QTCA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUk9MTEJBQ0tfSU1QTCA9IDM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FX0lNUEwgPSA0OwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHRocmVhZFRvRXh0ZW5kZWRPcENvbnRyb2wgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjYWNoZVRocmVhZEFuZENvbnRpbnVlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvLCBpbnQgcnVuVHlwZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFRocmVhZCBjdXJyZW50VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQkJZmluYWwgYm9vbGVhbiBpc1RvcExldmVsT3BlcmF0aW9uID0gIXRocmVhZFRvRXh0ZW5kZWRPcENvbnRyb2wuY29udGFpbnNLZXkoY3VycmVudFRocmVhZCk7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNUb3BMZXZlbE9wZXJhdGlvbikgewotCQkJCXRocmVhZFRvRXh0ZW5kZWRPcENvbnRyb2wucHV0KGN1cnJlbnRUaHJlYWQsIHRoaXMpOwotCQkJfQotCQkJc3dpdGNoIChydW5UeXBlKSB7Ci0JCQkJY2FzZSBFWEVDVVRFX0lNUEwgOgotCQkJCQlyZXR1cm4gZXhlY3V0ZUltcGwobW9uaXRvciwgaW5mbyk7Ci0JCQkJY2FzZSBVTkRPX0lNUEwgOgotCQkJCQlyZXR1cm4gdW5kb0ltcGwobW9uaXRvciwgaW5mbyk7Ci0JCQkJY2FzZSBSRURPX0lNUEwgOgotCQkJCQlyZXR1cm4gcmVkb0ltcGwobW9uaXRvciwgaW5mbyk7Ci0JCQkJY2FzZSBST0xMQkFDS19JTVBMIDoKLQkJCQkJcmV0dXJuIHJvbGxCYWNrSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCQljYXNlIFJFU1VNRV9JTVBMIDoKLQkJCQkJcmV0dXJuIHJlc3VtZUltcGwobW9uaXRvciwgaW5mbyk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXNUb3BMZXZlbE9wZXJhdGlvbikgewotCQkJCXRocmVhZFRvRXh0ZW5kZWRPcENvbnRyb2wucmVtb3ZlKGN1cnJlbnRUaHJlYWQpOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVzdW1lKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNhY2hlVGhyZWFkQW5kQ29udGludWUobW9uaXRvciwgaW5mbywgUkVTVU1FX0lNUEwpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJlc3VtZUltcGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlzd2l0Y2ggKGV4ZWN1dGlvblN0YXRlKSB7Ci0JCQljYXNlIE5PVF9TVEFSVEVEIDoKLQkJCQlyZXR1cm4gZXhlY3V0ZUltcGwobW9uaXRvciwgaW5mbyk7Ci0JCQljYXNlIFBBVVNFRF9FWEVDVVRFIDoKLQkJCWNhc2UgQ09NUExFVEVfUk9MTEJBQ0sgOgotCQkJCXJldHVybiBkb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCQljYXNlIFBBVVNFRF9VTkRPIDoKLQkJCQlyZXR1cm4gZG9VbmRvKG1vbml0b3IsIGluZm8pOwotCQkJY2FzZSBQQVVTRURfUkVETyA6Ci0JCQkJcmV0dXJuIHJlZG9JbXBsKG1vbml0b3IsIGluZm8pOwotCQl9Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIChDT01QTEVURV9VTkRPID09IGV4ZWN1dGlvblN0YXRlKSAmJiBzdXBlci5jYW5SZWRvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjYWNoZVRocmVhZEFuZENvbnRpbnVlKG1vbml0b3IsIGluZm8sIFJFRE9fSU1QTCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcmVkb0ltcGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJcmV0dXJuIGRvUmVkbyhtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1JlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gUlVOTklOR19SRURPOwotCQkJT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cyA9IG51bGw7Ci0JCQlpbnQgc2hvdWxkQ29udGludWUgPSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRTsKLQkJCXdoaWxlIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRSA9PSBzaG91bGRDb250aW51ZSAmJiAhcmVkb1N0YWNrLmlzRW1wdHkoKSkgewotCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgc3RhY2tFbnRyeSA9IChPcGVyYXRpb25TdGFja0VudHJ5KSByZWRvU3RhY2sucGVlaygpOwotCQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uID0gc3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKTsKLQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChvcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlJFRE8pOwotCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0UgPT0gc2hvdWxkQ29udGludWUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXVuZG9TdGFjay5wdXNoKHJlZG9TdGFjay5wb3AoKSk7Ci0JCQkJcmV0dXJuU3RhdHVzID0gcnVuT3BlcmF0aW9uKG9wZXJhdGlvbiwgbW9uaXRvciwgaW5mbywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUkVETywgcmV0dXJuU3RhdHVzKTsKLQkJCQlldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChvcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fRklOSVNIRUQsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlJFRE8pOwotCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQotCQkJfQotCQkJcmV0dXJuIHJldHVyblN0YXR1cyA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IHJldHVyblN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gcmVkb1N0YWNrLmlzRW1wdHkoKSA/IENPTVBMRVRFX1JFRE8gOiBQQVVTRURfUkVETzsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiAoZXhlY3V0aW9uU3RhdGUgPT0gQ09NUExFVEVfRVhFQ1VURSB8fCBleGVjdXRpb25TdGF0ZSA9PSBDT01QTEVURV9SRURPKSAmJiBzdXBlci5jYW5VbmRvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjYWNoZVRocmVhZEFuZENvbnRpbnVlKG1vbml0b3IsIGluZm8sIFVORE9fSU1QTCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdW5kb0ltcGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJcmVkb1N0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCXJldHVybiBkb1VuZG8obW9uaXRvciwgaW5mbyk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9VbmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCXRyeSB7Ci0JCQlleGVjdXRpb25TdGF0ZSA9IFJVTk5JTkdfVU5ETzsKLQkJCU9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMgPSBudWxsOwotCQkJaW50IHNob3VsZENvbnRpbnVlID0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JCQl3aGlsZSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUUgPT0gc2hvdWxkQ29udGludWUgJiYgIXVuZG9TdGFjay5pc0VtcHR5KCkpIHsKLQkJCQlPcGVyYXRpb25TdGFja0VudHJ5IHN0YWNrRW50cnkgPSAoT3BlcmF0aW9uU3RhY2tFbnRyeSkgdW5kb1N0YWNrLnBlZWsoKTsKLQkJCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHN0YWNrRW50cnkuZ2V0T3BlcmF0aW9uKCk7Ci0JCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwob3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5VTkRPKTsKLQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJaWYgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFID09IHNob3VsZENvbnRpbnVlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZWRvU3RhY2sucHVzaCh1bmRvU3RhY2sucG9wKCkpOwotCQkJCXJldHVyblN0YXR1cyA9IHJ1bk9wZXJhdGlvbihvcGVyYXRpb24sIG1vbml0b3IsIGluZm8sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlVORE8sIHJldHVyblN0YXR1cyk7Ci0JCQkJZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwob3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVELCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5VTkRPKTsKLQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0KLQkJCX0KLQkJCXJldHVybiByZXR1cm5TdGF0dXMgPT0gbnVsbCA/IFN0YXR1cy5PS19TVEFUVVMgOiByZXR1cm5TdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQlleGVjdXRpb25TdGF0ZSA9IHVuZG9TdGFjay5pc0VtcHR5KCkgPyBDT01QTEVURV9VTkRPIDogUEFVU0VEX1VORE87Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNhY2hlVGhyZWFkQW5kQ29udGludWUobW9uaXRvciwgaW5mbywgRVhFQ1VURV9JTVBMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBleGVjdXRlSW1wbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlleGVjdXRpb25TdGF0ZSA9IFJVTk5JTkdfRVhFQ1VURTsKLQkJCXVuZG9TdGFjayA9IG5ldyBTdGFjaygpOwotCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUgPSBuZXcgU3RhY2soKTsKLQkJCXJvb3RTdGFja0VudHJ5ID0gbmV3IE9wZXJhdGlvblN0YWNrRW50cnkobnVsbCwgcm9vdE9wZXJhdGlvbik7Ci0JCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wdXNoKHJvb3RTdGFja0VudHJ5KTsKLQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKHJvb3RPcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk5PREVfU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJaWYgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFID09IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCkpIHsKLQkJCQlyZXR1cm4gZG9FeGVjdXRlKG1vbml0b3IsIGluZm8pOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gZmluYWxseSB7Ci0JCQlleGVjdXRpb25TdGF0ZSA9IG9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLmlzRW1wdHkoKSA/IENPTVBMRVRFX0VYRUNVVEUgOiBQQVVTRURfRVhFQ1VURTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzID0gbnVsbDsKLQkJCWludCBzaG91bGRDb250aW51ZSA9IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFOwotCQkJd2hpbGUgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFID09IHNob3VsZENvbnRpbnVlICYmICFvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5pc0VtcHR5KCkpIHsKLQkJCQlPcGVyYXRpb25TdGFja0VudHJ5IHN0YWNrRW50cnkgPSAoT3BlcmF0aW9uU3RhY2tFbnRyeSkgb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucGVlaygpOwotCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgcHJlU3RhY2tFbnRyeSA9IHN0YWNrRW50cnkuZ2V0TmV4dFByZU9wZXJhdGlvbigpOwotCQkJCWlmIChudWxsICE9IHByZVN0YWNrRW50cnkpIHsKLQkJCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucHVzaChwcmVTdGFja0VudHJ5KTsKLQkJCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwocHJlU3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKSwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTk9ERV9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gc3RhY2tFbnRyeU9wZXJhdGlvbiA9IHN0YWNrRW50cnkuZ2V0T3BlcmF0aW9uRm9yRXhlY3V0aW9uKCk7Ci0JCQkJaWYgKG51bGwgIT0gc3RhY2tFbnRyeU9wZXJhdGlvbikgewotCQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChzdGFja0VudHJ5T3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0UgPT0gc2hvdWxkQ29udGludWUpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXJldHVyblN0YXR1cyA9IHJ1bk9wZXJhdGlvbihzdGFja0VudHJ5T3BlcmF0aW9uLCBtb25pdG9yLCBpbmZvLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFLCByZXR1cm5TdGF0dXMpOwotCQkJCQl1bmRvU3RhY2sucHVzaChzdGFja0VudHJ5KTsKLQkJCQkJZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwoc3RhY2tFbnRyeU9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQkJaWYgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFID09IHNob3VsZENvbnRpbnVlKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlPcGVyYXRpb25TdGFja0VudHJ5IHBvc3RTdGFja0VudHJ5ID0gc3RhY2tFbnRyeS5nZXROZXh0UG9zdE9wZXJhdGlvbigpOwotCQkJCWlmIChudWxsICE9IHBvc3RTdGFja0VudHJ5KSB7Ci0JCQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnB1c2gocG9zdFN0YWNrRW50cnkpOwotCQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChwb3N0U3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKSwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTk9ERV9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnBvcCgpOwotCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKHN0YWNrRW50cnkuZ2V0T3BlcmF0aW9uKCksIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk5PREVfRklOSVNIRUQsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCX0KLQkJCXJldHVybiByZXR1cm5TdGF0dXMgPT0gbnVsbCA/IFN0YXR1cy5PS19TVEFUVVMgOiByZXR1cm5TdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQlleGVjdXRpb25TdGF0ZSA9IG9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLmlzRW1wdHkoKSA/IENPTVBMRVRFX0VYRUNVVEUgOiBQQVVTRURfRVhFQ1VURTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJvbGxCYWNrKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNhY2hlVGhyZWFkQW5kQ29udGludWUobW9uaXRvciwgaW5mbywgUk9MTEJBQ0tfSU1QTCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcm9sbEJhY2tJbXBsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKFBBVVNFRF9FWEVDVVRFID09IGV4ZWN1dGlvblN0YXRlIHx8IFBBVVNFRF9ST0xMQkFDSyA9PSBleGVjdXRpb25TdGF0ZSkgewotCQkJdHJ5IHsKLQkJCQlleGVjdXRpb25TdGF0ZSA9IFJVTk5JTkdfUk9MTEJBQ0s7Ci0JCQkJT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cyA9IG51bGw7Ci0JCQkJaW50IHNob3VsZENvbnRpbnVlID0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JCQkJd2hpbGUgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFID09IHNob3VsZENvbnRpbnVlICYmICF1bmRvU3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgc3RhY2tFbnRyeSA9IChPcGVyYXRpb25TdGFja0VudHJ5KSB1bmRvU3RhY2sucGVlaygpOwotCQkJCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHN0YWNrRW50cnkuZ2V0T3BlcmF0aW9uKCk7Ci0JCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKG9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUk9MTEJBQ0spOwotCQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBzaG91bGRDb250aW51ZSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdW5kb1N0YWNrLnBvcCgpOwotCQkJCQlPcGVyYXRpb25TdGFja0VudHJ5IGV4ZWN1dGlvblRvcFN0YWNrRW50cnkgPSBzdGFja0VudHJ5LnJvbGxCYWNrT25lT3BlcmF0aW9uKCk7Ci0JCQkJCWlmIChvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5jb250YWlucyhleGVjdXRpb25Ub3BTdGFja0VudHJ5KSkgewotCQkJCQkJd2hpbGUgKG9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnBlZWsoKSAhPSBleGVjdXRpb25Ub3BTdGFja0VudHJ5KSB7Ci0JCQkJCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucG9wKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdGFjayBwYXJlbnRTdGFjayA9IG5ldyBTdGFjaygpOwotCQkJCQkJcGFyZW50U3RhY2sucHVzaChleGVjdXRpb25Ub3BTdGFja0VudHJ5KTsKLQkJCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgZW50cnkgPSBleGVjdXRpb25Ub3BTdGFja0VudHJ5LnBhcmVudDsKLQkJCQkJCXdoaWxlICghb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUuY29udGFpbnMoZW50cnkpKSB7Ci0JCQkJCQkJcGFyZW50U3RhY2sucHVzaChlbnRyeSk7Ci0JCQkJCQkJZW50cnkgPSBlbnRyeS5wYXJlbnQ7Ci0JCQkJCQl9Ci0JCQkJCQl3aGlsZSAob3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucGVlaygpICE9IGVudHJ5KSB7Ci0JCQkJCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucG9wKCk7Ci0JCQkJCQl9Ci0JCQkJCQl3aGlsZSAoIXBhcmVudFN0YWNrLmlzRW1wdHkoKSkgewotCQkJCQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnB1c2gocGFyZW50U3RhY2sucG9wKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVyblN0YXR1cyA9IHJ1bk9wZXJhdGlvbihvcGVyYXRpb24sIG1vbml0b3IsIGluZm8sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlVORE8sIHJldHVyblN0YXR1cyk7Ci0JCQkJCWV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKG9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUk9MTEJBQ0spOwotCQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXR1cm5TdGF0dXMgPT0gbnVsbCA/IFN0YXR1cy5PS19TVEFUVVMgOiByZXR1cm5TdGF0dXM7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWV4ZWN1dGlvblN0YXRlID0gdW5kb1N0YWNrLmlzRW1wdHkoKSA/IENPTVBMRVRFX1JPTExCQUNLIDogUEFVU0VEX1JPTExCQUNLOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50KSB7Ci0JCWlmIChudWxsICE9IG9wZXJhdGlvbkxpc3RlbmVycykgewotCQkJSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25MaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlsaXN0ZW5lciA9IChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcikgb3BlcmF0aW9uTGlzdGVuZXJzLmdldChpKTsKLQkJCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0UgPT0gbGlzdGVuZXIubm90aWZ5KGV2ZW50KSkgewotCQkJCQlyZXR1cm4gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3BlcmF0aW9uU3RhdHVzIGFkZFN0YXR1cyhPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzLCBJU3RhdHVzIHN0YXR1cykgewotCQlPcGVyYXRpb25TdGF0dXMgaW5uZXJSZXR1cm5TdGF0dXMgPSByZXR1cm5TdGF0dXM7Ci0JCWlmIChpbm5lclJldHVyblN0YXR1cyA9PSBudWxsKSB7Ci0JCQlpbm5lclJldHVyblN0YXR1cyA9IG5ldyBPcGVyYXRpb25TdGF0dXMoc3RhdHVzLmdldE1lc3NhZ2UoKSwgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJCWlubmVyUmV0dXJuU3RhdHVzLnNldFNldmVyaXR5KHN0YXR1cy5nZXRTZXZlcml0eSgpKTsKLQkJCWlubmVyUmV0dXJuU3RhdHVzLmFkZChzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJaW5uZXJSZXR1cm5TdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIGlubmVyUmV0dXJuU3RhdHVzOwotCX0KLQotCXByaXZhdGUgT3BlcmF0aW9uU3RhdHVzIGFkZEV4dGVuZGVkU3RhdHVzKE9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMsIElTdGF0dXMgYVN0YXR1cykgewotCQlPcGVyYXRpb25TdGF0dXMgaW5uZXJSZXR1cm5TdGF0dXMgPSByZXR1cm5TdGF0dXM7Ci0JCWlmIChpbm5lclJldHVyblN0YXR1cyA9PSBudWxsKSB7Ci0JCQlpbm5lclJldHVyblN0YXR1cyA9IG5ldyBPcGVyYXRpb25TdGF0dXMobmV3IElTdGF0dXNbXXtXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTfSk7Ci0JCX0KLQkJaW5uZXJSZXR1cm5TdGF0dXMuYWRkRXh0ZW5kZWRTdGF0dXMoYVN0YXR1cyk7Ci0JCXJldHVybiBpbm5lclJldHVyblN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIE9wZXJhdGlvblN0YXR1cyBydW5PcGVyYXRpb24oZmluYWwgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24sIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUFkYXB0YWJsZSBpbmZvLCBmaW5hbCBpbnQgZXhlY3V0aW9uVHlwZSwgT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cykgewotCQlPcGVyYXRpb25TdGF0dXMgaW5uZXJSZXR1cm5TdGF0dXMgPSByZXR1cm5TdGF0dXM7Ci0JCWlmIChyb290T3BlcmF0aW9uID09IG9wZXJhdGlvbikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBydW5PcGVyYXRpb24ob3BlcmF0aW9uLCBtb25pdG9yLCBpbmZvLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCWlubmVyUmV0dXJuU3RhdHVzID0gYWRkU3RhdHVzKGlubmVyUmV0dXJuU3RhdHVzLCBzdGF0dXMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bk9wZXJhdGlvbihvcGVyYXRpb24sIG1vbml0b3IsIGluZm8sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlpbm5lclJldHVyblN0YXR1cyA9IGFkZEV4dGVuZGVkU3RhdHVzKGlubmVyUmV0dXJuU3RhdHVzLCBzdGF0dXMpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsIFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI1IiwgbmV3IE9iamVjdFtde29wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKX0pLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlubmVyUmV0dXJuU3RhdHVzID0gYWRkRXh0ZW5kZWRTdGF0dXMoaW5uZXJSZXR1cm5TdGF0dXMsIHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlubmVyUmV0dXJuU3RhdHVzOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBydW5PcGVyYXRpb24oZmluYWwgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24sIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUFkYXB0YWJsZSBpbmZvLCBmaW5hbCBpbnQgZXhlY3V0aW9uVHlwZSkgewotCQlJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzIHdvcmtzcGFjZVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMoaW5mbykgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCXN3aXRjaCAoZXhlY3V0aW9uVHlwZSkgewotCQkJCQkJY2FzZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFIDoKLQkJCQkJCQl0aGlzLnNldFN0YXR1cyhvcGVyYXRpb24uZXhlY3V0ZShwbSwgaW5mbykpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5VTkRPIDoKLQkJCQkJCQl0aGlzLnNldFN0YXR1cyhvcGVyYXRpb24udW5kbyhwbSwgaW5mbykpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5SRURPIDoKLQkJCQkJCQl0aGlzLnNldFN0YXR1cyhvcGVyYXRpb24ucmVkbyhwbSwgaW5mbykpOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChudWxsID09IHRoaXMuZ2V0U3RhdHVzKCkpIHsKLQkJCQkJCXRoaXMuc2V0U3RhdHVzKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhpcy5zZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCAwLCBXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyNSIsIG5ldyBPYmplY3RbXXtvcGVyYXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCl9KSwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBvcGVyYXRpb24uZ2V0U2NoZWR1bGluZ1J1bGUoKTsKLQkJaWYgKG51bGwgPT0gcnVsZSkgewotCQkJcnVsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwgcnVsZSwgb3BlcmF0aW9uLmdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCksIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXdvcmtzcGFjZVJ1bm5hYmxlLnNldFN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsIFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI1IiwgbmV3IE9iamVjdFtde29wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKX0pLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gd29ya3NwYWNlUnVubmFibGUuZ2V0U3RhdHVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIE9wZXJhdGlvblN0YWNrRW50cnkgewotCi0JCXByaXZhdGUgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb247Ci0JCXByaXZhdGUgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb25Gb3JFeGVjdXRpb247Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkT3BzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCQlwcml2YXRlIENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIgZXh0T3BIb2xkZXIgPSBudWxsOwotCi0JCXByaXZhdGUgaW50IHByZU9wSW5kZXggPSAwOwotCQlwcml2YXRlIGludCBwb3N0T3BJbmRleCA9IDA7Ci0KLQkJcHJpdmF0ZSBPcGVyYXRpb25TdGFja0VudHJ5W10gcHJlT3BTdGFja0VudHJpZXMgPSBudWxsOwotCQlwcml2YXRlIE9wZXJhdGlvblN0YWNrRW50cnlbXSBwb3N0T3BTdGFja0VudHJpZXMgPSBudWxsOwotCi0JCXB1YmxpYyBPcGVyYXRpb25TdGFja0VudHJ5IHBhcmVudCA9IG51bGw7Ci0KLQkJcHVibGljIE9wZXJhdGlvblN0YWNrRW50cnkoT3BlcmF0aW9uU3RhY2tFbnRyeSBwYXJlbnQsIElEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotCQkJdGhpcy5vcGVyYXRpb25Gb3JFeGVjdXRpb24gPSBvcGVyYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgT3BlcmF0aW9uU3RhY2tFbnRyeSByb2xsQmFja09uZU9wZXJhdGlvbigpIHsKLQkJCXBvc3RPcEluZGV4ID0gMDsKLQkJCW9wZXJhdGlvbkZvckV4ZWN1dGlvbiA9IG9wZXJhdGlvbjsKLQkJCWlmIChwcmVPcEluZGV4ID09IDAgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGFyZW50LnJvbGxCYWNrRXh0ZW5kZWQodGhpcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCXByaXZhdGUgT3BlcmF0aW9uU3RhY2tFbnRyeSByb2xsQmFja0V4dGVuZGVkKE9wZXJhdGlvblN0YWNrRW50cnkgZXh0ZW5kZWRFbnRyeSkgewotCQkJd2hpbGUgKHBvc3RPcEluZGV4ID4gMCkgewotCQkJCWludCBpbmRleCA9IC0tcG9zdE9wSW5kZXg7Ci0JCQkJaWYgKHBvc3RPcFN0YWNrRW50cmllc1tpbmRleF0gPT0gZXh0ZW5kZWRFbnRyeSkgewotCQkJCQlwb3N0T3BTdGFja0VudHJpZXNbaW5kZXhdID0gbnVsbDsKLQkJCQkJcmV0dXJuIHRoaXM7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKHByZU9wSW5kZXggPiAwKSB7Ci0JCQkJaW50IGluZGV4ID0gLS1wcmVPcEluZGV4OwotCQkJCWlmIChwcmVPcFN0YWNrRW50cmllc1tpbmRleF0gPT0gZXh0ZW5kZWRFbnRyeSkgewotCQkJCQlwcmVPcFN0YWNrRW50cmllc1tpbmRleF0gPSBudWxsOwotCQkJCQlpZiAoaW5kZXggIT0gMCkgewotCQkJCQkJcmV0dXJuIHRoaXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobnVsbCAhPSBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gcGFyZW50LnJvbGxCYWNrRXh0ZW5kZWQodGhpcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCXB1YmxpYyBPcGVyYXRpb25TdGFja0VudHJ5IGdldE5leHRQcmVPcGVyYXRpb24oKSB7Ci0JCQlpZiAoIWV4dGVuZGVkT3BzSW5pdGlhbGl6ZWQpIHsKLQkJCQlpbml0RXh0ZW5kZWRPcHMoKTsKLQkJCX0KLQkJCWlmIChleHRPcEhvbGRlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlMaXN0IG9wcyA9IGV4dE9wSG9sZGVyLmdldFByZU9wcygpOwotCQkJaWYgKG9wcyA9PSBudWxsIHx8IG9wcy5zaXplKCkgPD0gcHJlT3BJbmRleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQl3aGlsZSAocHJlT3BJbmRleCA8IG9wcy5zaXplKCkpIHsKLQkJCQlpbnQgaW5kZXggPSBwcmVPcEluZGV4Kys7Ci0JCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IChJRGF0YU1vZGVsT3BlcmF0aW9uKSBvcHMuZ2V0KGluZGV4KTsKLQkJCQlpZiAoc2hvdWxkRXhlY3V0ZUV4dGVuZGVkKG9wLmdldElEKCkpKSB7Ci0JCQkJCW9wLnNldERhdGFNb2RlbChnZXREYXRhTW9kZWwoKSk7Ci0JCQkJCW9wLnNldEVudmlyb25tZW50KGdldEVudmlyb25tZW50KCkpOwotCQkJCQlwcmVPcFN0YWNrRW50cmllc1tpbmRleF0gPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeSh0aGlzLCBvcCk7Ci0JCQkJCXJldHVybiBwcmVPcFN0YWNrRW50cmllc1tpbmRleF07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBnZXRPcGVyYXRpb25JRCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25JRCgpIHsKLQkJCXJldHVybiBvcGVyYXRpb24uZ2V0SUQoKTsKLQkJfQotCi0JCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKLQkJCXJldHVybiBvcGVyYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlZCgpIHsKLQkJCXJldHVybiBudWxsICE9IG9wZXJhdGlvbkZvckV4ZWN1dGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgcm9vdCBvcGVyYXRpb24gaXMgb25seSByZXR1cm5lZCBvbmNlOyB0aGlzIHdheSBpdCBpcyBrbm93biB3aGV0aGVyIGl0IGhhcyBiZWVuCi0JCSAqIGV4ZWN1dGVkIHlldCBvciBub3QuCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRPcGVyYXRpb25Gb3JFeGVjdXRpb24oKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBvcGVyYXRpb25Gb3JFeGVjdXRpb247Ci0JCQl9IGZpbmFsbHkgewotCQkJCW9wZXJhdGlvbkZvckV4ZWN1dGlvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgT3BlcmF0aW9uU3RhY2tFbnRyeSBnZXROZXh0UG9zdE9wZXJhdGlvbigpIHsKLQkJCWlmICghZXh0ZW5kZWRPcHNJbml0aWFsaXplZCkgewotCQkJCWluaXRFeHRlbmRlZE9wcygpOwotCQkJfQotCQkJaWYgKGV4dE9wSG9sZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUxpc3Qgb3BzID0gZXh0T3BIb2xkZXIuZ2V0UG9zdE9wcygpOwotCQkJaWYgKG9wcyA9PSBudWxsIHx8IG9wcy5zaXplKCkgPD0gcG9zdE9wSW5kZXgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJd2hpbGUgKHBvc3RPcEluZGV4IDwgb3BzLnNpemUoKSkgewotCQkJCWludCBpbmRleCA9IHBvc3RPcEluZGV4Kys7Ci0JCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IChJRGF0YU1vZGVsT3BlcmF0aW9uKSBvcHMuZ2V0KGluZGV4KTsKLQkJCQlpZiAoc2hvdWxkRXhlY3V0ZUV4dGVuZGVkKG9wLmdldElEKCkpKSB7Ci0JCQkJCW9wLnNldERhdGFNb2RlbChnZXREYXRhTW9kZWwoKSk7Ci0JCQkJCW9wLnNldEVudmlyb25tZW50KGdldEVudmlyb25tZW50KCkpOwotCQkJCQlwb3N0T3BTdGFja0VudHJpZXNbaW5kZXhdID0gbmV3IE9wZXJhdGlvblN0YWNrRW50cnkodGhpcywgb3ApOwotCQkJCQlyZXR1cm4gcG9zdE9wU3RhY2tFbnRyaWVzW2luZGV4XTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluaXRFeHRlbmRlZE9wcygpIHsKLQkJCWlmIChzaG91bGRFeGVjdXRlRXh0ZW5kZWQob3BlcmF0aW9uLmdldElEKCkpKSB7Ci0JCQkJZXh0T3BIb2xkZXIgPSBDb21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyLmNyZWF0ZUV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyKG9wZXJhdGlvbi5nZXRJRCgpKTsKLQkJCQlpZiAobnVsbCAhPSBleHRPcEhvbGRlcikgewotCQkJCQlpZiAoZXh0T3BIb2xkZXIuaGFzUHJlT3BzKCkpIHsKLQkJCQkJCXByZU9wU3RhY2tFbnRyaWVzID0gbmV3IE9wZXJhdGlvblN0YWNrRW50cnlbZXh0T3BIb2xkZXIuZ2V0UHJlT3BzKCkuc2l6ZSgpXTsKLQkJCQkJfQotCQkJCQlpZiAoZXh0T3BIb2xkZXIuaGFzUG9zdE9wcygpKSB7Ci0JCQkJCQlwb3N0T3BTdGFja0VudHJpZXMgPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeVtleHRPcEhvbGRlci5nZXRQb3N0T3BzKCkuc2l6ZSgpXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWV4dGVuZGVkT3BzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRXhlY3V0ZUV4dGVuZGVkKFN0cmluZyBvcGVyYXRpb25JRCkgewotCQkvLyBDaGVjayB0aGUgdG9wIG1vc3QgbGV2ZWwgb3BlcmF0aW9uIGZpcnN0Ci0JCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbCB0aHJlYWRSb290T3BlcmF0aW9uID0gKERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbCkgdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbC5nZXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7Ci0JCWlmICh0aHJlYWRSb290T3BlcmF0aW9uICE9IHRoaXMgJiYgdGhyZWFkUm9vdE9wZXJhdGlvbi5nZXREYXRhTW9kZWwoKSAhPSBnZXREYXRhTW9kZWwoKSAmJiAhdGhyZWFkUm9vdE9wZXJhdGlvbi5zaG91bGRFeGVjdXRlRXh0ZW5kZWQob3BlcmF0aW9uSUQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gTm8gZXh0ZW5kZWQgb3BlcmF0aW9ucyBhcmUgYmVpbmcgZXhlY3V0ZWQKLQkJYm9vbGVhbiBhbGxvd0V4dGVuc2lvbnMgPSBnZXREYXRhTW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuQUxMT1dfRVhURU5TSU9OUyk7Ci0JCWlmICghYWxsb3dFeHRlbnNpb25zKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gVGhpcyBzcGVjaWZpYyBvcGVyYXRpb24gc2hvdWxkIG5vdCBiZSBleGVjdXRlZAotCQlMaXN0IHJlc3RyaWN0ZWRFeHRlbnNpb25zID0gKExpc3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMpOwotCQlpZiAocmVzdHJpY3RlZEV4dGVuc2lvbnMuY29udGFpbnMob3BlcmF0aW9uSUQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gVGhpcyBzcGVjaWZpYyBmdW5jdGlvbiBncm91cCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkCi0JCUxpc3QgZXh0ZW5kZWRDb250ZXh0ID0gZ2V0RGF0YU1vZGVsKCkuZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0JCWZvciAoaW50IGNvbnRleHRDb3VudCA9IDA7IGNvbnRleHRDb3VudCA8IGV4dGVuZGVkQ29udGV4dC5zaXplKCk7IGNvbnRleHRDb3VudCsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIoZXh0ZW5kZWRDb250ZXh0LmdldChjb250ZXh0Q291bnQpLCBJUHJvamVjdC5jbGFzcyk7Ci0JCQlpZiAobnVsbCAhPSBwcm9qZWN0ICYmICFJRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcihvcGVyYXRpb25JRCwgcHJvamVjdCkuaXNFbmFibGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQ5NGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogPHA+Ci0gKiBJRGF0YU1vZGVsTWFuYWdlck9wZXJhdGlvbiBpcyBhbiBJRGF0YU1vZGVsT3BlcmF0aW9uIHJldHVybmVkIGZyb20KLSAqIHtAbGlua29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNnZXREZWZhdWx0T3BlcmF0aW9uKCl9LiBUaGlzIE9wZXJhdGlvbiB3cmFwcyB0aGUgSURhdGFNb2RlbE9wZXJhdGlvbiByZXR1cm5lZAotICogZnJvbSB0aGUgSURhdE1vZGVsUHJvdmlkZXIgYmFja2luZyB0aGUgSURhdGFNb2RlbCB0aGF0IGNyZWF0ZWQgaXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgb3BlcmF0aW9uIHN1cHBvcnRzIHByZSBhbmQgcG9zdCBvcGVyYXRpb24gZXhlY3V0aW9uLiBQcmUgYW5kIHBvc3Qgb3BlcmF0aW9ucyBhcmUKLSAqIElEYXRhTW9kZWxPcGVyYXRpb25zIHJlZ2lzdGVyZWQgdGhyb3VnaCB0aGUgT3BlcmF0aW9uRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludCB3aGljaCBhcmUgZXhlY3V0ZWQKLSAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHByaW1hcnkgb3BlcmF0aW9uLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5FeGFtcGxlIDE8L2I+IDxicj4KLSAqIFN1cHBvc2UgYW4gSURhdGFNb2RlbFByb3ZpZGVyIHJldHVybnMgSURhdGFNb2RlbE9wZXJhdGlvbiBYIGFzIGl0cyBkZWZhdWx0IG9wZXJhdGlvbiwgYW5kIHRoaXMKLSAqIElEYXRhTW9kZWxNYW5hZ2VyT3BlcmF0aW9uIGlzIHdyYXBwaW5nIFguIEFsc28gc3VwcG9zZSBvcGVyYXRpb24gQSBpcyByZWdpc3RlcmVkIGFzIGEgcHJlCi0gKiBvcGVyYXRpb24gdG8gWCBhbmQgb3BlcmF0aW9uIEIgaXMgcmVnaXN0ZXJlZCBhcyBhIHBvc3Qgb3BlcmF0aW9uIHRvIFguIFdoZW4gdGhpcwotICogSURhdGFNb2RlbE1hbmFnZXJPcGVyYXRpb24gaXMgZXhlY3V0ZWQgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhpcyBvcmRlcjoKLSAqIEEsIFgsIEIgd2hpY2ggbWF5IGJlIHRob3VnaHQgYXMgYSBwcmVvcmRlciBleGVjdXRpb24gb2YgdGhlIGZvbGxvd2luZyB0cmVlOgotICogPC9wPgotICogCi0gKiA8cHJlPgotICogICAgICAgICAgIFgKLSAqICAgICAgICAgIC8gXAotICogICAgICAgICBBICAgQgotICogICAgICAgICAKLSAqICAgZXhlY3V0aW9uID0gQS5leGVjdXRlKCksICBYLmV4ZWN1dGUoKSwgQi5leGVjdXRlKCkKLSAqICAgdW5kbyA9IEIudW5kbygpLCBYLnVuZG8oKSwgQS51bmRvKCkKLSAqICAgcmVkbyA9IEEucmVkbygpLCBYLnJlZG8oKSwgQi5yZWRvKCkKLSAqIDwvcHJlPgotICogCi0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMjwvYj4gPGJyPgotICogSWYgQSBoYWQgYSBwcmUgb3BlcmF0aW9uIEMgYW5kIHBvc3Qgb3BlcmF0aW9uIEQsIGFuZCBCIGhhZCBhIHByZSBvcGVyYXRpb24gRSBhbmQgcG9zdCBvcGVyYXRpb24gRgotICogdGhlbiB0aGUgdHJlZSB3b3VsZCBsb29rIGxpa2U6Ci0gKiA8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiAgICAgICAgICAgIFgKLSAqICAgICAgICAgICAvIFwKLSAqICAgICAgICAgIC8gICBcCi0gKiAgICAgICAgIEEgICAgIEIKLSAqICAgICAgICAvIFwgICAvIFwKLSAqICAgICAgIEMgICBEIEUgICBGCi0gKiAgIAotICogICBleGVjdXRpb24gPSBDLmV4ZWN1dGUoKSwgQS5leGVjdXRlKCksICBELmV4ZWN1dGUoKSwgWC5leGVjdXRlKCksIEUuZXhlY3V0ZSgpLCBCLmV4ZWN1dGUoKSwgRi5leGVjdXRlKCkKLSAqICAgdW5kbyA9IEYudW5kbygpLCBCLnVuZG8oKSwgRS51bmRvKCksIFgudW5kbygpLCBELnVuZG8oKSwgQS51bmRvKCksIEMudW5kbygpCi0gKiAgIHJlZG8gPSBDLnJlZG8oKSwgQS5yZWRvKCksICBELnJlZG8oKSwgWC5yZWRvKCksIEUucmVkbygpLCBCLnJlZG8oKSwgRi5yZWRvKCkKLSAqIDwvcHJlPgotICogCi0gKiA8L3A+Ci0gKiA8Yj5FeGFtcGxlIDM8L2I+IDxicj4KLSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcHJlIG9wZXJhdGlvbiBvciBwb3N0IG9wZXJhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbiwgdGhlbiB0aGVyZQotICogaXMgbm8gZGVmaW5lZCBvcmRlcmluZyBvZiB0aG9zZSBwcmUgYW5kIHBvc3Qgb3BlcmF0aW9uIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLCBvdGhlciB0aGFuCi0gKiB0aGF0IGl0IHdpbGwgYmUgY29uc2lzdGVudC4gRm9yIGV4YW1wbGUgc3VwcG9zZSBvcGVyYXRpb24gWCBoYWQgb25seSB0d28gcHJlIG9wZXJhdGlvbnMsIEEgYW5kIEIsCi0gKiBhbmQgdHdvIHBvc3Qgb3BlcmF0aW9ucywgQyBhbmQgRC4gVGhlIGV4ZWN1dGlvbiB0cmVlIHdvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogPC9wPgotICogCi0gKiA8cHJlPgotICogICAgICAgICBYICAgICAgICAgICAgICBYICAgICAgICAgICAgICBYICAgICAgICAgICAgICBYCi0gKiAgICAgICAgLyBcICAgICAgICAgICAgLyBcICAgICAgICAgICAgLyBcICAgICAgICAgICAgLyBcCi0gKiAgICAgIEFCICAgQ0QgICAgICAgIEJBICAgQ0QgICAgICAgIEFCICAgREMgICAgICAgIEJBICAgREMKLSAqICAgCi0gKiAgICBleGVjID0gQUJYQ0QgICBleGVjID0gQkFYQ0QgICBleGVjID0gQUJYREMgICBleGVjID0gQkFYREMKLSAqICAgIHVuZG8gPSBEQ1hCQSAgIHVuZG8gPSBEQ1hBQiAgIHVuZG8gPSBDRFhCQSAgIHVuZG8gPSBDRFhBQiAKLSAqICAgIHJlZG8gPSBBQlhDRCAgIHJlZG8gPSBCQVhDRCAgIHJlZG8gPSBBQlhEQyAgIHJlZG8gPSBCQVhEQwotICogPC9wcmU+Ci0gKiAKLSAqIDxwPgotICogRHVyaW5nIGV4ZWN1dGlvbiwgcm9sbGJhY2ssIHVuZG8sIGFuZCByZWRvLCB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnR9cyBhcmUgZmlyZWQgdG8gYWxsCi0gKiByZWdpc3RlcmVkIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcn1zIGdpdmluZyBlYWNoIG9mIHRoZW0gYW4gb3Bwb3J0dW5pdHkgdG8gcGF1c2UgdGhlCi0gKiBvcGVyYXRpb24gYnkgcmV0dXJuaW5nIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciNQQVVTRX0uCi0gKiB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnR9IGhhcyBtb3JlIGRldGFpbHMgb24gd2hlbiB0aGVzZSBldmVudHMgYXJlIGZpcmVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZW9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNnZXREZWZhdWx0T3BlcmF0aW9uKCkKLSAqIAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBleHRlbmRzIElEYXRhTW9kZWxPcGVyYXRpb24gewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gbmV2ZXIgYmVlbiBleGVjdXRlZC4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMKLQkgKiBzdGF0ZSBpdCBtYXkgb25seSBiZSBleGVjdXRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfU1RBUlRFRCA9IDA7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGlsZSB0aGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGluZy4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQKLQkgKiBtYXkgb25seSBiZSBwYXVzZWQgYnkgYW4ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKiBAc2VlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOTklOR19FWEVDVVRFID0gMTsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoaWxlIHRoZSBvcGVyYXRpb24gaXMgcm9sbGluZyBiYWNrLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZQotCSAqIGl0IG1heSBvbmx5IGJlIHBhdXNlZCBieSBhbiB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNyb2xsQmFjayhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HX1JPTExCQUNLID0gMjsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoaWxlIHRoZSBvcGVyYXRpb24gaXMgcmVkb2luZy4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQKLQkgKiBtYXkgb25seSBiZSBwYXVzZWQgYnkgYW4ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3VuZG8oSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKiBAc2VlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOTklOR19VTkRPID0gMzsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoaWxlIHRoZSBvcGVyYWl0b24gaXMgcmVkb2luZy4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQKLQkgKiBtYXkgb25seSBiZSBwYXVzZWQgYnkgYW4ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI3JlZG8oSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKiBAc2VlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOTklOR19SRURPID0gNDsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBwYXVzZWQgd2hpbGUgaXQgd2FzIGV4ZWN1dGluZy4gV2hlbiB0aGUKLQkgKiBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdCBtYXkgZWl0aGVyIGJlIHJlc3VtZWQgdG8gY29udGludWUgZXhlY3V0aW9uIG9yIHJvbGxlZCBiYWNrIHRvCi0JICogdW5kbyB0aGUgcGFydGlhbCBleGVjdXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI3Jlc3VtZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgI3JvbGxCYWNrKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0VEX0VYRUNVVEUgPSA1OwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHBhdXNlZCB3aGlsZSBpdCB3YXMgcm9sbGluZyBiYWNrLiBXaGVuIHRoZQotCSAqIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0IG1heSBlaXRoZXIgYmUgcmVzdW1lZCB0byBjb250aW51ZSByb2xsaW5nIGJhY2sgb3IgZXhlY3V0ZWQKLQkgKiB3aGljaCBjb250aW51ZSB0aGUgZm93YXJkIGV4ZWN1dGlvbiBmcm9tIHRoZSBwb2ludCB3aGVyZSB0aGUgcm9sbGJhY2sgd2FzIHBhdXNlZAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNyZXN1bWUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVVNFRF9ST0xMQkFDSyA9IDY7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcGF1c2VkIHdoaWxlIGl0IHdhcyB1bmRvaW5nLiBXaGVuIHRoZQotCSAqIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0IG1heSBiZSBvbmx5IGJlIHJlc3VtZWQgdG8gY29udGludWUgdW5kb2luZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjcmVzdW1lKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0VEX1VORE8gPSA3OwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHBhdXNlZCB3aGlsZSBpdCB3YXMgcmVkb2luZy4gV2hlbiB0aGUKLQkgKiBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdCBtYXkgb25seSBiZSByZXN1bWVkIHRvIGNvbnRpbnVlIHJlZG9pbmcuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI3Jlc3VtZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVVNFRF9SRURPID0gODsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBmaW5pc2hlZCBleGVjdXRpb24uIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzCi0JICogc3RhdGUgaXQgbWF5IG9ubHkgYmUgdW5kb25lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jdW5kbyhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFX0VYRUNVVEUgPSA5OwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGZpbmlzaGVkIHJvbGxpbmcgYmFjay4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMKLQkgKiBzdGF0ZSBpdCBtYXkgb25seSBiZSBleGVjdXRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVURV9ST0xMQkFDSyA9IDEwOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGZpbmlzaGVkIHVuZG9pbmcuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlCi0JICogaXQgbWF5IG9ubHkgYmUgcmVkb25lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jcmVkbyhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFX1VORE8gPSAxMTsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBmaW5pc2hlZCByZWRvaW5nLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZQotCSAqIGl0IG1heSBvbmx5IGJlIHVkb25lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jdW5kbyhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFX1JFRE8gPSAxMjsKLQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhdGUgb2YgdGhlIG9wZXJhdGlvbi4gUmV0dXJucyBvbmUgb2Y6Ci0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgI05PVF9TVEFSVEVEfTwvbGk+Ci0JICogPGxpPntAbGluayAjUlVOTklOR19FWEVDVVRFfTwvbGk+Ci0JICogPGxpPntAbGluayAjUlVOTklOR19ST0xMQkFDS308L2xpPgotCSAqIDxsaT57QGxpbmsgI1JVTk5JTkdfVU5ET308L2xpPgotCSAqIDxsaT57QGxpbmsgI1JVTk5JTkdfUkVET308L2xpPgotCSAqIDxsaT57QGxpbmsgI1BBVVNFRF9FWEVDVVRFfTwvbGk+Ci0JICogPGxpPntAbGluayAjUEFVU0VEX1JPTExCQUNLfTwvbGk+Ci0JICogPGxpPntAbGluayAjUEFVU0VEX1VORE99PC9saT4KLQkgKiA8bGk+e0BsaW5rICNQQVVTRURfUkVET308L2xpPgotCSAqIDxsaT57QGxpbmsgI0NPTVBMRVRFX0VYRUNVVEV9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNDT01QTEVURV9ST0xMQkFDS308L2xpPgotCSAqIDxsaT57QGxpbmsgI0NPTVBMRVRFX1VORE99PC9saT4KLQkgKiA8bGk+e0BsaW5rICNDT01QTEVURV9SRURPfTwvbGk+Ci0JICogPC91bD4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4ZWN1dGlvblN0YXRlKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXN1bWVzIGV4ZWN1dGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIGN1cmVudGx5IHBhdXNlZC4gQW4gb3BlcmF0aW9uIGlzIHBhdXNlZCBpZgotCSAqIHtAbGluayAjZ2V0RXhlY3V0aW9uU3RhdGUoKX0gcmV0dXJucyBhbnkgb2Yge0BsaW5rICNQQVVTRURfRVhFQ1VURX0sCi0JICoge0BsaW5rICNQQVVTRURfUk9MTEJBQ0t9LCB7QGxpbmsgI1BBVVNFRF9VTkRPfSwgb3Ige0BsaW5rICNQQVVTRURfUkVET30uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHRvIHVzZSBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIHRvCi0JICogICAgICAgICAgICB0aGUgdXNlci4KLQkgKiBAcGFyYW0gaW5mbwotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseQotCSAqICAgICAgICAgICAgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIgZm9yIHRoZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBvZiB0aGUgcmVzdW1lLiBUaGUgc3RhdHVzIHNldmVyaXR5IHNob3VsZCBiZSBzZXQgdG8gPGNvZGU+T0s8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhbmQgPGNvZGU+RVJST1I8L2NvZGU+IGlmIGl0IHdhcyBub3QuIEFueSBvdGhlcgotCSAqICAgICAgICAgc3RhdHVzIGlzIGFzc3VtZWQgdG8gcmVwcmVzZW50IGFuIGluY29tcGxldGlvbiBvZiB0aGUgcmVzdW1lLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJlc3VtZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJvbGxzIGJhY2sgdGhlIHBhcnRpYWwgZXhlY3V0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgY3VycmVudGx5IGluCi0JICoge0BsaW5rICNnZXRFeGVjdXRpb25TdGF0ZSgpfSByZXR1cm5zIGVpdGVyIHtAbGluayAjUEFVU0VEX0VYRUNVVEV9IG9yCi0JICoge0BsaW5rICNQQVVTRURfUk9MTEJBQ0t9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSB0byB1c2UgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyB0bwotCSAqICAgICAgICAgICAgdGhlIHVzZXIuCi0JICogQHBhcmFtIGluZm8KLQkgKiAgICAgICAgICAgIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkKLQkgKiAgICAgICAgICAgIFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyIGZvciB0aGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLmNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgb2YgdGhlIHJlc3VtZS4gVGhlIHN0YXR1cyBzZXZlcml0eSBzaG91bGQgYmUgc2V0IHRvIDxjb2RlPk9LPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpdCB3YXMgbm90LiBBbnkgb3RoZXIKLQkgKiAgICAgICAgIHN0YXR1cyBpcyBhc3N1bWVkIHRvIHJlcHJlc2VudCBhbiBpbmNvbXBsZXRpb24gb2YgdGhlIHJlc3VtZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByb2xsQmFjayhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgYW4gb3BlcmF0aW9uIGxpc3RlbmVyIHRvIGxpc3RlbiBmb3Igb3BlcmF0aW9uIGV2ZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbkxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgSU9wZXJhdGlvbkxpc3RlbmVyIHRvIGFkZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25MaXN0ZW5lcihJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciBvcGVyYXRpb25MaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgSU9wZXJhdGlvbkxpbnN0ZW5lci4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIFRoZSBJT3BlcmF0b2luTGlzdGVuZXIgdG8gcmVtb3ZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU9wZXJhdGlvbkxpc3RlbmVyKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyIG9wZXJhdGlvbkxpc3RlbmVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjc4MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIDxwPgotICogVGhlc2UgZXZlbnRzIGFyZSBmaXJlZCB0byB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9cyBmcm9tIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259cyBkdXJpbmcgZXhlY3V0aW9uLCByb2xsYmFjaywgdW5kbywKLSAqIGFuZCByZWRvLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMjwvYj4gZnJvbSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufTxicj4KLSAqIDxwcmU+Ci0gKiAgICAgICAgICBYCi0gKiAgICAgICAgIC8gXAotICogICAgICAgIC8gICBcCi0gKiAgICAgICBBICAgICBCCi0gKiAgICAgIC8gXCAgIC8gXAotICogICAgIEMgICBEIEUgICBGCi0gKiA8L3ByZT4KLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZXZlbnRzIHdpbGwgYmUgZmlyZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBkdXJpbmcgYW4gZXhlY3V0aW9uOgotICogPHRhYmxlIGJvcmRlcj0xPgotICogPHRyPjx0aD5vcGVyYXRpb248L3RoPjx0aD5vcGVyYXRpb24gdHlwZTwvdGg+PHRoPmV4ZWN1dGlvbiB0eXBlPC90aD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8L3RhYmxlPgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5FeGFtcGxlIDI8L2I+IGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn08YnI+Ci0gKiA8cHJlPgotICogICAgICAgICAgWAotICogICAgICAgICAvIFwKLSAqICAgICAgICAvICAgXAotICogICAgICAgQSAgICAgQgotICogICAgICAvIFwgICAvIFwKLSAqICAgICBDICAgRCBFICAgRgotICogPC9wcmU+Ci0gKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgZHVyaW5nIGEgcm9sbGJhY2s6Ci0gKiA8dGFibGUgYm9yZGVyPTE+Ci0gKiA8dHI+PHRoPm9wZXJhdGlvbjwvdGg+PHRoPm9wZXJhdGlvbiB0eXBlPC90aD48dGg+ZXhlY3V0aW9uIHR5cGU8L3RoPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+Uk9MTEJBQ0s8L3RkPjwvdHI+Ci0gKiA8L3RhYmxlPgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5FeGFtcGxlIDI8L2I+IGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn08YnI+Ci0gKiA8cHJlPgotICogICAgICAgICAgWAotICogICAgICAgICAvIFwKLSAqICAgICAgICAvICAgXAotICogICAgICAgQSAgICAgQgotICogICAgICAvIFwgICAvIFwKLSAqICAgICBDICAgRCBFICAgRgotICogPC9wcmU+Ci0gKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgZHVyaW5nIGFuIHVuZG86Ci0gKiA8dGFibGUgYm9yZGVyPTE+Ci0gKiA8dHI+PHRoPm9wZXJhdGlvbjwvdGg+PHRoPm9wZXJhdGlvbiB0eXBlPC90aD48dGg+ZXhlY3V0aW9uIHR5cGU8L3RoPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPC90YWJsZT4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+RXhhbXBsZSAyPC9iPiBmcm9tIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259PGJyPgotICogPHByZT4KLSAqICAgICAgICAgIFgKLSAqICAgICAgICAgLyBcCi0gKiAgICAgICAgLyAgIFwKLSAqICAgICAgIEEgICAgIEIKLSAqICAgICAgLyBcICAgLyBcCi0gKiAgICAgQyAgIEQgRSAgIEYKLSAqIDwvcHJlPgotICogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBldmVudHMgd2lsbCBiZSBmaXJlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGR1cmluZyBhIHJlZG86Ci0gKiA8dGFibGUgYm9yZGVyPTE+Ci0gKiA8dHI+PHRoPm9wZXJhdGlvbjwvdGg+PHRoPm9wZXJhdGlvbiB0eXBlPC90aD48dGg+ZXhlY3V0aW9uIHR5cGU8L3RoPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPC90YWJsZT4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgb3BlcmF0aW9uIHR5cGUgc2V0IHdoZW4gYW4gb3BlcmF0aW9uIGV4ZWN1dGlvbiB0cmF2ZXJzYWwgaXMgYWJvdXQgdG8gc3RhcnQgd2l0aGluIHRoZQotCSAqIHRyZWUgb2Ygb3BlcmF0aW9ucyBoYW5kbGVkIGJ5IHRoZSBvd25pbmcge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn0uIFRoaXMgb3BlcmF0aW9uCi0JICogdHlwZSBpcyBvbmx5IHNldCB3aGVuIHRoZSBleGVjdXRpb24gdHlwZSBpcyBzZXQgdG8ge0BsaW5rICNFWEVDVVRFfS4gVXNpbmcgdGhlIGV4YW1wbGUKLQkgKiBhYm92ZSwgZXZlbnRzIHdpdGggdGhpcyBvcGVyYXRpb24gdHlwZSB3aWxsIGJlIGZpcmVkIGFjY29yZGluZyB0byBhbiBpbiBvcmRlciB0cmF2ZXJzYWwgb2YKLQkgKiB0aGUgdHJlZTsgaS5lLiBYQUNEQkVGCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PREVfU1RBUlRJTkcgPSAxOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gdHlwZSBzZXQgd2hlbiBhbiBvcGVyYXRpb24gZXhlY3V0aW9uIHRyYXZlcnNhbCBmaW5pc2hlcyB3aXRoaW4gdGhlIHRyZWUgb2YKLQkgKiBvcGVyYXRpb25zIGhhbmRsZWQgYnkgdGhlIG93bmluZyB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufS4gVGhpcyBvcGVyYXRpb24gdHlwZSBpcwotCSAqIG9ubHkgc2V0IHdoZW4gdGhlIGV4ZWN1dGlvbiB0eXBlIGlzIHNldCB0byB7QGxpbmsgI0VYRUNVVEV9LiBVc2luZyB0aGUgZXhhbXBsZSBhYm92ZSwgZXZlbnRzCi0JICogd2l0aCB0aGlzIG9wZXJhdGlvbiB0eXBlIHdpbGwgYmUgZmlyZWQgYWNjb3JkaW5nIHRvIGEgcG9zdCBvcmRlciB0cmF2ZXJzYWwgb2YgdGhlIHRyZWU7IGkuZS4KLQkgKiBDREFFRkJYCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PREVfRklOSVNIRUQgPSAyOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gdHlwZSBzZXQgcmlnaHQgYmVmb3JlIGFuIG9wZXJhdGlvbiBpcyBnb2luZyB0byBkbyBpdHMgd29yay4gVGhpcyBvcGVyYXRpb24gdHlwZQotCSAqIG1heSBiZSB1c2VkIHdpdGggYWxsIGV4ZWN0aW9uIHR5cGVzLiBVc2luZyB0aGUgZXhhbXBsZSBhYm92ZSwgZXZlbnRzIHdpdGggdGhpcyBvcGVyaXRvbiB0eXBlCi0JICogd2lsbCBiZSBmaXJlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0cmVlIHRyYXZlcnNhbDogQ0FEWEJFRgotCSAqIDxwPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BSU5fU1RBUlRJTkcgPSAzOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gdHlwZSBzZXQgaW1tZWRpYXRseSBhZnRlciBhbiBvcGVyYXRpb24gZmluc2hlZCBkb2luZyBpdHMgd29yay4gVGhpcyBvcGVyYXRpb24KLQkgKiB0eXBlIG1heSBiZSB1c2VkIHdpdGggYWxsIGV4ZWN0aW9uIHR5cGVzLiBVc2luZyB0aGUgZXhhbXBsZSBhYm92ZSwgZXZlbnRzIHdpdGggdGhpcyBvcGVyaXRvbgotCSAqIHR5cGUgd2lsbCBiZSBmaXJlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0cmVlIHRyYXZlcnNhbDogQ0FEWEJFRgotCSAqIDxwPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BSU5fRklOSVNIRUQgPSA0OwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZWN1dGlvbiB0eXBlIHNldCB3aGVuIGR1cmluZyBleGVjdXRpb24uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYRUNVVEUgPSAwOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGVjdXRpb24gdHlwZSBzZXQgd2hlbiBkdXJpbmcgcm9sbGJhY2suCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTExCQUNLID0gMTsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhlY3V0aW9uIHR5cGUgc2V0IHdoZW4gZHVyaW5nIHVuZG8uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVORE8gPSAyOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGVjdXRpb24gdHlwZSBzZXQgd2hlbiBkdXJpbmcgcmVkby4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVETyA9IDM7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBvcGVyYXRpb24gaW4gcXVlc3Rpb24uIFRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgb25lIG9mIHRoZSBvcGVyYXRpb25zIHdpdGhpbiB0aGUKLQkgKiB0cmVlIG9mIG9wZXJhdGlvbnMgaGFuZGxlZCBieSB0aGUgb3duaW5nIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIG9wZXJhdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259Ci0JICogZXhlY3V0aW5nIGl0LiBUaGlzIHdpbGwgYmUgb25lIG9mIHtAbGluayAjTk9ERV9TVEFSVElOR30sIHtAbGluayAjTk9ERV9GSU5JU0hFRH0sCi0JICoge0BsaW5rICNNQUlOX1NUQVJUSU5HfSwgb3Ige0BsaW5rICNNQUlOX0ZJTklTSEVEfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBvbmUgb2Yge0BsaW5rICNOT0RFX1NUQVJUSU5HfSwge0BsaW5rICNOT0RFX0ZJTklTSEVEfSwge0BsaW5rICNNQUlOX1NUQVJUSU5HfSwgb3IKLQkgKiAgICAgICAgIHtAbGluayAjTUFJTl9GSU5JU0hFRH0uCi0JICovCi0JcHVibGljIGludCBnZXRPcGVyYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGV4ZWN1dGlvbiB0aGUgb3BlcmF0aW9uIGlzIGFib3V0IHRvIGJlZ2luLiBUaGlzIHdpbGwgYmUgb25lIG9mCi0JICoge0BsaW5rICNFWEVDVVRFfSwge0BsaW5rICNST0xMQkFDS30sIHtAbGluayAjVU5ET30sIG9yIHtAbGluayAjUkVET30uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gb25lIG9mIHtAbGluayAjRVhFQ1VURX0sIHtAbGluayAjUk9MTEJBQ0t9LCB7QGxpbmsgI1VORE99LCBvciB7QGxpbmsgI1JFRE99LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhlY3V0aW9uVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1ZjQ3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFVzZWQgdG8gbGlzdGVuIGZvciB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnR9cyBmaXJlZCBmcm9tIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENsaWVudHMgc2hvdWxkIHJldHVybiB0aGlzIGNvbnN0YW50IGZyb20ge0BsaW5rICNub3RpZnkoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQpfSB0byBzcGVjaWZ5IHRoYXQKLQkgKiBleGVjdXRpb24gc2hvdWxkIGNvbnRpbnVlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05USU5VRSA9IDA7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDbGllbnRzIHNob3VsZCByZXR1cm4gdGhpcyBjb25zdGFudCBmcm9tIHtAbGluayAjbm90aWZ5KElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50KX0gdG8gc3BlY2lmeSB0aGF0Ci0JICogZXhlY3V0aW9uIHNob3VsZCBwYXVzZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0UgPSAxOwotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBMaXN0ZW5lciBpbnRlcmZhY2UgYnkge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn0gZm9yIG9wZXJhdGlvbiBleGVjdXRpb24KLQkgKiBub3RpZmljYXRpb24uIFByaW9yIHRvIHN0YXJ0aW5nIGFueSBvcGVyYXRpb24ncyBleGVjdXRpb24sIG5vdGlmaWNhdGlvbnMgd2lsbCBiZSBzZW50IHdoaWNoCi0JICogYWxsb3cgY2xpZW50cyB0byBwYXVzZSBhbiBvcGVyYXRpb24ncyBleGVjdXRpb24uIEltcGxlbWVudGVycyBzaG91bGQgcmV0dXJuIHtAbGluayAjQ09OVElOVUV9Ci0JICogdG8gYWxsb3cgdGhlIG9wZXJhdGlvbidzIGV4ZWN1dGlvbiB0byBjb250aW51ZSBvciB7QGxpbmsgI1BBVVNFfSB0byBwYXVzZSBleGVjdXRpb24uIElmCi0JICoge0BsaW5rICNQQVVTRX0gaXMgcmV0dXJuZWQsIHRoZW4gdGhlIGVudGlyZSBvcGVyYXRpb24gc3RhY2sgd2lsbCBiZSBwYXVzZWQgdW50aWwgaXQgaXMKLQkgKiByZXN1bWVkLiBUaGUgcmVzcG9uc2libGl0eSBmb3IgcmVzdW1pbmcgYSBwYXVzZWQgb3BlcmF0aW9uIGxpZXMgb24gdGhlIGNsaWVudCB0aGF0IHBhdXNlZCBpdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgb3BlcmF0aW9uIGV2ZW50Ci0JICogCi0JICogQHJldHVybiByZXR1cm4gQ09OVElOVUUgdG8gY29udGludWUsIG9yIFBBVVNFIHRvIHBhdXNlLgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uI2FkZE9wZXJhdGlvbkxpc3RlbmVyKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyKQotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uI3Jlc3VtZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBpbnQgbm90aWZ5KElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjE0YmQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JcHJpdmF0ZSBJQWRhcHRhYmxlIGluZm87Ci0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQotcHVibGljIElXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMoSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JfQotcHVibGljIElBZGFwdGFibGUgZ2V0SW5mbygpIHsKLQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JcmV0dXJuIGluZm87Ci19Ci1wdWJsaWMgdm9pZCBzZXRTdGF0dXMoSVN0YXR1cyBhU3RhdHVzKSB7Ci0Jc3RhdHVzID0gYVN0YXR1czsKLX0KLQotcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQl9Ci1wdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvV3JhcHBlZE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvV3JhcHBlZE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTM1ODUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL1dyYXBwZWRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdyYXBwZWRPcGVyYXRpb24gaW1wbGVtZW50cyBJRGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsT3BlcmF0aW9uIHJvb3RPcGVyYXRpb247Ci0JCi0JcHVibGljIFdyYXBwZWRPcGVyYXRpb24oSURhdGFNb2RlbE9wZXJhdGlvbiByb290T3BlcmF0aW9uKSB7Ci0JCXRoaXMucm9vdE9wZXJhdGlvbiA9IHJvb3RPcGVyYXRpb247Ci0JCWlmIChudWxsID09IHJvb3RPcGVyYXRpb24pIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uY2FuRXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlZG8oKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmNhblJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5jYW5VbmRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKSB7Ci0JCXJvb3RPcGVyYXRpb24uc2V0SUQoaWQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldElEKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJcm9vdE9wZXJhdGlvbi5zZXREYXRhTW9kZWwobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0RGF0YU1vZGVsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoSUVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCXJvb3RPcGVyYXRpb24uc2V0RW52aXJvbm1lbnQoZW52aXJvbm1lbnQpOwotCX0KLQotCXB1YmxpYyBJRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldEVudmlyb25tZW50KCk7Ci0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZSgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0U2NoZWR1bGluZ1J1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24udW5kbyhtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24ucmVkbyhtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXRPcGVyYXRpb25FeGVjdXRpb25GbGFncygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldExhYmVsKCk7Ci0JfQotCi0JcHVibGljIElVbmRvQ29udGV4dFtdIGdldENvbnRleHRzKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXRDb250ZXh0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uaGFzQ29udGV4dChjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb250ZXh0KElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJvb3RPcGVyYXRpb24uYWRkQ29udGV4dChjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0KElVbmRvQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJvb3RPcGVyYXRpb24ucmVtb3ZlQ29udGV4dChjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlyb290T3BlcmF0aW9uLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9BYnN0cmFjdElkZW50aWZpYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Fic3RyYWN0SWRlbnRpZmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDE0M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Fic3RyYWN0SWRlbnRpZmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdElkZW50aWZpYWJsZSBpbXBsZW1lbnRzIElkZW50aWZpYWJsZSB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCi0JcHVibGljIEFic3RyYWN0SWRlbnRpZmlhYmxlKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9Bc2NlbmRpbmdHcm91cENvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9Bc2NlbmRpbmdHcm91cENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhZmEwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFzY2VuZGluZ0dyb3VwQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCXByaXZhdGUgc3RhdGljIEFzY2VuZGluZ0dyb3VwQ29tcGFyYXRvciBzaW5nbGV0b247Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJaWYgKG8yID09IG51bGwgJiYgbzEgIT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKG8xID09IG51bGwgJiYgbzIgIT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQlpZiAobzEgPT0gbnVsbCAmJiBvMiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJRnVuY3Rpb25Hcm91cCBncm91cDEgPSAoRnVuY3Rpb25Hcm91cCkgbzE7Ci0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAyID0gKEZ1bmN0aW9uR3JvdXApIG8yOwotCi0JCWlmIChncm91cDEuZ2V0UHJpb3JpdHkoKSA+IGdyb3VwMi5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIDE7Ci0JCWlmIChncm91cDEuZ2V0UHJpb3JpdHkoKSA9PSBncm91cDIuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAwOwotCQlpZiAoZ3JvdXAxLmdldFByaW9yaXR5KCkgPCBncm91cDIuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQkJc2luZ2xldG9uID0gbmV3IEFzY2VuZGluZ0dyb3VwQ29tcGFyYXRvcigpOwotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0RhdGFNb2RlbEVuYWJsZW1lbnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGF0YU1vZGVsRW5hYmxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlMTI1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGF0YU1vZGVsRW5hYmxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbEVuYWJsZW1lbnRGYWN0b3J5IHsKLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgSURhdGFNb2RlbFByb3ZpZGVyIGJ5IHRoZSBzcGVjaWZpZWQgcHJvdmlkZXJLaW5kIFN0cmluZyBhbmQgYQotCSAqIGNvbnRleHQgb2YgdGhlIGNvbnRhaW5pbmcgUHJvamVjdC4gVGhlIG1ldGhvZCBnZXRzIGFuIGFycmF5IG9mIERhdGFNb2RlbFByb3ZpZGVyRGVzY3JpcHRvcgotCSAqIGZyb20gdGhlIGJhc2UgRGF0YU1vZGVsRmFjdG9yeSB0aGVuIGZpbHRlcnMgb3V0IFByb3ZpZGVycyBiYXNlZCBvbiBmdW5jdGlvbiBncm91cCBlbmFibGVtZW50LgotCSAqIEZpbmFsbHkgdGhlIFByb3ZpZGVyIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgaXMgcmV0dXJuZWQuIElmIHRoZSBJRGF0YU1vZGVsUHJvdmlkZXIgaXMgbm90Ci0JICogZm91bmQgdGhlbiBhIFJ1bnRpbWVFeGNlcHRpb24gaXMgbG9nZ2VkIGFuZCBudWxsIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlcktpbmQKLQkgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgaWQgb2YgdGhlIHByb3ZpZGVyIGtpbmQKLQkgKiBAcGFyYW0gY3VyUHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgSVByb2plY3QKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKFN0cmluZyBwcm92aWRlcktpbmQsIElQcm9qZWN0IGN1clByb2plY3QpIHsKLQkJU3RyaW5nW10gcHJvdmlkZXJJRHMgPSBEYXRhTW9kZWxGYWN0b3J5LmdldERhdGFNb2RlbFByb3ZpZGVySURzRm9yS2luZChwcm92aWRlcktpbmQpOwotCQlpZiAocHJvdmlkZXJJRHMgPT0gbnVsbCB8fCBwcm92aWRlcklEcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdG9wUHJvdmlkZXIgPSBnZXRIaWdoZXN0UHJpb3JpdHlFbmFibGVkUHJvdmlkZXJEZXNjKHByb3ZpZGVySURzLCBjdXJQcm9qZWN0KTsKLQkJaWYgKHRvcFByb3ZpZGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKHRvcFByb3ZpZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SGlnaGVzdFByaW9yaXR5RW5hYmxlZFByb3ZpZGVyRGVzYyhTdHJpbmdbXSBwcm92aWRlcklEcywgSVByb2plY3QgY3VyUHJvamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdElEID0gcHJvdmlkZXJJRHNbMF07Ci0JCUlFbmFibGVtZW50SWRlbnRpZmllciBlbmFibGVtZW50SWRlbnRpZmllcjsKLQkJSWRlbnRpZmlhYmxlIHRlbXBJZGVudGlmaWFibGU7Ci0JCUlkZW50aWZpYWJsZSB0b3BQcmlvcml0eUlkZW50aWZpYWJsZSA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwcm92aWRlcklEcy5sZW5ndGg7IGkrKykgewotCQkJdGVtcElkZW50aWZpYWJsZSA9IG5ldyBBYnN0cmFjdElkZW50aWZpYWJsZShwcm92aWRlcklEc1tpXSk7Ci0JCQllbmFibGVtZW50SWRlbnRpZmllciA9IEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIodGVtcElkZW50aWZpYWJsZS5nZXRJRCgpLCBjdXJQcm9qZWN0KTsKLQkJCWlmIChlbmFibGVtZW50SWRlbnRpZmllci5pc0VuYWJsZWQoKSkgewotCQkJCWlmICh0b3BQcmlvcml0eUlkZW50aWZpYWJsZSA9PSBudWxsKQotCQkJCQl0b3BQcmlvcml0eUlkZW50aWZpYWJsZSA9IHRlbXBJZGVudGlmaWFibGU7Ci0JCQkJZWxzZSBpZiAoSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5pbnN0YW5jZS5jb21wYXJlKHRlbXBJZGVudGlmaWFibGUsIHRvcFByaW9yaXR5SWRlbnRpZmlhYmxlKSA9PSBJZGVudGlmaWFibGVDb21wYXJhdG9yLkdSRUFURVJfVEhBTikKLQkJCQkJdG9wUHJpb3JpdHlJZGVudGlmaWFibGUgPSB0ZW1wSWRlbnRpZmlhYmxlOwotCQkJfQotCQl9Ci0JCWlmICh0b3BQcmlvcml0eUlkZW50aWZpYWJsZSA9PSBudWxsKQotCQkJcmV0dXJuIGRlZmF1bHRJRDsKLQkJcmV0dXJuIHRvcFByaW9yaXR5SWRlbnRpZmlhYmxlLmdldElEKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Rlc2NlbmRpbmdHcm91cENvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9EZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjA4NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Rlc2NlbmRpbmdHcm91cENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvciBzaW5nbGV0b247Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJaWYgKG8xID09IG51bGwgJiYgbzIgIT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKG8yID09IG51bGwgJiYgbzEgIT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQlpZiAobzEgPT0gbnVsbCAmJiBvMiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJRnVuY3Rpb25Hcm91cCBncm91cDEgPSAoRnVuY3Rpb25Hcm91cCkgbzE7Ci0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAyID0gKEZ1bmN0aW9uR3JvdXApIG8yOwotCi0JCWlmIChncm91cDEuZ2V0UHJpb3JpdHkoKSA+IGdyb3VwMi5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoZ3JvdXAxLmdldFByaW9yaXR5KCkgPT0gZ3JvdXAyLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpIDwgZ3JvdXAyLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gMTsKLQkJcmV0dXJuIDA7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3Igc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvcigpOwotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudElkZW50aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0N2EzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEwLCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRW5hYmxlbWVudElkZW50aWZpZXIgaW1wbGVtZW50cyBJRW5hYmxlbWVudElkZW50aWZpZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEhBU0hfRkFDVE9SID0gODk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9JTklUSUFMID0gRW5hYmxlbWVudElkZW50aWZpZXIuY2xhc3MuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQgc3Ryb25nUmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIFNldCBmdW5jdGlvbkdyb3VwSWRzOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nW10gZnVuY3Rpb25Hcm91cElkc0FzQXJyYXk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKLQotCXByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoQ29kZTsKLQotCXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gaGFzaENvZGVDb21wdXRlZDsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JcHJpdmF0ZSBMaXN0IGlkZW50aWZpZXJMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgc3RyaW5nOwotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJvdGVjdGVkIEVuYWJsZW1lbnRJZGVudGlmaWVyKFN0cmluZyBpZCkgewotCQl0aGlzKGlkLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW5hYmxlbWVudElkZW50aWZpZXIoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJZGVudGlmaWVyTGlzdGVuZXIoSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgaWRlbnRpZmllckxpc3RlbmVyKSB7Ci0JCWlmIChpZGVudGlmaWVyTGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCWlmIChpZGVudGlmaWVyTGlzdGVuZXJzID09IG51bGwpCi0JCQlpZGVudGlmaWVyTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICghaWRlbnRpZmllckxpc3RlbmVycy5jb250YWlucyhpZGVudGlmaWVyTGlzdGVuZXIpKQotCQkJaWRlbnRpZmllckxpc3RlbmVycy5hZGQoaWRlbnRpZmllckxpc3RlbmVyKTsKLQotCQlzdHJvbmdSZWZlcmVuY2VzLmFkZCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUVuYWJsZW1lbnRJZGVudGlmaWVyIGNhc3RlZE9iamVjdCA9IChFbmFibGVtZW50SWRlbnRpZmllcikgb2JqZWN0OwotCQlyZXR1cm4gVXRpbC5jb21wYXJlKGlkLCBjYXN0ZWRPYmplY3QuaWQpOwotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRW5hYmxlbWVudElkZW50aWZpZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUVuYWJsZW1lbnRJZGVudGlmaWVyIGNhc3RlZE9iamVjdCA9IChFbmFibGVtZW50SWRlbnRpZmllcikgb2JqZWN0OwotCQlib29sZWFuIGVxdWFscyA9IFV0aWwuZXF1YWxzKGlkLCBjYXN0ZWRPYmplY3QuaWQpOwotCQlyZXR1cm4gZXF1YWxzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVJZGVudGlmaWVyQ2hhbmdlZChFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IGZ1bmN0aW9uSWRlbnRpZmllckV2ZW50KSB7Ci0JCWlmIChmdW5jdGlvbklkZW50aWZpZXJFdmVudCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChpZGVudGlmaWVyTGlzdGVuZXJzKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudGlmaWVyTGlzdGVuZXJzLnNpemUoKTsgaSsrKQotCQkJCQkoKElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyKSBpZGVudGlmaWVyTGlzdGVuZXJzLmdldChpKSkuaWRlbnRpZmllckNoYW5nZWQoZnVuY3Rpb25JZGVudGlmaWVyRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRGdW5jdGlvbkdyb3VwSWRzKCkgewotCQlyZXR1cm4gZnVuY3Rpb25Hcm91cElkczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKCFoYXNoQ29kZUNvbXB1dGVkKSB7Ci0JCQloYXNoQ29kZSA9IEhBU0hfSU5JVElBTDsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUoaWQpOwotCQkJaGFzaENvZGVDb21wdXRlZCA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVJZGVudGlmaWVyTGlzdGVuZXIoSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgaWRlbnRpZmllckxpc3RlbmVyKSB7Ci0JCWlmIChpZGVudGlmaWVyTGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCWlmIChpZGVudGlmaWVyTGlzdGVuZXJzICE9IG51bGwpCi0JCQlpZGVudGlmaWVyTGlzdGVuZXJzLnJlbW92ZShpZGVudGlmaWVyTGlzdGVuZXIpOwotCi0JCWlmIChpZGVudGlmaWVyTGlzdGVuZXJzLmlzRW1wdHkoKSkKLQkJCXN0cm9uZ1JlZmVyZW5jZXMucmVtb3ZlKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNldEZ1bmN0aW9uR3JvdXBJZHMoU2V0IGZ1bmN0aW9uR3JvdXBJZHMpIHsKLQkJU2V0IHNhZmVGdW5jdGlvbkdyb3VwSWRzID0gVXRpbC5zYWZlQ29weShmdW5jdGlvbkdyb3VwSWRzLCBTdHJpbmcuY2xhc3MpOwotCi0JCWlmICghVXRpbC5lcXVhbHMoc2FmZUZ1bmN0aW9uR3JvdXBJZHMsIHRoaXMuZnVuY3Rpb25Hcm91cElkcykpIHsKLQkJCXRoaXMuZnVuY3Rpb25Hcm91cElkcyA9IHNhZmVGdW5jdGlvbkdyb3VwSWRzOwotCQkJdGhpcy5mdW5jdGlvbkdyb3VwSWRzQXNBcnJheSA9IChTdHJpbmdbXSkgdGhpcy5mdW5jdGlvbkdyb3VwSWRzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLmZ1bmN0aW9uR3JvdXBJZHMuc2l6ZSgpXSk7Ci0KLQkJCWhhc2hDb2RlQ29tcHV0ZWQgPSBmYWxzZTsKLQkJCWhhc2hDb2RlID0gMDsKLQkJCXN0cmluZyA9IG51bGw7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoZW5hYmxlZCAhPSB0aGlzLmVuYWJsZWQpIHsKLQkJCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCQloYXNoQ29kZUNvbXB1dGVkID0gZmFsc2U7Ci0JCQloYXNoQ29kZSA9IDA7Ci0JCQlzdHJpbmcgPSBudWxsOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVjb21wdXRlIHRoZSBlbmFibGVkIHN0YXRlIGFuZCByZXR1cm4gd2hldGhlciB0aGUgc3RhdGUgY2hhbmdlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc2V0RW5hYmxlZCgpIHsKLQkJcmV0dXJuIHNldEVuYWJsZWQoZ2V0TmV3RW5hYmxlZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXROZXdFbmFibGVkKCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmdW5jdGlvbkdyb3VwSWRzQXNBcnJheS5sZW5ndGggPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uR3JvdXBJZHNBc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0R3JvdXBCeUlEKGZ1bmN0aW9uR3JvdXBJZHNBc0FycmF5W2ldKTsKLQkJCWlmIChncm91cCAhPSBudWxsICYmIGdyb3VwLmlzRW5hYmxlZChwcm9qZWN0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnWycpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmdW5jdGlvbkdyb3VwSWRzKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZW5hYmxlZCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGlkKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJ10nKTsKLQkJCXN0cmluZyA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYXNzb2NpYXRlZCBQcm9qZWN0IG1heSBiZSBudWxsCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlGdW5jdGlvbkdyb3VwSWQoKSB7Ci0JCWludCBzZWxlY3RlZFByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCWludCBwcmlvcml0eSA9IDA7Ci0JCVN0cmluZyBzZWxlY3RlZEZ1bmN0aW9uR3JvdXBJZCA9IG51bGw7Ci0JCVN0cmluZyBmdW5jdGlvbkdyb3VwSWQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RnVuY3Rpb25Hcm91cElkcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWZ1bmN0aW9uR3JvdXBJZCA9IGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpOwotCQkJcHJpb3JpdHkgPSBGdW5jdGlvbkdyb3VwUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRHcm91cFByaW9yaXR5KGZ1bmN0aW9uR3JvdXBJZCk7Ci0JCQlpZiAocHJpb3JpdHkgPCBzZWxlY3RlZFByaW9yaXR5KQotCQkJCXNlbGVjdGVkRnVuY3Rpb25Hcm91cElkID0gZnVuY3Rpb25Hcm91cElkOwotCQkJaWYgKHByaW9yaXR5ID09IDApCi0JCQkJcmV0dXJuIHNlbGVjdGVkRnVuY3Rpb25Hcm91cElkOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZEZ1bmN0aW9uR3JvdXBJZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllckV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudElkZW50aWZpZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTA3N2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEwLCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IHsKLQotCXByaXZhdGUgYm9vbGVhbiBmdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZDsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZENoYW5nZWQ7Ci0JcHJpdmF0ZSBJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcjsKLQotCXB1YmxpYyBFbmFibGVtZW50SWRlbnRpZmllckV2ZW50KElFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyLCBib29sZWFuIGZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkLCBib29sZWFuIGVuYWJsZWRDaGFuZ2VkKSB7Ci0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQl0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwotCQl0aGlzLmZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkID0gZnVuY3Rpb25Hcm91cElkc0NoYW5nZWQ7Ci0JCXRoaXMuZW5hYmxlZENoYW5nZWQgPSBlbmFibGVkQ2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgY2hhbmdlZC4gR3VhcmFudGVlZCBub3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIElFbmFibGVtZW50SWRlbnRpZmllciBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gaWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBmdW5jdGlvbkdyb3VwSWRzIHByb3BlcnR5IGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlLCBpZmYgdGhlIGZ1bmN0aW9uR3JvdXBJZHMgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGVuYWJsZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUsIGlmZiB0aGUgZW5hYmxlZCBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuYWJsZWRDaGFuZ2VkKCkgewotCQlyZXR1cm4gZW5hYmxlZENoYW5nZWQ7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBbaWRlbnRpZmllcj0iICsgaWRlbnRpZmllci50b1N0cmluZygpICsgIiwgZnVuY3Rpb25Hcm91cElkc0NoYW5nZWQ9IiArIGhhc0Z1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkKCkgKyAiLCBlbmFibGVkQ2hhbmdlZD0iICsgaGFzRW5hYmxlZENoYW5nZWQoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjFkZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAzLCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLQotICogSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRW5hYmxlbWVudE1hbmFnZXIgaW1wbGVtZW50cyBJRW5hYmxlbWVudE1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRW5hYmxlbWVudE1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgRW5hYmxlbWVudE1hbmFnZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBpZGVudGlmaWVyc0J5UHJvamVjdCA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCi0JcHVibGljIEVuYWJsZW1lbnRNYW5hZ2VyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBNYXAgaW4gd2hpY2ggdGhlIGtleXMgYXJlIGlkcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGlkZW50aWZpZXJzCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRJZGVudGlmaWVyc0J5SWQoSVByb2plY3QgcHJvamVjdCkgewotCQlNYXAgYU1hcCA9IChNYXApIGlkZW50aWZpZXJzQnlQcm9qZWN0LmdldChwcm9qZWN0KTsKLQkJaWYgKGFNYXAgPT0gbnVsbCkgewotCQkJYU1hcCA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCQkJaWRlbnRpZmllcnNCeVByb2plY3QucHV0KHByb2plY3QsIGFNYXApOwotCQl9Ci0JCXJldHVybiBhTWFwOwotCX0KLQotICAgIHB1YmxpYyBJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcklkLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIGlmIChpZGVudGlmaWVySWQgPT0gbnVsbCl7Ci0gICAgICAgIAl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBJUHJvamVjdCBpbm5lclByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICBpZiAoaW5uZXJQcm9qZWN0ICE9IG51bGwgJiYgIWlubmVyUHJvamVjdC5pc0FjY2Vzc2libGUoKSl7Ci0gICAgICAgIAlpbm5lclByb2plY3QgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBpZGVudGlmaWVyUmVxdWlyZXNVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLQkgICAgICAgIE1hcCBpZGVudGlmaWVyc0J5SWQgPSBnZXRJZGVudGlmaWVyc0J5SWQoaW5uZXJQcm9qZWN0KTsJCi0JICAgICAgICBpZGVudGlmaWVyID0gKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBpZGVudGlmaWVyc0J5SWQuZ2V0KGlkZW50aWZpZXJJZCk7Ci0JICAgICAgICBpZihpZGVudGlmaWVyID09IG51bGwpewotCSAgICAgICAgCWlkZW50aWZpZXJSZXF1aXJlc1VwZGF0ZSA9IHRydWU7Ci0JICAgICAgICAJaWRlbnRpZmllciA9IGNyZWF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcklkLCBpbm5lclByb2plY3QpOwotCSAgICAgICAgICAgIGlkZW50aWZpZXJzQnlJZC5wdXQoaWRlbnRpZmllcklkLCBpZGVudGlmaWVyKTsKLQkgICAgICAgIH0KLQkgICAgfQotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkIChpZGVudGlmaWVyKXsKLSAgICAgICAgCWlmKGlkZW50aWZpZXJSZXF1aXJlc1VwZGF0ZSl7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKTsKLSAgICAgICAgCX0KLSAgICAgICAgCXJldHVybiBpZGVudGlmaWVyOwotICAgICAgICB9Ci0gICAgfQotCi0JcHJvdGVjdGVkIEVuYWJsZW1lbnRJZGVudGlmaWVyIGNyZWF0ZUlkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXJJZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEVuYWJsZW1lbnRJZGVudGlmaWVyKGlkZW50aWZpZXJJZCwgcHJvamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IHVwZGF0ZUlkZW50aWZpZXIoRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgewotCQlTdHJpbmcgaWQgPSBpZGVudGlmaWVyLmdldElkKCk7Ci0JCVNldCBmdW5jdGlvbkdyb3VwSWRzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlMaXN0IGdyb3VwcyA9IEZ1bmN0aW9uR3JvdXBSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEtub3duR3JvdXBzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBncm91cHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IChGdW5jdGlvbkdyb3VwKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmIChncm91cCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWlmIChncm91cC5pc01hdGNoKGlkKSkKLQkJCQlmdW5jdGlvbkdyb3VwSWRzLmFkZChncm91cC5nZXRHcm91cElEKCkpOwotCQl9Ci0KLQkJYm9vbGVhbiBmdW5jdGlvbkdyb3Vwc0NoYW5nZWQgPSBpZGVudGlmaWVyLnNldEZ1bmN0aW9uR3JvdXBJZHMoZnVuY3Rpb25Hcm91cElkcyk7Ci0JCWJvb2xlYW4gZW5hYmxlZENoYW5nZWQgPSBpZGVudGlmaWVyLnJlc2V0RW5hYmxlZCgpOwotCi0JCWlmIChmdW5jdGlvbkdyb3Vwc0NoYW5nZWQgfHwgZW5hYmxlZENoYW5nZWQpCi0JCQlyZXR1cm4gbmV3IEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQoaWRlbnRpZmllciwgZnVuY3Rpb25Hcm91cHNDaGFuZ2VkLCBlbmFibGVkQ2hhbmdlZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBhbGwgaWRlbnRpZmllciBsaXN0ZW5lcnMgdGhhdCB0aGUgc3RhdGUgb2YgYSBwcm9qZWN0IGhhcyBjaGFuZ2VkIHRoYXQgYWZmZWN0cyB0aGUKLQkgKiBlbmFibGVtZW50IG9mIGEgZ3JvdXAgZm9yIGEgcHJvamVjdC4gVGhpcyBtZXRob2QgaXMgZmFpbCBzYWZlLCBpbiB0aGF0IGlmIG9uZSBsaXN0ZW5lciB0aHJvd3MKLQkgKiBhbiBleGNlcHRpb24gd2hpbGUgYmVpbmcgbm90aWZpZWQsIGl0IHdpbGwgbm90IHN0b3AgdGhlIG5vdGlmaWNhdGlvbiBvZiBvdGhlciBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2dAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGV4Y2VwdGlvbnMgd2VyZSBjYXVnaHQgbm90aWZ5aW5nIGFueSBvZiB0aGUgbGlzdGVuZXJzLiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZQotCSAqICAgICAgICAgICAgIGNvcmUgZXhjZXB0aW9uIGZvciB0aGUgbmVzdGVkIGV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbm90aWZ5RnVuY3Rpb25Hcm91cENoYW5nZWQoU3RyaW5nIGdyb3VwSUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlNYXAgaWRlbnRpZmllcnMgPSBnZXRJZGVudGlmaWVyc0J5SWQocHJvamVjdCk7Ci0KLQkJaWYgKGlkZW50aWZpZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpZGVudGlmaWVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlJU3RhdHVzIGVycm9yU3RhdHVzID0gbnVsbDsKLQkJSVN0YXR1cyBuZXh0U3RhdHVzID0gbnVsbDsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlkZW50aWZpZXIgPSAoRW5hYmxlbWVudElkZW50aWZpZXIpIGl0ZXIubmV4dCgpOwotCi0JCQlFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IGV2dCA9IHVwZGF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcik7Ci0JCQl0cnkgewotCQkJCWlmIChldnQgIT0gbnVsbCkKLQkJCQkJaWRlbnRpZmllci5maXJlSWRlbnRpZmllckNoYW5nZWQoZXZ0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vRGVmZXIgdGhlIGV4Y2VwdGlvbiBzbyBvdGhlcnMgY2FuIGhhbmRsZSBpdC4KLQkJCQluZXh0U3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vbk1lc3NhZ2VzLklOVEVSTkFMX0VSUk9SLCBleCk7Ci0JCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGV4KTsKLQkJCQlpZiAoZXJyb3JTdGF0dXMgPT0gbnVsbCkKLQkJCQkJZXJyb3JTdGF0dXMgPSBuZXh0U3RhdHVzOwotCQkJCWVsc2UgaWYgKGVycm9yU3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkKLQkJCQkJKChNdWx0aVN0YXR1cykgZXJyb3JTdGF0dXMpLmFkZChuZXh0U3RhdHVzKTsKLQkJCQllbHNlIHsKLQkJCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0ge2Vycm9yU3RhdHVzLCBuZXh0U3RhdHVzfTsKLQkJCQkJZXJyb3JTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoZXJyb3JTdGF0dXMuZ2V0UGx1Z2luKCksIGVycm9yU3RhdHVzLmdldENvZGUoKSwgY2hpbGRyZW4sIFdUUENvbW1vbk1lc3NhZ2VzLklOVEVSTkFMX0VSUk9SLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlpZiAoZXJyb3JTdGF0dXMgIT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKGVycm9yU3RhdHVzKTsKLQotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIGZvciBjbGllbnRzIHRvIGRpc3Bvc2Ugb2YgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGVuYWJsZW1lbnRJZGVudGlmaWVycwotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIoQ29sbGVjdGlvbiBlbmFibGVtZW50SWRlbnRpZmllcnMsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBlbmFibGVtZW50SWRlbnRpZmllcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IChJRW5hYmxlbWVudElkZW50aWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJaWRlbnRpZmllci5yZW1vdmVJZGVudGlmaWVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3MGJiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIvYmxhbmNldHQKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uR3JvdXAgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUVfQVRUUiA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0RFU0NfQVRUUiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9FTkFCTEVEX0JZX0RFRkFVTFRfQVRUUiA9ICJlbmFibGVkQnlEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1BSSU9SSVRZX0FUVFIgPSAicHJpb3JpdHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfSU5USUFMSVpFUl9DTEFTU19BVFRSID0gImluaXRpYWxpemVyQ2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORUdBVElWRV9QUklPUklUWSA9IC0xOwotCi0JcHJpdmF0ZSBTdHJpbmcgZ3JvdXBJRDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgU3RyaW5nIGludGlhbGl6ZXJDbGFzc05hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVjbGFyaW5nRXh0ZW5zaW9uOwotCXByaXZhdGUgaW50IHByaW9yaXR5ID0gTkVHQVRJVkVfUFJJT1JJVFk7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIElHcm91cEluaXRpYWxpemVyIGdyb3VwSW50ZXJmYWNlOwotCXByaXZhdGUgU2V0IGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3M7Ci0vLwlwcml2YXRlIHRyYW5zaWVudCBGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdbXSBmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzQXNBcnJheTsKLQlwcml2YXRlIGJvb2xlYW4gZXJyb3JSZXBvcnRlZCA9IGZhbHNlOwotCi0JcHVibGljIEZ1bmN0aW9uR3JvdXAoU3RyaW5nIGdyb3VwSUQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZ3JvdXBJRCA9IGdyb3VwSUQ7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlkZXNjcmlwdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX0RFU0NfQVRUUik7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlTdHJpbmcgZ2V0SW5pdGFsaXplckNsYXNzTmFtZSgpIHsKLQkJaWYgKGludGlhbGl6ZXJDbGFzc05hbWUgPT0gbnVsbCkKLQkJCWludGlhbGl6ZXJDbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShHUk9VUF9JTlRJQUxJWkVSX0NMQVNTX0FUVFIpOwotCQlyZXR1cm4gaW50aWFsaXplckNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQluYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfTkFNRV9BVFRSKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uTmFtZSgpIHsKLQkJaWYgKGRlY2xhcmluZ0V4dGVuc2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKSA9PSBudWxsKQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZGVjbGFyaW5nRXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBkZWNsYXJpbmdFeHRlbnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRHcm91cElEKCkgewotCQlyZXR1cm4gZ3JvdXBJRDsKLQl9Ci0KLQlJR3JvdXBJbml0aWFsaXplciBnZXRJbml0aWFsaXplckNsYXNzKCkgewotCQlpZiAoZ3JvdXBJbnRlcmZhY2UgPT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJZ3JvdXBJbnRlcmZhY2UgPSAoSUdyb3VwSW5pdGlhbGl6ZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihHUk9VUF9JTlRJQUxJWkVSX0NMQVNTX0FUVFIpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI5IiwgbmV3IE9iamVjdFtde0dST1VQX0lOVElBTElaRVJfQ0xBU1NfQVRUUiwgZ2V0SW5pdGFsaXplckNsYXNzTmFtZSgpLCBnZXREZWNsYXJpbmdFeHRlbnNpb25OYW1lKCl9KSArICJcclxuIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJfQotCQlyZXR1cm4gZ3JvdXBJbnRlcmZhY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJcIiIgKyBnZXROYW1lKCkgKyAiXCIgKCIgKyBnZXRHcm91cElEKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJaWYgKHByaW9yaXR5ID09IE5FR0FUSVZFX1BSSU9SSVRZKQotCQkJcHJpb3JpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX1BSSU9SSVRZX0FUVFIpKTsKLQkJcmV0dXJuIHByaW9yaXR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChnZXRJbml0aWFsaXplckNsYXNzKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRJbml0aWFsaXplckNsYXNzKCkuaXNHcm91cEVuYWJsZWQocHJvamVjdCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzLmVxdWFscyhvKSkKLQkJCXJldHVybiAwOwotCQllbHNlIGlmICghKG8gaW5zdGFuY2VvZiBGdW5jdGlvbkdyb3VwKSkKLQkJCXJldHVybiAxOwotCi0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAgPSAoRnVuY3Rpb25Hcm91cCkgbzsKLQkJaWYgKGdldFByaW9yaXR5KCkgPT0gZ3JvdXAuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiBnZXRHcm91cElEKCkuY29tcGFyZVRvKGdyb3VwLmdldEdyb3VwSUQoKSk7Ci0KLQkJZWxzZSBpZiAoZ2V0UHJpb3JpdHkoKSA8IGdyb3VwLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goU3RyaW5nIHN0cmluZykgewotCQlpZiAoZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncyA9PSBudWxsKSB7Ci0JCQlpZiAoIWVycm9yUmVwb3J0ZWQpIHsKLQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMzAiLCBuZXcgT2JqZWN0W117Z2V0R3JvdXBJRCgpfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJZXJyb3JSZXBvcnRlZCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyA9IChGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJaWYgKGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZy5nZXRQYXR0ZXJuKCkubWF0Y2hlcihzdHJpbmcpLm1hdGNoZXMoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIHNldEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MoU2V0IGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MpIHsKLQkJU2V0IHNhZmVGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzID0gVXRpbC5zYWZlQ29weShmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzLCBGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcuY2xhc3MpOwotCi0JCWlmICghVXRpbC5lcXVhbHMoc2FmZUZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MsIHRoaXMuZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncykpIHsKLQkJCXRoaXMuZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncyA9IHNhZmVGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NGJjYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTAsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9GQUNUT1IgPSA4OTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9JTklUSUFMID0gRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmNsYXNzLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCXByaXZhdGUgU3RyaW5nIGZ1bmN0aW9uR3JvdXBJZDsKLQlwcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzaENvZGU7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBoYXNoQ29kZUNvbXB1dGVkOwotCXByaXZhdGUgUGF0dGVybiBwYXR0ZXJuOwotCXByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBzdHJpbmc7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyhTdHJpbmcgZnVuY3Rpb25Hcm91cElkLCBQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCXRoaXMuZnVuY3Rpb25Hcm91cElkID0gZnVuY3Rpb25Hcm91cElkOwotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmplY3QpIHsKLQkJRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGNhc3RlZE9iamVjdCA9IChGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcpIG9iamVjdDsKLQkJaW50IGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZShmdW5jdGlvbkdyb3VwSWQsIGNhc3RlZE9iamVjdC5mdW5jdGlvbkdyb3VwSWQpOwotCi0JCWlmIChjb21wYXJlVG8gPT0gMCkKLQkJCWNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZShwYXR0ZXJuLnBhdHRlcm4oKSwgY2FzdGVkT2JqZWN0LnBhdHRlcm4ucGF0dGVybigpKTsKLQotCQlyZXR1cm4gY29tcGFyZVRvOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGNhc3RlZE9iamVjdCA9IChGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcpIG9iamVjdDsKLQkJYm9vbGVhbiBlcXVhbHMgPSB0cnVlOwotCQllcXVhbHMgJj0gVXRpbC5lcXVhbHMoZnVuY3Rpb25Hcm91cElkLCBjYXN0ZWRPYmplY3QuZnVuY3Rpb25Hcm91cElkKTsKLQkJZXF1YWxzICY9IFV0aWwuZXF1YWxzKHBhdHRlcm4sIGNhc3RlZE9iamVjdC5wYXR0ZXJuKTsKLQkJcmV0dXJuIGVxdWFsczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5SWQoKSB7Ci0JCXJldHVybiBmdW5jdGlvbkdyb3VwSWQ7Ci0JfQotCi0JcHVibGljIFBhdHRlcm4gZ2V0UGF0dGVybigpIHsKLQkJcmV0dXJuIHBhdHRlcm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKCFoYXNoQ29kZUNvbXB1dGVkKSB7Ci0JCQloYXNoQ29kZSA9IEhBU0hfSU5JVElBTDsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUoZnVuY3Rpb25Hcm91cElkKTsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUocGF0dGVybik7Ci0JCQloYXNoQ29kZUNvbXB1dGVkID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBoYXNoQ29kZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCdbJykuYXBwZW5kKGZ1bmN0aW9uR3JvdXBJZCkuYXBwZW5kKCIscGF0dGVybj1cIiIpLmFwcGVuZChwYXR0ZXJuLnBhdHRlcm4oKSkuYXBwZW5kKCJcIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzdHJpbmcgPSBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBzdHJpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTU1Y2E5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFRoZSBGdW5jdGlvbkdyb3VwUmVnaXN0cnkgd2lsbCBjb25zdW1lIENvbmZpZ3VyYXRpb24gZWxlbWVudHMgY29uZm9ybWluZyB0byB0aGUgRnVuY3Rpb25Hcm91cAotICogRXh0ZW5zaW9uIFBvaW50IHNjaGVtYS4KLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9FTEVNRU5UID0gImZ1bmN0aW9uR3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfSURfQVRUUiA9ICJmdW5jdGlvbkdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05fR1JPVVBfUEFUVEVSTl9CSU5ESU5HX0VMTVQgPSAiZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fQVRUUiA9ICJwYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBNYXBCeUlkOwotCXByaXZhdGUgTGlzdCBrbm93bkdyb3VwczsKLQlwcml2YXRlIE1hcCBwYXR0ZXJuQmluZGluZ3NCeUdyb3VwSWQ7Ci0KLQlwcml2YXRlIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSgpIHsKLQkJc3VwZXIoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgV1RQQ29tbW9uUGx1Z2luLkdST1VQX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCXBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSgpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBSZWFkIGFsbCB0aGUgZWxlbWVudHMgZmlyc3QsIHRoZW4gc2V0IHRoZSBwYXR0ZXJuIGJpbmRpbmdzIG9uIHRoZSBmdW5jdGlvbgotCSAqIGdyb3VwcwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJc3VwZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JCXNldFBhdHRlcm5CaW5kaW5ncygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQYXR0ZXJuQmluZGluZ3MoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBwYXR0ZXJuQmluZGluZ3NCeUdyb3VwSWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3JvdXBJZCA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJU2V0IHZhbHVlID0gKFNldCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUZ1bmN0aW9uR3JvdXAgYUdyb3VwID0gZ2V0R3JvdXBCeUlEKGdyb3VwSWQpOwotCQkJaWYgKGFHcm91cCAhPSBudWxsKQotCQkJCWFHcm91cC5zZXRGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzKHZhbHVlKTsKLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhHUk9VUF9FTEVNRU5UKSkgewotCQkJcmVhZEdyb3VwKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEZVTkNUSU9OX0dST1VQX1BBVFRFUk5fQklORElOR19FTE1UKSkgewotCQkJcmVhZFBhdHRlcm5CaW5kaW5nKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRQYXR0ZXJuQmluZGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZ3JvdXBJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX0lEX0FUVFIpOwotCQlTdHJpbmcgcGF0dGVybiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBBVFRFUk5fQVRUUik7Ci0JCWlmICghaXNOdWxsT3JFbXB0eShncm91cElEKSAmJiAhaXNOdWxsT3JFbXB0eShwYXR0ZXJuKSkgewotCQkJUGF0dGVybiBhUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKTsKLQkJCUZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyBiaW5kaW5nID0gbmV3IEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyhncm91cElELCBhUGF0dGVybik7Ci0JCQlhZGRQYXR0ZXJuQmluZGluZyhncm91cElELCBiaW5kaW5nKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJpbmRpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUGF0dGVybkJpbmRpbmcoU3RyaW5nIGdyb3VwSUQsIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyBiaW5kaW5nKSB7Ci0JCVNldCBiaW5kaW5ncyA9IChTZXQpIHBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZC5nZXQoZ3JvdXBJRCk7Ci0JCWlmIChiaW5kaW5ncyA9PSBudWxsKSB7Ci0JCQliaW5kaW5ncyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlwYXR0ZXJuQmluZGluZ3NCeUdyb3VwSWQucHV0KGdyb3VwSUQsIGJpbmRpbmdzKTsKLQkJfQotCQliaW5kaW5ncy5hZGQoYmluZGluZyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGFTdHJpbmcgPT0gbnVsbCB8fCBhU3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRHcm91cChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZ3JvdXBJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX0lEX0FUVFIpOwotCQlpZiAoIWlzTnVsbE9yRW1wdHkoZ3JvdXBJRCkpIHsKLQkJCUZ1bmN0aW9uR3JvdXAgZ3JvdXAgPSBuZXcgRnVuY3Rpb25Hcm91cChncm91cElELCBlbGVtZW50KTsKLQkJCWdldEdyb3VwTWFwQnlJZCgpLnB1dChncm91cElELCBncm91cCk7Ci0JCQlnZXRLbm93bkdyb3VwcygpLmFkZChncm91cCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QXNjZW5kaW5nU29ydGVkR3JvdXBzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQ29tcGFyYXRvciBhc2NlbmRpbmdHcnBDb21wYXJhdG9yID0gQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLnNpbmdsZXRvbigpOwotCQlMaXN0IGdyb3VwTGlzdCA9IGdldEtub3duR3JvdXBzKHByb2plY3QpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGdyb3VwTGlzdCwgYXNjZW5kaW5nR3JwQ29tcGFyYXRvcik7Ci0JCXJldHVybiBncm91cExpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldERlc2NlbmRpbmdTb3J0ZWRHcm91cHMoSVByb2plY3QgcHJvamVjdCkgewotCQlDb21wYXJhdG9yIGRlc2NlbmRpbmdHcnBDb21wYXJhdG9yID0gRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5zaW5nbGV0b24oKTsKLQkJTGlzdCBncm91cExpc3QgPSBnZXRLbm93bkdyb3Vwcyhwcm9qZWN0KTsKLQkJQ29sbGVjdGlvbnMuc29ydChncm91cExpc3QsIGRlc2NlbmRpbmdHcnBDb21wYXJhdG9yKTsKLQkJcmV0dXJuIGdyb3VwTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRLbm93bkdyb3VwcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFycmF5TGlzdCBncm91cEJ5UHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KGdldEtub3duR3JvdXBzKCkuc2l6ZSgpKTsKLQkJTGlzdCBncm91cExpc3QgPSBnZXRLbm93bkdyb3VwcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTGlzdC5zaXplKCk7IGkrKykgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IChGdW5jdGlvbkdyb3VwKSBncm91cExpc3QuZ2V0KGkpOwotCQkJaWYgKGdyb3VwLmlzRW5hYmxlZChwcm9qZWN0KSkKLQkJCQlncm91cEJ5UHJvamVjdExpc3QuYWRkKGdyb3VwKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXBCeVByb2plY3RMaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFzY2VuZGluZ1ByaW9yaXR5R3JvdXBOYW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Qgc29ydGVkR3JvdXAgPSBnZXRBc2NlbmRpbmdTb3J0ZWRHcm91cHMocHJvamVjdCk7Ci0JCXJldHVybiBnZXRHcm91cExpc3ROYW1lcyhzb3J0ZWRHcm91cCwgbmV3IEFycmF5TGlzdChzb3J0ZWRHcm91cC5zaXplKCkpKTsKLQotCX0KLQotCXB1YmxpYyBMaXN0IGdldERlc2NlbmRpbmdQcmlvcml0eUdyb3VwTmFtZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHNvcnRlZEdyb3VwID0gZ2V0RGVzY2VuZGluZ1NvcnRlZEdyb3Vwcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGdldEdyb3VwTGlzdE5hbWVzKHNvcnRlZEdyb3VwLCBuZXcgQXJyYXlMaXN0KHNvcnRlZEdyb3VwLnNpemUoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRHcm91cExpc3ROYW1lcyhMaXN0IHNvcnRlZEdyb3VwLCBMaXN0IHNvcnRlZEdyb3VwTmFtZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWRHcm91cC5zaXplKCk7IGkrKykgewotCQkJRnVuY3Rpb25Hcm91cCBncnAgPSAoRnVuY3Rpb25Hcm91cCkgc29ydGVkR3JvdXAuZ2V0KGkpOwotCQkJc29ydGVkR3JvdXBOYW1lcy5hZGQoZ3JwLmdldEdyb3VwSUQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNvcnRlZEdyb3VwTmFtZXM7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldEdyb3VwSURzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXBNYXBCeUlkKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgRnVuY3Rpb25Hcm91cCBnZXRHcm91cEJ5SUQoU3RyaW5nIGdyb3VwSUQpIHsKLQkJcmV0dXJuIChGdW5jdGlvbkdyb3VwKSBnZXRHcm91cE1hcEJ5SWQoKS5nZXQoZ3JvdXBJRCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHcm91cEVuYWJsZWQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGdyb3VwSUQpIHsKLQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IGdldEdyb3VwQnlJRChncm91cElEKTsKLQkJaWYgKGdyb3VwICE9IG51bGwpCi0JCQlyZXR1cm4gZ3JvdXAuaXNFbmFibGVkKHByb2plY3QpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0S25vd25Hcm91cHMoKSB7Ci0JCWlmIChrbm93bkdyb3VwcyA9PSBudWxsKQotCQkJa25vd25Hcm91cHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBrbm93bkdyb3VwczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdyb3VwTWFwQnlJZC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldEdyb3VwTWFwQnlJZCgpIHsKLQkJaWYgKGdyb3VwTWFwQnlJZCA9PSBudWxsKQotCQkJZ3JvdXBNYXBCeUlkID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGdyb3VwTWFwQnlJZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0aGUgcHJpb3JpdHkgb2YgdGhlIHR3byBncm91cHMgcmVmZXJlbmNlZCBieQotCSAqIAotCSAqIEBncm91cElEMSBhbmQKLQkgKiBAZ3JvdXBJRDIKLQkgKiAKLQkgKiBAcGFyYW0gZ3JvdXBJRDEKLQkgKiBAcGFyYW0gZ3JvdXBJRDIKLQkgKiBAcmV0dXJuIDAgaWYgdGhlIHR3byBncm91cHMgYXJlIGVxdWFsLCAxIGlmCi0JICogQGdyb3VwSUQxIGhhcyBhIGhpZ2hlciBwcmVjZWRlbmNlLCBvdGhlcndpc2UgLTEKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGdyb3VwSUQxLCBTdHJpbmcgZ3JvdXBJRDIpIHsKLQkJRnVuY3Rpb25Hcm91cCBncm91cDEgPSBnZXRHcm91cEJ5SUQoZ3JvdXBJRDEpOwotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMiA9IGdldEdyb3VwQnlJRChncm91cElEMik7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjgiLCBuZXcgT2JqZWN0W117Z3JvdXBJRDF9KSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyOCIsIG5ldyBPYmplY3RbXXtncm91cElEMn0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJcmV0dXJuIGdyb3VwMS5jb21wYXJlVG8oZ3JvdXAyKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEdyb3VwUHJpb3JpdHkoU3RyaW5nIGdycElkKSB7Ci0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAgPSBnZXRHcm91cEJ5SUQoZ3JwSWQpOwotCQlyZXR1cm4gKGdyb3VwICE9IG51bGwpID8gZ3JvdXAuZ2V0UHJpb3JpdHkoKSA6IC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RnVuY3Rpb25Qcmlvcml0eShTdHJpbmcgZW5hYmxlbWVudElEKSB7Ci0JCWludCBwcmlvcml0eSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0S25vd25Hcm91cHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUZ1bmN0aW9uR3JvdXAgZ3JvdXAgPSAoRnVuY3Rpb25Hcm91cCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZ3JvdXAuaXNNYXRjaChlbmFibGVtZW50SUQpKQotCQkJCXByaW9yaXR5ID0gTWF0aC5taW4ocHJpb3JpdHksIGdyb3VwLmdldFByaW9yaXR5KCkpOwotCQl9Ci0JCXJldHVybiBwcmlvcml0eTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzNkODEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTAsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbmFibGVtZW50SWRlbnRpZmllciB7Ci0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JSWRlbnRpZmllckxpc3RlbmVyPC9jb2RlPiB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8KLQkgKiBwcm9wZXJ0aWVzIG9mIHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGlkZW50aWZpZXJMaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIHRvIHJlZ2lzdGVyLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlCi0JICogICAgICAgICAgICB0byByZWdpc3RlciBhbiBpbnN0YW5jZSB3aGljaCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGluc3RhbmNlLCBubwotCSAqICAgICAgICAgICAgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KLQkgKi8KLQl2b2lkIGFkZElkZW50aWZpZXJMaXN0ZW5lcihJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBpZGVudGlmaWVyTGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0IG9mIGZ1bmN0aW9uIGdyb3VwIGlkcyB0aGF0IHRoaXMgaW5zdGFuY2UgbWF0Y2hlcy4KLQkgKiA8cD4KLQkgKiBOb3RpZmljYXRpb24gaXMgc2VudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgaWYgdGhpcyBwcm9wZXJ0eSBjaGFuZ2VzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYWN0aXZpdHkgaWRzIHRoYXQgdGhpcyBpbnN0YW5jZSBtYXRjaGVzLiBUaGlzIHNldCBtYXkgYmUgZW1wdHksIGJ1dCBpcwotCSAqICAgICAgICAgZ3VhcmFudGVlZCBub3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgc2V0IGlzIG5vdCBlbXB0eSwgaXQgaXMgZ3VhcmFudGVlZAotCSAqICAgICAgICAgdG8gb25seSBjb250YWluIGluc3RhbmNlcyBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqLwotCVNldCBnZXRGdW5jdGlvbkdyb3VwSWRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGlzIGluc3RhbmNlLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBpbnN0YW5jZSBpcyBlbmFibGVkLgotCSAqIDxwPgotCSAqIE5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBpZiB0aGlzIHByb3BlcnR5IGNoYW5nZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSwgaWZmIHRoaXMgaW5zdGFuY2UgaXMgZW5hYmxlZC4KLQkgKi8KLQlib29sZWFuIGlzRW5hYmxlZCgpOwotCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXI8L2NvZGU+IGxpc3RlbmluZyBmb3IgY2hhbmdlcwotCSAqIHRvIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWRlbnRpZmllckxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2UgdG8gdW5yZWdpc3Rlci4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmIGFuIGF0dGVtcHQgaXMKLQkgKiAgICAgICAgICAgIG1hZGUgdG8gdW5yZWdpc3RlciBhbiBpbnN0YW5jZSB3aGljaCBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggdGhpcyBpbnN0YW5jZSwKLQkgKiAgICAgICAgICAgIG5vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCi0JICovCi0Jdm9pZCByZW1vdmVJZGVudGlmaWVyTGlzdGVuZXIoSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgaWRlbnRpZmllckxpc3RlbmVyKTsKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGNmOTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciB7Ci0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mIDxjb2RlPklJZGVudGlmaWVyPC9jb2RlPiBoYXZlCi0JICogY2hhbmdlZC4gU3BlY2lmaWMgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluIHRoZSA8Y29kZT5JZGVudGlmaWVyRXZlbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpZGVudGlmaWVyRXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGV2ZW50LiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQl2b2lkIGlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgaWRlbnRpZmllckV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2ZmNkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJRW5hYmxlbWVudE1hbmFnZXIgewotCVN0cmluZyBJTlRFUk5BTF9FTkFCTEVNRU5UX0RFVEVSTUlOQVRJT05fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkVuYWJsZW1lbnREZXRlcm1pbmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JSUVuYWJsZW1lbnRNYW5hZ2VyIElOU1RBTkNFID0gKElFbmFibGVtZW50TWFuYWdlcikgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZShJTlRFUk5BTF9FTkFCTEVNRU5UX0RFVEVSTUlOQVRJT05fSUQpOwotCi0JSUVuYWJsZW1lbnRJZGVudGlmaWVyIGdldElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXJJZCwgSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBOb3RpZnkgYWxsIGlkZW50aWZpZXIgbGlzdGVuZXJzIHRoYXQgdGhlIHN0YXRlIG9mIGEgcHJvamVjdCBoYXMgY2hhbmdlZCB0aGF0IGFmZmVjdHMgdGhlCi0JICogZW5hYmxlbWVudCBvZiBhIGdyb3VwIGZvciBhIHByb2plY3QuIFRoaXMgbWV0aG9kIGlzIGZhaWwgc2FmZSwgaW4gdGhhdCBpZiBvbmUgbGlzdGVuZXIgdGhyb3dzCi0JICogYW4gZXhjZXB0aW9uIHdoaWxlIGJlaW5nIG5vdGlmaWVkLCBpdCB3aWxsIG5vdCBzdG9wIHRoZSBub3RpZmljYXRpb24gb2Ygb3RoZXIgbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBldnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBleGNlcHRpb25zIHdlcmUgY2F1Z2h0IG5vdGlmeWluZyBhbnkgb2YgdGhlIGxpc3RlbmVycy4gQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUKLQkgKiAgICAgICAgICAgICBjb3JlIGV4Y2VwdGlvbiBmb3IgdGhlIG5lc3RlZCBleGNlcHRpb25zLgotCSAqLwotCXZvaWQgbm90aWZ5RnVuY3Rpb25Hcm91cENoYW5nZWQoU3RyaW5nIGdyb3VwSUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgZm9yIGNsaWVudHMgdG8gZGlzcG9zZSBvZiBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlbWVudElkZW50aWZpZXJzCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCByZW1vdmVFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyKENvbGxlY3Rpb24gZW5hYmxlbWVudElkZW50aWZpZXJzLCBJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lHcm91cEluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUdyb3VwSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjZGM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUdyb3VwSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElHcm91cEluaXRpYWxpemVyIHsKLQotCXB1YmxpYyBib29sZWFuIGlzR3JvdXBFbmFibGVkKElQcm9qZWN0IHByb2plY3QpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzY0YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lkZW50aWZpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJZGVudGlmaWFibGUgewotCi0JLyoqCi0JICogcmV0dXJuIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGluc3RhbmNlIG9mIGFuIGV4dGVuc2lvbiBwb2ludC4gSXQgaXMgdXAgdG8gZWFjaAotCSAqIGluZGl2aWR1YWwgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVyIHRvIGRlY2lkZSB3aGF0IHRoYXQgbWlnaHQgYmUgKGUuZy4sICJlZGl0b3JJRCIsICJwYWdlSUQiLAotCSAqIGV0Yy4KLQkgKi8KLQlTdHJpbmcgZ2V0SUQoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9yZGVyIHRoZSBJZGVudGlmaWFibGUgZWxlbWVudCB3YXMgbG9hZGVkCi0JICovCi0JaW50IGdldExvYWRPcmRlcigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lkZW50aWZpYWJsZUNvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JZGVudGlmaWFibGVDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDlhNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lkZW50aWZpYWJsZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGlmaWFibGVDb21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgR1JFQVRFUl9USEFOID0gMTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExFU1NfVEhBTiA9IC0xOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVFVQUwgPSAwOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJZGVudGlmaWFibGVDb21wYXJhdG9yIGluc3RhbmNlID0gbmV3IElkZW50aWZpYWJsZUNvbXBhcmF0b3IoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BSSU9SSVRZID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIElkZW50aWZpYWJsZUNvbXBhcmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJSWRlbnRpZmlhYmxlIGx2YWx1ZSA9IG51bGw7Ci0JCUlkZW50aWZpYWJsZSBydmFsdWUgPSBudWxsOwotCQlpZiAobzEgaW5zdGFuY2VvZiBJZGVudGlmaWFibGUpCi0JCQlsdmFsdWUgPSAoSWRlbnRpZmlhYmxlKSBvMTsKLQkJaWYgKG8yIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlKQotCQkJcnZhbHVlID0gKElkZW50aWZpYWJsZSkgbzI7Ci0KLQkJaWYgKHJ2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIEdSRUFURVJfVEhBTjsKLQkJaWYgKGx2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIExFU1NfVEhBTjsKLQotCQlpZiAoKGx2YWx1ZS5nZXRJRCgpID09IG51bGwgJiYgcnZhbHVlLmdldElEKCkgPT0gbnVsbCkgfHwgKGdldFByaW9yaXR5KGx2YWx1ZSkgPT0gZ2V0UHJpb3JpdHkocnZhbHVlKSkpCi0JCQlyZXR1cm4gY29tcGFyZUxvYWRPcmRlcihsdmFsdWUsIHJ2YWx1ZSk7Ci0JCS8qIFIgLSBMIGltcGxpZXMgMCBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eSAqLwotCQlyZXR1cm4gZ2V0UHJpb3JpdHkobHZhbHVlKSAtIGdldFByaW9yaXR5KHJ2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlQ29tcGFyYXRvcjsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcGFyZUxvYWRPcmRlcihJZGVudGlmaWFibGUgbHZhbHVlLCBJZGVudGlmaWFibGUgcnZhbHVlKSB7Ci0JCS8qIFIgLSBMIGltcGxpZXMgMCBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eSAqLwotCQlyZXR1cm4gbHZhbHVlLmdldExvYWRPcmRlcigpIC0gcnZhbHVlLmdldExvYWRPcmRlcigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoSWRlbnRpZmlhYmxlIGlkZW50aWZpYWJsZSkgewotCQlpZiAoaWRlbnRpZmlhYmxlLmdldElEKCkgIT0gbnVsbCAmJiBpZGVudGlmaWFibGUuZ2V0SUQoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RnVuY3Rpb25Qcmlvcml0eShpZGVudGlmaWFibGUuZ2V0SUQoKSk7Ci0JCXJldHVybiBERUZBVUxUX1BSSU9SSVRZOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDk3NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotLyoKLSAqIFJlbmFtZSB0aGlzIGNsYXNzIHRvIEVuYWJsZW1lbnRzVXRpbAotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFNvcnRlZE1hcCBFTVBUWV9TT1JURURfTUFQID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkTWFwKG5ldyBUcmVlTWFwKCkpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU29ydGVkU2V0IEVNUFRZX1NPUlRFRF9TRVQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQobmV3IFRyZWVTZXQoKSk7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWkVST19MRU5HVEhfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRJbnN0YW5jZShPYmplY3Qgb2JqZWN0LCBDbGFzcyBjKSB7Ci0JCWFzc2VydEluc3RhbmNlKG9iamVjdCwgYywgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRJbnN0YW5jZShPYmplY3Qgb2JqZWN0LCBDbGFzcyBjLCBib29sZWFuIGFsbG93TnVsbCkgewotCQlpZiAob2JqZWN0ID09IG51bGwgJiYgYWxsb3dOdWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJZWxzZSBpZiAoIWMuaXNJbnN0YW5jZShvYmplY3QpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoYm9vbGVhbiBsZWZ0LCBib29sZWFuIHJpZ2h0KSB7Ci0JCXJldHVybiBsZWZ0ID09IGZhbHNlID8gKHJpZ2h0ID09IHRydWUgPyAtMSA6IDApIDogMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKENvbXBhcmFibGUgbGVmdCwgQ29tcGFyYWJsZSByaWdodCkgewotCQlpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAobGVmdCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQllbHNlIGlmIChyaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiBsZWZ0LmNvbXBhcmVUbyhyaWdodCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShDb21wYXJhYmxlW10gbGVmdCwgQ29tcGFyYWJsZVtdIHJpZ2h0KSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQllbHNlIGlmIChsZWZ0ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UgaWYgKHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSB7Ci0JCQlpbnQgbCA9IGxlZnQubGVuZ3RoOwotCQkJaW50IHIgPSByaWdodC5sZW5ndGg7Ci0KLQkJCWlmIChsICE9IHIpCi0JCQkJcmV0dXJuIGwgLSByOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLQkJCQlpbnQgY29tcGFyZVRvID0gY29tcGFyZShsZWZ0W2ldLCByaWdodFtpXSk7Ci0KLQkJCQlpZiAoY29tcGFyZVRvICE9IDApCi0JCQkJCXJldHVybiBjb21wYXJlVG87Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoaW50IGxlZnQsIGludCByaWdodCkgewotCQlyZXR1cm4gbGVmdCAtIHJpZ2h0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoTGlzdCBsZWZ0LCBMaXN0IHJpZ2h0KSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQllbHNlIGlmIChsZWZ0ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UgaWYgKHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSB7Ci0JCQlpbnQgbCA9IGxlZnQuc2l6ZSgpOwotCQkJaW50IHIgPSByaWdodC5zaXplKCk7Ci0KLQkJCWlmIChsICE9IHIpCi0JCQkJcmV0dXJuIGwgLSByOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLQkJCQlpbnQgY29tcGFyZVRvID0gY29tcGFyZSgoQ29tcGFyYWJsZSkgbGVmdC5nZXQoaSksIChDb21wYXJhYmxlKSByaWdodC5nZXQoaSkpOwotCi0JCQkJaWYgKGNvbXBhcmVUbyAhPSAwKQotCQkJCQlyZXR1cm4gY29tcGFyZVRvOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlmZihNYXAgbGVmdCwgTWFwIHJpZ2h0LCBTZXQgbGVmdE9ubHksIFNldCBkaWZmZXJlbnQsIFNldCByaWdodE9ubHkpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsIHx8IGxlZnRPbmx5ID09IG51bGwgfHwgZGlmZmVyZW50ID09IG51bGwgfHwgcmlnaHRPbmx5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxlZnQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qga2V5ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoIXJpZ2h0LmNvbnRhaW5zS2V5KGtleSkpCi0JCQkJbGVmdE9ubHkuYWRkKGtleSk7Ci0JCQllbHNlIGlmICghVXRpbC5lcXVhbHMobGVmdC5nZXQoa2V5KSwgcmlnaHQuZ2V0KGtleSkpKQotCQkJCWRpZmZlcmVudC5hZGQoa2V5KTsKLQkJfQotCi0JCWl0ZXJhdG9yID0gcmlnaHQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qga2V5ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoIWxlZnQuY29udGFpbnNLZXkoa2V5KSkKLQkJCQlyaWdodE9ubHkuYWRkKGtleSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlmZihTZXQgbGVmdCwgU2V0IHJpZ2h0LCBTZXQgbGVmdE9ubHksIFNldCByaWdodE9ubHkpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsIHx8IGxlZnRPbmx5ID09IG51bGwgfHwgcmlnaHRPbmx5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxlZnQuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoIXJpZ2h0LmNvbnRhaW5zKG9iamVjdCkpCi0JCQkJbGVmdE9ubHkuYWRkKG9iamVjdCk7Ci0JCX0KLQotCQlpdGVyYXRvciA9IHJpZ2h0Lml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJaWYgKCFsZWZ0LmNvbnRhaW5zKG9iamVjdCkpCi0JCQkJcmlnaHRPbmx5LmFkZChvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuZHNXaXRoKExpc3QgbGVmdCwgTGlzdCByaWdodCwgYm9vbGVhbiBlcXVhbHMpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbCA9IGxlZnQuc2l6ZSgpOwotCQlpbnQgciA9IHJpZ2h0LnNpemUoKTsKLQkJaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKQotCQkJaWYgKCFlcXVhbHMobGVmdC5nZXQobCAtIGkgLSAxKSwgcmlnaHQuZ2V0KHIgLSBpIC0gMSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuZHNXaXRoKE9iamVjdFtdIGxlZnQsIE9iamVjdFtdIHJpZ2h0LCBib29sZWFuIGVxdWFscykgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBsID0gbGVmdC5sZW5ndGg7Ci0JCWludCByID0gcmlnaHQubGVuZ3RoOwotCQlpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcjsgaSsrKQotCQkJaWYgKCFlcXVhbHMobGVmdFtsIC0gaSAtIDFdLCByaWdodFtyIC0gaSAtIDFdKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoYm9vbGVhbiBsZWZ0LCBib29sZWFuIHJpZ2h0KSB7Ci0JCXJldHVybiBsZWZ0ID09IHJpZ2h0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoaW50IGxlZnQsIGludCByaWdodCkgewotCQlyZXR1cm4gbGVmdCA9PSByaWdodDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQgPT0gbnVsbCA/IHJpZ2h0ID09IG51bGwgOiBsZWZ0LmVxdWFscyhyaWdodCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoYm9vbGVhbiBiKSB7Ci0JCXJldHVybiBiID8gQm9vbGVhbi5UUlVFLmhhc2hDb2RlKCkgOiBCb29sZWFuLkZBTFNFLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoaW50IGkpIHsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0ICE9IG51bGwgPyBvYmplY3QuaGFzaENvZGUoKSA6IDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNhZmVDb3B5KExpc3QgbGlzdCwgQ2xhc3MgYykgewotCQlyZXR1cm4gc2FmZUNvcHkobGlzdCwgYywgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzYWZlQ29weShMaXN0IGxpc3QsIENsYXNzIGMsIGJvb2xlYW4gYWxsb3dOdWxsRWxlbWVudHMpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlMaXN0IHNhZmVMaXN0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0KGxpc3QpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzYWZlTGlzdC5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQlhc3NlcnRJbnN0YW5jZShpdGVyYXRvci5uZXh0KCksIGMsIGFsbG93TnVsbEVsZW1lbnRzKTsKLQotCQlyZXR1cm4gc2FmZUxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNYXAgc2FmZUNvcHkoTWFwIG1hcCwgQ2xhc3Mga2V5Q2xhc3MsIENsYXNzIHZhbHVlQ2xhc3MpIHsKLQkJcmV0dXJuIHNhZmVDb3B5KG1hcCwga2V5Q2xhc3MsIHZhbHVlQ2xhc3MsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNYXAgc2FmZUNvcHkoTWFwIG1hcCwgQ2xhc3Mga2V5Q2xhc3MsIENsYXNzIHZhbHVlQ2xhc3MsIGJvb2xlYW4gYWxsb3dOdWxsS2V5cywgYm9vbGVhbiBhbGxvd051bGxWYWx1ZXMpIHsKLQkJaWYgKG1hcCA9PSBudWxsIHx8IGtleUNsYXNzID09IG51bGwgfHwgdmFsdWVDbGFzcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJTWFwIHNhZmVNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmV3IEhhc2hNYXAobWFwKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2FmZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJYXNzZXJ0SW5zdGFuY2UoZW50cnkuZ2V0S2V5KCksIGtleUNsYXNzLCBhbGxvd051bGxLZXlzKTsKLQkJCWFzc2VydEluc3RhbmNlKGVudHJ5LmdldFZhbHVlKCksIHZhbHVlQ2xhc3MsIGFsbG93TnVsbFZhbHVlcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2FmZU1hcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNldCBzYWZlQ29weShTZXQgc2V0LCBDbGFzcyBjKSB7Ci0JCXJldHVybiBzYWZlQ29weShzZXQsIGMsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNldCBzYWZlQ29weShTZXQgc2V0LCBDbGFzcyBjLCBib29sZWFuIGFsbG93TnVsbEVsZW1lbnRzKSB7Ci0JCWlmIChzZXQgPT0gbnVsbCB8fCBjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlTZXQgc2FmZVNldCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldChzZXQpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzYWZlU2V0Lml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCWFzc2VydEluc3RhbmNlKGl0ZXJhdG9yLm5leHQoKSwgYywgYWxsb3dOdWxsRWxlbWVudHMpOwotCi0JCXJldHVybiBzYWZlU2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIHNhZmVDb3B5KFNvcnRlZE1hcCBzb3J0ZWRNYXAsIENsYXNzIGtleUNsYXNzLCBDbGFzcyB2YWx1ZUNsYXNzKSB7Ci0JCXJldHVybiBzYWZlQ29weShzb3J0ZWRNYXAsIGtleUNsYXNzLCB2YWx1ZUNsYXNzLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIHNhZmVDb3B5KFNvcnRlZE1hcCBzb3J0ZWRNYXAsIENsYXNzIGtleUNsYXNzLCBDbGFzcyB2YWx1ZUNsYXNzLCBib29sZWFuIGFsbG93TnVsbEtleXMsIGJvb2xlYW4gYWxsb3dOdWxsVmFsdWVzKSB7Ci0JCWlmIChzb3J0ZWRNYXAgPT0gbnVsbCB8fCBrZXlDbGFzcyA9PSBudWxsIHx8IHZhbHVlQ2xhc3MgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCVNvcnRlZE1hcCBzYWZlU29ydGVkTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkTWFwKG5ldyBUcmVlTWFwKHNvcnRlZE1hcCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNhZmVTb3J0ZWRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEluc3RhbmNlKGVudHJ5LmdldEtleSgpLCBrZXlDbGFzcywgYWxsb3dOdWxsS2V5cyk7Ci0JCQlhc3NlcnRJbnN0YW5jZShlbnRyeS5nZXRWYWx1ZSgpLCB2YWx1ZUNsYXNzLCBhbGxvd051bGxWYWx1ZXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNhZmVTb3J0ZWRNYXA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgc2FmZUNvcHkoU29ydGVkU2V0IHNvcnRlZFNldCwgQ2xhc3MgYykgewotCQlyZXR1cm4gc2FmZUNvcHkoc29ydGVkU2V0LCBjLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgc2FmZUNvcHkoU29ydGVkU2V0IHNvcnRlZFNldCwgQ2xhc3MgYywgYm9vbGVhbiBhbGxvd051bGxFbGVtZW50cykgewotCQlpZiAoc29ydGVkU2V0ID09IG51bGwgfHwgYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJU29ydGVkU2V0IHNhZmVTb3J0ZWRTZXQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQobmV3IFRyZWVTZXQoc29ydGVkU2V0KSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2FmZVNvcnRlZFNldC5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQlhc3NlcnRJbnN0YW5jZShpdGVyYXRvci5uZXh0KCksIGMsIGFsbG93TnVsbEVsZW1lbnRzKTsKLQotCQlyZXR1cm4gc2FmZVNvcnRlZFNldDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RhcnRzV2l0aChMaXN0IGxlZnQsIExpc3QgcmlnaHQsIGJvb2xlYW4gZXF1YWxzKSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGwgPSBsZWZ0LnNpemUoKTsKLQkJaW50IHIgPSByaWdodC5zaXplKCk7Ci0JCWlmIChyID4gbCB8fCAhZXF1YWxzICYmIHIgPT0gbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0JCQlpZiAoIWVxdWFscyhsZWZ0LmdldChpKSwgcmlnaHQuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoKE9iamVjdFtdIGxlZnQsIE9iamVjdFtdIHJpZ2h0LCBib29sZWFuIGVxdWFscykgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBsID0gbGVmdC5sZW5ndGg7Ci0JCWludCByID0gcmlnaHQubGVuZ3RoOwotCQlpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0JCQlpZiAoIWVxdWFscyhsZWZ0W2ldLCByaWdodFtpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFV0aWwudHJhbnNsYXRlU3RyaW5nKHJlc291cmNlQnVuZGxlLCBrZXksIGtleSwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhbnNsYXRlU3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBTdHJpbmcga2V5LCBTdHJpbmcgc3RyaW5nLCBib29sZWFuIHNpZ25hbCwgYm9vbGVhbiB0cmltKSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsICYmIGtleSAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlmaW5hbCBTdHJpbmcgdHJhbnNsYXRlZFN0cmluZyA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCi0JCQkJaWYgKHRyYW5zbGF0ZWRTdHJpbmcgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHRyaW0gPyB0cmFuc2xhdGVkU3RyaW5nLnRyaW0oKSA6IHRyYW5zbGF0ZWRTdHJpbmc7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZU1pc3NpbmdSZXNvdXJjZSkgewotCQkJCWlmIChzaWduYWwpCi0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlTWlzc2luZ1Jlc291cmNlKTsKLQkJCX0KLQotCQlyZXR1cm4gdHJpbSA/IHN0cmluZy50cmltKCkgOiBzdHJpbmc7Ci0JfQotCi0JcHJpdmF0ZSBVdGlsKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY3NmQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlciB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBwcmVPcHMgPSBudWxsOwotCXByaXZhdGUgQXJyYXlMaXN0IHBvc3RPcHMgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyIGNyZWF0ZUV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyKFN0cmluZyBvcGVyYXRpb25JRCkgewotCQlDb2xsZWN0aW9uIGV4dGVuc2lvbnMgPSAoQ29sbGVjdGlvbikgT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLmdldEV4dGVuc2lvblBvaW50cygpLmdldChvcGVyYXRpb25JRCk7Ci0JCWlmIChleHRlbnNpb25zID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlciBleHRPcGVyYXRpb25Ib2xkZXIgPSBuZXcgQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlcigpOwotCQlPYmplY3QgcHJlT3AgPSBudWxsOwotCQlPYmplY3QgcG9zdE9wID0gbnVsbDsKLQkJT3BlcmF0aW9uRXh0ZW5zaW9uIGN1cnJlbnRFeHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXh0ZW5zaW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQljdXJyZW50RXh0ID0gKE9wZXJhdGlvbkV4dGVuc2lvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoY3VycmVudEV4dC5nZXRFeHRlbnNpb25JZCgpLCBudWxsKS5pc0VuYWJsZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByZU9wID0gY3VycmVudEV4dC5nZXRQcmVPcGVyYXRpb24oKTsKLQkJCQkJaWYgKHByZU9wICE9IG51bGwpIHsKLQkJCQkJCWV4dE9wZXJhdGlvbkhvbGRlci5hZGRQcmVPcGVyYXRpb24ocHJlT3ApOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJcG9zdE9wID0gY3VycmVudEV4dC5nZXRQb3N0T3BlcmF0aW9uKCk7Ci0JCQkJCWlmIChwb3N0T3AgIT0gbnVsbCkgewotCQkJCQkJZXh0T3BlcmF0aW9uSG9sZGVyLmFkZFBvc3RPcGVyYXRpb24ocG9zdE9wKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBleHRPcGVyYXRpb25Ib2xkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlT3BlcmF0aW9uKE9iamVjdCBwcmVPcGVyYXRpb24pIHsKLQkJaWYgKHByZU9wcyA9PSBudWxsKSB7Ci0JCQlwcmVPcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcHJlT3BzLmFkZChwcmVPcGVyYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBvc3RPcGVyYXRpb24oT2JqZWN0IHBvc3RPcGVyYXRpb24pIHsKLQkJaWYgKHBvc3RPcHMgPT0gbnVsbCkgewotCQkJcG9zdE9wcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlwb3N0T3BzLmFkZChwb3N0T3BlcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmVPcHMoKSB7Ci0JCXJldHVybiBwcmVPcHMgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQb3N0T3BzKCkgewotCQlyZXR1cm4gcG9zdE9wcyAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0UG9zdE9wcygpIHsKLQkJcmV0dXJuIHBvc3RPcHM7Ci0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRQcmVPcHMoKSB7Ci0JCXJldHVybiBwcmVPcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWRiODVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIFNpbWlhbGFyIHRvIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MsIGhvd2V2ZXIgd2l0aG91dCBVSSBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCS8qKgotCSAqIFJ1bnMgdGhpcyBvcGVyYXRpb24gd2l0aG91dCBmb3JjaW5nIGEgVUkgZGVwZW5kZW5jeS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUgcmVxdWVzdHMgZm9yCi0JICogICAgICAgICAgICBjYW5jZWxhdGlvbgotCSAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sIGl0IHNob3VsZCB3cmFwIGl0IGluc2lkZQotCSAqICAgICAgICAgICAgICAgIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlCi0JICogICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSB3cmFwcGVkIGluIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+IGJ5IHRoZQotCSAqICAgICAgICAgICAgICAgIGNhbGxpbmcgY29udGV4dAotCSAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgdXNpbmcKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nCi0JICogICAgICAgICAgICAgICAgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+Ci0JICogCi0JICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSU9wZXJhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNlNGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotLyoqCi0gKiBQYXNzZWQgdG8gY29tcGxleCBtZXRob2RzIHRoYXQgbWF5IHJlcXVpcmUgcmVwb3J0aW5nIG9mIG1lc3NhZ2VzLCBvciBpbnRlcmFjdGlvbnMgZnJvbSB0aGUgdXNlcjsKLSAqIERlZmluZWQgYXMgYW4gaW50ZXJmYWNlIGJlY2F1c2UgdGhlIGFjdGlvbnMgbWF5IHJ1biBpbiBoZWFkbGVzcyBlbnZpcm9ubWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uSGFuZGxlciB7Ci0JaW50IFlFUyA9IDA7Ci0JaW50IFlFU19UT19BTEwgPSAxOwotCWludCBOTyA9IDI7Ci0JaW50IENBTkNFTCA9IDM7Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlLiA8Y29kZT5pdGVtczwvY29kZT4KLQkgKiBpcyBhbiBhcnJheSBvZiBkZXRhaWxzIHRoYXQgYWNjb21wYW55IHRoZSA8Y29kZT5tZXNzYWdlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpOwotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUuIFRoZSBib29sZWFuIGFycmF5Ci0JICogd2lsbCByZXR1cm4gdHdvIGJvb2xlYW5zLiBUaGUgZmlyc3QgaW5kaWNhdGVzIHRoZWlyIHJlc3BvbnNlIHRvIHRoZSBvcmlnaW5hbCBxdWVzdGlvbiBhbmQgdGhlCi0JICogc2Vjb25kIGluZGljYXRlcyBpZiB0aGV5IHNlbGVjdGVkIHRoZSBhcHBseSB0byBhbGwgY2hlY2sgYm94LgotCSAqIAotCSAqIFJldHVybiB0aGUgcmV0dXJuIGNvZGUgZm9yIHRoZSBkaWFsb2cuIDAgPSBZZXMsIDEgPSBZZXMgdG8gYWxsLCAyID0gTm8KLQkgKi8KLQlpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2soU3RyaW5nIG1lc3NhZ2UpOwotCi0JaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogQW4gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogQW4gaW5mb3JtYXRpb25hbCBtZXNzYWdlIG5lZWRzIHRvIGJlIHByZXNlbnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSk7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjM2Y2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcgewotCi0JLyoqCi0JICogQSByZXF1aXJlZCBkYXRhTW9kZWwgcHJvcGVydHlOYW1lIGZvciBhIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+IHR5cGUuIFRoaXMgaXMgdXNlZCB0bwotCSAqIHNwZWNpZnkgdGhlIHByb2plY3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBCb29sZWFuIHByb3BlcnR5IHVzZWQgZm9yIGRldGVybWluaW5nIGhvdyB0aGUgUFJPSkVDVF9MT0NBVElPTiBpcyBjb21wdXRlZC4gSWYgdGhpcwotCSAqIHByb3BlcnR5IGlzIHRydWUgdGhlbiB0aGUgUFJPSkVDVF9MT0NBVElPTiBpcyBudWxsLiBPdGhlcndpc2UgdGhlIFBST0pFQ1RfTE9DQVRJT04gaXMgdGhlCi0JICogdmFsdWUgb2YgVVNFUl9ERUZJTkVEX0xPQ0FUSU9OLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9ERUZBVUxUX0xPQ0FUSU9OID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlVTRV9ERUZBVUxUX0xPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBTdHJpbmcgcHJvcGVydHkgdXNlZCBpbiBjb25qdWN0aW9uIHdpdGggVVNFX0RFRkFVTFRfTE9DQVRJT04gdG8gb3ZlcnJpZGUgdGhlCi0JICogREVGQVVMVF9MT0NBVElPTi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFRklORURfTE9DQVRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuVVNFUl9ERUZJTkVEX0xPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBTdHJpbmcgcHJvcGVydHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjVVNFX0RFRkFVTFRfTE9DQVRJT059IGFuZAotCSAqIHtAbGluayAjUFJPSkVDVF9OQU1FfSB0byBvdmVycmlkIHRoZSB7QGxpbmsgI1BST0pFQ1RfTE9DQVRJT059LgotCSAqIAotCSAqIElmIHtAbGluayAjVVNFX0RFRkFVTFRfTE9DQVRJT059IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIHRoZW4gdGhlCi0JICoge0BsaW5rICNQUk9KRUNUX0xPQ0FUSU9OfSBpcyBkZWZpbmVkIGJ5IHtAbGluayAjVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT059L3tAbGluayAjUFJPSkVDVF9OQU1FfS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5VU0VSX0RFRklORURfQkFTRV9MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIHVuc2V0dGFibGUgcHJvcGVydHkgd2hpY2ggc3BlY2lmaWVkIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciBhIG5ld2x5IGNyZWF0ZWQgcHJvamVjdC4gVGhlCi0JICogdmFsdWUgaXMgY29tcHV0ZWQgYnkgYXBwZW5kaW5nIHRoZSBwcm9qZWN0IG5hbWUgdG8gdGhlIHdvcmtzcGFjZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPQ0FUSU9OID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LkRFRkFVTFRfTE9DQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiB1bnNldHRhYmxlIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJvamVjdCBsb2NhdGlvbi4gSWYgVVNFX0RFRkFVTFRfTE9DQVRJT04gdGhpcwotCSAqIHByb3BlcnR5IGV2YWx1YXRlcyB0byBVU0VSX0RFRklORURfTE9DQVRJT047IG90aGVyd2lzZSBpdCBpIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTE9DQVRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wdGlvbmFsIGRhdGFNb2RlbCBwcm9wZXJ0eU5hbWUgZm9yIGEgPGNvZGU+amF2YS5sYW5nLlN0cmluZ1tdPC9jb2RlPiB0eXBlLiBUaGlzIGlzIGEKLQkgKiBsaXN0IG9mIGFsbCBuYXR1cmVzIHRvIGFkZCB0byB0aGUgcHJvamVjdC4gVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BVFVSRVMgPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQVRVUkVTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSVByb2plY3QuIEFuIG5vbiBzZXR0YWJsZSBwcm9wZXJ0eS4gVGhpcyBpcyBhIGNvbnZlbmllY2UgZm9yIGNvbnN0cnVjdGlvbmcgZ2V0dGluZyB0aGUKLQkgKiBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1QgPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElQcm9qZWN0RGVzY3JpcHRpb24uIEFuIG5vbiBzZXR0YWJsZSBwcm9wZXJ0eS4gVGhpcyBpcyBhIGNvbnZlbmllY2UgZm9yIGNvbnN0cnVjdGlvbmcgYQotCSAqIHByb2plY3QgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9ERVNDUklQVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX0RFU0NSSVBUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmY2QxNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkV4dGVuc2lvbiB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG9wSUQgPSBudWxsOwotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBiYXNlRWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZU9wZXJhdGlvbkNsYXNzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9zdE9wZXJhdGlvbkNsYXNzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uSWQ7Ci0KLQlwdWJsaWMgT3BlcmF0aW9uRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgaWQsIFN0cmluZyBwcmVPcCwgU3RyaW5nIHBvc3RPcCkgewotCQlzdXBlcigpOwotCQliYXNlRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXNldFVwRXh0ZW5zaW9uKGlkLCBwcmVPcCwgcG9zdE9wKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VXBFeHRlbnNpb24oU3RyaW5nIGlkLCBTdHJpbmcgcHJlT3AsIFN0cmluZyBwb3N0T3ApIHsKLQkJb3BJRCA9IGlkOwotCQlwcmVPcGVyYXRpb25DbGFzcyA9IHByZU9wOwotCQlwb3N0T3BlcmF0aW9uQ2xhc3MgPSBwb3N0T3A7Ci0JCXRoaXMuZXh0ZW5zaW9uSWQgPSBiYXNlRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JCWlmICh0aGlzLmV4dGVuc2lvbklkID09IG51bGwpCi0JCQl0aGlzLmV4dGVuc2lvbklkID0gYmFzZUVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPcElEKCkgewotCQlyZXR1cm4gb3BJRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3RPcGVyYXRpb25DbGFzcygpIHsKLQkJcmV0dXJuIHBvc3RPcGVyYXRpb25DbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZU9wZXJhdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gcHJlT3BlcmF0aW9uQ2xhc3M7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQb3N0T3BlcmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocG9zdE9wZXJhdGlvbkNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJhc2VFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLkFUVF9QT1NUX09QKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByZU9wZXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByZU9wZXJhdGlvbkNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJhc2VFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLkFUVF9QUkVfT1ApOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXh0ZW5zaW9uSWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb25JZCgpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbklkOwotCX0KLQotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0QmFzZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBiYXNlRWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjgwMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkV4dGVuc2lvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25FeHRlbnNpb25SZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIG9wRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0oyRUVPUEVYVCA9ICJvcGVyYXRpb25FeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJFX09QID0gInByZU9wZXJhdGlvbkNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QT1NUX09QID0gInBvc3RPcGVyYXRpb25DbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBPcGVyYXRpb25FeHRlbnNpb25SZWFkZXIoKSB7Ci0JCXN1cGVyKFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsICJPcGVyYXRpb25FeHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOiA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0JICogcHJlT3BlcmF0aW9uQ2xhc3M9ImNvbS5pYm0uZXRvb2xzLi4uLlByZURlbGV0ZU9wZXJhdGlvbiIKLQkgKiBwb3N0T3BlcmF0aW9uQ2xhc3M9ImNvbS5pYm0uZXRvb2xzLi4uLlBvc3REZWxldGVPcGVyYXRpb24iPiA8L29wZXJhdGlvbkV4dGVuc2lvbj4KLQkgKi8KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfSjJFRU9QRVhUKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJU3RyaW5nIHByZU9wID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSRV9PUCk7Ci0JCVN0cmluZyBwb3N0T3AgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUE9TVF9PUCk7Ci0JCU9wZXJhdGlvbkV4dGVuc2lvbiBleHRlbnNpb24gPSBuZXcgT3BlcmF0aW9uRXh0ZW5zaW9uKGVsZW1lbnQsIGlkLCBwcmVPcCwgcG9zdE9wKTsKLQkJYWRkRXh0ZW5zaW9uUG9pbnQoZXh0ZW5zaW9uKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25zCi0JICogICAgICAgICAgICBUaGUgZXh0ZW5zaW9ucyB0byBzZXQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEV4dGVuc2lvblBvaW50KE9wZXJhdGlvbkV4dGVuc2lvbiBuZXdFeHRlbnNpb24pIHsKLQkJQ29sbGVjdGlvbiB0ZW1wID0gbnVsbDsKLQkJT2JqZWN0IGhvbGRlciA9IG9wRXh0ZW5zaW9ucy5nZXQobmV3RXh0ZW5zaW9uLmdldE9wSUQoKSk7Ci0JCWlmIChob2xkZXIgPT0gbnVsbCkgewotCQkJdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXRlbXAuYWRkKG5ld0V4dGVuc2lvbik7Ci0JCQlvcEV4dGVuc2lvbnMucHV0KG5ld0V4dGVuc2lvbi5nZXRPcElEKCksIHRlbXApOwotCQl9IGVsc2UgewotCQkJdGVtcCA9IChDb2xsZWN0aW9uKSBob2xkZXI7Ci0JCQl0ZW1wLmFkZChuZXdFeHRlbnNpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGdldEV4dGVuc2lvblBvaW50cygpIHsKLQkJaWYob3BFeHRlbnNpb25zID09IG51bGwpewotCQkJb3BFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCU9wZXJhdGlvbkV4dGVuc2lvblJlYWRlciBvcEV4dGVuc2lvblJlYWRlciA9IG5ldyBPcGVyYXRpb25FeHRlbnNpb25SZWFkZXIoKTsKLQkJCW9wRXh0ZW5zaW9uUmVhZGVyLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBvcEV4dGVuc2lvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvblN0YXR1cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvblN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmJmMGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uU3RhdHVzIGV4dGVuZHMgTXVsdGlTdGF0dXMgewotCi0JcHVibGljIE9wZXJhdGlvblN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHsKLQkJc3VwZXIoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgMCwgbmV3IElTdGF0dXNbXXt9LCBtZXNzYWdlLCBlKTsKLQl9Ci0KLQlwdWJsaWMgT3BlcmF0aW9uU3RhdHVzKElTdGF0dXNbXSBjaGlsZHJlbikgewotCQl0aGlzKFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsIGNoaWxkcmVuLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT3BlcmF0aW9uU3RhdHVzKFN0cmluZyBwbHVnaW5JZCwgaW50IGNvZGUsIElTdGF0dXNbXSBjaGlsZHJlbiwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJc3VwZXIocGx1Z2luSWQsIGNvZGUsIGNoaWxkcmVuLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEV4dGVuZGVkU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBvbGRTZXZlcml0eSA9IGdldFNldmVyaXR5KCk7Ci0JCXN1cGVyLmFkZChzdGF0dXMpOwotCQlpZiAob2xkU2V2ZXJpdHkgIT0gSVN0YXR1cy5FUlJPUiAmJiBnZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXNldFNldmVyaXR5KElTdGF0dXMuV0FSTklORyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIGV4cG9zZSBhcyBwdWJsaWMgaW5zdGVhZCBvZiBwcm90ZWN0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb2RlKGludCBjb2RlKSB7Ci0JCXN1cGVyLnNldENvZGUoY29kZSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBleHBvc2UgYXMgcHVibGljIGluc3RlYWQgb2YgcHJvdGVjdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJc3VwZXIuc2V0RXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBleHBvc2UgYXMgcHVibGljIGluc3RlYWQgb2YgcHJvdGVjdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlci5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gZXhwb3NlIGFzIHB1YmxpYyBpbnN0ZWFkIG9mIHByb3RlY3RlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkgewotCQlzdXBlci5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBuZXdTZXYgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJaWYgKG5ld1NldiA+IGdldFNldmVyaXR5KCkpIHsKLQkJCXNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQlzZXRFeGNlcHRpb24oc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCQlzdXBlci5hZGQoc3RhdHVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk2ZjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXcgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcgewotCi0JQE92ZXJyaWRlCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcobW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9MT0NBVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRV9ERUZBVUxUX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoREVGQVVMVF9MT0NBVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRVJfREVGSU5FRF9MT0NBVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQVRVUkVTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9ERVNDUklQVElPTik7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9MT0NBVElPTikpIHsKLQkJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoVVNFX0RFRkFVTFRfTE9DQVRJT04pKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgaWYgKGlzUHJvcGVydHlTZXQoVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04pKSB7Ci0JCQkJcmV0dXJuIGdldFN0cmluZ1Byb3BlcnR5KFVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OKSArIEZpbGUuc2VwYXJhdG9yICsgZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCX0KLQkJCXJldHVybiBnZXRQcm9wZXJ0eShVU0VSX0RFRklORURfTE9DQVRJT04pOwotCQl9IGVsc2UgaWYgKERFRkFVTFRfTE9DQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChVU0VfREVGQVVMVF9MT0NBVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChVU0VSX0RFRklORURfTE9DQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9ERVNDUklQVElPTikpCi0JCQlyZXR1cm4gZ2V0UHJvamVjdERlc2NyaXB0aW9uKCk7Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TG9jYXRpb24oKSB7Ci0JCUlQYXRoIHBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsKQotCQkJcGF0aCA9IHBhdGguYXBwZW5kKHByb2plY3ROYW1lKTsKLQkJcmV0dXJuIHBhdGgudG9PU1N0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTE9DQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoREVGQVVMVF9MT0NBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0RFU0NSSVBUSU9OKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLQkJCUlTdGF0dXMgc3RhdCA9IG1vZGVsLnZhbGlkYXRlUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCWlmIChzdGF0ICE9IE9LX1NUQVRVUykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KFBST0pFQ1QsIGdldFByb2plY3QoKSk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShERUZBVUxUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9ERUZBVUxUX0xPQ0FUSU9OKSB8fCBpc1Byb3BlcnR5U2V0KFVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OKSkgewotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfTE9DQVRJT04sIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRV9ERUZBVUxUX0xPQ0FUSU9OKSkgewotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9MT0NBVElPTiwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQl9IGVsc2UgaWYgKChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfREVGSU5FRF9MT0NBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTikpICYmICFnZXRCb29sZWFuUHJvcGVydHkoVVNFX0RFRkFVTFRfTE9DQVRJT04pKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdERlc2NyaXB0aW9uIGdldFByb2plY3REZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0TmFtZSk7Ci0JCVN0cmluZyBwcm9qZWN0TG9jYXRpb24gPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX0xPQ0FUSU9OKTsKLQkJaWYgKHByb2plY3RMb2NhdGlvbiAhPSBudWxsKQotCQkJZGVzYy5zZXRMb2NhdGlvbihuZXcgUGF0aChwcm9qZWN0TG9jYXRpb24pKTsKLQkJZWxzZQotCQkJZGVzYy5zZXRMb2NhdGlvbihudWxsKTsKLQkJcmV0dXJuIGRlc2M7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCXJldHVybiAobnVsbCAhPSBwcm9qZWN0TmFtZSAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDApID8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSA6IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlTmFtZShuYW1lKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTE9DQVRJT04pKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlTG9jYXRpb24oKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTE9DQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQotCQkJU3RyaW5nIHByb2plY3RMb2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCQlwcm9qZWN0TG9jID0gZ2V0RGVmYXVsdExvY2F0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCXByb2plY3RMb2MgPSBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX0xPQ0FUSU9OKTsKLQkJCX0KLQkJCXJldHVybiB2YWxpZGF0ZUV4aXN0aW5nKHByb2plY3ROYW1lLCBwcm9qZWN0TG9jKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEBwYXJhbSBwcm9qZWN0TG9jCi0JICogQHRvZG8gR2VuZXJhdGVkIGNvbW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVFeGlzdGluZyhTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBwcm9qZWN0TG9jKSB7Ci0JCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmICFwcm9qZWN0TmFtZS5lcXVhbHMoIiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocHJvamVjdExvYyk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJRmlsZSBkb3RQcm9qZWN0ID0gbmV3IEZpbGUoZmlsZSwgIi5wcm9qZWN0Iik7Ly8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZG90UHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUFJPSkVDVF9FWElTVFNfQVRfTE9DQVRJT05fRVJST1IsIG5ldyBPYmplY3RbXXtmaWxlLnRvU3RyaW5nKCl9KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3RIYW5kbGVGcm9tUHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUocHJvamVjdE5hbWUsIElSZXNvdXJjZS5QUk9KRUNUKTsKLQkJcmV0dXJuIChudWxsICE9IHByb2plY3ROYW1lICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCAmJiBzdGF0dXMuaXNPSygpKSA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKHByb2plY3ROYW1lLCBJUmVzb3VyY2UuUFJPSkVDVCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCWlmIChwcm9qZWN0TmFtZS5lbmRzV2l0aCgiICIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjQxIikpOyAvLyROT04tTkxTLTEkCi0JCS8vc3BlY2lhbCBGUkFHTUVOVF9TRVBBUkFUT1IgY2hhciBpbiBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCi0JCWlmIChwcm9qZWN0TmFtZS5pbmRleE9mKCcjJykgIT0gLTEpIAotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI4IikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlTmFtZShTdHJpbmcgbmFtZSkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE5hbWUobmFtZSk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5QUk9KRUNUX0VYSVNUU19TQU1FTkFNRV9FUlJPUiwgbmV3IE9iamVjdFtde25hbWV9KSk7Ci0JCX0KLQkJaWYgKCFXVFBQbHVnaW4uaXNQbGF0Zm9ybUNhc2VTZW5zaXRpdmUoKSkgewotCQkJLy8gbm93IGxvb2sgZm9yIGEgbWF0Y2hpbmcgY2FzZSB2YXJpYW50IGluIHRoZSB0cmVlCi0JCQlJUmVzb3VyY2UgdmFyaWFudCA9ICgoUmVzb3VyY2UpIHByb2plY3QpLmZpbmRFeGlzdGluZ1Jlc291cmNlVmFyaWFudChwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotCQkJaWYgKHZhcmlhbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiNDIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlTG9jYXRpb24oKSB7Ci0JCVN0cmluZyBsb2MgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX0xPQ0FUSU9OKTsKLQkJaWYgKG51bGwgIT0gbG9jKSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2MpOwotCQkJcmV0dXJuIHdvcmtzcGFjZS52YWxpZGF0ZVByb2plY3RMb2NhdGlvbihnZXRQcm9qZWN0KCksIHBhdGgpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbk9wZXJhdGlvbk5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbk9wZXJhdGlvbk5ldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJhN2JiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjcsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uTmV3IGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldyB7Ci0KLQlwdWJsaWMgUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uTmV3KElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSAoSVByb2plY3REZXNjcmlwdGlvbikgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9ERVNDUklQVElPTik7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCXByb2plY3QuY3JlYXRlKGRlc2MsIHN1Yk1vbml0b3IpOwotCQkJfQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJcHJvamVjdC5vcGVuKHN1Yk1vbml0b3IpOwotCi0JCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSAoU3RyaW5nW10pIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1RfTkFUVVJFUyk7Ci0JCQlpZiAobnVsbCAhPSBuYXR1cmVJZHMpIHsKLQkJCQlkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlc2Muc2V0TmF0dXJlSWRzKG5hdHVyZUlkcyk7Ci0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTU4ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT53dHAgb3BlcmF0aW9uIGFwaSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlRoZSBXVFAgT3BlcmF0aW9uIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkby4uLmV2ZXJ5dGhpbmchPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VW5kZXIgQ29uc3RydWN0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpbWcgc3JjPSJlc2NhcGVfb3V0X3RvX3NvdXJjZV9mb2xkZXIgbGV2ZWwvb3ZlcnZpZXcveW91cl9pbWFnZS5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMTogSW1hZ2UgZGVzY3JpcHRpb248L2k+Ci08L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDUwZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gCi08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT53dHAgb3BlcmF0aW9uIGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLSAgICAgICAgPGFic3RyYWN0PlRoZSBXVFAgT3BlcmF0aW9uIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkby4uLmV2ZXJ5dGhpbmchPC9hYnN0cmFjdD4KLQotCQk8IS0tIGZvcm1hdHRpbmcgaGFuZGxlZCBieSBYU0xUIFRyYW5zZm9ybWF0aW9uIC0tPgotCQk8cD5VbmRlciBDb25zdHJ1Y3Rpb24uPC9wPgotCQk8aW1nIHNyYz0iZXNjYXBlX291dF90b19zb3VyY2VfZm9sZGVyIGxldmVsL292ZXJ2aWV3L3lvdXJfaW1hZ2UuanBnIiBjYXB0aW9uID0iSW1hZ2UgZGVzY3JpcHRpb24iIC8+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9wbHVnaW4vV1RQQ29tbW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhZGU4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiA1LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV1RQQ29tbW9uTWVzc2FnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRVhJU1RTX0VSUk9SID0gIjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OT1RfRUFSID0gIjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DT01QQVRBQkxFX0oyRUVfVkVSU0lPTlMgPSAiMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1FX01PRFVMRV9BTkRfRUFSX05BTUUgPSAiNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX0ZJTEVfTkFNRV9FTVBUWV9FUlJPUiA9ICI1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRE9FU19OT1RfRVhJU1RfRVJST1IgPSAiNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUk5BTF9FUlJPUiA9ICI3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9JTlZBTElEID0gIjgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTVElOQVRJT05fQVJDSElWRV9TSE9VTERfRU5EX1dJVEggPSAiOSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNUSU5BVElPTl9JTlZBTElEID0gIjEwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1JFQURfT05MWSA9ICIxMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FWElTVFNfRVJST1IgPSAiMTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OT1RfRVhJU1RTX0VSUk9SID0gIjEzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNfTEVWRUxfTk9UX0ZPVU5EID0gIjE0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9FTVBUWSA9ICIxNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0NsT1NFRCA9ICIzMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0VYSVNUU19BVF9MT0NBVElPTl9FUlJPUiA9ICIzMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfRU1QVFlfTU9EVUxFX05BTUUgPSAiMzQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX0lOVkFMSURfQ0hBUlMgPSAiMzUiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVUExJQ0FURV9DT01QT05FTlRfTkFNRT0iMzYiOy8vJE5PTi1OTFMtMSQgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05PVF9TVVBQT1JURUQ9IjM3IjsvLyROT04tTkxTLTEkIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9FWElTVFNfRVJST1IgPSAiMzgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFRk9MREVSX0VNUFRZID0gIjM5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkNPTlRFTlRGT0xERVJfRU1QVFkgPSAiNDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9FWElTVFNfU0FNRU5BTUVfRVJST1IgPSAiNDMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9OT05FID0gIjQ0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9wbHVnaW4vV1RQQ29tbW9uUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmYzg3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBXVFBDb21tb25QbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiZnVuY3Rpb25Hcm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIDAsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkvLwlUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdUUENvbW1vblBsdWdpbiBwbHVnaW47Ci0KLQlwdWJsaWMgV1RQQ29tbW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoInd0cF9jb21tb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXVFBDb21tb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVFcnJvclN0YXR1cyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVXYXJuaW5nU3RhdHVzKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVDYW5jZWxTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZUNhbmNlbFN0YXR1cyhtZXNzYWdlLCBudWxsKTsKLQl9CQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlV2FybmluZ1N0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgLTEsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAtMSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlQ2FuY2VsU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuQ0FOQ0VMLCBQTFVHSU5fSUQsIC0xLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXVFBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlTdHJpbmcgcGF0dGVybiA9IGdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JCWlmIChwYXR0ZXJuICE9IG51bGwpCi0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgYXJncyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBleGNlcHRpb24uZ2V0U3RhdHVzKCkgKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL3d0cF9jb21tb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy93dHBfY29tbW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjNkYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL3d0cF9jb21tb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotMT1BIHByb2plY3QgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGlzIG5hbWUgYW5kIGxvY2F0aW9uLgotMj1UaGUgc3BlY2lmaWVkIEVBUiBwcm9qZWN0ICJ7MH0iIGlzIG5vdCBhbiBFQVIgcHJvamVjdC4KLTM9VGhlIEVBUiBwcm9qZWN0ICJ7MH0iIGhhcyBhIEoyRUVWZXJzaW9uIG9mIHsxfSB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kdWxlIHZlcnNpb24uCi00PVRoZSBFQVIgcHJvamVjdCBuYW1lLCAiezB9IiwgY2FuIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJvamVjdCBuYW1lLgotNT17MH0gZmlsZSBuYW1lIG11c3QgYmUgZW50ZXJlZC4KLTY9VGhlIHswfSBkb2VzIG5vdCBleGlzdC4KLTc9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuICBWaWV3IGxvZyBmaWxlcyBmb3IgZGV0YWlscy4KLTg9UHJvamVjdCBuYW1lIGlzIGludmFsaWQuCi05PURlc3RpbmF0aW9uIGFyY2hpdmUgc2hvdWxkIGVuZCB3aXRoIHswfS4KLTEwPURlc3RpbmF0aW9uIGFyY2hpdmUgaXMgaW52YWxpZC4KLTExPURlc3RpbmF0aW9uIGxvY2F0aW9uIGlzIHJlYWQgb25seS4KLTEyPVJlc291cmNlIHswfSBhbHJlYWR5IGV4aXN0cy4gSWYgeW91IHdpc2ggdG8gb3ZlcndyaXRlIHNlbGVjdCB0aGUgIk92ZXJ3cml0ZSBFeGlzdGluZyBmaWxlIiBvcHRpb24uCi0xMz1Qcm9qZWN0IHswfSBkb2VzIG5vdCBleGlzdC4KLTE0PVRoZSBzZWxlY3RlZCB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4KLTE1PUVudGVyIGEgcHJvamVjdCBuYW1lLgotMTY9U2F2ZSBwcm9ibGVtcwotMTc9U2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiAgU29tZSByZWxhdGVkIGZpbGVzIG1heSBoYXZlIGFscmVhZHkgYmVlbiBzYXZlZC5cblxuUmVhc29uCi0xOD17MH0gaGFzIGJlZW4gbG9ja2VkLiBQbGVhc2UgZW5zdXJlIHRoZSBvcGVyYXRpb24gaXMgbm90IGN1cnJlbnRseSBleGVjdXRpbmcuCi0xOT1UaGUgZXh0ZW5kZWRSb290IGlzIG51bGwuIE1ha2Ugc3VyZSB0aGF0IGlzRXh0ZW5kZWQoKSByZXR1cm5zIHRydWUuCi0yMD1Qcm9wZXJ0eSBub3QgbG9jYXRlZDoKLTIxPU5lc3RlZCBtb2RlbCBub3QgbG9jYXRlZDoKLTIyPUNhbm5vdCBtb2RpZnkgaWQgb25jZSBpdCBoYXMgYmVlbiBzZXQuCi0yMz1UaGUgaWQgY2Fubm90IGJlIG51bGwuCi0yND1FUlJPUjoKLTI1PUV4dGVuZGVkIE9wZXJhdGlvbiBmYWlsdXJlOiB7MH0KLTI2PVRoZSBKb2IgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQotMjc9RXhjZXB0aW9uIG9jY3VycmVkIHJ1bm5pbmcgam9iLgotMjg9R3JvdXAgY2Fubm90IGJlIHJlc29sdmVkOgotMjk9Q2xhc3Mgbm90IGZvdW5kIGZvciBhdHRyaWJ1dGUgezB9IDogezF9LCBEZWNsYXJpbmcgcGx1Z2luIGV4dGVuc2lvbjogezJ9Ci0zMD1GdW5jdGlvbiBncm91cCB7MH0gY29udGFpbnMgbm8gcGF0dGVybiBiaW5kaW5ncwotMzE9UHJvamVjdCB7MH0gaXMgY2xvc2VkLgotMzI9QSBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBmaWxlIHN5c3RlbSBhdCB0aGlzIGxvY2F0aW9uOiB7MH0uICBFaXRoZXIgdXNlICJJbXBvcnQgRXhpc3RpbmcgUHJvamVjdHMgaW50byBXb3Jrc3BhY2UiIHRvIGNyZWF0ZSBhIHByb2plY3QgYXQgdGhpcyBsb2NhdGlvbiBvciBkZWxldGUgdGhlIGNvbnRlbnRzIG9mIHswfSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLTMzPUEgbW9kZWwgaW5zdGFuY2UgbWF5IG9ubHkgYmUgbmVzdGVkIG9uY2UgdW5kZXIgYW5vdGhlciBtb2RlbCBpbnN0YW5jZS4KLTM0PU1vZHVsZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLTM1PUludmFsaWQgY2hhcmFjdGVycy4KLTM2PVRoZSBtb2R1bGUgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0zNz1UaGUgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzZXJ2ZXIuCi0zOD1Nb2R1bGUgbmFtZSBpcyBpbnZhbGlkLgotMzk9RW50ZXIgU291cmNlIEZvbGRlcgotNDA9RW50ZXIgV2ViIGNvbnRlbnQgRm9sZGVyCi00MT1Qcm9qZWN0IG5hbWVzIGNhbm5vdCBlbmQgd2l0aCB3aGl0ZSBzcGFjZS4KLTQyPVJlc291cmNlIGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgY2FzZS4KLTQzPUEgcHJvamVjdCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoaXMgbmFtZS4KLTQ0PTxOb25lPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlMDI1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkNjhjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAzOjEyOjQyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzc0ZTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMzoxMjozNiBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkN2MyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL1NuaXBwZXRzQ29udGV4dHMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvU25pcHBldHNDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjBjNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvU25pcHBldHNDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImxpYnYxMDAwIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB2aWV3IHRvIGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIG1hcmt1cCwgYWxvbmcgd2l0aCBjdXN0b20gdGFncywgdGhhdCBjYW4gYmUgZW1iZWRkZWQgaW4gZXhpc3RpbmcgZmlsZXMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImxpYnYxMTAwIj4KLTxkZXNjcmlwdGlvbj5TdXBwbHkgdmFsdWVzIGluIHRoaXMgZGlhbG9nIHRvIGRlZmluZSB0aGUgU25pcHBldHMgdmlldyBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBBc3NpZ24gYSB2YWx1ZSB0byB0aGUgdmFyaWFibGVzIGJlaW5nIGluc2VydGVkLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iSW5zZXJ0aW5nIGFuZCBlZGl0aW5nIGl0ZW1zIGluIHRoZSBhY3RpdmUgZWRpdG9yIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJsaWJ2MTIwMCI+Ci08ZGVzY3JpcHRpb24+SW4gdGhlIDxiPk5hbWU8L2I+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgYXMgeW91IHdhbnQgaXQgYmUgZGlzcGxheWVkIGluIHRoZSBTbmlwcGV0cyB2aWV3LiAgT3B0aW9uYWxseSwgYWRkIGEgZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBpbiB0aGUgPGI+RGVzY3JpcHRpb248L2I+IGZpZWxkLgotCi1TZWxlY3QgdGhlIDxiPkhpZGU8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoaXMgc25pcHBldCBvYmplY3Qgbm90IHZpc2libGUgaW4gdGhlIHZpZXcuCi0KLVRvIGFkZCBhIG5ldyB2YXJpYWJsZSwgY2xpY2sgdGhlIDxiPk5ldzwvYj4gcHVzaCBidXR0b24sIGFuZCB0eXBlIHZhbHVlcyBpbiB0aGUgY2VsbHMgb2YgdGhlIDxiPlZhcmlhYmxlczwvYj4gdGFibGUuIFRoZSA8Yj5OYW1lPC9iPiBmaWVsZCByZXByZXNlbnRzIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCB3aGVuIHlvdSBhZGQgaXQgdG8gYSBkb2N1bWVudC4gPGI+RGVmYXVsdCB2YWx1ZTwvYj4gaXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIG5hbWVkIHZhcmlhYmxlLiBPcHRpb25hbGx5LCBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaWFibGUuCi0KLUluc2VydCB0aGUgdmFyaWFibGVzIHRoYXQgeW91IGRlZmluZSBpbnRvIHRoZSA8Yj5UZW1wbGF0ZSBQYXR0ZXJuPC9iPiBmaWVsZCB1c2luZyB0aGUgPGI+SW5zZXJ0IFZhcmlhYmxlIFBsYWNlaG9sZGVyPC9iPiBwdXNoIGJ1dHRvbi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImxpYnYxMzAwIj4KLTxkZXNjcmlwdGlvbj5UeXBlIHRoZSBuYW1lIG9mIHRoZSBuZXcgY2F0ZWdvcnkgaW4gdGhlIDxiPk5hbWU8L2I+IGZpZWxkIGFuZCBvcHRpb25hbGx5IGFkZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXRlZ29yeSBpbiB0aGUgPGI+RGVzY3JpcHRpb248L2I+IGZpZWxkLgotCi1TZWxlY3QgPGI+T3BlbiBkcmF3ZXIgYXQgc3RhcnQtdXA8L2I+IHRvIGhhdmUgdGhlIGNhdGVnb3J5IGRyYXdlciBvcGVuZWQgaW4gdGhlIFNuaXBwZXRzIHZpZXcgd2hlbiB0aGUgd29ya2JlbmNoIHN0YXJ0cyB1cC4KLQotWW91IGNhbiBzcGVjaWZ5IGhvdyB5b3Ugd2FudCB0aGUgY2F0ZWdvcnkgZHJhd2VyIGRpc3BsYXllZCBpbiB0aGUgU25pcHBldHMgdmlldyBieSBzZWxlY3RpbmcgYSByYWRpbyBidXR0b24gZm9yIHRoZSA8Yj5TaG93L0hpZGUgRHJhd2VyPC9iPiBmaWVsZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDEwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+SW1wb3J0PC9iPiBkaWFsb2csIHdoaWNoIGxldHMgeW91IGltcG9ydCBzbmlwcGV0IGNhdGVnb3JpZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwMjAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5FeHBvcnQ8L2I+IGRpYWxvZywgd2hpY2ggbGV0cyB5b3UgZXhwb3J0IHNuaXBwZXQgY2F0ZWdvcmllcyB0byB0aGUgZmlsZSBzeXN0ZW0uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwMzAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgY29udGVudCB0eXBlcyB0aGF0IHNob3VsZCBiZSB2aXNpYmxlIGluIHRoaXMgZHJhd2VyIGZvciBpbiB0aGUgU25pcHBldHMgdmlldy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDQwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIG1lbnUgaXRlbSBhZGRzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBTbmlwcGV0cyB2aWV3IGFzIGEgbmV3IGl0ZW0uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwNTAiPgotPGRlc2NyaXB0aW9uPlRoaXMgbWVudSBpdGVtIGN1dHMgdGhlIHNlbGVjdGVkIFNuaXBwZXQgaXRlbSB0byB0aGUgY2xpcGJvYXJkLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJzbmlwMDA2MCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBtZW51IGl0ZW0gY29waWVzIHRoZSBzZWxlY3RlZCBTbmlwcGV0IGl0ZW0gdG8gdGhlIGNsaXBib2FyZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwNzAiPgotPGRlc2NyaXB0aW9uPlRoaXMgbWVudSBpdGVtIGNyZWF0ZXMgYSBuZXcgU25pcHBldHMgdmlldyBpdGVtIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ic25pcDAwODAiPgotPGRlc2NyaXB0aW9uPlR5cGUgYSBuYW1lIGZvciB0aGUgY2F0ZWdvcnkuIFRoZSBjYXRlZ29yeSBhcHBlYXJzIGluIHRoZSBDdXN0b21pemUgUGFsZXR0ZSBkaWFsb2cgYm94LiBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgYSBjYXRlZ29yeSwgeW91IGNhbiBhZGQgaXRlbXMgdG8gdGhlIGNhdGVnb3J5LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQzZGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBTbmlwcGV0c0NvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjAyNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AKLUJ1bmRsZS1OYW1lLjAgPSBDb21tb24gV1NUIGluZm9wb3BzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWUxNzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iU25pcHBldHNDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM1ZTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3N2VhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDgyZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotI0ZyaSBTZXAgMTEgMTc6MTM6MDggUERUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzYTU5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5Nb2R1bGVDb3JlVUlQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMjAwLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi41LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmVkNWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5BdWd1c3QsIDIwMDk8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDc4N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2ljb25zL2ZvbGRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9pY29ucy9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFiMjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2ljb25zL2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9pY29ucy9qYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2ljb25zL2phcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzMxNWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2ljb25zL2phcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvaWNvbnMvcHJqX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9pY29ucy9wcmpfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlYTU4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9pY29ucy9wcmpfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhY2NhZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyPUVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gTW9kdWxlY29yZSBVSSBQbHVnLWluCi1Nb2R1bGVfYXNzZW1ibHkubmFtZSA9IE1vZHVsZSBBc3NlbWJseQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzEzZTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZHVsZURlcGVuZGVuY3lQcm9wZXJ0eVBhZ2UiIG5hbWU9Im1vZHVsZURlcGVuZGVuY3lQcm9wZXJ0eVBhZ2UiIHNjaGVtYT0ic2NoZW1hL21vZHVsZURlcGVuZGVuY3lQcm9wZXJ0eVBhZ2UuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQiIG5hbWU9InJlZmVyZW5jZVdpemFyZEZyYWdtZW50IiBzY2hlbWE9InNjaGVtYS9yZWZlcmVuY2VXaXphcmRGcmFnbWVudC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlciIgbmFtZT0idmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIiIHNjaGVtYT0ic2NoZW1hL3ZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyLmV4c2QiLz4KLSAgIDwhLS0gPT09PT09PT09PT0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY3lQYWdlID09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotIAk8cGFnZQotICAgICAgCQluYW1lPSIlTW9kdWxlX2Fzc2VtYmx5Lm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5Nb2R1bGVBc3NlbWJseVJvb3RQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5KMkVFRGVwZW5kZW5jaWVzUGFnZSI+Ci0gICAgICAgICAgIDxlbmFibGVkV2hlbj4KLQkJCQk8YWRhcHQKLQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQk8dGVzdAotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2plY3ROYXR1cmUiCi0gICAgICAgICAgCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSIvPgotCQkJCTwvYWRhcHQ+Ci0gICAgICAgICA8L2VuYWJsZWRXaGVuPiAgICAgICAgICAKLSAgICAgIDwvcGFnZT4KLSAgICAgIDwvZXh0ZW5zaW9uPgotCi0KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS5yZWZlcmVuY2VXaXphcmRGcmFnbWVudCI+Ci0gICAgICAgPHJlZmVyZW5jZUZyYWdtZW50Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50IgotICAgICAgICAgICAgIGljb249Imljb25zL3Byal9vYmouZ2lmIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkubmV3UHJvamVjdFJlZmVyZW5jZSIKLSAgICAgICAgICAgICBuYW1lPSJQcm9qZWN0Ij4KLSAgICAgICA8L3JlZmVyZW5jZUZyYWdtZW50PgotICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zY2hlbWEvbW9kdWxlRGVwZW5kZW5jeVByb3BlcnR5UGFnZS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc2NoZW1hL21vZHVsZURlcGVuZGVuY3lQcm9wZXJ0eVBhZ2UuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2MmE2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zY2hlbWEvbW9kdWxlRGVwZW5kZW5jeVByb3BlcnR5UGFnZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkiIGlkPSJtb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlIiBuYW1lPSJtb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXBlbmRlbmN5UGFnZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXBlbmRlbmN5UGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS9yZWZlcmVuY2VXaXphcmRGcmFnbWVudC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc2NoZW1hL3JlZmVyZW5jZVdpemFyZEZyYWdtZW50LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTJkYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc2NoZW1hL3JlZmVyZW5jZVdpemFyZEZyYWdtZW50LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aSIgaWQ9InJlZmVyZW5jZVdpemFyZEZyYWdtZW50IiBuYW1lPSJyZWZlcmVuY2VXaXphcmRGcmFnbWVudCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgaW50ZXJuYWw9InRydWUiIC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlZmVyZW5jZUZyYWdtZW50Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlZmVyZW5jZUZyYWdtZW50Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgVUksIGluc2lkZSB0aGUgdmlld2VyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5XaXphcmRGcmFnbWVudDoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoaWRkZW4iIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRydWUgaWYgdGhpcyByZWZlcmVuY2UgdHlwZSBzaG91bGQgYmUgaGlkZGVuIGFuZCBOT1QgZXhwb3NlZCBhcyBhIHBvc3NpYmxlIHJlZmVyZW5jZSBmb3IgYWxsIHZpcnR1YWwgY29tcG9uZW50cywgZmFsc2UgaWYgaXQgd2lsbCBiZSBoaWRkZW4gYW5kIGFkZGVkIG1hbnVhbGx5IHRvIHJlbGV2YW50IGNvbXBvbmVudHMmYXBvczsgcmVmZXJlbmNlIHdpemFyZHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zY2hlbWEvdmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS92aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q4N2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS92aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkiIGlkPSJ2aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlciIgbmFtZT0idmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5JVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWlnaHQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvVGFza01vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvVGFza01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjEwMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Rhc2tNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0vKioKLSAqIEEgdGFzayBtb2RlbCByZXByZXNlbnRzIGEgbW9kZWwgdGhhdCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUKLSAqIHRhc2tzIGluIGEgY29tbW9uIHdvcmtmbG93LgotICogPHA+Ci0gKiBUaGUgdGFzayBtb2RlbCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3ZlcmFsbCB0YXNrIGZsb3cgYW5kIGFsbG93cwotICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgdGFza3MgdG8gYmUKLSAqIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSB0YXNrIHRvIHRoZSBpbnB1dAotICogb2YgYW5vdGhlci4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza01vZGVsIHsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBpbiB0aGUgdGFzayBtb2RlbCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgaWQgY2FuIGJlIGFueSBvZiB0aGUgcHJlZGVmaW5lZCBpZHMgd2l0aGluIFRhc2tNb2RlbCwgb3IKLQkgKiBhbnkgb3RoZXIga2V5IHRvIHJldHJpZXZlIHRhc2stc3BlY2lmaWMgZGF0YS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkIGZvciB0aGUgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIGlmIG5vIG9iamVjdCBjb3VsZCBiZSBmb3VuZCB3aXRoIHRoYXQgaWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYXAuZ2V0KGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHV0IGFuIG9iamVjdCBpbnRvIHRoZSB0YXNrIG1vZGVsIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqIDxwPgotCSAqIFRoZSBpZCBjYW4gYmUgYW55IG9mIHRoZSBwcmVkZWZpbmVkIGlkcyB3aXRoaW4gVGFza01vZGVsLCBvcgotCSAqIGFueSBvdGhlciBrZXkgdG8gc3RvcmUgdGFzay1zcGVjaWZpYyBkYXRhLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NvY2lhdGUgdGhlIG9iamVjdCB3aXRoCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlc2V0IChjbGVhcikgdGhlIGlkCi0JICovCi0JcHVibGljIHZvaWQgcHV0T2JqZWN0KFN0cmluZyBpZCwgT2JqZWN0IG9iaikgewotCQltYXAucHV0KGlkLCBvYmopOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjYzRmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZHVsZUFzc2VtYmx5Um9vdFBhZ2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2R1bGVBc3NlbWJseTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvckNoZWNraW5nRmFjZXRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yTm90VmlydHVhbENvbXBvbmVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXBsb3lQYXRoQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvdXJjZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbExpYkphcldhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkRm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEZvbGRlckVsaXBzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkRm9sZGVyTWFwcGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUmVmZXJlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRSZWZlcmVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZXJuYWxKYXJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEphckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdSZWZlcmVuY2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdSZWZlcmVuY2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdSZWZlcmVuY2VXaXphcmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdFJlZmVyZW5jZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RSZWZlcmVuY2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVJlZmVyZW5jZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlUmVmZXJlbmNlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkRXJyb3I7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9Nb2R1bGVDb3JlVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvTW9kdWxlQ29yZVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYzkyMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9Nb2R1bGVDb3JlVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElDT05fRElSUyA9IG5ldyBTdHJpbmdbXXsiaWNvbnMvZnVsbC9vYmoxNiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zL2Z1bGwvY3ZpZXcxNiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zL2Z1bGwvY3Rvb2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zL2Z1bGwvY2xjbDE2IiwgLy8kTk9OLU5MUy0xJAotCQkiaWNvbnMvZnVsbC9vdnIxNiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zL2Z1bGwvZXh0cmEiLCAvLyROT04tTkxTLTEkCi0JCSJpY29ucy9mdWxsL3dpemJhbiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zIiwgLy8kTk9OLU5MUy0xJAotCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBNb2R1bGVDb3JlVUlQbHVnaW4gcGx1Z2luOwotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlQ29yZVVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmVyVUlQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZUNvcmVVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgLmdpZiBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWltYWdlID0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaW1hZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXksZ2V0QnVuZGxlKCkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXksIEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIGdpZiA9ICIvIiArIGtleSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElDT05fRElSUy5sZW5ndGg7IGkrKykgewotCQkJcGF0aCA9IG5ldyBQYXRoKElDT05fRElSU1tpXSkuYXBwZW5kKGdpZik7Ci0JCQlpZiAoUGxhdGZvcm0uZmluZChidW5kbGUscGF0aCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwoIGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZUNvcmVVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpIHsKLQkJbG9nKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgbWVzc2FnZSwgZSk7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggZXhjZXB0aW9uLmdldFN0YXR1cygpICk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzYzOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aTsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBJTkZPID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV0FSTklORyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFVkVSRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVTVCA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVSID0gNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEVSRk9STUFOQ0UgPSA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFWFRFTlNJT05fUE9JTlQgPSA3OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV2ZWxOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJDT05GSUcgIiwgIklORk8gICAiLCAiV0FSTklORyIsICJTRVZFUkUgIiwgIkZJTkVSICAiLCAiRklORVNUICIsICJQRVJGICAgIiwgIkVYVEVOU0lPTiJ9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQvTU0veXkgSEg6bW0uc3MuU1NTIik7Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBsb2dnZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgYSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQl0cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobGV2ZWwgPT0gU0VWRVJFKSB7Ci0JCQlpZiAoIWxvZ2dlZC5jb250YWlucyhzKSkgewotCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZygKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgCi0JCQkJCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCQlsb2dnZWQuYWRkKHMpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIU1vZHVsZUNvcmVVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKE1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKGxldmVsTmFtZXNbbGV2ZWxdKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzZGYuZm9ybWF0KG5ldyBEYXRlKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvQWRkRm9sZGVyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9BZGRGb2xkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzMDdiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9BZGRGb2xkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQWRkRm9sZGVyRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIElDb250YWluZXIgc2VsZWN0ZWQgPSBudWxsOwotCXB1YmxpYyBBZGRGb2xkZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOyAgICAgICAgCi0gICAgICAgIHNldFNoZWxsU3R5bGUoIGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUgKTsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCQotCQlzaGVsbC5zZXRCb3VuZHMoc2hlbGwuZ2V0TG9jYXRpb24oKS54LCBzaGVsbC5nZXRMb2NhdGlvbigpLnksIDQwMCwzMDApOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCXBhcmVudC5nZXRTaGVsbCgpLnNldFRleHQoTWVzc2FnZXMuQWRkRm9sZGVyKTsKLQkJc2V0VGl0bGUoTWVzc2FnZXMuQWRkRm9sZGVyKTsKLQkgICAgc2V0TWVzc2FnZShNZXNzYWdlcy5BZGRGb2xkZXJNYXBwaW5ncyk7Ci0JICAgIC8vc2V0VGl0bGVJbWFnZSggICk7Ci0JCXRoaXMudmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoYywgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLmFkZEZpbHRlcihnZXRGaWx0ZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChwcm9qZWN0KTsKLQkJdmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGdldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IGZpcnN0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmKCBmaXJzdCBpbnN0YW5jZW9mIElDb250YWluZXIpIAotCQkJCQlzZWxlY3RlZCA9IChJQ29udGFpbmVyKWZpcnN0OwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsCi0JCQkJCU9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQkJCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gcHJvamVjdC5tZW1iZXJzKCk7Ci0JCQkJfSBjYXRjaCggQ29yZUV4Y2VwdGlvbiBjZSApIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt9OwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiAoKElDb250YWluZXIpZWxlbWVudCkubWVtYmVycygpLmxlbmd0aCA+IDA7Ci0JCQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJCQlyZXR1cm4gKChJUmVzb3VyY2UpZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCWlmKCBwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuICgoSUNvbnRhaW5lcilwYXJlbnRFbGVtZW50KS5tZW1iZXJzKCk7Ci0JCQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt9OwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQkJCXJldHVybiAoKElSZXNvdXJjZSllbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9Db21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9Db21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZmI1ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1vZHVsZUNvcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLkFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuQ29tcG9uZW50UmVzb3VyY2VQcm94eTsKLQotCi0vKgotICogIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnRzIHRoaXMgY29udGVudCBwcm92aWRlciAoc2hvdWxkKSBwcm92aWRlCi0gKiAgYXJlIElQcm9qZWN0IG9yIElWaXJ0dWFsQ29tcG9uZW50IG9iamVjdHMuIFRoZSBydW50aW1lIHBhdGhzIHBvcnRpb24gaXMgCi0gKiAgc2hhcmVkIHdpdGggdGhlIHByZWZlcmVuY2UgcGFnZSBpdHNlbGYgd2hlcmUgdGhleSBjYW4gYm90aCBtb2RpZnkgdGhlIGRhdGEuIAotICogCi0gKiBUaGlzIHByb3ZpZGVyIG5vIGxvbmdlciAibWVkZGxlcyIgaW4gdG8gdGhlIGNvbnRlbnQgYXMgaXQgdXNlZCB0bywgCi0gKiBidXQgcmF0aGVyIHNlcnZlcyBhcyBvbmx5IGEgdmlldyBvZiBpdC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBBVEhfU0VQQVJBVE9SID0gU3RyaW5nLnZhbHVlT2YoSVBhdGguU0VQQVJBVE9SKTsKLQkKLQlwcml2YXRlIEhhc2hNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4gcnVudGltZVBhdGhzOwotCXByaXZhdGUgQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlUHJveHk+IHJlc291cmNlTWFwcGluZ3M7Ci0JcHJpdmF0ZSBEZWNvcmF0aW5nTGFiZWxQcm92aWRlciBkZWNQcm92aWRlciA9IG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcigKLQkgICAgICAgICAgICAgICAgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS4KLQkgICAgICAgICAgICAgICAgIGdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKTsKLQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlcltdIGRlbGVnYXRlczsKLQlwdWJsaWMgQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlcihBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZSBhZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZSkgewotCQlzdXBlcigpOwotCQlkZWNQcm92aWRlci5hZGRMaXN0ZW5lcihhZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZSk7Ci0JCWRlbGVnYXRlcyA9IERlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5sb2FkRGVsZWdhdGVzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVBhdGhzKEhhc2hNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4gcGF0aHMpIHsKLQkJdGhpcy5ydW50aW1lUGF0aHMgPSBwYXRoczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hcHBpbmdzKEFycmF5TGlzdDxDb21wb25lbnRSZXNvdXJjZVByb3h5PiBtYXBwaW5ncykgewotCQl0aGlzLnJlc291cmNlTWFwcGluZ3MgPSBtYXBwaW5nczsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJT2JqZWN0W10gZW1wdHkgPSBuZXcgT2JqZWN0WzBdOwotCQlpZiggIShpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkpCi0JCQlyZXR1cm4gZW1wdHk7Ci0JCUFycmF5TGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJbGlzdC5hZGRBbGwocmVzb3VyY2VNYXBwaW5ncyk7Ci0JCWxpc3QuYWRkQWxsKHJ1bnRpbWVQYXRocy5rZXlTZXQoKSk7Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRSZXNvdXJjZVByb3h5KSB7Ci0JCQlyZXR1cm4gTW9kdWxlQ29yZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImZvbGRlciIpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJCXJldHVybiBNb2R1bGVDb3JlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiamFyX29iaiIpOwotCQkJZWxzZQotCQkJCXJldHVybiBoYW5kbGVTb3VyY2VJbWFnZSgoSVZpcnR1YWxDb21wb25lbnQpZWxlbWVudCk7Ci0JCX0gCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpewotCQkJcmV0dXJuIGRlY1Byb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSkgewotCQkJaWYoIGNvbHVtbkluZGV4ID09IDAgKSAKLQkJCQlyZXR1cm4gKChDb21wb25lbnRSZXNvdXJjZVByb3h5KWVsZW1lbnQpLnJ1bnRpbWVQYXRoLnRvU3RyaW5nKCk7Ci0JCQllbHNlIGlmKCBjb2x1bW5JbmRleCA9PSAxICkgCi0JCQkJcmV0dXJuICgoQ29tcG9uZW50UmVzb3VyY2VQcm94eSllbGVtZW50KS5zb3VyY2UudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWVsZW1lbnQ7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCWlmKCBydW50aW1lUGF0aHMgPT0gbnVsbCB8fCBydW50aW1lUGF0aHMuZ2V0KGVsZW1lbnQpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBQYXRoKFBBVEhfU0VQQVJBVE9SKS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gcnVudGltZVBhdGhzLmdldChlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCXJldHVybiBoYW5kbGVTb3VyY2VUZXh0KGNvbXApOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCl7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCWlmKCBydW50aW1lUGF0aHMgPT0gbnVsbCB8fCBydW50aW1lUGF0aHMuZ2V0KGVsZW1lbnQpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBQYXRoKFBBVEhfU0VQQVJBVE9SKS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gcnVudGltZVBhdGhzLmdldChlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiAoKElQcm9qZWN0KWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBoYW5kbGVTb3VyY2VUZXh0KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlpZiggZGVsZWdhdGVzICE9IG51bGwgKSB7Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5sZW5ndGg7IGkrKyApCi0JCQkJaWYoIGRlbGVnYXRlc1tpXS5jYW5IYW5kbGUoY29tcG9uZW50KSkKLQkJCQkJcmV0dXJuIGRlbGVnYXRlc1tpXS5nZXRTb3VyY2VUZXh0KGNvbXBvbmVudCk7Ci0JCX0KLQkJCi0JCS8vIGRlZmF1bHQgaW1wbAotCQlpZiggY29tcG9uZW50LmlzQmluYXJ5KCkgJiYgY29tcG9uZW50IGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCUlQYXRoIHAgPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCQlpZiggcCA9PSBudWxsICkKLQkJCQlwID0gbmV3IFBhdGgoKChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCljb21wb25lbnQpLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXJldHVybiBwLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgaGFuZGxlU291cmNlSW1hZ2UoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmKCBkZWxlZ2F0ZXMgIT0gbnVsbCApIHsKLQkJCWZvciggaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVzLmxlbmd0aDsgaSsrICkKLQkJCQlpZiggZGVsZWdhdGVzW2ldLmNhbkhhbmRsZShjb21wb25lbnQpKQotCQkJCQlyZXR1cm4gZGVsZWdhdGVzW2ldLmdldFNvdXJjZUltYWdlKGNvbXBvbmVudCk7Ci0JCX0KLQkJCi0JCS8vIGRlZmF1bHQgaW1wbAotCQlpZihjb21wb25lbnQuaXNCaW5hcnkoKSkKLQkJCXJldHVybiBNb2R1bGVDb3JlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiamFyX29iaiIpOwotCQllbHNlIHJldHVybiBkZWNQcm92aWRlci5nZXRJbWFnZShjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9EZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0RlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzIwZGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0RlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5Nb2R1bGVDb3JlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JRGVwZW5kZW5jeVBhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIERlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlciBtYW5hZ2VyID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIERlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiggbWFuYWdlciA9PSBudWxsICkKLQkJCW1hbmFnZXIgPSBuZXcgRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyKCk7Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQkKLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBJRGVwZW5kZW5jeVBhZ2VQcm92aWRlcj4gcHJvdmlkZXJzID0gbnVsbDsKLQkKLQlwdWJsaWMgSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIgZ2V0UHJvdmlkZXIoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYoIHByb3ZpZGVycyA9PSBudWxsICkKLQkJCWxvYWRQcm92aWRlcnMoKTsKLQkJSXRlcmF0b3I8SURlcGVuZGVuY3lQYWdlUHJvdmlkZXI+IGkgPSBwcm92aWRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIgdGVtcDsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCXRlbXAgPSBpLm5leHQoKTsKLQkJCWlmKCB0ZW1wLmNhbkhhbmRsZShwcm9qZWN0KSkKLQkJCQlyZXR1cm4gdGVtcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcm92aWRlcnMoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBJRGVwZW5kZW5jeVBhZ2VQcm92aWRlcj4gdGVtcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSURlcGVuZGVuY3lQYWdlUHJvdmlkZXI+KCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsICJtb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBjZi5sZW5ndGg7IGkrKyApIHsKLQkJCXRyeSB7Ci0JCQkJdGVtcC5wdXQoY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCAgLy8kTk9OLU5MUy0xJAotCQkJCQkoSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIpY2ZbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKSk7ICAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlICkge30KLQkJfQotCQlwcm92aWRlcnMgPSB0ZW1wOwotCX0KLQkKLQlwdWJsaWMgV2l6YXJkRnJhZ21lbnRbXSBsb2FkQWxsUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnRzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLQkJCQlNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lELCAicmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFdpemFyZEZyYWdtZW50PigpOwotCQlmb3IoIGludCBpID0gMDsgaSA8IGNmLmxlbmd0aDsgaSsrICkgewotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZCgoV2l6YXJkRnJhZ21lbnQpY2ZbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKSk7Ci0JCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlKSB7fQotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IFdpemFyZEZyYWdtZW50W2xpc3Quc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyBXaXphcmRGcmFnbWVudCBsb2FkUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQoU3RyaW5nIGlkKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsICJyZWZlcmVuY2VXaXphcmRGcmFnbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCWZvciggaW50IGkgPSAwOyBpIDwgY2YubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiggY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLmVxdWFscyhpZCkpIC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gKFdpemFyZEZyYWdtZW50KWNmW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlKSB7fQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgUmVmZXJlbmNlRXh0ZW5zaW9uW10gZ2V0RXhwb3NlZFJlZmVyZW5jZUV4dGVuc2lvbnMoKSB7Ci0JCUFycmF5TGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jZUV4dGVuc2lvbj4oKTsKLQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRBbGxSZWZlcmVuY2VFeHRlbnNpb25zKCkpKTsKLQkJZm9yKEl0ZXJhdG9yPFJlZmVyZW5jZUV4dGVuc2lvbj4gaSA9IGxpc3QuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspIHsKLQkJCWlmKGkubmV4dCgpLmlzSGlkZGVuKCkpCi0JCQkJaS5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBSZWZlcmVuY2VFeHRlbnNpb25bbGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIFJlZmVyZW5jZUV4dGVuc2lvbltdIGdldEFsbFJlZmVyZW5jZUV4dGVuc2lvbnMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsICJyZWZlcmVuY2VXaXphcmRGcmFnbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5TGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jZUV4dGVuc2lvbj4oKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBjZi5sZW5ndGg7IGkrKyApIHsKLQkJCWxpc3QuYWRkKG5ldyBSZWZlcmVuY2VFeHRlbnNpb24oY2ZbaV0pKTsKLQkJfQotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBSZWZlcmVuY2VFeHRlbnNpb25bbGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIFJlZmVyZW5jZUV4dGVuc2lvbiBmaW5kUmVmZXJlbmNlRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLQkJCQlNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lELCAicmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUxpc3Q8UmVmZXJlbmNlRXh0ZW5zaW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+KCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgY2YubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZihjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikuZXF1YWxzKGlkKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgUmVmZXJlbmNlRXh0ZW5zaW9uKGNmW2ldKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIFJlZmVyZW5jZUV4dGVuc2lvbiB7Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JCXByaXZhdGUgU3RyaW5nIGlkLCBuYW1lLCBpbWFnZUxvYzsKLQkJcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQkJcHJpdmF0ZSBib29sZWFuIGhpZGRlbjsKLQkJcHVibGljIFJlZmVyZW5jZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCXRoaXMuaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5uYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5pbWFnZUxvYyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpY29uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuaGlkZGVuID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhpZGRlbiIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgeyByZXR1cm4gdGhpcy5pZDt9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIHRoaXMubmFtZTsgfQotCQlwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbigpIHsgcmV0dXJuIHRoaXMuaGlkZGVuOyB9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsgCi0JCQlpZiggaW1hZ2UgPT0gbnVsbCApIHsKLQkJCQlpZiggaW1hZ2VMb2MgIT0gbnVsbCAmJiBlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwgaW1hZ2VMb2MpOwotCQkJCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZUltYWdlKCkgewotCQkJaWYoIGltYWdlICE9IG51bGwgKSB7Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCWltYWdlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlcltdIGxvYWREZWxlZ2F0ZXMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsICJ2aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlciIpOyAvLyROT04tTkxTLTEkCi0JCUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBsaXN0ID0gQXJyYXlzLmFzTGlzdChjZik7Ci0JCUNvbXBhcmF0b3IgYyA9IG5ldyBDb21wYXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IG8xLAotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgbzIpIHsKLQkJCQlTdHJpbmcgbzFTdHJpbmcsIG8yU3RyaW5nOwotCQkJCWludCBvMWludCwgbzJpbnQ7Ci0JCQkJbzFTdHJpbmc9bzEuZ2V0QXR0cmlidXRlKCJ3ZWlnaHQiKTsKLQkJCQlvMlN0cmluZz1vMi5nZXRBdHRyaWJ1dGUoIndlaWdodCIpOwotCQkJCW8xaW50ID0gSW50ZWdlci5wYXJzZUludChvMVN0cmluZyk7Ci0JCQkJbzJpbnQgPSBJbnRlZ2VyLnBhcnNlSW50KG8xU3RyaW5nKTsKLQkJCQlyZXR1cm4gbzFpbnQtbzJpbnQ7Ci0JCQl9Ci0JCX07Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgYyk7Ci0JCUFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXI+IHJldExpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlcj4oKTsKLQkJSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBpID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXRMaXN0LmFkZCgoSVZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyKWkubmV4dCgpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIikpOwotCQkJfSBjYXRjaCggQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vIGxvZwotCQkJfQotCQl9Ci0JCXJldHVybiByZXRMaXN0LnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlcltyZXRMaXN0LnNpemUoKV0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvSVJlZmVyZW5jZUVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvSVJlZmVyZW5jZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ0NGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0lSZWZlcmVuY2VFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogV2l6YXJkRnJhZ21lbnRzIHRoYXQgYXJlIHByb3ZpZGluZyByZWZlcmVuY2Ugd2l6YXJkIGV4dGVuc2lvbnMKLSAqIG1heSBhbHNvIGltcGxlbWVudCBJUmVmZXJlbmNlRWRpdG9yIHRvIHNob3cgdGhhdCB0aGlzIHBhcnRpY3VsYXIKLSAqIGZyYWdtZW50IG1heSBiZSBhYmxlIHRvIGVkaXQgY29tcG9uZW50cyBpdCBoYXMgY3JlYXRlZC4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZmVyZW5jZUVkaXRvciB7Ci0JCi0JLyoqCi0JICogVGhlIHdpemFyZCBmcmFnbWVudCB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgCi0JICogYW5kIGlzIGFibGUgdG8gZWRpdCB0aGUgcHJvdmlkZWQgdmlydHVhbCBjb21wb25lbnQgaXMgZXhwZWN0ZWQgCi0JICogdG8gY2FjaGUgdGhpcyB2aXJ0dWFsIGNvbXBvbmVudCBhdCB0aGUgdGltZSBjYW5FZGl0KGV0YykgaXMgY2FsbGVkCi0JICogCi0JICogQHBhcmFtIHZjCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVkaXQoSVZpcnR1YWxDb21wb25lbnQgdmMpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvSVZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9JVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0NGQyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9JVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlciB7Ci0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCk7Ci0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VUZXh0KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCk7Ci0JcHVibGljIEltYWdlIGdldFNvdXJjZUltYWdlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9OZXdSZWZlcmVuY2VSb290V2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL05ld1JlZmVyZW5jZVJvb3RXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWUxMGRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL05ld1JlZmVyZW5jZVJvb3RXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5EZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuUmVmZXJlbmNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBOZXdSZWZlcmVuY2VSb290V2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50PiBmcmFnbWVudE1hcCA9IAotCQluZXcgSGFzaE1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50PigpOwotCXByaXZhdGUgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIFJlZmVyZW5jZUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBudWxsOwotCXB1YmxpYyBOZXdSZWZlcmVuY2VSb290V2l6YXJkRnJhZ21lbnQoUmVmZXJlbmNlRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucykgewotCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zICE9IG51bGwgPyBleHRlbnNpb25zIDoKLQkJCQlEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEV4cG9zZWRSZWZlcmVuY2VFeHRlbnNpb25zKCk7Ci0JCWlmKCB0aGlzLmV4dGVuc2lvbnMubGVuZ3RoID09IDAgKQotCQkJc2V0Q29tcGxldGUoZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMuTmV3UmVmZXJlbmNlVGl0bGUpOwotCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuTmV3UmVmZXJlbmNlRGVzY3JpcHRpb24pOwotCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWMuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdmlld2VyU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmlld2VyU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV2l6YXJkRnJhZ21lbnQgZ2V0V2l6YXJkRnJhZ21lbnQoU3RyaW5nIGV4dGVuc2lvblBvaW50SUQpIHsKLQkJdHJ5IHsKLQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gZnJhZ21lbnRNYXAuZ2V0KGV4dGVuc2lvblBvaW50SUQpOwotCQkJaWYgKGZyYWdtZW50ICE9IG51bGwpCi0JCQkJcmV0dXJuIGZyYWdtZW50OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJCi0JCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5sb2FkUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQoZXh0ZW5zaW9uUG9pbnRJRCk7Ci0JCWlmIChmcmFnbWVudCAhPSBudWxsKQotCQkJZnJhZ21lbnRNYXAucHV0KGV4dGVuc2lvblBvaW50SUQsIGZyYWdtZW50KTsKLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQlMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0SW1wbCA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+KCk7Ci0JCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKLQkJcmV0dXJuIGxpc3RJbXBsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJLy8gSW5zdGFudGlhdGUgYW5kIGFkZCB0aGUgZnJhZ21lbnQgZm9yIHRoZSBjdXJyZW50IElECi0JCWlmKCB2aWV3ZXIgIT0gbnVsbCApIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlSZWZlcmVuY2VFeHRlbnNpb24gc2VsZWN0ZWQgPSAoUmVmZXJlbmNlRXh0ZW5zaW9uKXNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKCBzZWxlY3RlZCAhPSBudWxsICkgewotCQkJCVdpemFyZEZyYWdtZW50IGNoaWxkID0gZ2V0V2l6YXJkRnJhZ21lbnQoc2VsZWN0ZWQuZ2V0SWQoKSk7Ci0JCQkJaWYoIGNoaWxkICE9IG51bGwgKQotCQkJCQlsaXN0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkKLQlwcml2YXRlIExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCWlmKCBsYWJlbFByb3ZpZGVyID09IG51bGwgKSB7Ci0JCQlsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgUmVmZXJlbmNlRXh0ZW5zaW9uKQotCQkJCQkJcmV0dXJuICgoUmVmZXJlbmNlRXh0ZW5zaW9uKWVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBSZWZlcmVuY2VFeHRlbnNpb24pCi0JCQkJCQlyZXR1cm4gKChSZWZlcmVuY2VFeHRlbnNpb24pZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCQlyZXR1cm4gZWxlbWVudCA9PSBudWxsID8gIiIgOiBlbGVtZW50LnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCSAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkgICAgCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCSAgICAJaWYoIGV4dGVuc2lvbnMgIT0gbnVsbCApIHsKLQkJCSAgICAJCWZvciggaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJICAgIAkJCWV4dGVuc2lvbnNbaV0uZGlzcG9zZUltYWdlKCk7Ci0JCQkgICAgCQl9Ci0JCQkgICAgCX0KLQkJCSAgICB9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlpZiggY29udGVudFByb3ZpZGVyID09IG51bGwgKSB7Ci0JCQljb250ZW50UHJvdmlkZXIgPSBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL05ld1JlZmVyZW5jZVdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvTmV3UmVmZXJlbmNlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzIyNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvTmV3UmVmZXJlbmNlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkRlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5SZWZlcmVuY2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuVGFza1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5XaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLklSZWZlcmVuY2VXaXphcmRDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBOZXdSZWZlcmVuY2VXaXphcmQgZXh0ZW5kcyBUYXNrV2l6YXJkIGltcGxlbWVudHMgSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFJFRkVSRU5DRV9GQU1JTFkgPSBuZXcgT2JqZWN0KCk7Ci0JcHVibGljIE5ld1JlZmVyZW5jZVdpemFyZCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JcHVibGljIE5ld1JlZmVyZW5jZVdpemFyZChSZWZlcmVuY2VFeHRlbnNpb25bXSBleHRlbnNpb25zKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLk5ld1JlZmVyZW5jZVdpemFyZCwgbmV3IFJvb3RXaXphcmRGcmFnbWVudChleHRlbnNpb25zKSk7Ci0JCXNldEZpbmlzaEpvYkZhbWlseShSRUZFUkVOQ0VfRkFNSUxZKTsKLQkJZ2V0Um9vdEZyYWdtZW50KCkuc2V0VGFza01vZGVsKGdldFRhc2tNb2RlbCgpKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSb290V2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JCXByaXZhdGUgUmVmZXJlbmNlRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IG51bGw7Ci0JCXB1YmxpYyBSb290V2l6YXJkRnJhZ21lbnQoKSB7fQotCQlwdWJsaWMgUm9vdFdpemFyZEZyYWdtZW50KFJlZmVyZW5jZUV4dGVuc2lvbltdIGV4dGVuc2lvbnMpIHsKLQkJCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KENPTVBPTkVOVCk7Ci0JCQlpZiggY29tcG9uZW50ID09IG51bGwgKQotCQkJCWxpc3QuYWRkKG5ldyBOZXdSZWZlcmVuY2VSb290V2l6YXJkRnJhZ21lbnQoZXh0ZW5zaW9ucykpOwotCQkJZWxzZSB7Ci0JCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBnZXRGaXJzdEVkaXRpbmdGcmFnbWVudChjb21wb25lbnQpOwotCQkJCWlmKCBmcmFnbWVudCAhPSBudWxsICkKLQkJCQkJbGlzdC5hZGQoZnJhZ21lbnQpOwotCQkJfQotCQkJaWYoIGxpc3Quc2l6ZSgpID09IDAgKQotCQkJCXNldENvbXBsZXRlKGZhbHNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2l6YXJkRnJhZ21lbnQgZ2V0Rmlyc3RFZGl0aW5nRnJhZ21lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCVdpemFyZEZyYWdtZW50W10gZnJhZ3MgPSBEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmxvYWRBbGxSZWZlcmVuY2VXaXphcmRGcmFnbWVudHMoKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBmcmFncy5sZW5ndGg7IGkrKyApIHsKLQkJCWlmKCBmcmFnc1tpXSBpbnN0YW5jZW9mIElSZWZlcmVuY2VFZGl0b3IgKSB7Ci0JCQkJaWYoICgoSVJlZmVyZW5jZUVkaXRvcilmcmFnc1tpXSkuY2FuRWRpdChjb21wb25lbnQpKSB7Ci0JCQkJCS8vIGFjY2VwdCBmaXJzdCBvbmUKLQkJCQkJcmV0dXJuIGZyYWdzW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIG5ld1dvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9Qcm9qZWN0UmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL1Byb2plY3RSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmNlMzUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL1Byb2plY3RSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLklNb2R1bGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByaXZhdGUgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIElQcm9qZWN0IHNlbGVjdGVkOwotCQotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJaGFuZGxlLnNldFRpdGxlKE1lc3NhZ2VzLlByb2plY3RSZWZlcmVuY2VUaXRsZSk7Ci0JCWhhbmRsZS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5Qcm9qZWN0UmVmZXJlbmNlRGVzY3JpcHRpb24pOwotCQkKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoYywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2VsQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsQ2hhbmdlZCgpIHsKLQkJaWYoIHZpZXdlciAhPSBudWxsICkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmKCBzZWwgIT0gbnVsbCApIAotCQkJCXNlbGVjdGVkID0gKElQcm9qZWN0KXNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiggIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3Qoc2VsZWN0ZWQpKSB7Ci0JCQl0cnkgewotCQkJCVByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShzZWxlY3RlZC5nZXRQcm9qZWN0KCksIHRydWUsIG1vbml0b3IpOwotCQkJfSBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlZSkgewotCQkJCS8vIFRPRE8gc29tZXRoaW5nCi0JCQl9Ci0JCX0KLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoc2VsZWN0ZWQsIGZhbHNlKTsKLQkJcGF0aCA9IGdldEFyY2hpdmVOYW1lKHNlbGVjdGVkLGNvbXApOwotCQkKLQotCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5DT01QT05FTlQsIGNvbXApOwotCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5DT01QT05FTlRfUEFUSCwgcGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBcmNoaXZlTmFtZShJUHJvamVjdCBwcm9qLCBJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVIYW5kbGVyKCkuZ2V0QXJjaGl2ZU5hbWUocHJvaixjb21wKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgSU1vZHVsZUhhbmRsZXIgZ2V0TW9kdWxlSGFuZGxlcigpIHsKLQkJcmV0dXJuIChJTW9kdWxlSGFuZGxlcilnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5NT0RVTEVIQU5ETEVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiggbGFiZWxQcm92aWRlciA9PSBudWxsICkgewotCQkJbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVCk7Ci0JCQkJfQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICkKLQkJCQkJCXJldHVybiAoKElQcm9qZWN0KWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQkJcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlpZiggY29udGVudFByb3ZpZGVyID09IG51bGwgKSB7Ci0JCQljb250ZW50UHJvdmlkZXIgPSBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJSVByb2plY3Qgcm9vdCA9IChJUHJvamVjdClnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5QUk9KRUNUKTsKLQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQkJQXJyYXlMaXN0PElQcm9qZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oQXJyYXlzLmFzTGlzdChwcm9qZWN0cykpOwotCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlJPT1RfQ09NUE9ORU5UKTsKLQkJCQkJTGlzdCBmaWx0ZXJlZCA9IGdldE1vZHVsZUhhbmRsZXIoKS5nZXRGaWx0ZXJlZFByb2plY3RMaXN0Rm9yQWRkKGNvbXAsIGxpc3QpOwotCQkJCQlyZXR1cm4gZmlsdGVyZWQudG9BcnJheShuZXcgSVByb2plY3RbZmlsdGVyZWQuc2l6ZSgpXSk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9JV2l6YXJkSGFuZGxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvSVdpemFyZEhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTc5Mjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9JV2l6YXJkSGFuZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLS8qKgotICogQSB3aXphcmQgaGFuZGxlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdpemFyZEhhbmRsZSBleHRlbmRzIElNZXNzYWdlUHJvdmlkZXIgewotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHdpemFyZCBlcnJvciBtZXNzYWdlcyBhbmQgYnV0dG9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHRpdGxlIG9mIHRoaXMgd2l6YXJkIHBhZ2UuCi0JICogIAotCSAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgb2YgdGhlIHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKTsKLQotCS8qKgotCSAqIFRoZSBwYWdlJ3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2MgdGhlIHBhZ2UncyBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKTsKLQotCS8qKgotCSAqIFRoZSBwYWdlJ3MgaW1hZ2UgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIHBhZ2UncyBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBpbWFnZSk7Ci0KLQkvKioKLQkgKiBTZXQgYW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdNZXNzYWdlIHRoZSBuZXcgbWVzc2FnZQotCSAqIEBwYXJhbSBuZXdUeXBlIHRoZSBuZXcgdHlwZSwgZnJvbSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpOwotCi0JLyoqCi0JICogRXhlY3V0ZSBhIHJ1bm5hYmxlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgd2l6YXJkLiBUaGlzIHdpbGwgdHlwaWNhbGx5Ci0JICogZGlzYWJsZSB0aGUgd2l6YXJkIHdoaWxlIHRoZSBydW5uYWJsZSBpcyBydW5uaW5nLCBhbmQgcHJvdmlkZSBhIHByb2dyZXNzCi0JICogbW9uaXRvciBmb3IgdGhlIHVzZXIuICAKLQkgKiAKLQkgKiBAcGFyYW0gZm9yayB0cnVlIGlmIGEgc2VwYXJhdGUgdGhyZWFkIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIGNhbmNlbGFibGUgdHJ1ZSBpZiBpdCBzaG91bGQgYmUgY2FuY2VsYWJsZQotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgcnVubmFibGUKLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiBpdCBpcyBpbnRlcnJ1cHRlZAotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9UYXNrV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvVGFza1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGEyNDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9UYXNrV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1vZHVsZUNvcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuVHJhY2U7Ci0KLQotCi0vKioKLSAqIEEgd2l6YXJkIHVzZWQgdG8gZXhlY3V0ZSB0YXNrcy4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tXaXphcmQgaW1wbGVtZW50cyBJV2l6YXJkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEZJTklTSCA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBDQU5DRUwgPSAzOwotCi0JcHJpdmF0ZSBMaXN0PElXaXphcmRQYWdlPiBwYWdlczsKLQlwcml2YXRlIGJvb2xlYW4gYWRkaW5nUGFnZXM7Ci0JcHJpdmF0ZSBNYXA8V2l6YXJkRnJhZ21lbnQsIFRhc2tXaXphcmRQYWdlPiBmcmFnbWVudERhdGEgPSBuZXcgSGFzaE1hcDxXaXphcmRGcmFnbWVudCwgVGFza1dpemFyZFBhZ2U+KCk7Ci0JcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JCi0JcHJpdmF0ZSBJV2l6YXJkQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzSGVscEF2YWlsYWJsZSA9IGZhbHNlOwotCQotCXByaXZhdGUgSW1hZ2UgZGVmYXVsdEltYWdlID0gbnVsbDsKLQkKLQlwcml2YXRlIFJHQiB0aXRsZUJhckNvbG9yID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHdpbmRvd1RpdGxlID0gbnVsbDsKLQkKLQlwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBXaXphcmRGcmFnbWVudCByb290RnJhZ21lbnQ7Ci0JcHJpdmF0ZSBXaXphcmRGcmFnbWVudCBjdXJyZW50RnJhZ21lbnQ7Ci0JcHJpdmF0ZSBPYmplY3QgZmluaXNoRmFtaWx5OwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXNrV2l6YXJkIHdpdGggdGhlIGdpdmVuIHRpdGxlIGFuZCByb290IGZyYWdtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZSBhIHRpdGxlCi0JICogQHBhcmFtIHJvb3RGcmFnbWVudCBhIHJvb3QgZnJhZ21lbnQKLQkgKi8KLQlwdWJsaWMgVGFza1dpemFyZChTdHJpbmcgdGl0bGUsIFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudCkgewotCQl0aGlzKHRpdGxlLCByb290RnJhZ21lbnQsIG51bGwpOwotCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhc2tXaXphcmQgd2l0aCB0aGUgZ2l2ZW4gdGl0bGUsIHJvb3QgZnJhZ21lbnQsIGFuZCB0YXNrIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZSBhIHRpdGxlCi0JICogQHBhcmFtIHJvb3RGcmFnbWVudCBhIHJvb3QgZnJhZ21lbnQKLQkgKiBAcGFyYW0gdGFza01vZGVsIGEgdGFzayBtb2RlbAotCSAqLwotCXB1YmxpYyBUYXNrV2l6YXJkKFN0cmluZyB0aXRsZSwgV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50LCBUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh0aXRsZSAhPSBudWxsKQotCQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCQl0aGlzLnJvb3RGcmFnbWVudCA9IHJvb3RGcmFnbWVudDsKLQkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0JCWlmICh0YXNrTW9kZWwgPT0gbnVsbCkKLQkJCXRoaXMudGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQkKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQl0aGlzLnRhc2tNb2RlbCA9IHRhc2tNb2RlbDsKLQl9Ci0JCi0JcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7Ci0JCXJldHVybiB0YXNrTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdEZyYWdtZW50KFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudCkgewotCQl0aGlzLnJvb3RGcmFnbWVudCA9IHJvb3RGcmFnbWVudDsKLQl9Ci0JCi0JcHVibGljIFdpemFyZEZyYWdtZW50IGdldFJvb3RGcmFnbWVudCgpIHsKLQkJcmV0dXJuIHJvb3RGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBDYW5jZWwgdGhlIGNsaWVudCBzZWxlY3Rpb24uCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlmaW5hbCBMaXN0IGxpc3QgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCQkJCWV4ZWN1dGVUYXNrKChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpLCBDQU5DRUwsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oY2UpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCVRocm93YWJsZSB0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChnZXRDb250YWluZXIoKSAhPSBudWxsKQotCQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCQllbHNlCi0JCQkJcnVubmFibGUucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gdGUpIHsKLQkJCXQgPSB0ZS5nZXRDYXVzZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdCA9IGU7Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FuY2VsbGluZyB0YXNrIHdpemFyZCIsIHQpOwotCQloYW5kbGVUaHJvd2FibGUodCk7Ci0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKGN1cnJlbnRGcmFnbWVudCAhPSBudWxsKQotCQkJY3VycmVudEZyYWdtZW50LmV4aXQoKTsKLQkJCi0JCWZpbmFsIFdpemFyZEZyYWdtZW50IGNGcmFnbWVudCA9IGN1cnJlbnRGcmFnbWVudDsKLQotCQlmaW5hbCBMaXN0IGxpc3QgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKTsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkvLyBlbnRlciAmIGV4aXQgdGhlIHJlbWFpbmluZyBwYWdlcwotCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihjRnJhZ21lbnQpOwotCQkJCXdoaWxlIChpbmRleCA+IDAgJiYgaW5kZXggPCBsaXN0LnNpemUoKSAtIDEpIHsKLQkJCQkJZmluYWwgV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGxpc3QuZ2V0KCsraW5kZXgpOwotCQkJCQl0cnkgewotCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZnJhZ21lbnQuZW50ZXIoKTsKLQkJCQkJCQkJZnJhZ21lbnQuZXhpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBlbnRlci9leGl0IHBhZ2UiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAodXNlSm9iKCkpIHsKLQkJCQkJY2xhc3MgRmluaXNoV2l6YXJkSm9iIGV4dGVuZHMgSm9iIHsKLQkJCQkJCXB1YmxpYyBGaW5pc2hXaXphcmRKb2IoKSB7Ci0JCQkJCQkJc3VwZXIoZ2V0Sm9iVGl0bGUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJCQkJcmV0dXJuIChnZXRGaW5pc2hKb2JGYW1pbHkoKSA9PSBudWxsICYmIGZhbWlseSA9PSBudWxsICkgCi0JCQkJCQkJfHwgKGdldEZpbmlzaEpvYkZhbWlseSgpICE9IG51bGwgJiYgZ2V0RmluaXNoSm9iRmFtaWx5KCkuZXF1YWxzKGZhbWlseSkpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMikgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCQkJCQkJZXhlY3V0ZVRhc2soKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCksIEZJTklTSCwgbW9uaXRvcjIpOwotCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZmluaXNoaW5nIHdpemFyZCBqb2IiLCBjZSk7Ci0JCQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlGaW5pc2hXaXphcmRKb2Igam9iID0gbmV3IEZpbmlzaFdpemFyZEpvYigpOwotCQkJCQlqb2Iuc2V0VXNlcih0cnVlKTsKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJCQlleGVjdXRlVGFzaygoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKSwgRklOSVNILCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlUaHJvd2FibGUgdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgbmV3IFdvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlcihydW5uYWJsZSkpOwotCQkJZWxzZQotCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHRlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBmaW5pc2hpbmcgdGFzayB3aXphcmQiLCB0ZSk7Ci0JCQl0ID0gdGUuZ2V0Q2F1c2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpbmlzaGluZyB0YXNrIHdpemFyZCAyIiwgZSk7Ci0JCQl0ID0gZTsKLQkJfQotCQkKLQkJLy8gVE9ETzogc2hvdyBiZXR0ZXIgZXJyb3IgZGlhbG9nLCBlLmcuIHdoZW4gVG9tY2F0IGNvbmZpZyBpcyBjb3JydXB0IHdoaWxlIGRvaW5nIEFkZC9SZW1vdmUKLQkJLy8gaXQgY3VycmVudGx5IGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlIHR3aWNlCi0JCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBjb21wbGV0aW5nIHdpemFyZCIsIHQpOwotCQloYW5kbGVUaHJvd2FibGUodCk7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoSm9iRmFtaWx5KCkgewotCQlyZXR1cm4gZmluaXNoRmFtaWx5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hKb2JGYW1pbHkoT2JqZWN0IG8pIHsKLQkJdGhpcy5maW5pc2hGYW1pbHkgPSBvOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJcGFnZXMuYWRkKHBhZ2UpOwotCQlwYWdlLnNldFdpemFyZCh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVRhc2soV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQsIGJ5dGUgdHlwZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHR5cGUgPT0gRklOSVNIKQotCQkJZnJhZ21lbnQucGVyZm9ybUZpbmlzaChtb25pdG9yKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBDQU5DRUwpCi0JCQlmcmFnbWVudC5wZXJmb3JtQ2FuY2VsKG1vbml0b3IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV2l6YXJkRnJhZ21lbnQgZ2V0Q3VycmVudFdpemFyZEZyYWdtZW50KCkgewotCQlyZXR1cm4gY3VycmVudEZyYWdtZW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzd2l0Y2hXaXphcmRGcmFnbWVudChXaXphcmRGcmFnbWVudCBuZXdGcmFnbWVudCkgewotCQlMaXN0IGxpc3QgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKTsKLQkJaW50IG9sZEluZGV4ID0gbGlzdC5pbmRleE9mKGN1cnJlbnRGcmFnbWVudCk7Ci0JCWludCBuZXdJbmRleCA9IGxpc3QuaW5kZXhPZihuZXdGcmFnbWVudCk7Ci0JCWlmIChvbGRJbmRleCA9PSBuZXdJbmRleCkKLQkJCXJldHVybjsKLQkJCi0JCS8vc2FmZUV4ZWN1dGVUYXNrKGN1cnJlbnRGcmFnbWVudCwgREVQQVJUVVJFKTsKLQkJaWYgKGN1cnJlbnRGcmFnbWVudCAhPSBudWxsKQotCQkJY3VycmVudEZyYWdtZW50LmV4aXQoKTsKLQkJCi0JCWlmIChvbGRJbmRleCA8IG5ld0luZGV4KQotCQkJb2xkSW5kZXggKys7Ci0JCWVsc2UKLQkJCW9sZEluZGV4IC0tOwotCQkKLQkJd2hpbGUgKG9sZEluZGV4ICE9IG5ld0luZGV4KSB7Ci0JCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgbGlzdC5nZXQob2xkSW5kZXgpOwotCQkJLy9zYWZlRXhlY3V0ZVRhc2soZnJhZ21lbnQsIEFSUklWQUwpOwotCQkJLy9zYWZlRXhlY3V0ZVRhc2soZnJhZ21lbnQsIERFUEFSVFVSRSk7Ci0JCQlmcmFnbWVudC5lbnRlcigpOwotCQkJZnJhZ21lbnQuZXhpdCgpOwotCQkJaWYgKG9sZEluZGV4IDwgbmV3SW5kZXgpCi0JCQkJb2xkSW5kZXggKys7Ci0JCQllbHNlCi0JCQkJb2xkSW5kZXggLS07Ci0JCX0KLQkJCi0JCWN1cnJlbnRGcmFnbWVudCA9IG5ld0ZyYWdtZW50OwotCQkvL3NhZmVFeGVjdXRlVGFzayhjdXJyZW50RnJhZ21lbnQsIEFSUklWQUwpOwotCQljdXJyZW50RnJhZ21lbnQuZW50ZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFdpemFyZEZyYWdtZW50PiBnZXRBbGxXaXphcmRGcmFnbWVudHMoKSB7Ci0JCUxpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFdpemFyZEZyYWdtZW50PigpOwotCQlsaXN0LmFkZChyb290RnJhZ21lbnQpOwotCQlhZGRTdWJXaXphcmRGcmFnbWVudHMocm9vdEZyYWdtZW50LCBsaXN0KTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCF0YXNrTW9kZWwuZXF1YWxzKGZyYWdtZW50LmdldFRhc2tNb2RlbCgpKSkKLQkJCQlmcmFnbWVudC5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3ViV2l6YXJkRnJhZ21lbnRzKFdpemFyZEZyYWdtZW50IGZyYWdtZW50LCBMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZnJhZ21lbnQuZ2V0Q2hpbGRGcmFnbWVudHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlXaXphcmRGcmFnbWVudCBjaGlsZCA9IChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJbGlzdC5hZGQoY2hpbGQpOwotCQkJYWRkU3ViV2l6YXJkRnJhZ21lbnRzKGNoaWxkLCBsaXN0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKGFkZGluZ1BhZ2VzKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCWFkZGluZ1BhZ2VzID0gdHJ1ZTsKLQkJCXBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQkJCUl0ZXJhdG9yPFdpemFyZEZyYWdtZW50PiBpdGVyYXRvciA9IGdldEFsbFdpemFyZEZyYWdtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJVGFza1dpemFyZFBhZ2UgcGFnZSA9IGdldEZyYWdtZW50RGF0YShmcmFnbWVudCk7Ci0JCQkJaWYgKGZyYWdtZW50Lmhhc0NvbXBvc2l0ZSgpKSB7Ci0JCQkJCWlmIChwYWdlICE9IG51bGwpCi0JCQkJCQlhZGRQYWdlKHBhZ2UpOwotCQkJCQllbHNlIHsKLQkJCQkJCVRhc2tXaXphcmRQYWdlIHBhZ2UyID0gbmV3IFRhc2tXaXphcmRQYWdlKGZyYWdtZW50KTsKLQkJCQkJCWZyYWdtZW50RGF0YS5wdXQoZnJhZ21lbnQsIHBhZ2UyKTsKLQkJCQkJCWFkZFBhZ2UocGFnZTIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgYWRkaW5nIGZyYWdtZW50cyB0byB3aXphcmQiLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWFkZGluZ1BhZ2VzID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKnByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlV2l6YXJkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQljdXJyZW50LnVwZGF0ZVBhZ2VzKCk7Ci0JCQljdXJyZW50LmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHVwZGF0aW5nIHdpemFyZCBwYWdlcyIsIGUpOwotCQl9Ci0JfSovCi0KLQlwcml2YXRlIFRhc2tXaXphcmRQYWdlIGdldEZyYWdtZW50RGF0YShXaXphcmRGcmFnbWVudCBmcmFnbWVudCkgewotCQl0cnkgewotCQkJVGFza1dpemFyZFBhZ2UgcGFnZSA9IGZyYWdtZW50RGF0YS5nZXQoZnJhZ21lbnQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGFnZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgZnJhZ21lbnQgZGF0YSIsIGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJYWRkUGFnZXMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBjaGVjayBpZiBhbGwgcGFnZXMgYXJlIGNvbXBsZXRlLgotCQlmb3IgKGludCBpPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmICghKHBhZ2VzLmdldChpKSkuaXNQYWdlQ29tcGxldGUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJLy8gdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY3JlYXRlIGFsbCB0aGUgcGFnZXMgY29udHJvbHMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKyl7Ci0JCQlJV2l6YXJkUGFnZSBwYWdlID0gcGFnZXMuZ2V0KGkpOwotCQkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm90aWZ5IHBhZ2VzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXBhZ2VzLmdldChpKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG9mIGltYWdlCi0JCWlmIChkZWZhdWx0SW1hZ2UgIT0gbnVsbCkgewotCQkJZGVmYXVsdEltYWdlLmRpc3Bvc2UoKTsKLQkJCWRlZmF1bHRJbWFnZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRDb250YWluZXIoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXREZWZhdWx0UGFnZUltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGVmYXVsdFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRJbWFnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXREaWFsb2dTZXR0aW5ncygpCi0JICovCi0JcHVibGljIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIGRpYWxvZ1NldHRpbmdzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldE5leHRQYWdlKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpbnQgaW5kZXggPSBwYWdlcy5pbmRleE9mKHBhZ2UpOwotCQlpZiAoaW5kZXggPT0gcGFnZXMuc2l6ZSgpIC0gMSB8fCBpbmRleCA9PSAtMSkKLQkJCS8vIGxhc3QgcGFnZSBvciBwYWdlIG5vdCBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gcGFnZXMuZ2V0KGluZGV4ICsgMSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UGFnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHBhZ2VzLmdldChpKTsKLQkJCVN0cmluZyBwYWdlTmFtZSA9IHBhZ2UuZ2V0TmFtZSgpOwotCQkJaWYgKHBhZ2VOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gcGFnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRQYWdlQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UGFnZUNvdW50KCkgewotCQlyZXR1cm4gcGFnZXMuc2l6ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2VbXSBnZXRQYWdlcygpIHsKLQkJcmV0dXJuIHBhZ2VzLnRvQXJyYXkobmV3IElXaXphcmRQYWdlW3BhZ2VzLnNpemUoKV0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFByZXZpb3VzUGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCWludCBpbmRleCA9IHBhZ2VzLmluZGV4T2YocGFnZSk7Ci0JCWlmIChpbmRleCA9PSAwIHx8IGluZGV4ID09IC0xKQotCQkJLy8gZmlyc3QgcGFnZSBvciBwYWdlIG5vdCBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwYWdlcy5nZXQoaW5kZXggLSAxKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRTdGFydGluZ1BhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKSB7Ci0JCWlmIChwYWdlcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIHBhZ2VzLmdldCgwKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRUaXRsZUJhckNvbG9yKCkKLQkgKi8KLQlwdWJsaWMgUkdCIGdldFRpdGxlQmFyQ29sb3IoKSB7Ci0JCXJldHVybiB0aXRsZUJhckNvbG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFdpbmRvd1RpdGxlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpbmRvd1RpdGxlKCkgewotCQlyZXR1cm4gd2luZG93VGl0bGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjaXNIZWxwQXZhaWxhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hlbHBBdmFpbGFibGUoKSB7Ci0JCXJldHVybiBpc0hlbHBBdmFpbGFibGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjbmVlZHNQcmV2aW91c0FuZE5leHRCdXR0b25zKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKSB7Ci0JCXJldHVybiBmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgfHwgcGFnZXMuc2l6ZSgpID4gMTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNuZWVkc1Byb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBuZWVkc1Byb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNzZXRDb250YWluZXIob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElXaXphcmRDb250YWluZXIgd2l6YXJkQ29udGFpbmVyKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gd2l6YXJkQ29udGFpbmVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREaWFsb2dTZXR0aW5ncyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLQkJZGlhbG9nU2V0dGluZ3MgPSBzZXR0aW5nczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IoYm9vbGVhbiBiKSB7Ci0JCW5lZWRzUHJvZ3Jlc3NNb25pdG9yID0gYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKGJvb2xlYW4gYikgewotCQlmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgPSBiOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXaW5kb3dUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJd2luZG93VGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VKb2IoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpvYlRpdGxlKCkgewotCQlyZXR1cm4gZ2V0V2luZG93VGl0bGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVRocm93YWJsZShmaW5hbCBUaHJvd2FibGUgdCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0JCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gdC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSA/ICgoQ29yZUV4Y2VwdGlvbil0KS5nZXRTdGF0dXMoKSA6IG51bGw7Ci0JCQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmKCBzdGF0dXMgPT0gbnVsbCApCi0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5XaXphcmRFcnJvciwgbWVzc2FnZSk7Ci0JCQkJZWxzZQotCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLldpemFyZEVycm9yLCBtZXNzYWdlLCBzdGF0dXMpOwotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC90YXNrd2l6YXJkL1Rhc2tXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvVGFza1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3MWI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvVGFza1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLlRyYWNlOwotCi0vKioKLSAqIEEgdGFzayB3aXphcmQgcGFnZS4KLSAqLwotY2xhc3MgVGFza1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgSVdpemFyZEhhbmRsZSB7Ci0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGZyYWdtZW50OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgVGFza1dpemFyZFBhZ2UoV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQpIHsKLQkJc3VwZXIoZnJhZ21lbnQudG9TdHJpbmcoKSk7Ci0JCXRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnRDb21wKSB7Ci0JCUNvbXBvc2l0ZSBjb21wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbXAgPSBmcmFnbWVudC5jcmVhdGVDb21wb3NpdGUocGFyZW50Q29tcCwgdGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSB3aXphcmQgcGFnZSBjb21wb3NpdGUiLCBlKTsKLQkJfQotCQlpZiAoY29tcCA9PSBudWxsKSB7Ci0JCQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnRDb21wLCBTV1QuTk9ORSk7Ci0JCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoIkludGVybmFsIGVycm9yIik7Ci0JCX0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDE1MCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2V0Q29udHJvbChjb21wKTsKLQkJCi0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0JCXVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQl0cnkgewotCQkJaWYgKCFmcmFnbWVudC5pc0NvbXBsZXRlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlpZiAoZ2V0TmV4dFBhZ2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJaWYgKCFmcmFnbWVudC5pc0NvbXBsZXRlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQotCQlpZiAodmlzaWJsZSkgewotCQkJVGFza1dpemFyZCB3aXphcmQgPSAoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCQl3aXphcmQuc3dpdGNoV2l6YXJkRnJhZ21lbnQoZnJhZ21lbnQpOwotCQkJCi0JCQlpZiAoZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBudWxsKQotCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IElNZXNzYWdlUHJvdmlkZXIuRVJST1IgJiYgIiIuZXF1YWxzKG1lc3NhZ2UpKSB7Ci0JCQltZXNzYWdlID0gbnVsbDsKLQkJfQotCQlzdXBlci5zZXRNZXNzYWdlKG1lc3NhZ2UsIHR5cGUpOwotCQlXaXphcmRGcmFnbWVudCBmcmFnID0gKChUYXNrV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0Q3VycmVudFdpemFyZEZyYWdtZW50KCk7Ci0JCWlmICghZnJhZ21lbnQuZXF1YWxzKGZyYWcpKQotCQkJcmV0dXJuOwotCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnJ1bihmb3JrLCBjYW5jZWxhYmxlLCBydW5uYWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoIWlzQ3JlYXRlZCkKLQkJCXJldHVybjsKLQkJCi0JCWZpbmFsIElXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmcmFnbWVudC51cGRhdGVDaGlsZEZyYWdtZW50cygpOwotCQkJCSgoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCkpLnVwZGF0ZVBhZ2VzKCk7Ci0JCQkJCi0JCQkJaWYgKGNvbnRhaW5lci5nZXRDdXJyZW50UGFnZSgpICE9IG51bGwpCi0JCQkJCWNvbnRhaW5lci51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFlYzBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuVGFza01vZGVsOwotCi0vKioKLSAqIEEgd2l6YXJkIGZyYWdtZW50IGlzIGEgbm9kZSB3aXRoaW4gYSB3aXphcmQgdGhhdCBwcm92aWRlcyBhIGNvbXBsZXRlbHkKLSAqIGV4dGVuZGFibGUgd2l6YXJkIGZsb3cgYnkgc3VwcG9ydGluZyBhIGZsZXhpYmxlIHRyZWUgc3RydWN0dXJlIGZvciB0aGUKLSAqIHBhZ2VzLiBBcyB0aGUgdXNlciB3YWxrcyBwYWdlcyB0aHJvdWdoIHRoZSB3aXphcmQsIHRoZXkgYXJlIGFjdHVhbGx5Ci0gKiB0cmF2ZXJzaW5nIHRoZSBub2RlcyBvZiBhIHRyZWUsIGFuZCBlYWNoIG5vZGUgY2FuIGFkZCBvciByZW1vdmUgY2hpbGRyZW4KLSAqIGF0IGFueSB0aW1lLgotICogCi0gKiBFYWNoIG5vZGUgbWF5IGJlIG5vbi1VSSAodXNlZnVsIGZvciBpbmplY3RpbmcgYmVoYXZpb3VyIGludG8gdGhlIHRyZWUpCi0gKiBvciBjb250YWluIGEgc2luZ2xlIHdpemFyZCBwYWdlIChAc2VlIGhhc0NvbXBvc2l0ZSgpIGFuZAotICogY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSwgSVdpemFyZEhhbmRsZSkpLiBUaGUgbm9kZSBtYXkgYWxzbyBoYXZlCi0gKiBjaGlsZHJlbiAoQHNlZSBnZXRDaGlsZEZyYWdtZW50cygpLCB3aGljaCBzaG91bGQgYmUgdXBkYXRlZCBvciByZWZyZXNoZWQKLSAqIHdoZW5ldmVyIHRoZSB1cGRhdGVDaGlsZEZyYWdtZW50cygpIG1ldGhvZCBpcyBjYWxsZWQgYnkgYW5vdGhlciBub2RlIHRvCi0gKiBsZXQgdGhpcyBub2RlIGtub3cgdGhhdCBpdCdzIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQuCi0gKiAKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKCkgbWV0aG9kIHRvIGFsbG93IHRoZQotICogZnJhZ21lbnQgdG8gYWRkIGl0J3MgY2hpbGRyZW4gaW50byB0aGUgdHJlZS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heQotICogYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHRoZSB0cmVlIGlzIHVwZGF0ZWQgYW5kIGl0IG11c3QgcmV0dXJuIHRoZQotICogc2FtZSBpbnN0YW5jZSBvZiBhbnkgY2hpbGRyZW4gdGhhdCBoYXZlIHByZXZpb3VzbHkgYmVlbiByZXR1cm5lZC4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkRnJhZ21lbnQgewotCXByaXZhdGUgVGFza01vZGVsIHRhc2tNb2RlbDsKLQlwcml2YXRlIGJvb2xlYW4gaXNDb21wbGV0ZSA9IHRydWU7Ci0JcHJpdmF0ZSBMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0SW1wbDsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmcmFnbWVudCBoYXMgYW4gYXNzb2NpYXRlZCBVSSwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZyYWdtZW50IGhhcyBhIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbXBvc2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFnbWVudC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIGhhc0NvbXBvc2l0ZSgpIHJldHVybnMgdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBoYW5kbGUgYSB3aXphcmQgaGFuZGxlCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3aXphcmQgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBBIHRhc2sgbW9kZWwgaXMgc2hhcmVkIGJ5IGFsbCBmcmFnbWVudHMgaW4gdGhlIHdpemFyZCBhbmQgaXMgdXNlZCB0byBzaGFyZQotCSAqIGRhdGEuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCi0JICogZnJhZ21lbnRzIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBkYXRhLiBJdHMgdXNhZ2UgYWxsb3dzIG11bHRpcGxlIGZyYWdtZW50cwotCSAqIHRvIGJlIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSBmcmFnbWVudCB0bwotCSAqIHRoZSBpbnB1dCBvZiBhbm90aGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdGFza01vZGVsIHRoZSB0YXNrIG1vZGVsCi0JICogQHNlZSAjZ2V0VGFza01vZGVsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQl0aGlzLnRhc2tNb2RlbCA9IHRhc2tNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgdGFzayBtb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YXNrIG1vZGVsCi0JICogQHNlZSAjc2V0VGFza01vZGVsKFRhc2tNb2RlbCkKLQkgKi8KLQlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKLQkJcmV0dXJuIHRhc2tNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvIGhhcyB0cmF2ZXJzZWQKLQkgKiBpbnRvIHRoaXMgd2l6YXJkIGZyYWdtZW50LiBJdCBpcyBjYWxsZWQgdG8gZ2l2ZSB0aGUgZnJhZ21lbnQgdGhlCi0JICogb3Bwb3J0dW5pdHkgdG8gaW5pdGlhbGl6ZSBhbnkgdmFsdWVzIHNob3duIGluIHRoZSBjb21wb3NpdGUgb3IKLQkgKiB1cGRhdGUgdGhlIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogV2hlbiBmaW5pc2ggaXMgcHJlc3NlZCwgdGhlIGN1cnJlbnQgZnJhZ21lbnQgaXMgZXhpdCgpZWQsIGFuZCB0aGVuCi0JICogcGVyZm9ybUZpbmlzaCgpIGlzIGNhbGxlZCBvbiBhbGwgb2YgdGhlIGZyYWdtZW50cyBpbiB0aGUgdHJlZS4KLQkgKiBlbnRlcigpIGFuZCBleGl0KCkgYXJlIG5vdCBjYWxsZWQgb24gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHdpemFyZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmVsb25ncyB0byBoYXMgdHJhdmVyc2VkCi0JICogb3V0IG9mIHRoaXMgd2l6YXJkIGZyYWdtZW50LiBJdCBpcyBjYWxsZWQgdG8gZ2l2ZSB0aGUgZnJhZ21lbnQgdGhlCi0JICogb3Bwb3J0dW5pdHkgdG8gc2F2ZSBhbnkgdmFsdWVzIGVudGVyZWQgaW50byB0aGUgY29tcG9zaXRlIG9yCi0JICogdXBkYXRlIHRoZSB0YXNrIG1vZGVsLgotCSAqIDxwPgotCSAqIFdoZW4gZmluaXNoIGlzIHByZXNzZWQsIHRoZSBjdXJyZW50IGZyYWdtZW50IGlzIGV4aXQoKWVkLCBhbmQgdGhlbgotCSAqIHBlcmZvcm1GaW5pc2goKSBpcyBjYWxsZWQgb24gYWxsIG9mIHRoZSBmcmFnbWVudHMgaW4gdGhlIHRyZWUuCi0JICogZW50ZXIoKSBhbmQgZXhpdCgpIGFyZSBub3QgY2FsbGVkIG9uIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLiAKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZXhpdCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB3aXphcmQgdGhhdCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgdG8gaXMgZmluaXNoZWQuCi0JICogQWZ0ZXIgZXhpdCgpaW5nIHRoZSBjdXJyZW50IHBhZ2UsIGFsbCBmcmFnbWVudCdzIHBlcmZvcm1GaW5pc2goKQotCSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBpbiBvcmRlci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQgYW5kIG11c3Qgbm90IGFjY2VzcyB0aGUKLQkgKiBjb21wb3NpdGUuIE5vdCBvbmx5IG1pZ2h0IHRoZSB1c2VyIG5ldmVyIGhhdmUgYWNjZXNzZWQgdGhlIGZyYWdtZW50J3MKLQkgKiBjb21wb3NpdGUsIGJ1dCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IG9uIGEgam9iCi0JICogb25jZSB0aGUgd2l6YXJkIGhhcyBjbG9zZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHdpemFyZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmVsb25ncyB0byBpcyBjYW5jZWxlZC4KLQkgKiBBZnRlciBleGl0KClpbmcgdGhlIGN1cnJlbnQgcGFnZSwgYWxsIGZyYWdtZW50J3MgcGVyZm9ybUNhbmNlbCgpCi0JICogbWV0aG9kcyBhcmUgY2FsbGVkIGluIG9yZGVyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBhbmQgbXVzdCBub3QgYWNjZXNzIHRoZQotCSAqIGNvbXBvc2l0ZS4gTm90IG9ubHkgbWlnaHQgdGhlIHVzZXIgbmV2ZXIgaGF2ZSBhY2Nlc3NlZCB0aGUgZnJhZ21lbnQncwotCSAqIGNvbXBvc2l0ZSwgYnV0IHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkgb24gYSBqb2IKLQkgKiBvbmNlIHRoZSB3aXphcmQgaGFzIGNsb3NlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1DYW5jZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBmcmFnbWVudHMuIENoaWxkIGZyYWdtZW50cyBjb21lIGRpcmVjdGx5IGFmdGVyIHRoaXMgZnJhZ21lbnQKLQkgKiBpbiB0aGUgd2l6YXJkIGZsb3cuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgY2hpbGQgZnJhZ21lbnRzCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRGcmFnbWVudHMoKSB7Ci0JCWlmIChsaXN0SW1wbCA9PSBudWxsKSB7Ci0JCQlsaXN0SW1wbCA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+KCk7Ci0JCQljcmVhdGVDaGlsZEZyYWdtZW50cyhsaXN0SW1wbCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RJbXBsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBnaXZlIHRoZSBmcmFnbWVudCBhIGNoYW5jZSB0byB1cGRhdGUgaXQncyBjaGlsZCBmcmFnbWVudHMgaW4KLQkgKiByZXNwb25zZSB0byBvdGhlciBjaGFuZ2VzIHdpdGhpbiB0aGUgd2l6YXJkIG9yIHRhc2sgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ2hpbGRGcmFnbWVudHMoKSB7Ci0JCWxpc3RJbXBsID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIGdldENoaWxkRnJhZ21lbnRzKCkgdG8KLQkgKiBhbGxvdyB0aGlzIGZyYWdtZW50IHRvIGFkZCBpdCdzIGNoaWxkcmVuLiBUaGlzIG1ldGhvZCBtdXN0IGNhY2hlIGFuZAotCSAqIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSBvZiBhbnkgY2hpbGQgZnJhZ21lbnQgY3JlYXRlZC4gSWYgbmV3Ci0JICogaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGVhY2ggdGltZSB0aGUgd2l6YXJkIGlzIHVwZGF0ZWQsIHRoZSBlbmFibGVtZW50Ci0JICogc3RhdGUgYW5kIHRoZSBmbG93IG9mIHRoZSB3aXphcmQgd2lsbCBiZSBpbmNvcnJlY3QuIAotCSAqIAotCSAqIEBwYXJhbSBsaXN0IGEgbGlzdCB0byBhZGQgdGhlIGNoaWxkIGZyYWdtZW50cyB0bwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IGlzIGNvbXBsZXRlIChjYW4gZmluaXNoKS4gSWYgaXQgaXMKLQkgKiBjb21wbGV0ZSB0aGUgdXNlciB3aWxsIGJlIGFsbG93ZWQgdG8gZ28gdG8gdGhlIG5leHQgZnJhZ21lbnQgb3IKLQkgKiBmaW5pc2ggdGhlIHdpemFyZC4gSWYgdGhlIGZyYWdtZW50IGlzIG5vdCBjb21wbGV0ZSwgdGhlIE5leHQgYnV0dG9uCi0JICogd2lsbCBiZSBkaXNhYmxlZC4gSWYgdGhlIGZyYWdtZW50IGlzIGNvbXBsZXRlIGJ1dCBhbm90aGVyIGZyYWdtZW50Ci0JICogaXMgbm90IGNvbXBsZXRlLCB0aGUgRmluaXNoIGJ1dHRvbiB3aWxsIG5vdCBiZSBlbmFibGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZyYWdtZW50IGlzIGNvbXBsZXRlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGlzQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpc0NvbXBsZXRlIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBjb21wbGV0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZnJhZ21lbnQgaXMgY29tcGxldGUsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb21wbGV0ZShib29sZWFuIGNvbXBsZXRlKSB7Ci0JCXRoaXMuaXNDb21wbGV0ZSA9IGNvbXBsZXRlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvV29ya3NwYWNlUnVubmFibGVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvV29ya3NwYWNlUnVubmFibGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NDdlNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC90YXNrd2l6YXJkL1dvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0vKioKLSAqIElSdW5uYWJsZVdpdGhQcm9ncmVzc0FkYXB0ZXIgdG8gYWxsb3cgaXQgdG8gcnVuIGFuIElXb3Jrc3BhY2VSdW5uYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlciBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JcHJpdmF0ZSBJV29ya3NwYWNlUnVubmFibGUgd29ya3NwYWNlUnVubmFibGU7Ci0JCi0JcHVibGljIFdvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlcihJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUpIHsKLQkJd29ya3NwYWNlUnVubmFibGUgPSBydW5uYWJsZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4od29ya3NwYWNlUnVubmFibGUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhODZlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1Nb2R1bGVBc3NlbWJseVJvb3RQYWdlRGVzY3JpcHRpb249Q3JlYXRlIGFuZCBjaGFuZ2UgcGFja2FnaW5nIHN0cnVjdHVyZSBmb3IgdGhpcyBwcm9qZWN0Ci1Nb2R1bGVBc3NlbWJseT1Nb2R1bGUgQXNzZW1ibHkKLUVycm9yQ2hlY2tpbmdGYWNldHM9RXJyb3IgQ2hlY2tpbmcgUHJvamVjdCBGYWNldHMKLUVycm9yTm90VmlydHVhbENvbXBvbmVudD1UaGUgZ2l2ZW4gcHJvamVjdCBpcyBub3QgYSB2aXJ0dWFsIGNvbXBvbmVudCBwcm9qZWN0Ci1EZXBsb3lQYXRoQ29sdW1uPURlcGxveSBQYXRoCi1Tb3VyY2VDb2x1bW49U291cmNlCi1JbnRlcm5hbExpYkphcldhcm5pbmc9VGhpcyBsaWJyYXJ5IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBwcm9qZWN0IGJ5IHVzaW5nIHRoZSBwcm9qZWN0IHRyZWUgb3IgdGhlIGZpbGUgc3lzdGVtLiBJZiB5b3Ugd2FudCB0byBtb3ZlIC8gcmVtb3ZlIGl0LCB1c2UgdGhlIHNhbWUgYXBwcm9hY2guCi1BZGRGb2xkZXI9QWRkIEZvbGRlcgotQWRkRm9sZGVyRWxpcHNlcz1BZGQgRm9sZGVyLi4uCi1BZGRGb2xkZXJNYXBwaW5ncz1BZGQgZm9sZGVyIG1hcHBpbmdzCi1BZGRSZWZlcmVuY2U9QWRkIFJlZmVyZW5jZS4uLgotRWRpdFJlZmVyZW5jZT1FZGl0IFJlZmVyZW5jZS4uLgotUmVtb3ZlU2VsZWN0ZWQ9UmVtb3ZlIHNlbGVjdGVkCi1FeHRlcm5hbEphclRpdGxlPUFkZCBhbiBFeHRlcm5hbCBKYXIgUmVmZXJlbmNlCi1FeHRlcm5hbEphckRlc2NyaXB0aW9uPUhlcmUgeW91IGNhbiByZWZlcmVuY2UgYSBmaWxlc3lzdGVtIEphclxuVGhpcyBpcyBub3QgYSBzdWdnZXN0ZWQgdXNlLWNhc2UsIGJ1dCBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4KLUphclRpdGxlPUFkZCBhIEphciBSZWZlcmVuY2UKLUphckRlc2NyaXB0aW9uPSJIZXJlIHlvdSBjYW4gcmVmZXJlbmNlIGEgd29ya3NwYWNlIEphclxuVGhpcyBpcyBub3QgYSBzdWdnZXN0ZWQgdXNlLWNhc2UsIGJ1dCBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4KLUJyb3dzZT1Ccm93c2UuLi4KLU5ld1JlZmVyZW5jZVRpdGxlPVNlbGVjdCBhIHJlZmVyZW5jZSB0eXBlCi1OZXdSZWZlcmVuY2VEZXNjcmlwdGlvbj1IZXJlIHlvdSBjYW4gc2VsZWN0IG9uZSBvZiBtYW55IHR5cGVzIG9mIHJlZmVyZW5jZXMgdG8gYWRkCi1OZXdSZWZlcmVuY2VXaXphcmQ9TmV3IFJlZmVyZW5jZSBXaXphcmQKLVByb2plY3RSZWZlcmVuY2VUaXRsZT1BZGQgYSBQcm9qZWN0IFJlZmVyZW5jZQotUHJvamVjdFJlZmVyZW5jZURlc2NyaXB0aW9uPUhlcmUgeW91IGNhbiBtYWtlIGEgcHJvamVjdCBpbnRvIGEgcmVmZXJlbmNlLlxuSWYgdGhlIHByb2plY3QgaXMgbm90IGFscmVhZHkgYSBmbGV4aWJsZSBwcm9qZWN0LCBpdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIG9uZS4KLVZhcmlhYmxlUmVmZXJlbmNlVGl0bGU9QWRkIGEgVmFyaWFibGUgUmVmZXJlbmNlCi1WYXJpYWJsZVJlZmVyZW5jZURlc2NyaXB0aW9uPSJIZXJlIHlvdSBjYW4gcmVmZXJlbmNlIGEgdmFyaWFibGUgd2hpY2ggbWFwcyB0byBhIHNpbmdsZSBqYXIuXG5UaGlzIGlzIG5vdCBhIHN1Z2dlc3RlZCB1c2UtY2FzZSwgYnV0IGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5LgotV2l6YXJkRXJyb3I9V2l6YXJkIEVycm9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL0FkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODUxZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlZmF1bHRNb2R1bGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSU1vZHVsZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTW9kdWxlQ29yZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuQWRkRm9sZGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkRlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLk5ld1JlZmVyZW5jZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkRlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5SZWZlcmVuY2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0gCi1wdWJsaWMgY2xhc3MgQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciwKLQkJSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2wsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWV9QQVRIX1BST1BFUlRZID0gbmV3IEludGVnZXIoMCkudG9TdHJpbmcoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1BST1BFUlRZID0gbmV3IEludGVnZXIoMSkudG9TdHJpbmcoKTsKLQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFBBVEhfU0VQQVJBVE9SID0gU3RyaW5nLnZhbHVlT2YoSVBhdGguU0VQQVJBVE9SKTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgZmluYWwgTW9kdWxlQXNzZW1ibHlSb290UGFnZSBwcm9wUGFnZTsKLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgY29tcG9uZW50TmFtZVRleHQ7Ci0JcHJvdGVjdGVkIExhYmVsIGF2YWlsYWJsZU1vZHVsZXM7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRNYXBwaW5nQnV0dG9uLCBhZGRSZWZlcmVuY2VCdXR0b24sIGVkaXRSZWZlcmVuY2VCdXR0b24sIHJlbW92ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1dHRvbkNvbHVtbjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgT0tfU1RBVFVTID0gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQlwcm90ZWN0ZWQgTGlzdGVuZXIgdGFibGVMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgTGlzdGVuZXIgbGFiZWxMaXN0ZW5lcjsKLQotCS8vIE1hcHBpbmdzIHRoYXQgZXhpc3RlZCB3aGVuIHRoZSBwYWdlIHdhcyBvcGVuZWQgKG9yIGxhc3Qgc2F2ZWQpCi0JcHJvdGVjdGVkIEhhc2hNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4gb2xkQ29tcG9uZW50VG9SdW50aW1lUGF0aCA9IG5ldyBIYXNoTWFwPElWaXJ0dWFsQ29tcG9uZW50LCBTdHJpbmc+KCk7Ci0KLQkvLyBNYXBwaW5ncyB0aGF0IGFyZSBjdXJyZW50Ci0JcHJvdGVjdGVkIEhhc2hNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4gb2JqZWN0VG9SdW50aW1lUGF0aCA9IG5ldyBIYXNoTWFwPElWaXJ0dWFsQ29tcG9uZW50LCBTdHJpbmc+KCk7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb25zdW1lZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCi0JLy8gQSBzaW5nbGUgbGlzdCBvZiB3Yi1yZXNvdXJjZSBtYXBwaW5ncy4gSWYgdGhlcmUncyBhbnkgY2hhbmdlLCAKLQkvLyBhbGwgb2xkIHdpbGwgYmUgcmVtb3ZlZCBhbmQgbmV3IG9uZXMgYWRkZWQKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlUHJveHk+IHJlc291cmNlTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlUHJveHk+KCk7Ci0JCi0JLy8ga2VlcHMgdHJhY2sgaWYgYSBjaGFuZ2UgaGFzIG9jY3VycmVkIGluIHdiLXJlc291cmNlIG1hcHBpbmdzCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VNYXBwaW5nc0NoYW5nZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgSU1vZHVsZUhhbmRsZXIgbW9kdWxlSGFuZGxlcjsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWRkTW9kdWxlc3RvRUFSUHJvcGVydGllc0NvbnRyb2wuCi0JICovCi0JcHVibGljIEFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0JCQlmaW5hbCBNb2R1bGVBc3NlbWJseVJvb3RQYWdlIHBhZ2UpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5wcm9wUGFnZSA9IHBhZ2U7Ci0JCXJvb3RDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIFVJIENyZWF0aW9uIE1ldGhvZHMKLQkgKi8KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udGVudHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJTW9kdWxlQXNzZW1ibHlSb290UGFnZS5jcmVhdGVEZXNjcmlwdGlvbkNvbXBvc2l0ZShjb21wb3NpdGUsCi0JCQkJZ2V0TW9kdWxlQXNzZW1ibHlSb290UGFnZURlc2NyaXB0aW9uKCkpOwotCQljcmVhdGVMaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJcmVmcmVzaCgpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVBc3NlbWJseVJvb3RQYWdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5Nb2R1bGVBc3NlbWJseVJvb3RQYWdlRGVzY3JpcHRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGlzdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGxpc3RHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGlzdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJbGlzdEdyb3VwLnNldExheW91dERhdGEoZ0RhdGEpOwotCi0JCWF2YWlsYWJsZU1vZHVsZXMgPSBuZXcgTGFiZWwobGlzdEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWF2YWlsYWJsZU1vZHVsZXMuc2V0VGV4dChNZXNzYWdlcy5Nb2R1bGVBc3NlbWJseSk7IAotCQlhdmFpbGFibGVNb2R1bGVzLnNldExheW91dERhdGEoZ0RhdGEpOwotCQljcmVhdGVUYWJsZUNvbXBvc2l0ZShsaXN0R3JvdXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJZmlsbENvbXBvc2l0ZShjb21wb3NpdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljcmVhdGVUYWJsZShwYXJlbnQpOwotCQljcmVhdGVCdXR0b25Db2x1bW4ocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25Db2x1bW4oQ29tcG9zaXRlIHBhcmVudCkgewotCQlidXR0b25Db2x1bW4gPSBjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUocGFyZW50KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljcmVhdGVQdXNoQnV0dG9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVB1c2hCdXR0b25zKCkgewotCQlhZGRNYXBwaW5nQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihnZXRBZGRGb2xkZXJMYWJlbCgpKTsKLQkJYWRkUmVmZXJlbmNlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihnZXRBZGRSZWZlcmVuY2VMYWJlbCgpKTsKLQkJZWRpdFJlZmVyZW5jZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oZ2V0RWRpdFJlZmVyZW5jZUxhYmVsKCkpOwotCQlyZW1vdmVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGdldFJlbW92ZVNlbGVjdGVkTGFiZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW1vdmVTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuUmVtb3ZlU2VsZWN0ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0UmVmZXJlbmNlTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5FZGl0UmVmZXJlbmNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkUmVmZXJlbmNlTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5BZGRSZWZlcmVuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBZGRGb2xkZXJMYWJlbCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkFkZEZvbGRlckVsaXBzZXM7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29sdW1uLCBTV1QuUFVTSCk7Ci0JCWFCdXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWFCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWFCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBhQnV0dG9uOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQnV0dG9uQ29sdW1uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGFCdXR0b25Db2x1bW4gPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWFCdXR0b25Db2x1bW4uc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0JCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlhQnV0dG9uQ29sdW1uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBhQnV0dG9uQ29sdW1uOwotCX0KLQotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAocm9vdENvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyID0gY3JlYXRlQXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcihwYXJlbnQpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0JCQkJCXwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCUNvbXBvbmVudERlcGVuZGVuY3lDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigpOwotCQkJcHJvdmlkZXIuc2V0UnVudGltZVBhdGhzKG9iamVjdFRvUnVudGltZVBhdGgpOwotCQkJcHJvdmlkZXIuc2V0UmVzb3VyY2VNYXBwaW5ncyhyZXNvdXJjZU1hcHBpbmdzKTsKLQkJCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJCS8vYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcigKLQkgICAgICAgIC8vICAgICAgICBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLgotCSAgICAgICAgLy8gICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotCQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJCWFkZFRhYmxlTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVyLXJpZGUgdGhpcyBhbmQgZXh0ZW5kIHRoZSBjbGFzcwotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyIGNyZWF0ZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IENvbXBvbmVudERlcGVuZGVuY3lDb250ZW50UHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBMaXN0ZW5lcnMgb2YgdmFyaW91cyBldmVudHMKLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlTGlzdGVuZXJzKCkgewotCQlhZGRIb3ZlckhlbHBMaXN0ZW5lcnMoKTsKLQkJYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcigpOwotCQlhZGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEhvdmVySGVscExpc3RlbmVycygpIHsKLQkJZmluYWwgVGFibGUgdGFibGUgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCk7Ci0JCWNyZWF0ZUxhYmVsTGlzdGVuZXIodGFibGUpOwotCQljcmVhdGVUYWJsZUxpc3RlbmVyKHRhYmxlKTsKLQkJdGFibGUuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIHRhYmxlTGlzdGVuZXIpOwotCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgdGFibGVMaXN0ZW5lcik7Ci0JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZU1vdmUsIHRhYmxlTGlzdGVuZXIpOwotCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VIb3ZlciwgdGFibGVMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGFiZWxMaXN0ZW5lcihmaW5hbCBUYWJsZSB0YWJsZSkgewotCQlsYWJlbExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlMYWJlbCBsYWJlbCA9IChMYWJlbCkgZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHNoZWxsID0gbGFiZWwuZ2V0U2hlbGwoKTsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJCQkJZS5pdGVtID0gKFRhYmxlSXRlbSkgbGFiZWwuZ2V0RGF0YSgiX1RBQkxFSVRFTSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyAoVGFibGVJdGVtKSBlLml0ZW0gfSk7Ci0JCQkJCXRhYmxlLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBlKTsKLQkJCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJCQl0YWJsZS5zZXRGb2N1cygpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0JCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlTGlzdGVuZXIoZmluYWwgVGFibGUgdGFibGUpIHsKLQkJdGFibGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCVNoZWxsIHRpcCA9IG51bGw7Ci0JCQlMYWJlbCBsYWJlbCA9IG51bGw7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQljYXNlIFNXVC5LZXlEb3duOgotCQkJCWNhc2UgU1dULk1vdXNlTW92ZTogewotCQkJCQlpZiAodGlwID09IG51bGwpCi0JCQkJCQlicmVhazsKLQkJCQkJdGlwLmRpc3Bvc2UoKTsKLQkJCQkJdGlwID0gbnVsbDsKLQkJCQkJbGFiZWwgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuTW91c2VIb3ZlcjogewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0obmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmdldERhdGEoKSAhPSBudWxsICYmICFjYW5FZGl0KGl0ZW0uZ2V0RGF0YSgpKSkgewotCQkJCQkJaWYgKHRpcCAhPSBudWxsICYmICF0aXAuaXNEaXNwb3NlZCgpKQotCQkJCQkJCXRpcC5kaXNwb3NlKCk7Ci0JCQkJCQl0aXAgPSBuZXcgU2hlbGwoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJU1dULk9OX1RPUCB8IFNXVC5OT19GT0NVUyB8IFNXVC5UT09MKTsKLQkJCQkJCXRpcC5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKAotCQkJCQkJCQlTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQkJCQlGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0JCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQkJCQkJdGlwLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJbGFiZWwgPSBuZXcgTGFiZWwodGlwLCBTV1QuV1JBUCk7Ci0JCQkJCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKERpc3BsYXkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7Ci0JCQkJCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQkJCQlsYWJlbC5zZXREYXRhKCJfVEFCTEVJVEVNIiwgaXRlbSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxhYmVsLnNldFRleHQoIE1lc3NhZ2VzLkludGVybmFsTGliSmFyV2FybmluZyk7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCBsYWJlbExpc3RlbmVyKTsKLQkJCQkJCWxhYmVsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGxhYmVsTGlzdGVuZXIpOwotCQkJCQkJUG9pbnQgc2l6ZSA9IHRpcC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcygwKTsKLQkJCQkJCVBvaW50IHB0ID0gdGFibGUudG9EaXNwbGF5KHJlY3QueCwgcmVjdC55KTsKLQkJCQkJCXRpcC5zZXRCb3VuZHMocHQueCwgcHQueSAtIHNpemUueSwgc2l6ZS54LCBzaXplLnkpOwotCQkJCQkJdGlwLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGRhdGEpIHsKLQkJaWYoIGRhdGEgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLQkJaWYoICEoZGF0YSBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSkgcmV0dXJuIHRydWU7Ci0JCQotCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBkMiA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudClkYXRhOwotCQlib29sZWFuIHNhbWVQcm9qZWN0ID0gZDIuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgIT0gbnVsbAotCQkJJiYgZDIuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkuc2VnbWVudCgwKQotCQkJCS5lcXVhbHMocm9vdENvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuICEoc2FtZVByb2plY3QgJiYgaXNQaHlzaWNhbGx5QWRkZWQoZDIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXSB7IAotCQkJCURFUExPWV9QQVRIX1BST1BFUlRZLCBTT1VSQ0VfUFJPUEVSVFkgfSk7Ci0JCQotCQlDZWxsRWRpdG9yW10gZWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW10geyAKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IoYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUYWJsZSgpKSwKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IoKX07Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0Q2VsbEVkaXRvcnMoZWRpdG9ycyk7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIKLQkJCQkuc2V0Q2VsbE1vZGlmaWVyKG5ldyBSdW50aW1lUGF0aENlbGxNb2RpZmllcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXZpZXdlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2aWV3ZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQllZGl0UmVmZXJlbmNlQnV0dG9uLnNldEVuYWJsZWQoaGFzRWRpdFdpemFyZFBhZ2UoZ2V0U2VsZWN0ZWRPYmplY3QoKSkpOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChnZXRTZWxlY3RlZE9iamVjdCgpICE9IG51bGwgJiYgY2FuRWRpdChnZXRTZWxlY3RlZE9iamVjdCgpKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc0VkaXRXaXphcmRQYWdlKE9iamVjdCBvKSB7Ci0JCWlmKCBvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQpKSAKLQkJCXJldHVybiBmYWxzZTsKLQkJV2l6YXJkRnJhZ21lbnQgd2YgPSBOZXdSZWZlcmVuY2VXaXphcmQuZ2V0Rmlyc3RFZGl0aW5nRnJhZ21lbnQoKElWaXJ0dWFsQ29tcG9uZW50KW8pOwotCQlyZXR1cm4gd2YgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGVkT2JqZWN0KCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSdW50aW1lUGF0aENlbGxNb2RpZmllciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIgewotCi0JCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiggcHJvcGVydHkuZXF1YWxzKERFUExPWV9QQVRIX1BST1BFUlRZKSkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBjYW5FZGl0KGVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCU9iamVjdCBkYXRhID0gZWxlbWVudDsgLy8oKFRhYmxlSXRlbSllbGVtZW50KS5nZXREYXRhKCk7Ci0JCQlpZiggZGF0YSBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50ICkgewotCQkJCXJldHVybiBvYmplY3RUb1J1bnRpbWVQYXRoLmdldChlbGVtZW50KSA9PSBudWxsID8gbmV3IFBhdGgoIi8iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkudG9TdHJpbmcoKSA6IG9iamVjdFRvUnVudGltZVBhdGguZ2V0KGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmKCBkYXRhIGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSkgewotCQkJCXJldHVybiAoKENvbXBvbmVudFJlc291cmNlUHJveHkpZGF0YSkucnVudGltZVBhdGgudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQlpZiAocHJvcGVydHkuZXF1YWxzKERFUExPWV9QQVRIX1BST1BFUlRZKSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQkJCQlpZiggaXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJCQlvYmplY3RUb1J1bnRpbWVQYXRoLnB1dCgoSVZpcnR1YWxDb21wb25lbnQpaXRlbS5nZXREYXRhKCksIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYoIGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSkgewotCQkJCQlDb21wb25lbnRSZXNvdXJjZVByb3h5IGMgPSAoKENvbXBvbmVudFJlc291cmNlUHJveHkpaXRlbS5nZXREYXRhKCkpOwotCQkJCQljLnJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoKFN0cmluZyl2YWx1ZSk7Ci0JCQkJCXJlc291cmNlTWFwcGluZ3NDaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmVmcmVzaCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiggZXZlbnQud2lkZ2V0ID09IGFkZE1hcHBpbmdCdXR0b24pIAotCQkJaGFuZGxlQWRkTWFwcGluZ0J1dHRvbigpOwotCQllbHNlIGlmKCBldmVudC53aWRnZXQgPT0gYWRkUmVmZXJlbmNlQnV0dG9uKSAKLQkJCWhhbmRsZUFkZFJlZmVyZW5jZUJ1dHRvbigpOwotCQllbHNlIGlmKCBldmVudC53aWRnZXQgPT0gZWRpdFJlZmVyZW5jZUJ1dHRvbikgCi0JCQloYW5kbGVFZGl0UmVmZXJlbmNlQnV0dG9uKCk7Ci0JCWVsc2UgaWYoIGV2ZW50LndpZGdldCA9PSByZW1vdmVCdXR0b24gKSAKLQkJCWhhbmRsZVJlbW92ZVNlbGVjdGVkQnV0dG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkTWFwcGluZ0J1dHRvbigpIHsKLQkJQWRkRm9sZGVyRGlhbG9nIGFmZCA9IG5ldyBBZGRGb2xkZXJEaWFsb2coYWRkTWFwcGluZ0J1dHRvbi5nZXRTaGVsbCgpLCBwcm9qZWN0KTsKLQkJaWYoIGFmZC5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJQ29udGFpbmVyIGMgPSBhZmQuZ2V0U2VsZWN0ZWQoKTsKLQkJCWlmKCBjICE9IG51bGwgKSB7Ci0JCQkJSVBhdGggcCA9IGMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCUNvbXBvbmVudFJlc291cmNlUHJveHkgcHJveHkgPSBuZXcgQ29tcG9uZW50UmVzb3VyY2VQcm94eShwLCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc291cmNlTWFwcGluZ3MuYWRkKHByb3h5KTsKLQkJCQlyZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkUmVmZXJlbmNlQnV0dG9uKCkgewotCQlzaG93UmVmZXJlbmNlV2l6YXJkKGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRWRpdFJlZmVyZW5jZUJ1dHRvbigpIHsKLQkJc2hvd1JlZmVyZW5jZVdpemFyZCh0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlZmVyZW5jZUV4dGVuc2lvbltdIGZpbHRlclJlZmVyZW5jZVR5cGVzKFJlZmVyZW5jZUV4dGVuc2lvbltdIGRlZmF1bHRzKSB7Ci0JCXJldHVybiBkZWZhdWx0czsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1JlZmVyZW5jZVdpemFyZChib29sZWFuIGVkaXRpbmcpIHsKLQkJUmVmZXJlbmNlRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IAotCQkJRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRFeHBvc2VkUmVmZXJlbmNlRXh0ZW5zaW9ucygpOwotCQlleHRlbnNpb25zID0gZmlsdGVyUmVmZXJlbmNlVHlwZXMoZXh0ZW5zaW9ucyk7Ci0JCU5ld1JlZmVyZW5jZVdpemFyZCB3aXphcmQgPSBuZXcgTmV3UmVmZXJlbmNlV2l6YXJkKGV4dGVuc2lvbnMpOwotCQkvLyBmaWxsIHRoZSB0YXNrIG1vZGVsCi0JCXdpemFyZC5nZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5QUk9KRUNULCBwcm9qZWN0KTsKLQkJd2l6YXJkLmdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlJPT1RfQ09NUE9ORU5ULCByb290Q29tcG9uZW50KTsKLQkJd2l6YXJkLmdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLk1PRFVMRUhBTkRMRVIsIGdldE1vZHVsZUhhbmRsZXIoKSk7Ci0KLQkJSVZpcnR1YWxDb21wb25lbnQgc2VsZWN0ZWQgPSBudWxsOwotCQlpZiggZWRpdGluZyApIHsKLQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKCBvIGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQgKSB7Ci0JCQkJc2VsZWN0ZWQgPSAoSVZpcnR1YWxDb21wb25lbnQpbzsKLQkJCQl3aXphcmQuZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuQ09NUE9ORU5ULCBzZWxlY3RlZCk7Ci0JCQkJd2l6YXJkLmdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkNPTVBPTkVOVF9QQVRILCBvYmplY3RUb1J1bnRpbWVQYXRoLmdldChzZWxlY3RlZCkpOwotCQkJfQotCQl9Ci0JCQotCQlXaXphcmREaWFsb2cgd2QgPSBuZXcgV2l6YXJkRGlhbG9nKGFkZFJlZmVyZW5jZUJ1dHRvbi5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQlpZiggd2Qub3BlbigpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCWlmKCBlZGl0aW5nICYmIHNlbGVjdGVkICE9IG51bGwpIHsKLQkJCQkvLyByZW1vdmUgb2xkCi0JCQkJb2JqZWN0VG9SdW50aW1lUGF0aC5yZW1vdmUoc2VsZWN0ZWQpOyAKLQkJCQljb25zdW1lZFJlZmVyZW5jZXMucmVtb3ZlKHNlbGVjdGVkKTsKLQkJCX0KLQkJCQotCQkJT2JqZWN0IGMxID0gd2l6YXJkLmdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkNPTVBPTkVOVCk7Ci0JCQlPYmplY3QgcDEgPSB3aXphcmQuZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuQ09NUE9ORU5UX1BBVEgpOwotCQkJRGVwZW5kZW5jeVR5cGUgdHlwZSA9IChEZXBlbmRlbmN5VHlwZSl3aXphcmQuZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuREVQRU5ERU5DWV9UWVBFKTsKLQkJCWJvb2xlYW4gY29uc3VtZWQgPSB0eXBlID09IG51bGwgPyBmYWxzZSA6IHR5cGUuZXF1YWxzKERlcGVuZGVuY3lUeXBlLkNPTlNVTUVTX0xJVEVSQUwpOwotCQkJCi0JCQlJVmlydHVhbENvbXBvbmVudFtdIGNvbXBBcnIgPSBjMSBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50ID8gCi0JCQkJCW5ldyBJVmlydHVhbENvbXBvbmVudFtdIHsgKElWaXJ0dWFsQ29tcG9uZW50KWMxIH0gOiAKLQkJCQkJCShJVmlydHVhbENvbXBvbmVudFtdKWMxOwotCQkJU3RyaW5nW10gcGF0aEFyciA9IHAxIGluc3RhbmNlb2YgU3RyaW5nID8gCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgKFN0cmluZylwMSB9IDogCi0JCQkJCQkJCShTdHJpbmdbXSlwMTsKLQkJCWZvciggaW50IGkgPSAwOyBpIDwgY29tcEFyci5sZW5ndGg7IGkrKyApIHsKLQkJCQlvYmplY3RUb1J1bnRpbWVQYXRoLnB1dChjb21wQXJyW2ldLCAKLQkJCQkJCWdldFJ1bnRpbWVQYXRoKGNvbXBBcnJbaV0sIHBhdGhBcnJbaV0pKTsKLQkJCQlpZiggY29uc3VtZWQgKSAKLQkJCQkJY29uc3VtZWRSZWZlcmVuY2VzLmFkZChjb21wQXJyW2ldKTsKLQkJCX0KLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIGFyZSBlbmNvdXJhZ2VkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIAotCSAqIHRoZXkgaGF2ZSBzb21lIHNwZWNpZmljIHBsYWNlICh3ZWJpbmYvbGliIGV0Yykgd2hlcmUgY2VydGFpbgotCSAqIHR5cGVzIG9mIHJlZmVyZW5jZXMgc2hvdWxkIGRlZmF1bHQgdG8uIAotCSAqIAotCSAqIElmIHRoZSBzdWJjbGFzcyBkb2VzIG5vdCB1bmRlcnN0YW5kIG9yIGtub3cgYWJvdXQgdGhlIAotCSAqIHRoaXMgY29tcG9uZW50IHR5cGUsIG9yIGlmIGl0IGhhcyBubyBjdXN0b21pemF0aW9ucyB0byBwZXJmb3JtLAotCSAqIGl0IHNob3VsZCByZXR1cm4gdGhlIHByb3ZpZGVkIHdpemFyZFBhdGggdW5jaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIGFkZGVkQ29tcCBUaGUgY29tcG9uZW50IGJlaW5nIGFkZGVkIGFzIGEgcmVmZXJlbmNlCi0JICogQHBhcmFtIGFkZGVkUGF0aCBUaGUgcGF0aCB0aGF0IHRoZSB3aXphcmQgc3VnZ2VzdHMgYXMgdGhlIHBhdGgKLQkgKiBAcmV0dXJuIFRoZSBydW50aW1lIHBhdGggdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHByb3BlcnRpZXMgcGFnZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UnVudGltZVBhdGgoSVZpcnR1YWxDb21wb25lbnQgYWRkZWRDb21wLCBTdHJpbmcgd2l6YXJkUGF0aCkgewotCQlyZXR1cm4gd2l6YXJkUGF0aDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlU2VsZWN0ZWRCdXR0b24oKSB7Ci0JCUlTZWxlY3Rpb24gc2VsID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYoIHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICkgewotCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiggbyBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KQotCQkJCW9iamVjdFRvUnVudGltZVBhdGgucmVtb3ZlKG8pOwotCQkJZWxzZSBpZiggbyBpbnN0YW5jZW9mIENvbXBvbmVudFJlc291cmNlUHJveHkpIAotCQkJCXJlc291cmNlTWFwcGluZ3MucmVtb3ZlKG8pOwotCQkJcmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFRhYmxlVmlld2VyIGNyZWF0ZUF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbnQgZmxhZ3MgPSBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJOwotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgZmxhZ3MpOwotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQotCQkvLyBzZXQgdXAgdGFibGUgbGF5b3V0Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg0MDAsIHRydWUpKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MDAsIHRydWUpKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldFNvcnRlcihudWxsKTsKLQotCQlUYWJsZUNvbHVtbiBibmRDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAwKTsKLQkJYm5kQ29sdW1uLnNldFRleHQoTWVzc2FnZXMuRGVwbG95UGF0aENvbHVtbik7Ci0JCWJuZENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gcHJvamVjdENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDEpOwotCQlwcm9qZWN0Q29sdW1uLnNldFRleHQoTWVzc2FnZXMuU291cmNlQ29sdW1uKTsKLQkJcHJvamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJdGFibGVMYXlvdXQubGF5b3V0KHRhYmxlLCB0cnVlKTsKLQkJcmV0dXJuIGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXI7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BoeXNpY2FsbHlBZGRlZChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJdHJ5IHsKLQkJCWNvbXBvbmVudC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGNoYW5nZXMsIHN1Y2ggYXMgYWRkaW5nIGEgcHJvamVjdAotCSAqIHJlZmVyZW5jZSwgYWRkaW5nIGEgbGliIHJlZmVyZW5jZSBldGMuCi0JICogCi0JICogSXQgd2lsbCByZXNldCB0aGUgaW5wdXQsIG1hbnVhbGx5IHJlLWFkZCBtaXNzaW5nIGVsZW1lbnRzLCBhbmQgZG8gb3RoZXIKLQkgKiB0YXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXJlc2V0VGFibGVVSSgpOwotCQlpZiAoIWhhc0luaXRpYWxpemVkKSB7Ci0JCQlpbml0aWFsaXplKCk7Ci0JCQlyZXNldFRhYmxlVUkoKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRUYWJsZVVJKCkgewotCQlJV29ya3NwYWNlUm9vdCBpbnB1dCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWludCBudW1saW5lcyA9IE1hdGgubWluKDEwLCBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkKLQkJCQkuZ2V0SXRlbUNvdW50KCkpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUhlaWdodCgpCi0JCQkJKiBudW1saW5lczsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCUdyaWREYXRhIGJ0bmRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0JCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlidXR0b25Db2x1bW4uc2V0TGF5b3V0RGF0YShidG5kYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSByb290Q29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcDsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrICkgeyAKLQkJCWNvbXAgPSByZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCVN0cmluZyBhcmNoaXZlTmFtZSA9IHJlZnNbaV0uZ2V0RGVwZW5kZW5jeVR5cGUoKSA9PSBEZXBlbmRlbmN5VHlwZS5DT05TVU1FUyA/IG51bGwgOiByZWZzW2ldLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQlTdHJpbmcgdmFsID0gKGFyY2hpdmVOYW1lICE9IG51bGwpID8gcmVmc1tpXS5nZXRSdW50aW1lUGF0aCgpLmFwcGVuZChhcmNoaXZlTmFtZSkudG9TdHJpbmcoKSA6IHJlZnNbaV0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpOwotCQkJb2JqZWN0VG9SdW50aW1lUGF0aC5wdXQoY29tcCwgdmFsKTsKLQkJCW9sZENvbXBvbmVudFRvUnVudGltZVBhdGgucHV0KGNvbXAsIHZhbCk7Ci0JCQlpZiggcmVmc1tpXS5nZXREZXBlbmRlbmN5VHlwZSgpID09IERlcGVuZGVuY3lUeXBlLkNPTlNVTUVTKQotCQkJCWNvbnN1bWVkUmVmZXJlbmNlcy5hZGQoY29tcCk7Ci0JCX0KLQotCQlDb21wb25lbnRSZXNvdXJjZVtdIGFsbE1hcHBpbmdzID0gZmluZEFsbE1hcHBpbmdzKCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgYWxsTWFwcGluZ3MubGVuZ3RoOyBpKysgKSB7Ci0JCQlyZXNvdXJjZU1hcHBpbmdzLmFkZChuZXcgQ29tcG9uZW50UmVzb3VyY2VQcm94eSgKLQkJCQkJYWxsTWFwcGluZ3NbaV0uZ2V0U291cmNlUGF0aCgpLCBhbGxNYXBwaW5nc1tpXS5nZXRSdW50aW1lUGF0aCgpCi0JCQkpKTsKLQkJfQotCQllZGl0UmVmZXJlbmNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWhhc0luaXRpYWxpemVkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kQWxsTWFwcGluZ3MoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgc3RydWN0dXJlRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJ1Y3R1cmVFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBzdHJ1Y3R1cmVFZGl0LmdldENvbXBvbmVudCgpOwotCQkJT2JqZWN0W10gYXJyID0gY29tcG9uZW50LmdldFJlc291cmNlcygpLnRvQXJyYXkoKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzdWx0ID0gbmV3IENvbXBvbmVudFJlc291cmNlW2Fyci5sZW5ndGhdOwotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKysgKQotCQkJCXJlc3VsdFtpXSA9IChDb21wb25lbnRSZXNvdXJjZSlhcnJbaV07Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdHJ1Y3R1cmVFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbXBvbmVudFJlc291cmNlW117fTsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIENvbXBvbmVudFJlc291cmNlUHJveHkgewotCQlwdWJsaWMgSVBhdGggc291cmNlLCBydW50aW1lUGF0aDsKLQkJcHVibGljIENvbXBvbmVudFJlc291cmNlUHJveHkoSVBhdGggc291cmNlLCBJUGF0aCBydW50aW1lUGF0aCkgewotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLnJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGg7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDbGVhbi11cCBtZXRob2RzIGFyZSBiZWxvdy4gVGhlc2UgaW5jbHVkZSBwZXJmb3JtQ2FuY2VsLCBwZXJmb3JtRGVmYXVsdHMsCi0JICogcGVyZm9ybU9LLCBhbmQgYW55IG90aGVyIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkICpvbmx5KiBieSB0aGlzIG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlUYWJsZSB0YWJsZSA9IG51bGw7Ci0JCWlmIChhdmFpbGFibGVDb21wb25lbnRzVmlld2VyICE9IG51bGwpIHsKLQkJCXRhYmxlID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUYWJsZSgpOwotCQl9Ci0JCWlmICh0YWJsZSA9PSBudWxsIHx8IHRhYmxlTGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsgCi0JCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5EaXNwb3NlLCB0YWJsZUxpc3RlbmVyKTsKLQkJdGFibGUucmVtb3ZlTGlzdGVuZXIoU1dULktleURvd24sIHRhYmxlTGlzdGVuZXIpOwotCQl0YWJsZS5yZW1vdmVMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCB0YWJsZUxpc3RlbmVyKTsKLQkJdGFibGUucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlSG92ZXIsIHRhYmxlTGlzdGVuZXIpOwotCX0KLQotCQotCQotCS8qCi0JICogVGhpcyBpcyB3aGVyZSB0aGUgT0sgd29yayBnb2VzLiBMb3RzIG9mIGl0LiBXYXRjaCB5b3VyIGhlYWQuCi0JICogeGlhbyB4aW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVIYW5kbGVDaGFuZ2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwb3N0SGFuZGxlQ2hhbmdlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXJlc3VsdCAmPSBzYXZlUmVzb3VyY2VDaGFuZ2VzKCk7Ci0JCXJlc3VsdCAmPSBzYXZlUmVmZXJlbmNlQ2hhbmdlcygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlUmVzb3VyY2VDaGFuZ2VzKCkgewotCQlyZW1vdmVBbGxSZXNvdXJjZU1hcHBpbmdzKCk7Ci0JCWFkZE5ld1Jlc291cmNlTWFwcGluZ3MoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGFkZE5ld1Jlc291cmNlTWFwcGluZ3MoKSB7Ci0JCUNvbXBvbmVudFJlc291cmNlUHJveHlbXSBwcm94aWVzID0gcmVzb3VyY2VNYXBwaW5ncy50b0FycmF5KG5ldyBDb21wb25lbnRSZXNvdXJjZVByb3h5W3Jlc291cmNlTWFwcGluZ3Muc2l6ZSgpXSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSByb290Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm94aWVzLmxlbmd0aDsgaSsrICkgewotCQkJdHJ5IHsKLQkJCQlyb290Rm9sZGVyLmdldEZvbGRlcihwcm94aWVzW2ldLnJ1bnRpbWVQYXRoKS5jcmVhdGVMaW5rKHByb3hpZXNbaV0uc291cmNlLCAwLCBudWxsKTsKLQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0JCQl9Ci0JCX0KLQkJcmVzb3VyY2VNYXBwaW5nc0NoYW5nZWQgPSBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlc291cmNlTWFwcGluZ3MoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQltb2R1bGVDb3JlLmdldENvbXBvbmVudCgpLmdldFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNhdmVSZWZlcmVuY2VDaGFuZ2VzKCkgewotCQkvLyBGaWxsIG91ciBkZWx0YSBsaXN0cwotCQlBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGFkZGVkID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4oKTsKLQkJQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiByZW1vdmVkID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4oKTsKLQkJQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjaGFuZ2VkID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4oKTsKLQotCQlJdGVyYXRvcjxJVmlydHVhbENvbXBvbmVudD4gaiA9IG9sZENvbXBvbmVudFRvUnVudGltZVBhdGgua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IGtleSwgdmFsOwotCQl3aGlsZSAoai5oYXNOZXh0KCkpIHsKLQkJCWtleSA9IGoubmV4dCgpOwotCQkJdmFsID0gb2xkQ29tcG9uZW50VG9SdW50aW1lUGF0aC5nZXQoa2V5KTsKLQkJCWlmKCAhb2JqZWN0VG9SdW50aW1lUGF0aC5jb250YWluc0tleShrZXkpKQotCQkJCXJlbW92ZWQuYWRkKChJVmlydHVhbENvbXBvbmVudClrZXkpOwotCQkJZWxzZSBpZiAoIXZhbC5lcXVhbHMob2JqZWN0VG9SdW50aW1lUGF0aC5nZXQoa2V5KSkpCi0JCQkJY2hhbmdlZC5hZGQoKElWaXJ0dWFsQ29tcG9uZW50KWtleSk7Ci0JCX0KLQotCQlqID0gb2JqZWN0VG9SdW50aW1lUGF0aC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoai5oYXNOZXh0KCkpIHsKLQkJCWtleSA9IGoubmV4dCgpOwotCQkJaWYgKCFvbGRDb21wb25lbnRUb1J1bnRpbWVQYXRoLmNvbnRhaW5zS2V5KGtleSkpCi0JCQkJYWRkZWQuYWRkKChJVmlydHVhbENvbXBvbmVudClrZXkpOwotCQl9Ci0KLQkJTnVsbFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJYm9vbGVhbiBzdWJSZXN1bHQgPSBwcmVIYW5kbGVDaGFuZ2VzKG1vbml0b3IpOwotCQlpZiggIXN1YlJlc3VsdCApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQloYW5kbGVEZWx0YXMocmVtb3ZlZCwgY2hhbmdlZCwgYWRkZWQpOwotCQlzdWJSZXN1bHQgJj0gcG9zdEhhbmRsZUNoYW5nZXMobW9uaXRvcik7Ci0JCQotCQkvLyBOb3cgdXBkYXRlIHRoZSB2YXJpYWJsZXMKLQkJb2xkQ29tcG9uZW50VG9SdW50aW1lUGF0aC5jbGVhcigpOwotCQlBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGtleXMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCQlrZXlzLmFkZEFsbChvYmplY3RUb1J1bnRpbWVQYXRoLmtleVNldCgpKTsKLQkJSXRlcmF0b3I8SVZpcnR1YWxDb21wb25lbnQ+IGkgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCB2YyA9IGkubmV4dCgpOwotCQkJU3RyaW5nIHBhdGggPSBvYmplY3RUb1J1bnRpbWVQYXRoLmdldCh2Yyk7Ci0JCQlvbGRDb21wb25lbnRUb1J1bnRpbWVQYXRoLnB1dCh2YywgcGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHN1YlJlc3VsdDsKLQl9Ci0JCi0JLy8gU3ViY2xhc3MgY2FuIG92ZXJyaWRlIGlmIGl0IGhhcyBhIGdvb2Qgd2F5IHRvIGhhbmRsZSBjaGFuZ2VkIGVsZW1lbnRzCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGVsdGFzKEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4gcmVtb3ZlZCwgCi0JCQlBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNoYW5nZWQsIEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4gYWRkZWQpIHsKLQkJQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiByZW1vdmVkMiA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0JCUFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4gYWRkZWQyID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4oKTsKLQkJcmVtb3ZlZDIuYWRkQWxsKHJlbW92ZWQpOwotCQlyZW1vdmVkMi5hZGRBbGwoY2hhbmdlZCk7Ci0JCWFkZGVkMi5hZGRBbGwoYWRkZWQpOwotCQlhZGRlZDIuYWRkQWxsKGNoYW5nZWQpOwotCi0JCS8vIG1lbGQgdGhlIGNoYW5nZWQgaW50byB0aGUgYWRkZWQgLyByZW1vdmVkIGZvciBsZXNzIGVmZmljaWVuY3kgOykgCi0JCS8vIGJhc2ljYWxseSB3ZSBsYWNrICJjaGFuZ2UiIG9wZXJhdGlvbnMgYW5kIG9ubHkgaGF2ZSBhZGQgLyByZW1vdmUKLQkJaGFuZGxlUmVtb3ZlZChyZW1vdmVkMik7Ci0JCWhhbmRsZUFkZGVkKGFkZGVkMik7Ci0JfQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmVkKEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4gcmVtb3ZlZCkgewotCQkvLyBJZiBpdCdzIHJlbW92ZWQgaXQgc2hvdWxkICpvbmx5KiBiZSBhIHZpcnR1YWwgY29tcG9uZW50IGFscmVhZHkKLQkJaWYocmVtb3ZlZC5pc0VtcHR5KCkpIHJldHVybjsKLQkJZmluYWwgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4oKTsKLQkJSXRlcmF0b3I8SVZpcnR1YWxDb21wb25lbnQ+IGkgPSByZW1vdmVkLml0ZXJhdG9yKCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IG87Ci0JCXdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0JCQlvID0gaS5uZXh0KCk7Ci0JCQljb21wb25lbnRzLmFkZChvKTsKLQkJfQotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJCQlyZW1vdmVDb21wb25lbnRzKGNvbXBvbmVudHMpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gZSApIHsKLQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50cyhBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IHJlbW92ZWQpIHsKLQkJSXRlcmF0b3I8SVZpcnR1YWxDb21wb25lbnQ+IGkgPSByZW1vdmVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0JCQlyZW1vdmVPbmVDb21wb25lbnQoaS5uZXh0KCkpOwotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU9uZUNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCXRyeSB7Ci0JCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGdldFJlbW92ZUNvbXBvbmVudE9wZXJhdGlvbihjb21wKTsKLQkJCW9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQl9IGNhdGNoKCBFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldFJlbW92ZUNvbXBvbmVudE9wZXJhdGlvbihJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJU3RyaW5nIHBhdGgsIGFyY2hpdmVOYW1lOwotCQlwYXRoID0gYXJjaGl2ZU5hbWUgPSBudWxsOwotCQkKLQkJaWYoICFjb25zdW1lZFJlZmVyZW5jZXMuY29udGFpbnMoY29tcG9uZW50KSkgewotCQkJcGF0aCA9IG5ldyBQYXRoKG9sZENvbXBvbmVudFRvUnVudGltZVBhdGguZ2V0KGNvbXBvbmVudCkpLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCQkJYXJjaGl2ZU5hbWUgPSBuZXcgUGF0aChvbGRDb21wb25lbnRUb1J1bnRpbWVQYXRoLmdldChjb21wb25lbnQpKS5sYXN0U2VnbWVudCgpOyAKLQkJfSBlbHNlIHsKLQkJCXBhdGggPSBvbGRDb21wb25lbnRUb1J1bnRpbWVQYXRoLmdldChjb21wb25lbnQpOwotCQl9Ci0JCUlEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciA9IGdldFJlbW92ZVJlZmVyZW5jZURhdGFNb2RlbFByb3ZpZGVyKGNvbXBvbmVudCk7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChwcm92aWRlcik7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCByb290Q29tcG9uZW50KTsKLQkJTGlzdDxJVmlydHVhbENvbXBvbmVudD4gbW9kSGFuZGxlc0xpc3QgPSAoTGlzdDxJVmlydHVhbENvbXBvbmVudD4pIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQltb2RIYW5kbGVzTGlzdC5hZGQoY29tcG9uZW50KTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIHBhdGgpOwotCQlNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4gdXJpTWFwID0gbmV3IEhhc2hNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4oKTsKLQkJdXJpTWFwLnB1dChjb21wb25lbnQsIGFyY2hpdmVOYW1lKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVAsIHVyaU1hcCk7Ci0JCXJldHVybiBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0UmVtb3ZlUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiBuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZChBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNoYW5nZWQpIHsKLQkJSXRlcmF0b3I8SVZpcnR1YWxDb21wb25lbnQ+IGkgPSBjaGFuZ2VkLml0ZXJhdG9yKCk7IAotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZjsKLQkJSVBhdGggcDsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCWNvbXBvbmVudCA9IGkubmV4dCgpOwotCQkJcmVmID0gcm9vdENvbXBvbmVudC5nZXRSZWZlcmVuY2UoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCQlwID0gbmV3IFBhdGgob2JqZWN0VG9SdW50aW1lUGF0aC5nZXQoY29tcG9uZW50KSk7Ci0JCQlyZWYuc2V0UnVudGltZVBhdGgocCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkZWQoQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBhZGRlZCkgewotCQlmaW5hbCBBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCQlJdGVyYXRvcjxJVmlydHVhbENvbXBvbmVudD4gaSA9IGFkZGVkLml0ZXJhdG9yKCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IG87Ci0JCXdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0JCQlvID0gaS5uZXh0KCk7Ci0JCQljb21wb25lbnRzLmFkZChvKTsKLQkJfQotCQkKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCQkJYWRkQ29tcG9uZW50cyhjb21wb25lbnRzKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKSB7Ci0JCQlNb2R1bGVDb3JlVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50cyhBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSXRlcmF0b3I8SVZpcnR1YWxDb21wb25lbnQ+IGkgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0JCQlhZGRPbmVDb21wb25lbnQoaS5uZXh0KCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0QWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiBuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE9uZUNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBhdGgsIGFyY2hpdmVOYW1lOwotCQlwYXRoID0gbmV3IFBhdGgob2JqZWN0VG9SdW50aW1lUGF0aC5nZXQoY29tcG9uZW50KSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCWFyY2hpdmVOYW1lID0gbmV3IFBhdGgob2JqZWN0VG9SdW50aW1lUGF0aC5nZXQoY29tcG9uZW50KSkubGFzdFNlZ21lbnQoKTsKLQotCQlJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcihjb21wb25lbnQpOwotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwocHJvdmlkZXIpOwotCQkKLQkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHJvb3RDb21wb25lbnQpOwotCQlkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBBcnJheXMuYXNMaXN0KGNvbXBvbmVudCkpOwotCQkKLQkJLy9bQnVnIDIzODI2NF0gdGhlIHVyaSBtYXAgbmVlZHMgdG8gYmUgbWFudWFsbHkgc2V0IGNvcnJlY3RseQotCQlNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4gdXJpTWFwID0gbmV3IEhhc2hNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4oKTsKLQkJdXJpTWFwLnB1dChjb21wb25lbnQsIGFyY2hpdmVOYW1lKTsKLQkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVAsIHVyaU1hcCk7Ci0gICAgICAgIGRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSCwgcGF0aCk7Ci0KLQkJSVN0YXR1cyBzdGF0ID0gZG0udmFsaWRhdGVQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJaWYgKHN0YXQgIT0gT0tfU1RBVFVTKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdCk7Ci0JCXRyeSB7Ci0JCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmKCFhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpKQotCQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5yZWZyZXNoKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlSGFuZGxlciBnZXRNb2R1bGVIYW5kbGVyKCkgewotCQlpZihtb2R1bGVIYW5kbGVyID09IG51bGwpCi0JCQltb2R1bGVIYW5kbGVyID0gbmV3IERlZmF1bHRNb2R1bGVIYW5kbGVyKCk7Ci0JCXJldHVybiBtb2R1bGVIYW5kbGVyOwotCX0KLQkKLS8vCS8qKgotLy8JICogW0J1ZyAyMzgyNjRdCi0vLwkgKiBkZXRlcm1pbmVzIGEgdW5pcXVlIFVSSSBtYXBwaW5nIG5hbWUgZm9yIGEgZ2l2ZW4gY29tcG9uZW50Ci0vLwkgKiB0aGlzIGlzIGluIGNhc2UgdHdvIGNvbXBvbmVudHMgaGF2ZSB0aGUgc2FtZSBuYW1lLgotLy8JICogCi0vLwkgKiBAcmV0dXJuIHJldHVybnMgYSB2YWxpZCAobm9uZSBkdXBsaWNhdGUpIHVyaSBtYXBwaW5nIG5hbWUgZm9yIHRoZSBnaXZlbiBjb21wb25lbnRcCi0vLwkgKi8KLS8vCXByaXZhdGUgU3RyaW5nIGdldFVSSU1hcHBpbmdOYW1lKElWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUpIHsKLS8vCQkKLS8vCQkvL2dldCB0aGUgZGVmYXVsdCB1cmkgbWFwIG5hbWUgZm9yIHRoZSBnaXZlbiBhcmNoaXZlCi0vLwkJSVBhdGggY29tcG9uZW50UGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGFyY2hpdmUuZ2V0TmFtZSgpKTsKLS8vCQlTdHJpbmcgdXJpTWFwTmFtZSA9IGNvbXBvbmVudFBhdGgubGFzdFNlZ21lbnQoKS5yZXBsYWNlKCcgJywgJ18nKTsKLS8vCQkKLS8vCQkKLS8vCQkvL2NoZWNrIHRvIGJlIHN1cmUgdGhpcyB1cmkgbWFwcGluZyBpcyBub3QgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciByZWZlcmVuY2UKLS8vCQlib29sZWFuIGR1cGVBcmNoaXZlTmFtZTsKLS8vCQlTdHJpbmcgcmVmZWRDb21wTmFtZTsKLS8vCQlpbnQgbGFzdERvdEluZGV4OwotLy8JCVN0cmluZyBpbmNyZW1lbnQ7Ci0vLwkJSVZpcnR1YWxSZWZlcmVuY2UgW10gZXhpc3RpbmdSZWZzID0gcm9vdENvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0vLwkJZm9yKGludCBpPTA7aTxleGlzdGluZ1JlZnMubGVuZ3RoO2krKyl7Ci0vLwkJCXJlZmVkQ29tcE5hbWUgPSBleGlzdGluZ1JlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKTsKLS8vCQkJCi0vLwkJCS8vaWYgdXJpIG1hcHBpbmcgbmFtZXMgb2YgdGhlIHJlZmVkIGNvbXBvbmVudCBhbmQgdGhlIGdpdmVuIGFyY2hpdmUgYXJlIHRoZSBzYW1lCi0vLwkJCS8vICBmaW5kIGEgbmV3IHVyaSBtYXAgbmFtZSBmb3IgdGhlIGdpdmVuIGFyY2hpdmUKLS8vCQkJaWYoZXhpc3RpbmdSZWZzW2ldLmdldEFyY2hpdmVOYW1lKCkuZXF1YWxzKHVyaU1hcE5hbWUpKXsKLS8vCQkJCWR1cGVBcmNoaXZlTmFtZSA9IHRydWU7Ci0vLwkJCQkvL2ZpbmQgYSBuZXcgdXJpTWFwTmFtZSBmb3IgdGhlIGdpdmVuIGNvbXBvbmVudAotLy8JCQkJZm9yKGludCBqPTE7IGR1cGVBcmNoaXZlTmFtZTsgaisrKXsKLS8vCQkJCQlsYXN0RG90SW5kZXggPSB1cmlNYXBOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0vLwkJCQkJaW5jcmVtZW50ID0gIl8iK2o7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkKLS8vCQkJCQkvL2NyZWF0ZSB0aGUgbmV3IHBvdGVudGlhbCBuYW1lCi0vLwkJCQkJaWYobGFzdERvdEluZGV4ICE9IC0xKXsKLS8vCQkJCQkJdXJpTWFwTmFtZSA9IHVyaU1hcE5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3RJbmRleCkgKyBpbmNyZW1lbnQgKyB1cmlNYXBOYW1lLnN1YnN0cmluZyhsYXN0RG90SW5kZXgpOwotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCXVyaU1hcE5hbWUgPSB1cmlNYXBOYW1lLnN1YnN0cmluZygwKStpbmNyZW1lbnQ7Ci0vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJCS8vZGV0ZXJtaW5lIGlmIHRoZSBuZXcgcG90ZW50aWFsIG5hbWUgaXMgdmFsaWQKLS8vCQkJCQlmb3IoaW50IGs9MDsgazxleGlzdGluZ1JlZnMubGVuZ3RoOyBrKyspIHsKLS8vCQkJCQkJZHVwZUFyY2hpdmVOYW1lID0gZXhpc3RpbmdSZWZzW2tdLmdldEFyY2hpdmVOYW1lKCkuZXF1YWxzKHVyaU1hcE5hbWUpOwotLy8JCQkJCQlpZihkdXBlQXJjaGl2ZU5hbWUpIHsKLS8vCQkJCQkJCWJyZWFrOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCXJldHVybiB1cmlNYXBOYW1lOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL0lEZXBlbmRlbmN5UGFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMmZkNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci0KLS8qKgotICogU3VnZ2VzdGVkIHVzZSBjYXNlIG9mIHRoaXMgY2xhc3MgaXMgYXMgZm9sbG93czoKLSAqIAotICogCQlwcm92aWRlciA9IERlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvdmlkZXIoZmFjZXRlZFByb2plY3QpOwotICoJCWlmKCBwcm92aWRlciAhPSBudWxsICkgewotICoJCQljb250cm9scyA9IHByb3ZpZGVyLmNyZWF0ZVBhZ2VzKGZhY2V0ZWRQcm9qZWN0LCB0aGlzKTsKLSAqCQkJQ29tcG9zaXRlIHJvb3QgPSBwcm92aWRlci5jcmVhdGVSb290Q29udHJvbChjb250cm9scywgcGFyZW50KTsKLSAqCQl9Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHBhZ2UgcHJvdmlkZXIga25vd3MgaG93IHRvIAotCSAqIGhhbmRsZSB0aGUgZ2l2ZW4gZmFjZXRlZCBwcm9qZWN0LCBmYWxzZSBvdGhlcndpc2UKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwcm92aWRlciBjYW4gaGFuZGxlIGl0LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGUoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHBhZ2UgY29udHJvbCBvYmplY3RzIHdoaWNoIHNob3VsZCBiZQotCSAqIHByZXNlbnRlZCB0byB0aGUgdXNlciBmb3IgdGhpcyBwcm9qZWN0IHR5cGUuIAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2xbXSBjcmVhdGVQYWdlcyhJRmFjZXRlZFByb2plY3QgcHJvamVjdCwgTW9kdWxlQXNzZW1ibHlSb290UGFnZSBwYXJlbnQpOwotCQotCS8qKgotCSAqIFR1cm4gdGhpcyBhcnJheSBvZiBwYWdlcyAvIGNvbnRyb2xzIGludG8gb25lIHJvb3QgY29udHJvbAotCSAqIHRoYXQgY2FuIGJlIHJldHVybmVkIHRvIHRoZSBQcm9wZXJ0aWVzIFBhZ2UgY29udGFpbmVyLiAKLQotCSAqIEBwYXJhbSBwYWdlcwotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVSb290Q29udHJvbChJRmFjZXRlZFByb2plY3QgcHJvamVjdCwgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2xbXSBwYWdlcywgQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHBhZ2UgdGl0bGUgc3RyaW5nIG9yIG51bGwgaWYgZGVmYXVsdCB0aXRsZSBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGl0bGUoSVByb2plY3QgcHJvamVjdCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9JTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlYmY5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9JTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBvbmUgY29udHJvbCB3aGljaCBtYXkgYmUgcHJlc2VudCBvbiBhIHBhZ2UKLSAqIGFuZCByZXF1aXJlcyB0byBsaXN0ZW4gaW4gdG8gdGhlIHNwZWNpZmljIGxpZmVjeWNsZSAKLSAqIGV2ZW50cyBvZiB0aGUgcGFnZS4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2wgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIENvbXBvc2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250cm9sLgotCSAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IENvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIENvbXBvc2l0ZSBmb3IgdGhlIGNvbnRyb2wuCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwcm9wZXJ0eSBwYWdlJ3MgPGNvZGU+cGVyZm9ybU9rKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gcGVyZm9ybU9rKCk7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHByb3BlcnR5IHBhZ2UncyA8Y29kZT5wZXJmb3JtRGVmYXVsdHMoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0Jdm9pZCBwZXJmb3JtRGVmYXVsdHMoKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHJvcGVydHkgcGFnZSdzIDxjb2RlPnBlcmZvcm1DYW5jZWwoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCk7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHByb3BlcnR5IHBhZ2UncyA8Y29kZT5zZXRWaXNpYmxlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCi0JICogQHJldHVybgotCSAqLwotCXZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpOwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwcm9wZXJ0eSBwYWdlJ3MgPGNvZGU+ZGlzcG9zZSgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL0lSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL0lSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmYTdhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UID0gImRlcGVuZGVuY3kuY29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9QQVRIID0gImRlcGVuZGVuY3kuY29tcG9uZW50LnBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVCA9ICJyb290LnByb2plY3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9DT01QT05FTlQgPSAicm9vdC5jb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DWV9UWVBFID0gImRlcGVuZGVuY3kudHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVIQU5ETEVSID0gIm1vZHVsZS5oYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvTW9kdWxlQXNzZW1ibHlSb290UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvTW9kdWxlQXNzZW1ibHlSb290UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmYyZWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL01vZHVsZUFzc2VtYmx5Um9vdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkRlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogUHJpbWFyeSBwcm9qZWN0IHByb3BlcnR5IHBhZ2UgZm9yIE1vZHVsZSBhc3NlbWJseTsKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUFzc2VtYmx5Um9vdFBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sW10gY29udHJvbHMgPSBuZXcgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2xbMF07Ci0JCi0JcHVibGljIE1vZHVsZUFzc2VtYmx5Um9vdFBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGdldEZhY2V0RXJyb3JDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBTdHJpbmcgZXJyb3JDaGVja2luZ0ZhY2V0ID0gTWVzc2FnZXMuRXJyb3JDaGVja2luZ0ZhY2V0czsKLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yQ2hlY2tpbmdGYWNldCk7Ci0JCXJldHVybiBnZXRFcnJvckNvbXBvc2l0ZShwYXJlbnQsIGVycm9yQ2hlY2tpbmdGYWNldCk7CQkKLQl9Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZ2V0VmlydENvbXBFcnJvckNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIFN0cmluZyBlcnJvckNoZWNraW5nRmFjZXQgPSBNZXNzYWdlcy5FcnJvck5vdFZpcnR1YWxDb21wb25lbnQ7Ci0JCXNldEVycm9yTWVzc2FnZShlcnJvckNoZWNraW5nRmFjZXQpOwotCQlyZXR1cm4gZ2V0RXJyb3JDb21wb3NpdGUocGFyZW50LCBlcnJvckNoZWNraW5nRmFjZXQpOwkJCi0JfQotCQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGdldEVycm9yQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFN0cmluZyBlcnJvcikgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJZmluYWwgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZmluYWwgTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChlcnJvcik7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udHJvbHNbaV0gIT0gbnVsbCkgewotCQkJCWlmICghY29udHJvbHNbaV0ucGVyZm9ybU9rKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udHJvbHNbaV0gIT0gbnVsbCkgewotCQkJCWNvbnRyb2xzW2ldLnBlcmZvcm1EZWZhdWx0cygpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1DYW5jZWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjb250cm9sc1tpXS5wZXJmb3JtQ2FuY2VsKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybUNhbmNlbCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udHJvbHNbaV0gIT0gbnVsbCkgewotCQkJCWNvbnRyb2xzW2ldLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGNvbnRyb2xzW2ldICE9IG51bGwpewotCQkJCWNvbnRyb2xzW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjcmVhdGVEZXNjcmlwdGlvbkNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJQ29tcG9zaXRlIGRlc2NyaXB0aW9uQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlkZXNjcmlwdGlvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRlc2NyaXB0aW9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZmlsbERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uQ29tcCwgZGVzY3JpcHRpb24pOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxEZXNjcmlwdGlvbihDb21wb3NpdGUgYywgU3RyaW5nIHMpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDI1MDsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoYywgU1dULlJFQURfT05MWSB8IFNXVC5XUkFQKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0ZXh0LnNldFRleHQocyk7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCS8vIE5lZWQgdG8gZmluZCBvdXQgd2hhdCB0eXBlIG9mIHByb2plY3Qgd2UgYXJlIGhhbmRsaW5nCi0JCXByb2plY3QgPSAoSVByb2plY3QpIGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCWlmKCBwcm9qZWN0ICE9IG51bGwgKSB7Ci0JCQl0cnkgewotCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsgCi0JCQkJSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQkJCWlmKCBmYWNldGVkUHJvamVjdCA9PSBudWxsICkKLQkJCQkJcmV0dXJuIGdldEZhY2V0RXJyb3JDb21wb3NpdGUocGFyZW50KTsKLQkJCQkKLQkJCQlwcm92aWRlciA9IERlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvdmlkZXIoZmFjZXRlZFByb2plY3QpOwotCQkJCWlmKCBwcm92aWRlciAhPSBudWxsICkgewotCQkJCQljb250cm9scyA9IHByb3ZpZGVyLmNyZWF0ZVBhZ2VzKGZhY2V0ZWRQcm9qZWN0LCB0aGlzKTsKLQkJCQkJY29udHJvbHMgPSBjb250cm9scyA9PSBudWxsID8gbmV3IElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sW117fSA6IGNvbnRyb2xzOwotCQkJCQlpZiAocHJvdmlkZXIuZ2V0UGFnZVRpdGxlKHByb2plY3QpICE9IG51bGwpCi0JCQkJCQlzZXRUaXRsZShwcm92aWRlci5nZXRQYWdlVGl0bGUocHJvamVjdCkpOwotCQkJCQlyZXR1cm4gcHJvdmlkZXIuY3JlYXRlUm9vdENvbnRyb2woZmFjZXRlZFByb2plY3QsIGNvbnRyb2xzLCBwYXJlbnQpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiggQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCkgPT0gbnVsbCApCi0JCQkJCXJldHVybiBnZXRWaXJ0Q29tcEVycm9yQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQkJCi0JCQkJQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UgcGFnZSA9IG5ldyBBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZShwcm9qZWN0LCB0aGlzKTsKLQkJCQljb250cm9scyA9IG5ldyBJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbFsxXTsKLQkJCQljb250cm9sc1swXSA9IHBhZ2U7Ci0JCQkJcmV0dXJuIHBhZ2UuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKQl7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEZhY2V0RXJyb3JDb21wb3NpdGUocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDgzODM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtc2VhcmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y3OWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXVpLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1NTdlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODMwMzg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jTW9uIEphbiAzMCAyMzo0MTo1OCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTZhNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gSmFuIDMwIDIzOjExOjQ5IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlNzA4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjUwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9nczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5uYXZpZ2F0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vyczt4LWludGVybmFsOj10cnVlCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDsgdmVyc2lvbj0iMy44IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL1JFQURNRS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjOTNkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVVJIFV0aWxpdHkgY2xhc3NlcyBmb3IgYWN0aW9ucywgZHJhZyduJ2Ryb3AgYW5kIHdpemFyZHMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2YTg2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHNyYy1zZWFyY2gvCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDljY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIgotCW5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24iPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQkKLTwhLS0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL2NvbW1vbi9vdmVydmlldy5odG1sIiAvPiAtLT4KLQotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnZpZXdlcnMiPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlNlbGVjdFNpbmdsZUZpbGVWaWV3IiAvPiAgLS0+ICA8IS0tID8sIGRvZXMgZWNsaXBzZSBwcm92aWRlIGJldHRlciBzdXBwb3J0PyAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlJlc291cmNlRmlsdGVyIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlNlbGVjdE11bHRpRmlsZVBhZ2UiIC8+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iU2VsZWN0U2luZ2xlRmlsZVBhZ2UiIC8+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iVGFibGVOYXZpZ2F0b3IiIC8+IC0tPiAgICAgICA8IS0tIE5vLCBzaG91bGQgYmUgaW4gZWNsaXBzZSBiYXNlIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iTmF2aWdhYmxlVGFibGVWaWV3ZXIiIC8+IC0tPiA8IS0tIE5vLCBzaG91bGQgYmUgaW4gZWNsaXBzZSBiYXNlIC0tPgotPCEtLQk8L3BhY2thZ2U+IC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmFjdGlvbmhhbmRsZXIuYWN0aW9uIj4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJDdXRBY3Rpb24iIC8+ICAtLT4gICAgPCEtLSBObyB0byB0aGVzZSBmb3VyLCAgc2hvdWxkIGJlIHJlbW92ZWQ/IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iUGFzdGVBY3Rpb24iIC8+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iQ29weUFjdGlvbiIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iRWRpdEFjdGlvbiIgLz4gLS0+Ci08IS0tCTwvcGFja2FnZT4gIC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIj4gLS0+Ci08IS0tICAJPHR5cGUgbmFtZT0iVUlQbHVnaW4iIC8+ICAtLT4gICAgPCEtLSBObywgZGVsZXRlIHRoaXMgLS0+Ci08IS0tIAk8dHlwZSBuYW1lPSJPdmVybGF5SWNvbk1hbmFnZXIiIC8+ICAtLT4gPCEtLSAgTm8gLS0+Ci08IS0tICAJPHR5cGUgbmFtZT0iV2luZG93VXRpbGl0eSIgLz4gIC0tPiAgIDwhLS0gUmVtb3ZlIGNsYXNzLCBjbGVhbiB1cCB4c2QudWkgLS0+Ci08IS0tICAgIDx0eXBlIG5hbWU9IkltYWdlRmFjdG9yeSIgLz4gIC0tPiAgIDwhLS0gTm8gLS0+Ci08IS0tCTwvcGFja2FnZT4gLS0+Ci08IS0tCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkud2l6YXJkcyI+ICAtLT4KLTwhLS0gIAkJPHR5cGUgbmFtZT0iRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiIgLz4gIC0tPiAgPCEtLSByZWZlcmVuY2VkIGV4dGVybmFsbHkgb25seSB3aXRoaW4gcGFja2FnZSAoRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UgLS0+Ci08IS0tIAkJPHR5cGUgbmFtZT0iRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UiIC8+IC0tPiA8IS0tIHJlZmVyZW5jZWQgZXh0ZXJuYWxseSBvbmx5IHdpdGhpbiBwYWNrYWdlIChFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLCBhbmQgT3BlcmF0aW9uIC0tPgotPCEtLSAgCQk8dHlwZSBuYW1lPSJFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIiAvPiAgLS0+IDwhLS0gcmVmZXJlbmNlZCBieSBYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLCB3aGljaCBpcyBkZXByZWNhdGVkIGFuZCBnb2luZyB0byBiZSByZW1vdmVkIGluIE00ICAtLT4KLTwhLS0JPC9wYWNrYWdlPiAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5kbmQiPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlZpZXdlckRyb3BBZGFwdGVyIiAvPiAgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJEcmFnQW5kRHJvcENvbW1hbmQiIC8+IC0tPiAgPCEtLSByZWZlcmVuY2VkIGV4dGVybmFsbHkgb25seSB3aXRoaW4gcGFja2FnZSAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkRyYWdBbmREcm9wTWFuYWdlciIgLz4gLS0+ICA8IS0tICAgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJPYmplY3RUcmFuc2ZlciIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iVmlld2VyRHJhZ0FkYXB0ZXIiIC8+IC0tPgotPCEtLQk8L3BhY2thZ2U+ICAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5yZXNvdXJjZSI+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iUmVzb3VyY2VEZWxldGVMaXN0ZW5lciIgLz4gIC0tPiAgPCEtLSBubyByZWZlcmVuY2VzIC0tPgotPCEtLQk8L3BhY2thZ2U+IC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmRpYWxvZ3MiPiAgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIiAvPiAgLS0+ICAgIDwhLS0gTm8sIHNob3VsZCBsb29rIGludG8gYmFzZSBmb3Igc3VwcG9ydD8gLS0+Ci08IS0tCTwvcGFja2FnZT4gIC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmFjdGlvbmhhbmRsZXIiPgotCQk8dHlwZSBuYW1lPSJBY3Rpb25IYW5kbGVyTGlzdGVuZXIiIC8+Ci0JPC9wYWNrYWdlPgotLS0+Ci08IS0tIHByb3Zpc2lvbmFsIEFQSXMgLS0+Ci08IS0tCi0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciI+Ci0JCTx0eXBlIG5hbWU9IlVSSVJlc29sdmVyUGx1Z2luIiAgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iVVJJUmVzb2x2ZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iVVJJUmVzb2x2ZXJFeHRlbnNpb24iIGltcGxlbWVudD0idHJ1ZSIvPgotCTwvcGFja2FnZT4KLS0tPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL2NvbGxhcHNlQWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9jb2xsYXBzZUFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZGZmZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL2NvbGxhcHNlQWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9leHBhbmRBbGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL2V4cGFuZEFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTk0MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL2V4cGFuZEFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvc2F2ZWFzX3dpei5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvc2F2ZWFzX3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjNkMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3NhdmVhc193aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3RzZWFyY2hfZHBkbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3RzZWFyY2hfZHBkbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGEyMWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhMmYzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotISBQbHVnaW4gcHJvcGVydGllcwotcGx1Z2luTmFtZSAgICAgICAgICAgICAgID0gRWNsaXBzZSBCYXNlIFVJIGV4dGVuc2lvbnMKLXBsdWdpblByb3ZpZGVyICAgICAgICAgICA9IEVjbGlwc2Uub3JnCi0KLSEgU2VsZWN0U2luZ2xlRmlsZVBhZ2UgYW5kIFNlbGVjdE11bHRpRmlsZVBhZ2UKLV9VSV9MQUJFTF9TT1VSQ0VfRklMRVMgICA9IFdvcmtzcGFjZSBGaWxlcwotX1VJX0xBQkVMX1NFTEVDVEVEX0ZJTEVTID0gU2VsZWN0ZWQgRmlsZXMKLV9VSV9QT1BVUF9FWFBBTkRfQUxMCSA9IEV4cGFuZCBBbGwKLV9VSV9QT1BVUF9DT0xMQVBTRV9BTEwJID0gQ29sbGFwc2UgQWxsCi0JCi1fVUlfSU1QT1JUX0JVVFRPTiAgICAgICAgICA9IEltcG9ydCBGaWxlcy4uLgotX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVAgPSBJbXBvcnQgZmlsZXMgZnJvbSBmaWxlIHN5c3RlbQotCi0KLSEgU2VsZWN0TXVsdGlGaWxlUGFnZQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IHRoZSBmb2xsb3dpbmcgdGhyZWUgbGluZXMgcmVmZXJzIHRvIF9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyBsYWJlbCBhYm92ZQotX1VJX0FERF9CVVRUT05fVE9PTF9USVAgICAgPSBBZGQgZmlsZXMgdG8gU2VsZWN0ZWQgRmlsZXMgbGlzdC4KLV9VSV9SRU1PVkVfQlVUVE9OX1RPT0xfVElQID0gUmVtb3ZlIGZpbGVzIGZyb20gU2VsZWN0ZWQgRmlsZXMgbGlzdC4KLV9VSV9SRU1PVkVfQUxMX0JVVFRPTl9UT09MX1RJUCA9ICBSZW1vdmUgYWxsIGZpbGVzIGZyb20gU2VsZWN0ZWQgRmlsZXMgbGlzdC4KLQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IE5vIHRyYW5zbGF0aW9uIG5lZWRlZCBvZiBmb2xsb3dpbmcgdGhyZWUgbGluZXMKLV9VSV9BRERfQlVUVE9OICAgICAgICAgICAgID0gPgotX1VJX1JFTU9WRV9CVVRUT04gICAgICAgICAgPSA8Ci1fVUlfUkVNT1ZFX0FMTF9CVVRUT04gICAgICA9IDw8Ci0KLSEgU2VsZWN0SmF2YVByb2plY3RWaWV3Ci1fVUlfTEFCRUxfQ0hPT1NFX0ZPTERFUiA9IFNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyOgotCi0hIFNlbGVjdEphdmFQcm9qZWN0RGlhbG9nCi1fVUlfTEFCRUxfRk9MREVSX1NFTEVDVElPTiA9IENvbnRhaW5lciBTZWxlY3Rpb24KLQotISBUZXh0Vmlld2VyT3BlcmF0aW9uQWN0aW9uCi1fVUlfTUVOVV9DT1BZICAgICAgICAgPSAmQ29weQotX1VJX01FTlVfQ1VUICAgICAgICAgID0gQ3UmdAotX1VJX01FTlVfREVMRVRFICAgICAgID0gRGVsZXRlCi1fVUlfTUVOVV9QQVNURSAgICAgICAgPSAmUGFzdGUKLV9VSV9NRU5VX1BSRUZJWCAgICAgICA9IFByZWZpeAotX1VJX01FTlVfUkVETyAgICAgICAgID0gUmVkbwotX1VJX01FTlVfU0VMRUNUX0FMTCAgID0gU2VsZWN0IEFsbAotX1VJX01FTlVfU0hJRlRfTEVGVCAgID0gU2hpZnQgTGVmdAotX1VJX01FTlVfU0hJRlRfUklHSFQgID0gU2hpZnQgUmlnaHQKLV9VSV9NRU5VX1NUUklQX1BSRUZJWCA9IFN0cmlwIFByZWZpeAotX1VJX01FTlVfVU5ETyAgICAgICAgID0gVW5kbwotCi0hIFNvdXJjZVZpZXdlckdvdG9MaW5lQWN0aW9uCi1fVUlfTUVOVV9HT1RPX0xJTkUgICAgICAgICAgID0gR28gVG8gTGluZS4uLgotX1VJX0dPVE9fTElORV9ESUFMT0dfVElUTEUgICA9IEdvIFRvIExpbmUKLV9VSV9HT1RPX0xJTkVfRElBTE9HX1RFWFQgICAgPSBFbnRlciBMaW5lIE51bWJlcgotCi1fVUlfRklMRV9DSEFOR0VEX1RJVExFID0gRmlsZSBDaGFuZ2VkCi1fVUlfRklMRV9ERUxFVEVEX1NBVkVfQ0hBTkdFUyA9IFRoZSBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIHNhdmUgeW91ciBjaGFuZ2VzIG9yIGNsb3NlIHRoZSBlZGl0b3Igd2l0aG91dCBzYXZpbmc/Ci1fVUlfRklMRV9ERUxFVEVEX0VESVRPUl9DTE9TRUQgPSBUaGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBUaGlzIGVkaXRvciB3aWxsIGJlIGNsb3NlZC4KLV9VSV9GSUxFX0NIQU5HRURfTE9BRF9DSEFOR0VTID0gVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci1fVUlfU0FWRV9CVVRUT04gPSBTYXZlCi1fVUlfQ0xPU0VfQlVUVE9OID0gQ2xvc2UKLQotCi0hIFhTTCBQcmVmZXJlcmVuY2UKLV9VSV9YU0xUX1NFTEVDVCAgICAgPSBTZWxlY3Qgd2hpY2ggZWxlbWVudCB0byB1c2UgZm9yIHlvdXIgc3R5bGVzaGVldAotX1VJX1hTTFRfU1RZTEVTSEVFVCA9ICZVc2UgPHhzbDpzdHlsZXNoZWV0PgotX1VJX1hTTFRfVFJBTlNGT1JNICA9IFUmc2UgPHhzbDp0cmFuc2Zvcm0+Ci0KLSEgWFNMIERlYnVnIFByZWZlcmVyZW5jZQotX1VJX1hTTF9ERUJVR19TRUxFQ1RfTEFVTkNIRVIgPSBTZXQgdGhlIGRlZmF1bHQgWFNMIGxhdW5jaGVyIGZvciB0aGUgWFNMIERlYnVnZ2luZyBhbmQgVHJhbnNmb3JtYXRpb24gdG9vbAotX1VJX1hTTF9ERUJVR19MT0NBTCAgICAgICAgICAgPSAmWFNMIGFwcGxpY2F0aW9uCi1fVUlfWFNMX0RFQlVHX1JFTU9URSAgICAgICAgICA9IFhTJkwgcmVtb3RlIGFwcGxpY2F0aW9uCi1fVUlfWFNMX1RJTEVfRURJVE9SICAgICAgICAgICA9ICZTaG93IGFsbCBkZWJ1Z2dpbmcgZmlsZXMgaW4gYSB0aWxlIGVkaXRvcgotX1VJX1hTTF9ERUJVR19BTkRfVFJBTlNGT1JNICAgPSAmUnVuIHRyYW5zZm9ybWF0aW9uIGFuZCBvcGVuIGEgZGVidWdnaW5nIHNlc3Npb24KLV9VSV9YU0xfQ09OVEVYVF9VUkkgICAgICAgICAgID0gQ29udGV4dCBQYXRoIAotX1VJX1hTTF9DT05URVhUICAgICAgICAgICAgICAgPSBTcGVjaWZ5IGEgJmNvbnRleHQgcGF0aCBmb3IgcmVzb2x2aW5nIFVSSXMgaW4geHNsOmltcG9ydCwgeHNsOmluY2x1ZGUgb3IgZG9jdW1lbnQoKQotCi0KLV9VSV9PVkVSUklERV9GSUxFICAgID0gT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzCi1fVUlfSkFWQV9FWElTVF9GSUxFMSA9IFRoZSBmb2xsb3dpbmcgSmF2YSBjbGFzc2VzIGFscmVhZHkgZXhpc3QuCi1fVUlfSkFWQV9FWElTVF9GSUxFMiA9IERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZmlsZT8KLSAgICAgIAotISBzb21lIG9wdGlvbnMgc3RyaW5ncyBjb21tb24gdG8gc2V2ZXJhbCBwbHVnaW5zCi1fVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9USVRMRSA9IEVycm9yIENyZWF0aW5nIEZpbGUKLV9VSV9FUlJPUl9DUkVBVElOR19GSUxFX1NIT1JUX0RFU0MgPSBFcnJvciBjcmVhdGluZyBmaWxlICJ7MH0iCi1fVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9MT05HX0RFU0MgPSBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIHRoZSBmaWxlICJ7MH0iLgotX1VJX1BBUkVOVF9GT0xERVJfSVNfUkVBRF9PTkxZID0gVGhlIHBhcmVudCBkaXJlY3RvcnkgInswfSIgaXMgcmVhZCBvbmx5LgotX1VJX1VOS05PV05fRVJST1JfV0lUSF9ISU5UID0gVW5rbm93biBlcnJvci4gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3RvcnkgInswfSIgaXMgd3JpdGVhYmxlLgotX1VJX1VOS05PV05fRVJST1IgPSBVbmtub3duIGVycm9yLiBFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSAiezB9IiBpcyB3cml0ZWFibGUuCi0KLSEgdXNhZ2UgLSB0aGlzIGxhYmVsIGlzIGZvbGxvd2VkIGJ5IHR3byByYWRpbyBidXR0b24gb3B0aW9ucyBmb3IgdGhlIGZpbGUgbG9jYXRpb24KLV9VSV9MQUJFTF9JTkNMVURFX1VSTF9GSUxFID0gU2VsZWN0IGZpbGUgbG9jYXRpb24KLV9VSV9SQURJT19GSUxFICAgICAgICAgICAgID0gV29ya3NwYWNlIHByb2plY3RzCi1fVUlfUkFESU9fVVJMICAgICAgICAgICAgICA9IEhUVFAKLQotX1VJX0xBQkVMX0NPTVBPTkVOVFMJCQkJICAgPSBDb21wb25lbnRzOgotX1VJX0xBQkVMX1FVQUxJRklFUgkJCQkJICAgPSBRdWFsaWZpZXI6Ci0KLSEtIGNvbXBvbmVudCBzZWxlY3Rpb24gZGlhbG9ncyAKLV9VSV9MQUJFTF9DT01QT05FTlRfTkFNRQkJCSAgID0gQ29tcG9uZW50IE5hbWU6Ci1fVUlfTEFCRUxfTUFUQ0hJTkdfQ09NUE9ORU5UUwkJICAgPSBNYXRjaGluZyBDb21wb25lbnRzOgotX1VJX0xBQkVMX1NQRUNJRklFRF9GSUxFCQkJICAgPSBTcGVjaWZpZWQgRmlsZQotX1VJX0xBQkVMX0VOQ0xPU0lOR19QUk9KRUNUCQkJICAgPSBFbmNsb3NpbmcgUHJvamVjdAotX1VJX0xBQkVMX1dPUktTUEFDRQkJCQkJICAgPSBXb3Jrc3BhY2UKLV9VSV9MQUJFTF9DVVJSRU5UX1JFU09VUkNFCQkJICAgPSBDdXJyZW50IFJlc291cmNlCi1fVUlfTEFCRUxfU0VBUkNIX1NDT1BFCQkJCSAgID0gU2VhcmNoIFNjb3BlCi1fVUlfTEFCRUxfTkFSUk9XX1NFQVJDSF9TQ09QRV9SRVNPVVJDRSA9IFVzZSByZXNvdXJjZSB2aWV3IHRvIG5hcnJvdyBzZWFyY2ggc2NvcGUKLV9VSV9MQUJFTF9BVkFJTEFCTEVfVFlQRVMJCQkgICA9IEF2YWlsYWJsZSBUeXBlcwotX1VJX0xBQkVMX1dPUktJTkdfU0VUUyAgICAgICAgICAgICAgICAgPSBXb3JraW5nIFNldHMKLQotX1VJX0xBQkVMX05ldz1OZXcuLi4KLV9VSV9MQUJFTF9ERUNMQVJBVElPTl9MT0NBVElPTj1EZWNsYXJhdGlvbiBMb2NhdGlvbjoKLV9VSV9MQUJFTF9DSE9PU0U9Q2hvb3NlLi4uCi0KLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIQotISBIZXJlIGlzIHRoZSBsaXN0IG9mIEVycm9yIHN0cmluZyB0aGF0IGhhdmUgbWVzc2FnZSBJRHMgLSBtYWtlIHN1cmUgdGhleSBhcmUgdW5pcXVlCi0hICBSYW5nZSBmb3IgYjJiZ3VpIG1lc3NhZ2VJRHM6IElXQVgxMjAxIC0gSVdBWDE0MDAKLSEKLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1fRVJST1JfVEhFX0NPTlRBSU5FUl9OQU1FID0gVGhlIHNwZWNpZmllZCBjb250YWluZXIgbXVzdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlIGFuZCBpdHMgcGF0aCBtdXN0IHN0YXJ0IGF0IHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQotX0VSUk9SX0xPQ0FMX0xPQ0FUSU9OICAgICA9IFRoZSBsb2NhbCBsb2NhdGlvbiBvZiB0aGlzIGNvbnRhaW5lciBjYW5ub3QgYmUgcmVzb2x2ZWQuCi1fRVJST1JfTk9UX0pBVkFfUFJPSkVDVCAgID0gVGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIG5vdCBhIEphdmEgcHJvamVjdC4KLQotIU5PVEUgVE8gVFJBTlNMQVRPUjogdGhpcyBlcnJvciBtZXNzYWdlIHRleHQgaXMgZm9sbG93ZWQgYnkgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBwbHVnaW4KLV9FUlJPUl9JTlZBTElEX0pBVkFfUEFDS0FHRSA9IElXQVgxMjAxRSBJbnZhbGlkIHBhY2thZ2UgbmFtZSBlcnJvcjoKLQotIU5PVEUgVE8gVFJBTlNMQVRPUjogKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OICsgc3RyaW5nICsgX1VJX0xBQkVMX09SICsgc3RyaW5nKSBvciAoX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04pCi1fRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiAgICAgICAgID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoCi1fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgICAgICAgID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLQotX0VSUk9SX0NPTlRBSU5FUl9OT1RfSkFWQV9CVUlMRFBBVEggPSBUaGUgY29udGFpbmVyIGlzIG5vdCBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhpcyBwcm9qZWN0Ci1fRVJST1JfVVNFX1BST0pFQ1RfSkFWQV9TT1VSQ0VfRk9MREVSID0gVGhlIHByb2plY3QgaXMgbm90IG9uIHRoZSBidWlsZCBwYXRoLiAgU2VsZWN0IGEgSmF2YSBzb3VyY2UgZm9sZGVyIGZvciB0aGUgcHJvamVjdC4KLQotX1VJX0VSUk9SICAgICAgICAgICAgID0gRXJyb3IKLQotIU5PVEUgVE8gVFJBTlNMQVRPUjogdGhpcyB3YXJuaW5nIG1lc3NhZ2UgdGV4dCBpcyBmb2xsb3dlZCBieSBhIG1lc3NhZ2UgZnJvbSBhbm90aGVyIHBsdWdpbgotX1dBUk5fSU5WQUxJRF9KQVZBX1BBQ0tBR0UgPSBJbnZhbGlkIHBhY2thZ2UgbmFtZSB3YXJuaW5nOgotCi1fRVJST1JfUk9PVF9FTEVNRU5UID0gVGhlIFhNTCBzY2hlbWEgZG9lcyBub3QgY29udGFpbiBhbnkgZ2xvYmFsIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSByb290IGVsZW1lbnQuCi1fRVJST1JfU0FWSU5HX0ZJTEUgPSBFcnJvciBzYXZpbmcgZmlsZSAiezB9IgotCi0hIEZpbGUgVmFsaWRhdG9yCi1fVUlfRVJST1JfVkFMSURBVEVfRkFJTF9USVRMRSA9IEZhaWxlZCB0byBjaGVjayBvdXQgbmVjZXNzYXJ5IGZpbGVzCi1fVUlfRVJST1JfVkFMSURBVEVfRkFJTF9NRVNTQUdFID0gR2VuZXJhdGlvbiBmYWlsZWQuIE5lY2Vzc2FyeSBmaWxlcyBjb3VsZCBub3QgYmUgY2hlY2tlZCBvdXQuIAotCi0hIFByb3BlcnR5RGlydHlDaGFuZ2VMaXN0ZW5lciBhbmQgUHJvcGVydHlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyCi1fVUlfRVJST1JfVkFMSURBVEVfRURJVF9GQUlMX09ORV9GSUxFID0gRXJyb3IKLQotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC50aXRsZT1OZXcgRXhhbXBsZSBQcm9qZWN0Ci1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm9wX2Vycm9yLnRpdGxlPVByb2plY3QgQ3JlYXRpb24gRmFpbGVkCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm9wX2Vycm9yLm1lc3NhZ2U9UHJvamVjdCBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLQotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vdmVyd3JpdGVxdWVyeS50aXRsZT1PdmVyd3JpdGUKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQub3ZlcndyaXRlcXVlcnkubWVzc2FnZT1EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgezB9PwotCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24ub3BfZGVzYz1DcmVhdGluZyBleGFtcGxlIHByb2plY3RzLi4uCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2NfcHJvaj1Db25maWd1cmluZyBwcm9qZWN0Li4uCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmVycm9yLmFscmVhZHlleGlzdHM9UHJvamVjdCBhbHJlYWR5IGV4aXN0cy4KLVNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM9U2F2ZSBBbGwgTW9kaWZpZWQgUmVzb3VyY2VzCi1TYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlPUFsbCBtb2RpZmllZCByZXNvdXJjZXMgbXVzdCBiZSBzYXZlZCBiZWZvcmUgdGhpcyBvcGVyYXRpb24uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDBiNjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIgbmFtZT0iRXhhbXBsZSBQcm9qZWN0IENyZWF0aW9uIFdpemFyZCIgc2NoZW1hPSJzY2hlbWEvZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5leHNkIi8+Ci0gIDxleHRlbnNpb24KLQlwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFJlc3VsdFZpZXdQYWdlcyI+Ci0JPHZpZXdQYWdlCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hSZXN1bHRQYWdlIgotCQlzZWFyY2hSZXN1bHRDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoUmVzdWx0IgotCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoUmVzdWx0UGFnZSI+Ci0JPC92aWV3UGFnZT4KLSAgPC9leHRlbnNpb24+Ci0gCi0gIDwhLS0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPiAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24gCi0gICAgICAgICBpZD0idGVzdCIgCi0gICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPiAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBpZD0idGVzdGl0IiAKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgbGFiZWw9IlRFU1QgU0VBUkNIIERJQUxPRyIgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5UZXN0Ij4gCi0gICAgICAgICA8L2FjdGlvbj4gICAgICAgICAgCi0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgICAgICAgICAKLSAgICA8L2V4dGVuc2lvbj4gCi0gICAtLT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NjaGVtYS9leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc2NoZW1hL2V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4YzMyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc2NoZW1hL2V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkiIGlkPSJFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIiBuYW1lPSJFeGFtcGxlIFByb2plY3QgQ3JlYXRpb24gV2l6YXJkIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0byBleHRlbmQgTmV3IHByb2plY3Qgd2l0aGFyZCB3aXRoIHRoZQ0KLXBhZ2Ugc2V0IHVwIHNldHVwIGluZm9ybWF0aW9uIGZvciB0aGUgY3JlYXRlZCBwcm9qZWN0IGFzIHdlbGwgYXMgc291cmNlIGZpbGVzIHRoYXQgd2lsbCBiZSBpbXBvcnRlZCBvbiB0aGUgcHJvamVjdCBjcmVhdGlvbi4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvamVjdHNldHVwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSB3aXphcmQgdGhhdCB0aGlzIGV4dGVuc2lvbiBpcyBpbnRlbmRlZCBmb3IuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImJhbm5lciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBQbHVnaW4gcmVsYXRpdmUgcGF0aCB0byB0aGUgaW1hZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBhcyBhIGJhbm5lciBvbiB0aGUgd2l6YXJkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icHJvamVjdHNldHVwIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGFkZGl0aW9uYWwgcHJvamVjdCBzZXR1cC4NCi1UaGVyZSB3aWxsIGJlIGFzIG1hbnkgcGFnZXMgY3JlYXRlZCBmb3IgdGhlIHdpemFyZCBhcyB0aGVyZSBhcmUgcHJvamVjdHNldHVwIGVsZW1lbnRzLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImltcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibmF0dXJlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZWZlcmVuY2VzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhZ2V0aXRsZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaXRsZSBvZiB0aGUgd2l6YXJkJmFwb3M7cyBwYWdlLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEluaXRpYWwgcHJvamVjdCBuYW1lIHRoYXQgd2lsbCBiZSBwcm92aWRlZCBvbiB0aGUgd2l6YXJkIHBhZ2UuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIExhYmVsIGZvciB0aGUgcHJvamVjdCBuYW1lIGZpZWxkIG9uIHRoZSB3aXphcmQgcGFnZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFnZWRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIG9mIHRoZSB3aXphcmQgcGFnZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcGVuIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFBsdWdpbiByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBvcGVuZWQgd2hlbiB3aXphcmQgZmluaXNoZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJpbXBvcnQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hhdCB0byBpbXBvcnQgaW50byB0aGUgcHJvamVjdCB3aGVuIGl0JmFwb3M7cyBjcmVhdGVkLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBQcm9qZWN0IHJlbGF0aXZlIHBhdGggb2YgdGhlIGZvbGRlciB3aGVyZSBwcm9qZWN0IGZpbGVzIHdpbGwgYmUgaW1wb3J0ZWQgdG8sIGlmIG5vdCBzcGVjaWZpZWQsIGl0JmFwb3M7cyB0aGUgcHJvamVzdCBpdHNlbGYuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBQbHVnaW4gcmVsYXRpdmUgcGF0aCBvZiB0aGUgaW1wb3J0IC56aXAgZmlsZSB3aXRoIHRoZSBmaWxlcyB0byBiZSBpbXBvcnRlZCBpbnRvIHRoZSBwcm9qZWN0Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ibmF0dXJlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbGVtZW50IHRoYXQgc3BlY2lmaWVkIEVjbGlwc2UgbmF0dXJlIHRoYXQgaXMgYXBwbGljYWJsZSB0byB0aGUgcHJvamVjdC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgbmF0dXJlIHRoYXQgd2lsbCBiZSBvcGVuZWQgd2hlbiBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InJlZmVyZW5jZXMiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIEVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgcmVmZXJlbmNlIGZvciB0aGUgcHJvamVjdCB0aGF0IHdpbGwgYmUgY3JlYXRlZC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkJnF1b3Q7DQotICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkRXh0ZW5zaW9uJnF1b3Q7Jmd0OyANCi0gICAgICAmbHQ7d2l6YXJkDQotICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueG1sLnVpLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQmcXVvdDsNCi0gICAgICAgICAgIGJhbm5lcj0mcXVvdDtpY29ucy9uZXdTYW1wbGVQcm9qZWN0X3dpemJhbm5lci5naWYmcXVvdDsmZ3Q7DQotICAgICAgICAgJmx0O3Byb2plY3RzZXR1cA0KLSAgICAgICAgICAgICAgIHBhZ2V0aXRsZT0mcXVvdDslWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wYWdldGl0bGUmcXVvdDsNCi0gICAgICAgICAgICAgICBuYW1lPSZxdW90OyVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnByb2plY3RuYW1lJnF1b3Q7DQotICAgICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubGFiZWwmcXVvdDsNCi0gICAgICAgICAgICAgICBwYWdlZGVzY3JpcHRpb249JnF1b3Q7JVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQucGFnZWRlc2NyaXB0aW9uJnF1b3Q7DQotICAgICAgICAgICAgICAgb3Blbj0mcXVvdDtyZWFkbWUuaHRtbCZxdW90OyZndDsNCi0gICAgICAgICAgICAmbHQ7aW1wb3J0DQotICAgICAgICAgICAgICAgICAgZGVzdD0mcXVvdDsmcXVvdDsNCi0gICAgICAgICAgICAgICAgICBzcmM9JnF1b3Q7ZXhhbXBsZXMvRWRpdGluZ0FuZFZhbGlkYXRpbmdYTUwuemlwJnF1b3Q7Jmd0Ow0KLSAgICAgICAgICAgICZsdDsvaW1wb3J0Jmd0Ow0KLSAgICAgICAgJmx0Oy9wcm9qZWN0c2V0dXAmZ3Q7DQotICAgICAmbHQ7L3dpemFyZCZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL0Fic3RyYWN0U2VhcmNoUXVlcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL0Fic3RyYWN0U2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlOTdmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVF1ZXJ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5NZXNzYWdlczsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWFyY2hRdWVyeSBpbXBsZW1lbnRzIElTZWFyY2hRdWVyeSB7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBmUGF0dGVybjsKLQlwcm90ZWN0ZWQgU2VhcmNoU2NvcGUgZlNjb3BlOwotCXByb3RlY3RlZCBTZWFyY2hSZXN1bHQgZlJlc3VsdDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTY29wZURlc2NyaXB0aW9uOwotCi0JcHVibGljIEFic3RyYWN0U2VhcmNoUXVlcnkoU3RyaW5nIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLCBTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbikgewotCQlzdXBlcigpOwotCQlmUGF0dGVybj0gcGF0dGVybjsKLQkJZlNjb3BlPSBzY29wZTsKLQkJZlNjb3BlRGVzY3JpcHRpb249IHNjb3BlRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVydW4oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hRdWVyeV9sYWJlbDsgCi0JfQotCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlpZiAoZlJlc3VsdCA9PSBudWxsKSB7Ci0JCQlmUmVzdWx0PSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMpOwotCQkJbmV3IFNlYXJjaFJlc3VsdFVwZGF0ZXIoZlJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIGZSZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0TGFiZWwoaW50IG5NYXRjaGVzKSB7Ci0JCWlmIChuTWF0Y2hlcyA9PSAxKSB7Ci0JCQlpZiAoZlBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJT2JqZWN0W10gYXJncz0geyBmUGF0dGVybiwgZlNjb3BlRGVzY3JpcHRpb24gfTsKLQkJCQlyZXR1cm4gTWVzc2FnZXMuZm9ybWF0KFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hRdWVyeV9zaW5ndWxhckxhYmVsLCBhcmdzKTsgCi0JCQl9Ci0JCQlPYmplY3RbXSBhcmdzPSB7ICIiLCBmU2NvcGVEZXNjcmlwdGlvbiB9OwotCQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbF9maWxlTmFtZVNlYXJjaCwgYXJncyk7IAotCQl9Ci0JCWlmIChmUGF0dGVybi5sZW5ndGgoKSA+IDApIHsKLQkJCU9iamVjdFtdIGFyZ3M9IHsgZlBhdHRlcm4sIG5ldyBJbnRlZ2VyKG5NYXRjaGVzKSwgZlNjb3BlRGVzY3JpcHRpb24gfTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybiwgYXJncyk7IAotCQl9Ci0JCU9iamVjdFtdIGFyZ3M9IHsgIiIsIG5ldyBJbnRlZ2VyKG5NYXRjaGVzKSwgZlNjb3BlRGVzY3JpcHRpb24gfTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWVzc2FnZXMuZm9ybWF0KFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hRdWVyeV9wbHVyYWxQYXR0ZXJuX2ZpbGVOYW1lU2VhcmNoLCBhcmdzKTsgCi0JCi0JCi0JfQotCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFNlYXJjaFJlc3VsdCB0ZXh0UmVzdWx0PSAoU2VhcmNoUmVzdWx0KSBnZXRTZWFyY2hSZXN1bHQoKTsKLQkJdGV4dFJlc3VsdC5yZW1vdmVBbGwoKTsKLQkJU2VhcmNoUXVlcnlSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yPSBuZXcgU2VhcmNoUXVlcnlSZXN1bHRDb2xsZWN0b3IodGV4dFJlc3VsdCk7Ci0JCVN0cmluZyBzZWFyY2hTdHJpbmc9IGZQYXR0ZXJuOwotCQlpZiAoc2VhcmNoU3RyaW5nLnRyaW0oKS5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoJyonKSkpIHsKLQkJCXNlYXJjaFN0cmluZz0gbmV3IFN0cmluZygpOwotCQl9Ci0JCVN0cmluZyBtZXNzYWdlPSBTZWFyY2hNZXNzYWdlcy5UZXh0U2VhcmNoRW5naW5lX3N0YXR1c01lc3NhZ2U7IAotCQlNdWx0aVN0YXR1cyBzdGF0dXM9IG5ldyBNdWx0aVN0YXR1cyhOZXdTZWFyY2hVSS5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIG51bGwpOwotCQkKLQkJU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLQkKLQkJUXVhbGlmaWVkTmFtZSB0eXBlTmFtZSA9IFF1YWxpZmllZE5hbWUudmFsdWVPZihzZWFyY2hTdHJpbmcpOwotCQkKLQkJdHJ5IHsKLSAgICAgICAgICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IGNyZWF0ZVNlYXJjaFBhdHRlcm4odHlwZU5hbWUpOwotICAgICAgICAgICAgc2VhcmNoRW5naW5lLnNlYXJjaChwYXR0ZXJuLCBjb2xsZWN0b3IsIGZTY29wZSwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCQotCQlyZXR1cm4gc3RhdHVzOwotCi0JfQotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTZWFyY2hQYXR0ZXJuIGNyZWF0ZVNlYXJjaFBhdHRlcm4oUXVhbGlmaWVkTmFtZSB0eXBlTmFtZSk7Ci0JCi0JcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFVwZGF0ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVF1ZXJ5TGlzdGVuZXIgewotCQlTZWFyY2hSZXN1bHQgZlJlc3VsdDsKLQotCQlwdWJsaWMgU2VhcmNoUmVzdWx0VXBkYXRlcihTZWFyY2hSZXN1bHQgcmVzdWx0KSB7Ci0JCQlmUmVzdWx0PSByZXN1bHQ7Ci0JCQlOZXdTZWFyY2hVSS5hZGRRdWVyeUxpc3RlbmVyKHRoaXMpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpCi0JCQkJaGFuZGxlRGVsdGEoZGVsdGEpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGVsdGEoSVJlc291cmNlRGVsdGEgZCkgewotCQkJdHJ5IHsKLQkJCQlkLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJCQkJCUlSZXNvdXJjZSByZXM9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJCQkJTWF0Y2hbXSBtYXRjaGVzPSBmUmVzdWx0LmdldE1hdGNoZXMocmVzKTsKLQkJCQkJCQkJCWZSZXN1bHQucmVtb3ZlTWF0Y2hlcyhtYXRjaGVzKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgotCQkJCQkJCQkvLyBoYW5kbGUgY2hhbmdlZCByZXNvdXJjZQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcXVlcnlBZGRlZChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCS8vIGRvbid0IGNhcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXJ5UmVtb3ZlZChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCWlmIChmUmVzdWx0LmVxdWFscyhxdWVyeS5nZXRTZWFyY2hSZXN1bHQoKSkpIHsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQlOZXdTZWFyY2hVSS5yZW1vdmVRdWVyeUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBxdWVyeVN0YXJ0aW5nKElTZWFyY2hRdWVyeSBxdWVyeSkgewotCQkJLy8gZG9uJ3QgY2FyZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcXVlcnlGaW5pc2hlZChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCS8vIGRvbid0IGNhcmUKLQkJfQotICAgIH0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9JU2VhcmNoQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9JU2VhcmNoQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzE0MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvSVNlYXJjaENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hDb25zdGFudHMgewotCQotCS8qKgotCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgZGVjbGFyYXRpb24uCi0JICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbnkgb2YgdGhlIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50cwotCSAqIHNvIGFzIHRvIGJldHRlciBuYXJyb3cgZG93biB0aGUgc2VhcmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IERFQ0xBUkFUSU9OUz0gMDsKLQotCi0JLyoqCi0JICogVGhlIHNlYXJjaCByZXN1bHQgaXMgYSByZWZlcmVuY2UuCi0JICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbnkgb2YgdGhlIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50cwotCSAqIHNvIGFzIHRvIGJldHRlciBuYXJyb3cgZG93biB0aGUgc2VhcmNoLgotCSAqIFJlZmVyZW5jZXMgY2FuIGNvbnRhaW4gaW1wbGVtZW50ZXJzIHNpbmNlIHRoZXkgYXJlIG1vcmUgZ2VuZXJpYyBraW5kCi0JICogb2YgbWF0Y2hlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBSRUZFUkVOQ0VTPSAxOwotCi0JLyoqCi0JICogVGhlIHNlYXJjaCByZXN1bHQgaXMgYSBkZWNsYXJhdGlvbiwgb3IgYSByZWZlcmVuY2UuCi0JICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbnkgb2YgdGhlIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50cwotCSAqIHNvIGFzIHRvIGJldHRlciBuYXJyb3cgZG93biB0aGUgc2VhcmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IEFMTF9PQ0NVUlJFTkNFUz0gMjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZkZmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VhcmNoTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU2VhcmNoTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdyb3VwX3JlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uc0luUHJvamVjdEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUGFnZV9saW1pdGVkX2Zvcm1hdDsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFBhZ2VfZXJyb3JfbWFya2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVTZWFyY2hQYWdlX3NvcnRfYnlfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbldpdGhNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVTZWFyY2hRdWVyeV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbF9maWxlTmFtZVNlYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybl9maWxlTmFtZVNlYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0U2VhcmNoRW5naW5lX3N0YXR1c01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUxhYmVsUHJvdmlkZXJfY291bnRfZm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVMYWJlbFByb3ZpZGVyX3JlbW92ZWRfcmVzb3VyY2VfbGFiZWw7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTZWFyY2hNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U5ZjgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWdyb3VwX3JlZmVyZW5jZXM9IFJlJmZlcmVuY2VzCi1TZWFyY2hfRmluZERlY2xhcmF0aW9uQWN0aW9uX2xhYmVsPSAmV29ya3NwYWNlCi1TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luUHJvamVjdEFjdGlvbl9sYWJlbD0gJlByb2plY3QKLVNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsPSBXb3JraW5nICZTZXQuLi4KLUZpbGVTZWFyY2hQYWdlX2xpbWl0ZWRfZm9ybWF0PXswfSAoc2hvd2luZyB7MX0gb2YgezJ9IGZpbGVzKQotRmlsZVNlYXJjaFBhZ2VfZXJyb3JfbWFya2VyPUNvdWxkIG5vdCBjcmVhdGUgbWFya2VyCi1GaWxlU2VhcmNoUGFnZV9zb3J0X2J5X2xhYmVsPVNvcnQgQnkKLU9wZW5XaXRoTWVudV9sYWJlbD0gT3BlbiBXaXQmaAotCi1GaWxlTGFiZWxQcm92aWRlcl9jb3VudF9mb3JtYXQ9ezB9ICh7MX0gbWF0Y2hlcykKLUZpbGVMYWJlbFByb3ZpZGVyX3JlbW92ZWRfcmVzb3VyY2VfbGFiZWw9PHJlbW92ZWQgcmVzb3VyY2U+Ci0KLUZpbGVTZWFyY2hRdWVyeV9sYWJlbD1GaWxlIFNlYXJjaAotCi0jIFRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBwYXR0ZXJuLCB0aGUgc2Vjb25kIGJ5IHRoZSBjb3VudCBhbmQgdGhlIHRoaXJkIGJ5IHRoZSBzY29wZQotRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm49ICcnezB9JycgLSB7MX0gbWF0Y2hlcyBpbiB7Mn0KLQotIyBUaGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgcGF0dGVybiwgdGhlIHNlY29uZCBieSB0aGUgc2NvcGUKLUZpbGVTZWFyY2hRdWVyeV9zaW5ndWxhckxhYmVsPSAnJ3swfScnIC0gMSBtYXRjaCBpbiB7MX0KLQotRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWxfZmlsZU5hbWVTZWFyY2g9MSBmaWxlIG5hbWUgbWF0Y2hpbmcgJyd7MH0nJyBpbiB7MX0KLUZpbGVTZWFyY2hRdWVyeV9wbHVyYWxQYXR0ZXJuX2ZpbGVOYW1lU2VhcmNoPXsxfSBmaWxlIG5hbWVzIG1hdGNoaW5nICcnezB9JycgaW4gezJ9Ci0KLVRleHRTZWFyY2hFbmdpbmVfc3RhdHVzTWVzc2FnZT0gUHJvYmxlbXMgZW5jb3VudGVyZWQgZHVyaW5nIHRleHQgc2VhcmNoLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUXVlcnlSZXN1bHRDb2xsZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZDIzNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUXVlcnlSZXN1bHRDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLWNsYXNzIFNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yIHsKLQkKLQlwcml2YXRlIFNlYXJjaFJlc3VsdCBmU2VhcmNoUmVzdWx0OwotCi0JCi0JcHJvdGVjdGVkIFNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yKFNlYXJjaFJlc3VsdCByZXN1bHQpewotCQlzdXBlcigpOwotCQlmU2VhcmNoUmVzdWx0PSByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWF0Y2ggYU1hdGNoID0gbmV3IE1hdGNoKG1hdGNoLmdldEZpbGUoKSwgbWF0Y2guZ2V0T2Zmc2V0KCksIG1hdGNoLmdldExlbmd0aCgpKTsKLQkJZlNlYXJjaFJlc3VsdC5hZGRNYXRjaChhTWF0Y2gpOwotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5NDFkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRWRpdG9yTWF0Y2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklGaWxlTWF0Y2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgaW1wbGVtZW50cyBJRWRpdG9yTWF0Y2hBZGFwdGVyLCBJRmlsZU1hdGNoQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBNYXRjaFtdIEVNUFRZX0FSUj0gbmV3IE1hdGNoWzBdOwotCQotCXByaXZhdGUgQWJzdHJhY3RTZWFyY2hRdWVyeSBmUXVlcnk7Ci0KLQlwdWJsaWMgU2VhcmNoUmVzdWx0KEFic3RyYWN0U2VhcmNoUXVlcnkgam9iKSB7Ci0JCWZRdWVyeT0gam9iOwotCX0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3RzZWFyY2hfZHBkbl9vYmouZ2lmIik7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBmUXVlcnkuZ2V0UmVzdWx0TGFiZWwoZ2V0TWF0Y2hDb3VudCgpKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUb29sdGlwKCkgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgTWF0Y2hbXSBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0LCBJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBnZXRNYXRjaGVzKGZpbGUpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0JCQlyZXR1cm4gKElGaWxlKWVsZW1lbnQ7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hvd25JbkVkaXRvcihNYXRjaCBtYXRjaCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JJbnB1dCBlaT0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlaSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmk9IChJRmlsZUVkaXRvcklucHV0KSBlaTsKLQkJCXJldHVybiBtYXRjaC5nZXRFbGVtZW50KCkuZXF1YWxzKGZpLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgTWF0Y2hbXSBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0LCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJSUVkaXRvcklucHV0IGVpPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGVpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmaT0gKElGaWxlRWRpdG9ySW5wdXQpIGVpOwotCQkJcmV0dXJuIGdldE1hdGNoZXMoZmkuZ2V0RmlsZSgpKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfQVJSOwotCX0KLQotCXB1YmxpYyBJU2VhcmNoUXVlcnkgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiBmUXVlcnk7Ci0JfQotCQotCXB1YmxpYyBJRmlsZU1hdGNoQWRhcHRlciBnZXRGaWxlTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIElFZGl0b3JNYXRjaEFkYXB0ZXIgZ2V0RWRpdG9yTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI0N2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5EZWxlZ2F0aW5nRHJhZ0FkYXB0ZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSUNvbnRleHRNZW51Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0Vmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuRmlsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk9wZW5XaXRoTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlJlc291cmNlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlLkZpbGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlLklGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlLlJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5Tb3J0QWN0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRQYWdlIGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlcjsKLQotCQlwdWJsaWMgRGVjb3JhdG9ySWdub3JpbmdWaWV3ZXJTb3J0ZXIoSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIobnVsbCk7IC8vIGxhenkgaW5pdGlhbGl6YXRpb24KLQkJCWZMYWJlbFByb3ZpZGVyPSBsYWJlbFByb3ZpZGVyOwotCQl9Ci0JCQotCSAgICBwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkgICAgICAgIFN0cmluZyBuYW1lMT0gZkxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlMSk7Ci0JICAgICAgICBTdHJpbmcgbmFtZTI9IGZMYWJlbFByb3ZpZGVyLmdldFRleHQoZTIpOwotCSAgICAgICAgaWYgKG5hbWUxID09IG51bGwpCi0JICAgICAgICAgICAgbmFtZTEgPSAiIjsvLyROT04tTkxTLTEkCi0JICAgICAgICBpZiAobmFtZTIgPT0gbnVsbCkKLQkgICAgICAgICAgICBuYW1lMiA9ICIiOy8vJE5PTi1OTFMtMSQKLQkgICAgICAgIHJldHVybiBnZXRDb2xsYXRvcigpLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQkgICAgfQotCSAgICAKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyI2dldENvbGxhdG9yKCkKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBDb2xsYXRvciBnZXRDb2xsYXRvcigpIHsKLQkJCWlmIChjb2xsYXRvciA9PSBudWxsKSB7Ci0JCQkJY29sbGF0b3I9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29sbGF0b3I7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TT1JUSU5HPSAib3JnLmVjbGlwc2Uuc2VhcmNoLnJlc3VsdHBhZ2Uuc29ydGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWN0aW9uR3JvdXAgZkFjdGlvbkdyb3VwOwotCXByaXZhdGUgSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIGludCBmQ3VycmVudFNvcnRPcmRlcjsKLQlwcml2YXRlIFNvcnRBY3Rpb24gZlNvcnRCeU5hbWVBY3Rpb247Ci0JcHJpdmF0ZSBTb3J0QWN0aW9uIGZTb3J0QnlQYXRoQWN0aW9uOwotCQotCS8vIG5ldmVyIHVzZWQKLQkvL3ByaXZhdGUgRWRpdG9yT3BlbmVyIGZFZGl0b3JPcGVuZXI9IG5ldyBFZGl0b3JPcGVuZXIoKTsKLQotCQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTSE9XX0lOX1RBUkdFVFM9IG5ldyBTdHJpbmdbXSB7IElQYWdlTGF5b3V0LklEX1JFU19OQVYgfTsKLQlwcml2YXRlICBzdGF0aWMgZmluYWwgSVNob3dJblRhcmdldExpc3QgU0hPV19JTl9UQVJHRVRfTElTVD0gbmV3IElTaG93SW5UYXJnZXRMaXN0KCkgewotCQlwdWJsaWMgU3RyaW5nW10gZ2V0U2hvd0luVGFyZ2V0SWRzKCkgewotCQkJcmV0dXJuIFNIT1dfSU5fVEFSR0VUUzsKLQkJfQotCX07Ci0KLQkvLyBwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCQotCXB1YmxpYyBTZWFyY2hSZXN1bHRQYWdlKCkgewotCQkvLyBUT0RPCi0JCS8vZlNvcnRCeU5hbWVBY3Rpb249IG5ldyBTb3J0QWN0aW9uKFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hQYWdlX3NvcnRfbmFtZV9sYWJlbCwgdGhpcywgRmlsZUxhYmVsUHJvdmlkZXIuU0hPV19MQUJFTF9QQVRIKTsgCi0JCS8vZlNvcnRCeVBhdGhBY3Rpb249IG5ldyBTb3J0QWN0aW9uKFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hQYWdlX3NvcnRfcGF0aF9sYWJlbCwgdGhpcywgRmlsZUxhYmVsUHJvdmlkZXIuU0hPV19QQVRIX0xBQkVMKTsgCi0gICAgICAgIC8vIGNzIDogSSd2ZSBjb21tZW50IHRoaXMgY29kZSBvdXQgZm9yIG5vdy4gIFdlIG5lZWQgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzIHRvIHRoZSBiYXNlIGNsYXNzIGFuZCByZWFjdCBhY2NvcmRpbmdseS4KLQkJLy8gRXZlbiBtb3JlIGltcG9ydGFudGx5IHdlIG5lZWQgdG8gZGlzY3VzcyB3aXRoIHRoZSBiYXNlIGd1eXMgdG8gZ2V0IEFQSSBsaW5lZCB1cCBmb3IgdGhpcyAoc2VlIGJ1ZyAxNjMxNzcpLgotCQkvKgotCQlmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChTZWFyY2hQcmVmZXJlbmNlUGFnZS5MSU1JVF9UQUJMRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkgfHwgU2VhcmNoUHJlZmVyZW5jZVBhZ2UuTElNSVRfVEFCTEVfVE8uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKQotCQkJCQlpZiAoZ2V0Vmlld2VyKCkgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikgewotCQkJCQkJZ2V0Vmlld1BhcnQoKS51cGRhdGVMYWJlbCgpOwotCQkJCQkJZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVNlYXJjaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCSovCi19Ci0JCi0JcHVibGljIFN0cnVjdHVyZWRWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Vmlld2VyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREcmFnQWRhcHRlcnMoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnM9IG5ldyBUcmFuc2ZlcltdIHsgUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCWludCBvcHM9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQkKLQkJRGVsZWdhdGluZ0RyYWdBZGFwdGVyIGFkYXB0ZXI9IG5ldyBEZWxlZ2F0aW5nRHJhZ0FkYXB0ZXIoKTsKLQkJYWRhcHRlci5hZGREcmFnU291cmNlTGlzdGVuZXIobmV3IFJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQkJCi0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChvcHMsIHRyYW5zZmVycywgYWRhcHRlcik7Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRhYmxlVmlld2VyKFRhYmxlVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJRmlsZUxhYmVsUHJvdmlkZXIgaW5uZXJMYWJlbFByb3ZpZGVyPSBuZXcgRmlsZUxhYmVsUHJvdmlkZXIodGhpcywgZkN1cnJlbnRTb3J0T3JkZXIpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoaW5uZXJMYWJlbFByb3ZpZGVyLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKHRoaXMpKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgRGVjb3JhdG9ySWdub3JpbmdWaWV3ZXJTb3J0ZXIoaW5uZXJMYWJlbFByb3ZpZGVyKSk7Ci0JCWZDb250ZW50UHJvdmlkZXI9IChJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlhZGREcmFnQWRhcHRlcnModmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUcmVlVmlld2VyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQlGaWxlTGFiZWxQcm92aWRlciBpbm5lckxhYmVsUHJvdmlkZXI9IG5ldyBGaWxlTGFiZWxQcm92aWRlcih0aGlzLCBGaWxlTGFiZWxQcm92aWRlci5TSE9XX0xBQkVMKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKGlubmVyTGFiZWxQcm92aWRlciwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyKHZpZXdlcikpOwotCQl2aWV3ZXIuc2V0U29ydGVyKG5ldyBEZWNvcmF0b3JJZ25vcmluZ1ZpZXdlclNvcnRlcihpbm5lckxhYmVsUHJvdmlkZXIpKTsKLQkJZkNvbnRlbnRQcm92aWRlcj0gKElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyKSB2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWFkZERyYWdBZGFwdGVycyh2aWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3dNYXRjaChNYXRjaCBtYXRjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZT0gKElGaWxlKSBtYXRjaC5nZXRFbGVtZW50KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdiUGFnZT0gVUlQbHVnaW4uZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUGFydCBlZGl0b3I9IElERS5vcGVuRWRpdG9yKHdiUGFnZSwgKElGaWxlKSBtYXRjaC5nZXRFbGVtZW50KCksIGFjdGl2YXRlKTsKLQkJaWYgKG9mZnNldCAhPSAwICYmIGxlbmd0aCAhPSAwKSB7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJCQl0ZXh0RWRpdG9yLnNlbGVjdEFuZFJldmVhbChvZmZzZXQsIGxlbmd0aCk7Ci0JCQl9IGVsc2UgaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJc2hvd1dpdGhNYXJrZXIoZWRpdG9yLCBmaWxlLCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNob3dXaXRoTWFya2VyKElFZGl0b3JQYXJ0IGVkaXRvciwgSUZpbGUgZmlsZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJSU1hcmtlciBtYXJrZXI9IG51bGw7Ci0JCXRyeSB7Ci0JCQltYXJrZXI9IGZpbGUuY3JlYXRlTWFya2VyKE5ld1NlYXJjaFVJLlNFQVJDSF9NQVJLRVIpOwotCQkJSGFzaE1hcCBhdHRyaWJ1dGVzPSBuZXcgSGFzaE1hcCg0KTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIob2Zmc2V0KSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBuZXcgSW50ZWdlcihvZmZzZXQgKyBsZW5ndGgpKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkJSURFLmdvdG9NYXJrZXIoZWRpdG9yLCBtYXJrZXIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9lcnJvcl9tYXJrZXIsIGUpOyAKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtYXJrZXIgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWdyKSB7Ci0JCXN1cGVyLmZpbGxDb250ZXh0TWVudShtZ3IpOwotCQlhZGRTb3J0QWN0aW9ucyhtZ3IpOwotCQlmQWN0aW9uR3JvdXAuc2V0Q29udGV4dChuZXcgQWN0aW9uQ29udGV4dChnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSkpOwotCQlmQWN0aW9uR3JvdXAuZmlsbENvbnRleHRNZW51KG1ncik7Ci0vLwkJRmlsZVNlYXJjaFF1ZXJ5IHF1ZXJ5PSAoRmlsZVNlYXJjaFF1ZXJ5KSBnZXRJbnB1dCgpLmdldFF1ZXJ5KCk7Ci0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZFNvcnRBY3Rpb25zKElNZW51TWFuYWdlciBtZ3IpIHsKLQkJaWYgKGdldExheW91dCgpICE9IEZMQUdfTEFZT1VUX0ZMQVQpCi0JCQlyZXR1cm47Ci0JCU1lbnVNYW5hZ2VyIHNvcnRNZW51PSBuZXcgTWVudU1hbmFnZXIoU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2Vfc29ydF9ieV9sYWJlbCk7IAotCQlzb3J0TWVudS5hZGQoZlNvcnRCeU5hbWVBY3Rpb24pOwotCQlzb3J0TWVudS5hZGQoZlNvcnRCeVBhdGhBY3Rpb24pOwotCQkKLQkJZlNvcnRCeU5hbWVBY3Rpb24uc2V0Q2hlY2tlZChmQ3VycmVudFNvcnRPcmRlciA9PSBmU29ydEJ5TmFtZUFjdGlvbi5nZXRTb3J0T3JkZXIoKSk7Ci0JCWZTb3J0QnlQYXRoQWN0aW9uLnNldENoZWNrZWQoZkN1cnJlbnRTb3J0T3JkZXIgPT0gZlNvcnRCeVBhdGhBY3Rpb24uZ2V0U29ydE9yZGVyKCkpOwotCQkKLQkJbWdyLmFwcGVuZFRvR3JvdXAoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1ZJRVdFUl9TRVRVUCwgc29ydE1lbnUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdQYXJ0KElTZWFyY2hSZXN1bHRWaWV3UGFydCBwYXJ0KSB7Ci0JCXN1cGVyLnNldFZpZXdQYXJ0KHBhcnQpOwotCQlmQWN0aW9uR3JvdXA9IG5ldyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAocGFydCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZBY3Rpb25Hcm91cC5kaXNwb3NlKCk7Ci0JCS8vIFNlYXJjaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gb2JqZWN0cykgewotCQlpZiAoZkNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJZkNvbnRlbnRQcm92aWRlci5lbGVtZW50c0NoYW5nZWQob2JqZWN0cyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyICE9IG51bGwpCi0JCQlmQ29udGVudFByb3ZpZGVyLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U29ydE9yZGVyKGludCBzb3J0T3JkZXIpIHsKLQkJZkN1cnJlbnRTb3J0T3JkZXI9IHNvcnRPcmRlcjsKLQkJRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgbHBXcmFwcGVyPSAoRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIpIGdldFZpZXdlcigpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJKChGaWxlTGFiZWxQcm92aWRlcikgbHBXcmFwcGVyLmdldExhYmVsUHJvdmlkZXIoKSkuc2V0T3JkZXIoc29ydE9yZGVyKTsKLQkJZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQlnZXRTZXR0aW5ncygpLnB1dChLRVlfU09SVElORywgZkN1cnJlbnRTb3J0T3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlci5yZXN0b3JlU3RhdGUobWVtZW50byk7Ci0JCXRyeSB7Ci0JCQlmQ3VycmVudFNvcnRPcmRlcj0gZ2V0U2V0dGluZ3MoKS5nZXRJbnQoS0VZX1NPUlRJTkcpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJLy9mQ3VycmVudFNvcnRPcmRlcj0gZlNvcnRCeU5hbWVBY3Rpb24uZ2V0U29ydE9yZGVyKCk7Ci0JCX0KLQkJaWYgKG1lbWVudG8gIT0gbnVsbCkgewotCQkJSW50ZWdlciB2YWx1ZT0gbWVtZW50by5nZXRJbnRlZ2VyKEtFWV9TT1JUSU5HKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWZDdXJyZW50U29ydE9yZGVyPSB2YWx1ZS5pbnRWYWx1ZSgpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCXN1cGVyLnNhdmVTdGF0ZShtZW1lbnRvKTsKLQkJbWVtZW50by5wdXRJbnRlZ2VyKEtFWV9TT1JUSU5HLCBmQ3VycmVudFNvcnRPcmRlcik7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJU2hvd0luVGFyZ2V0TGlzdC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCXJldHVybiBTSE9XX0lOX1RBUkdFVF9MSVNUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmcgbGFiZWw9IHN1cGVyLmdldExhYmVsKCk7Ci0JCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyPSBnZXRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVmlld2VyKSB7Ci0JCQlUYWJsZVZpZXdlciB0dj0gKFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0KLQkJCUFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQ9IGdldElucHV0KCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlpbnQgaXRlbUNvdW50PSAoKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKSB0di5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0RWxlbWVudHMoZ2V0SW5wdXQoKSkubGVuZ3RoOwotCQkJCWludCBmaWxlQ291bnQ9IGdldElucHV0KCkuZ2V0RWxlbWVudHMoKS5sZW5ndGg7Ci0JCQkJaWYgKGl0ZW1Db3VudCA8IGZpbGVDb3VudCkgewotCQkJCQlTdHJpbmcgZm9ybWF0PSBTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9saW1pdGVkX2Zvcm1hdDsgCi0JCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChmb3JtYXQsIG5ldyBPYmplY3RbXXtsYWJlbCwgbmV3IEludGVnZXIoaXRlbUNvdW50KSwgbmV3IEludGVnZXIoZmlsZUNvdW50KX0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCWNsYXNzIE5ld1RleHRTZWFyY2hBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQotCQlwcml2YXRlIElTZWxlY3Rpb25Qcm92aWRlciBmU2VsZWN0aW9uUHJvdmlkZXI7CQkKLQkJcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBmUGFnZTsKLQkJcHJpdmF0ZSBPcGVuRmlsZUFjdGlvbiBmT3BlbkFjdGlvbjsKLQkJcHJpdmF0ZSBQcm9wZXJ0eURpYWxvZ0FjdGlvbiBmT3BlblByb3BlcnRpZXNEaWFsb2c7Ci0KLQkJcHVibGljIE5ld1RleHRTZWFyY2hBY3Rpb25Hcm91cChJVmlld1BhcnQgcGFydCkgewotCQkJQXNzZXJ0LmlzTm90TnVsbChwYXJ0KTsKLQkJCUlXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlPSBwYXJ0LmdldFNpdGUoKTsKLQkJCWZTZWxlY3Rpb25Qcm92aWRlcj0gc2l0ZS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJZlBhZ2U9IHNpdGUuZ2V0UGFnZSgpOwotCQkJZk9wZW5Qcm9wZXJ0aWVzRGlhbG9nPSBuZXcgUHJvcGVydHlEaWFsb2dBY3Rpb24oc2l0ZSwgZlNlbGVjdGlvblByb3ZpZGVyKTsKLQkJCWZPcGVuQWN0aW9uPSBuZXcgT3BlbkZpbGVBY3Rpb24oZlBhZ2UpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGZTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCWZPcGVuUHJvcGVydGllc0RpYWxvZy5zZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pOwotCQkJZWxzZQotCQkJCWZPcGVuUHJvcGVydGllc0RpYWxvZy5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQkKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQkvLyB2aWV3IG11c3QgZXhpc3QgaWYgd2UgY3JlYXRlIGEgY29udGV4dCBtZW51IGZvciBpdC4KLQkJCQotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCWFkZE9wZW5XaXRoTWVudShtZW51LCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQkJaWYgKGZPcGVuUHJvcGVydGllc0RpYWxvZyAhPSBudWxsICYmIGZPcGVuUHJvcGVydGllc0RpYWxvZy5pc0VuYWJsZWQoKSAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJmZPcGVuUHJvcGVydGllc0RpYWxvZy5pc0FwcGxpY2FibGVGb3JTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pKQotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1BST1BFUlRJRVMsIGZPcGVuUHJvcGVydGllc0RpYWxvZyk7Ci0JCQl9Ci0JCQkJCi0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBhZGRPcGVuV2l0aE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLQkJCQlyZXR1cm47Ci0JCQotCQkJT2JqZWN0IG89IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCi0JCQlpZiAoIShvIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkpCi0JCQkJcmV0dXJuOyAKLQkJCi0JCQlmT3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX09QRU4sIGZPcGVuQWN0aW9uKTsKLQkJCi0JCQkvLyBDcmVhdGUgbWVudQotCQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnU9IG5ldyBNZW51TWFuYWdlcihTZWFyY2hNZXNzYWdlcy5PcGVuV2l0aE1lbnVfbGFiZWwpOyAKLQkJCXN1Ym1lbnUuYWRkKG5ldyBPcGVuV2l0aE1lbnUoZlBhZ2UsIChJQWRhcHRhYmxlKW8pKTsKLQkJCi0JCQkvLyBBZGQgdGhlIHN1Ym1lbnUuCi0JCQltZW51LmFwcGVuZFRvR3JvdXAoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX09QRU4sIHN1Ym1lbnUpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gQWN0aW9uR3JvdXAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcikgewotCQkJc3VwZXIuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFyKTsKLQkJCXNldEdsb2JhbEFjdGlvbkhhbmRsZXJzKGFjdGlvbkJhcik7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBzZXRHbG9iYWxBY3Rpb25IYW5kbGVycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUk9QRVJUSUVTLmdldElkKCksIGZPcGVuUHJvcGVydGllc0RpYWxvZyk7CQkKLQkJfQotCX0JCi0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1N2QyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUj0gbmV3IE9iamVjdFswXTsKLQkKLQlwcml2YXRlIFNlYXJjaFJlc3VsdFBhZ2UgZlBhZ2U7Ci0JcHJpdmF0ZSBBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgZlJlc3VsdDsKLQotCXB1YmxpYyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcihTZWFyY2hSZXN1bHRQYWdlIHBhZ2UpIHsKLQkJZlBhZ2U9IHBhZ2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgewotCQkJT2JqZWN0W10gZWxlbWVudHM9ICgoU2VhcmNoUmVzdWx0KWlucHV0RWxlbWVudCkuZ2V0RWxlbWVudHMoKTsKLSAgIAkgICAgICAgIC8vIGNzIDogSSd2ZSBjb21tZW50IHRoaXMgY29kZSBvdXQgZm9yIG5vdy4gIFdlIG5lZWQgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzIHRvIHRoZSBiYXNlIGNsYXNzIGFuZCByZWFjdCBhY2NvcmRpbmdseS4KLQkJCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJCS8qCi0JCQlpbnQgdGFibGVMaW1pdD0gU2VhcmNoUHJlZmVyZW5jZVBhZ2UuZ2V0VGFibGVMaW1pdCgpOwotCQkJaWYgKFNlYXJjaFByZWZlcmVuY2VQYWdlLmlzVGFibGVMaW1pdGVkKCkgJiYgZWxlbWVudHMubGVuZ3RoID4gdGFibGVMaW1pdCkgewotCQkJCU9iamVjdFtdIHNob3duRWxlbWVudHM9IG5ldyBPYmplY3RbdGFibGVMaW1pdF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgc2hvd25FbGVtZW50cywgMCwgdGFibGVMaW1pdCk7Ci0JCQkJcmV0dXJuIHNob3duRWxlbWVudHM7Ci0JCQl9Ki8KLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCQlyZXR1cm4gRU1QVFlfQVJSOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSB7Ci0JCQlmUmVzdWx0PSAoU2VhcmNoUmVzdWx0KSBuZXdJbnB1dDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gdXBkYXRlZEVsZW1lbnRzKSB7Ci0JCVRhYmxlVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKCk7Ci0JICAgIC8vIGNzIDogSSd2ZSBjb21tZW50ICd0YWJsZUxpbWl0ZWQnIHJlbGF0ZWQgY29kZSBvdXQgZm9yIG5vdy4gIFdlIG5lZWQgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzIHRvIHRoZSBiYXNlIGNsYXNzIGFuZCByZWFjdCBhY2NvcmRpbmdseS4KLQkJLy8gRXZlbiBtb3JlIGltcG9ydGFudGx5IHdlIG5lZWQgdG8gZGlzY3VzcyB3aXRoIHRoZSBiYXNlIGd1eXMgdG8gZ2V0IEFQSSBsaW5lZCB1cCBmb3IgdGhpcyAoc2VlIGJ1ZyAxNjMxNzcpLgotCQkvL2Jvb2xlYW4gdGFibGVMaW1pdGVkPSBTZWFyY2hQcmVmZXJlbmNlUGFnZS5pc1RhYmxlTGltaXRlZCgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZlJlc3VsdC5nZXRNYXRjaENvdW50KHVwZGF0ZWRFbGVtZW50c1tpXSkgPiAwKSB7Ci0JCQkJaWYgKHZpZXdlci50ZXN0RmluZEl0ZW0odXBkYXRlZEVsZW1lbnRzW2ldKSAhPSBudWxsKQotCQkJCQl2aWV3ZXIudXBkYXRlKHVwZGF0ZWRFbGVtZW50c1tpXSwgbnVsbCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vaWYgKCF0YWJsZUxpbWl0ZWQgfHwgdmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgPCBTZWFyY2hQcmVmZXJlbmNlUGFnZS5nZXRUYWJsZUxpbWl0KCkpCi0JCQkJCQl2aWV3ZXIuYWRkKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJdmlld2VyLnJlbW92ZSh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiAoVGFibGVWaWV3ZXIpIGZQYWdlLmdldFZpZXdlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3OWNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlLklGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgZlJlc3VsdDsKLQlwcml2YXRlIEFic3RyYWN0VHJlZVZpZXdlciBmVHJlZVZpZXdlcjsKLQlwcml2YXRlIE1hcCBmQ2hpbGRyZW5NYXA7Ci0JCi0JU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcihBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWZUcmVlVmlld2VyPSB2aWV3ZXI7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHsKLQkJCWluaXRpYWxpemUoKFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQpOwotCQl9Ci0JfQotCQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemUoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCkgewotCQlmUmVzdWx0PSByZXN1bHQ7Ci0JCWZDaGlsZHJlbk1hcD0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cz0gcmVzdWx0LmdldEVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnNlcnQoZWxlbWVudHNbaV0sIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydChPYmplY3QgY2hpbGQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcikgewotCQlPYmplY3QgcGFyZW50PSBnZXRQYXJlbnQoY2hpbGQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChpbnNlcnRDaGlsZChwYXJlbnQsIGNoaWxkKSkgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKQotCQkJCQlmVHJlZVZpZXdlci5hZGQocGFyZW50LCBjaGlsZCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKQotCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKHBhcmVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2hpbGQ9IHBhcmVudDsKLQkJCXBhcmVudD0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJfQotCQlpZiAoaW5zZXJ0Q2hpbGQoZlJlc3VsdCwgY2hpbGQpKSB7Ci0JCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQlmVHJlZVZpZXdlci5hZGQoZlJlc3VsdCwgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGlsZCBhbHJlYWR5IHdhcyBhIGNoaWxkIG9mIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRyeWU8L2NvZGU+IGlmIHRoZSBjaGlsZCB3YXMgYWRkZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaW5zZXJ0Q2hpbGQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0JCVNldCBjaGlsZHJlbj0gKFNldCkgZkNoaWxkcmVuTWFwLmdldChwYXJlbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW49IG5ldyBIYXNoU2V0KCk7Ci0JCQlmQ2hpbGRyZW5NYXAucHV0KHBhcmVudCwgY2hpbGRyZW4pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgZWxlbWVudCwgYm9vbGVhbiByZWZyZXNoVmlld2VyKSB7Ci0JCS8vIHByZWNvbmRpdGlvbiBoZXJlOiAgZlJlc3VsdC5nZXRNYXRjaENvdW50KGNoaWxkKSA8PSAwCi0JCi0JCWlmIChoYXNDaGlsZHJlbihlbGVtZW50KSkgewotCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJZlRyZWVWaWV3ZXIucmVmcmVzaChlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmUmVzdWx0LmdldE1hdGNoQ291bnQoZWxlbWVudCkgPT0gMCkgewotCQkJCWZDaGlsZHJlbk1hcC5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJT2JqZWN0IHBhcmVudD0gZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVGcm9tU2libGluZ3MoZWxlbWVudCwgcGFyZW50KTsKLQkJCQkJcmVtb3ZlKHBhcmVudCwgcmVmcmVzaFZpZXdlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIGZSZXN1bHQpOwotCQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJCWZUcmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCWZUcmVlVmlld2VyLnJlZnJlc2goZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21TaWJsaW5ncyhPYmplY3QgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgewotCQlTZXQgc2libGluZ3M9IChTZXQpIGZDaGlsZHJlbk1hcC5nZXQocGFyZW50KTsKLQkJaWYgKHNpYmxpbmdzICE9IG51bGwpIHsKLQkJCXNpYmxpbmdzLnJlbW92ZShlbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlTZXQgY2hpbGRyZW49IChTZXQpIGZDaGlsZHJlbk1hcC5nZXQocGFyZW50RWxlbWVudCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZX0FSUjsKLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCQlmb3IgKGludCBpPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZlJlc3VsdC5nZXRNYXRjaENvdW50KHVwZGF0ZWRFbGVtZW50c1tpXSkgPiAwKQotCQkJCWluc2VydCh1cGRhdGVkRWxlbWVudHNbaV0sIHRydWUpOwotCQkJZWxzZQotCQkJCXJlbW92ZSh1cGRhdGVkRWxlbWVudHNbaV0sIHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoZlJlc3VsdCk7Ci0JCWZUcmVlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBlbGVtZW50OwotCQkJcmV0dXJuIHJlc291cmNlLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL0ZpbGVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9GaWxlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzdlMjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL0ZpbGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIERlcml2ZWQgZnJvbSBvcmcuZWNsaXBzZS5zZWFyY2guaW50ZXJuYWwudWkuRmlsZUxhYmVsUHJvdmlkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaE1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0xBQkVMPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfTEFCRUxfUEFUSD0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX1BBVEhfTEFCRUw9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19QQVRIPSA0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmZ1NlcGFyYXRvckZvcm1hdD0gInswfSAtIHsxfSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFdvcmtiZW5jaExhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSBmUGFnZTsKLQkJCi0JcHJpdmF0ZSBpbnQgZk9yZGVyOwotCXByaXZhdGUgU3RyaW5nW10gZkFyZ3M9IG5ldyBTdHJpbmdbMl07Ci0KLQlwdWJsaWMgRmlsZUxhYmVsUHJvdmlkZXIoQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UgcGFnZSwgaW50IG9yZGVyRmxhZykgewotCQlmTGFiZWxQcm92aWRlcj0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQkJZk9yZGVyPSBvcmRlckZsYWc7Ci0JCWZQYWdlPSBwYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9yZGVyKGludCBvcmRlckZsYWcpIHsKLQkJZk9yZGVyPSBvcmRlckZsYWc7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7Ci0JCXJldHVybiBmT3JkZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVJlc291cmNlIHJlc291cmNlPSAoSVJlc291cmNlKWVsZW1lbnQ7Ci0JCVN0cmluZyB0ZXh0PSBudWxsOwotCi0JCWlmICghcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQl0ZXh0PSBTZWFyY2hNZXNzYWdlcy5GaWxlTGFiZWxQcm92aWRlcl9yZW1vdmVkX3Jlc291cmNlX2xhYmVsOyAKLQkJCi0JCWVsc2UgewotCQkJSVBhdGggcGF0aD0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlpZiAocGF0aC5nZXREZXZpY2UoKSA9PSBudWxsKQotCQkJCXBhdGg9IHBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQlpZiAoZk9yZGVyID09IFNIT1dfTEFCRUwgfHwgZk9yZGVyID09IFNIT1dfTEFCRUxfUEFUSCkgewotCQkJCXRleHQ9IGZMYWJlbFByb3ZpZGVyLmdldFRleHQocmVzb3VyY2UpOwotCQkJCWlmIChwYXRoICE9IG51bGwgJiYgZk9yZGVyID09IFNIT1dfTEFCRUxfUEFUSCkgewotCQkJCQlmQXJnc1swXT0gdGV4dDsKLQkJCQkJZkFyZ3NbMV09IHBhdGgudG9TdHJpbmcoKTsKLQkJCQkJdGV4dD0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZmdTZXBhcmF0b3JGb3JtYXQsIGZBcmdzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJCXRleHQ9IHBhdGgudG9TdHJpbmcoKTsKLQkJCQllbHNlCi0JCQkJCXRleHQ9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGZPcmRlciA9PSBTSE9XX1BBVEhfTEFCRUwpIHsKLQkJCQkJZkFyZ3NbMF09IHRleHQ7Ci0JCQkJCWZBcmdzWzFdPSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KHJlc291cmNlKTsKLQkJCQkJdGV4dD0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZmdTZXBhcmF0b3JGb3JtYXQsIGZBcmdzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWludCBtYXRjaENvdW50PSAwOwotCQlBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0PSBmUGFnZS5nZXRJbnB1dCgpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQltYXRjaENvdW50PSByZXN1bHQuZ2V0TWF0Y2hDb3VudChlbGVtZW50KTsKLQkJaWYgKG1hdGNoQ291bnQgPD0gMSkKLQkJCXJldHVybiB0ZXh0OwotCQlTdHJpbmcgZm9ybWF0PSBTZWFyY2hNZXNzYWdlcy5GaWxlTGFiZWxQcm92aWRlcl9jb3VudF9mb3JtYXQ7IAotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W10geyB0ZXh0LCBuZXcgSW50ZWdlcihtYXRjaENvdW50KSB9KTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2U9IChJUmVzb3VyY2UpZWxlbWVudDsKLQkJSW1hZ2UgaW1hZ2U9IGZMYWJlbFByb3ZpZGVyLmdldEltYWdlKHJlc291cmNlKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZkxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlci5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlmTGFiZWxQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWZMYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlZjQxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqCi0gKiBEZXJpdmVkIGZyb20gb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLklGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIgewotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cyk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcigpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5MWRjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCi0gKiBEZXJpdmVkIGZyb20gb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLk1lc3NhZ2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGZvcm1hdCBtZXNzYWdlIHN0cmluZ3MuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgbmV3IE9iamVjdFtdIHsgb2JqZWN0fSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBtZXNzYWdlLCBPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBvYmplY3RzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBOb3QgZm9yIGluc3RhbnRpYXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1Jlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzUyODFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1Jlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCi0gKiBEZXJpdmVkIGZyb20gb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLlJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlJlc291cmNlVHJhbnNmZXI7Ci0KLS8qKgotICogQSBkcmFnIGFkYXB0ZXIgdGhhdCB0cmFuc2ZlcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFzIDwvY29kZT4KLSAqIElSZXNvdXJjZTwvY29kZT4uIE9ubHkgdGhvc2UgZWxlbWVudHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgcGFydCAKLSAqIG9mIHRoZSB0cmFuc2ZlciB3aGljaCBjYW4gYmUgY29udmVydGVkIGludG8gYW4gPGNvZGU+SVJlc291cmNlCi0gKiA8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyIGV4dGVuZHMgRHJhZ1NvdXJjZUFkYXB0ZXIgaW1wbGVtZW50cyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25Qcm92aWRlciBmUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlciBmb3IgdGhlIGdpdmVuIHNlbGVjdGlvbgotCSAqIHByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlciB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyIHRvIGFjY2VzcyB0aGUgdmlld2VyJ3Mgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIFJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJZlByb3ZpZGVyPSBwcm92aWRlcjsKLQkJQXNzZXJ0LmlzTm90TnVsbChmUHJvdmlkZXIpOwotCX0KLQkKLQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCXJldHVybiBSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJZXZlbnQuZG9pdD0gY29udmVydFNlbGVjdGlvbigpLnNpemUoKSA+IDA7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlMaXN0IHJlc291cmNlcz0gY29udmVydFNlbGVjdGlvbigpOwotCQlldmVudC5kYXRhPSByZXNvdXJjZXMudG9BcnJheShuZXcgSVJlc291cmNlW3Jlc291cmNlcy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlpZiAoIWV2ZW50LmRvaXQpCi0JCQlyZXR1cm47Ci0JfQotCQotCXByaXZhdGUgTGlzdCBjb252ZXJ0U2VsZWN0aW9uKCkgewotCQlJU2VsZWN0aW9uIHM9IGZQcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEocyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb249IChJU3RydWN0dXJlZFNlbGVjdGlvbikgczsKLQkJTGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3Qoc2VsZWN0aW9uLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQ9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvU29ydEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvU29ydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTkxZWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1NvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5Tb3J0QWN0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaFJlc3VsdFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBTb3J0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIGludCBmU29ydE9yZGVyOwotCXByaXZhdGUgU2VhcmNoUmVzdWx0UGFnZSBmUGFnZTsKLQkKLQlwdWJsaWMgU29ydEFjdGlvbihTdHJpbmcgbGFiZWwsIFNlYXJjaFJlc3VsdFBhZ2UgcGFnZSwgaW50IHNvcnRPcmRlcikgewotCQlzdXBlcihsYWJlbCk7Ci0JCWZQYWdlPSBwYWdlOwotCQlmU29ydE9yZGVyPSBzb3J0T3JkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlmUGFnZS5zZXRTb3J0T3JkZXIoZlNvcnRPcmRlcik7Ci0JfQotCi0JcHVibGljIGludCBnZXRTb3J0T3JkZXIoKSB7Ci0JCXJldHVybiBmU29ydE9yZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9Db21wb25lbnRTZWFyY2hMaXN0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZWQ1OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9Db21wb25lbnRTZWFyY2hMaXN0RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLlRleHRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotICAgIHByaXZhdGUgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGU7Ci0KLSAgICBwcm90ZWN0ZWQgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLSAgICBwcml2YXRlIExpc3QgY29tcG9uZW50VGFibGVWaWV3ZXJJbnB1dDsKLSAgICBwcml2YXRlIExpc3QgbWFzdGVyQ29tcG9uZW50TGlzdDsKLSAgICAKLSAgICAvLyB3aWRnZXRzCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSB0b3BDb21wb3NpdGU7Ci0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBib3R0b21Db21wb3NpdGU7IAotICAgIHByaXZhdGUgVGV4dCB0ZXh0RmlsdGVyOwotICAgIHByb3RlY3RlZCBUYWJsZVZpZXdlciBjb21wb25lbnRUYWJsZVZpZXdlcjsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVMb2NhdGlvbkxhYmVsID0gTWVzc2FnZXMuX1VJX0xBQkVMX0RFQ0xBUkFUSU9OX0xPQ0FUSU9OOwotICAgIHByb3RlY3RlZCBWaWV3Rm9ybSBmaWxlTG9jYXRpb25WaWV3OyAgICAKLSAgICBwcm90ZWN0ZWQgQ0xhYmVsIGxvY2F0aW9uTGFiZWw7Ci0KLSAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBpdGVtIHByZXZpb3VzbHkgc2VsZWN0ZWQgaW4gdGhlIHRhYmxlCi0JcHJpdmF0ZSBUYWJsZUl0ZW0gcHJldkl0ZW07Ci0JcHJpdmF0ZSBTdHJpbmcgcHJldkl0ZW1UZXh0OwotCi0JcHJvdGVjdGVkIE9iamVjdCBjb21wb25lbnRTZWxlY3Rpb247Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBxdWFsaWZpZXJUZXh0U2VsZWN0aW9uOwotICAgIAotCXByb3RlY3RlZCBUb29sQmFyIGZpbHRlclRvb2xCYXI7Ci0JcHJvdGVjdGVkIFRvb2xJdGVtIHRvb2xJdGVtOwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBmTWVudU1hbmFnZXI7Ci0JCi0JcHJvdGVjdGVkIEhhc2hNYXAgVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wgPSBuZXcgSGFzaE1hcCgpOyAgCi0gICAgcHJpdmF0ZSBCdXR0b24gbmV3QnV0dG9uOwotIAotCi0JcHVibGljIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBzdXBlcihzaGVsbCk7Ci0gICAgICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgICAgIHRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXJJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbWFzdGVyQ29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5pbml0KHRoaXMpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZSgpOwotICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFRleHRGaWx0ZXJGb2N1cygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0RmlsdGVyRm9jdXMoKSB7Ci0gICAgICAgIHRleHRGaWx0ZXIuc2V0Rm9jdXMoKTsgICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBnZXRTaGVsbCgpLnNldFRleHQoZGlhbG9nVGl0bGUpOwotCi0gICAgICAgIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICBHcmlkRGF0YSBnRGF0YSA9IChHcmlkRGF0YSkgbWFpbkNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0gICAgICAgIGdEYXRhLmhlaWdodEhpbnQgPSA1MDA7Ci0gICAgICAgIAotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVdpZGdldEFib3ZlUXVhbGlmaWVyQm94KG1haW5Db21wb3NpdGUpOyAgICAgICAgCi0gICAgICAgIC8vIFN1YmNsYXNzZXMgbWF5IHVzZSB0aGlzIENvbXBvc2l0ZSB0byBhZGQgZGVzaXJlZCB3aWRnZXRzCi0gICAgICAgIC8vdG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIC8vdG9wQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgICAgICAvL3RvcENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBpbnRyb2R1Y2UgYSBtZXRob2QgaGVyZSB0byBjb250YWluIHRoaXMKLSAgICAgICAgLy8gc28gd2UgY2FuIGFkZCBkaWZmZXJlbnQgcGFyZW50IG90aGVyIHRoYW4gJ3RvcENvbXBvc2l0ZScKLSAgICAgICAgQ29tcG9zaXRlIGZpbHRlckxhYmVsQW5kVGV4dCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dEZpbHRlckxhYmVsQW5kVGV4dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgbGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGZpbHRlckxhYmVsQW5kVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZmlsdGVyTGFiZWxBbmRUZXh0LnNldExheW91dChsYXlvdXRGaWx0ZXJMYWJlbEFuZFRleHQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBUZXh0IHRleHRGaWx0ZXIKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGZpbHRlckxhYmVsID0gbmV3IExhYmVsKGZpbHRlckxhYmVsQW5kVGV4dCwgU1dULk5PTkUpOwotICAgICAgICBmaWx0ZXJMYWJlbC5zZXRUZXh0KGNvbmZpZ3VyYXRpb24uZ2V0RmlsdGVyTGFiZWxUZXh0KCkpOy8vICsgIig/ID0gYW55IGNoYXJhY3RlciwgKiA9IGFueSBzdHJpbmcpOiIpOwotICAgICAgICBHcmlkRGF0YSBmaWx0ZXJMYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZmlsdGVyTGFiZWxEYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZmlsdGVyTGFiZWwuc2V0TGF5b3V0RGF0YShmaWx0ZXJMYWJlbERhdGEpOwotCi0gICAgICAgIHRleHRGaWx0ZXIgPSBuZXcgVGV4dChmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgdGV4dEZpbHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgICAgICAgIAotICAgICAgICB0ZXh0RmlsdGVyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBUZXh0RmlsdGVyTW9kaWZ5QWRhcHRlcigpKTsKLSAgICAgICAgR3JpZERhdGEgdGV4dEZpbHRlckRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgdGV4dEZpbHRlckRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIHRleHRGaWx0ZXJEYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICB0ZXh0RmlsdGVyLnNldExheW91dERhdGEodGV4dEZpbHRlckRhdGEpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSU5ld0NvbXBvbmVudEhhbmRsZXIgaGFuZGxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0TmV3Q29tcG9uZW50SGFuZGxlcigpOwotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICAgbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgbmV3QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05ldyk7ICAKLSAgICAgICAgICAgbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICAgICAgIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIub3Blbk5ld0NvbXBvbmVudERpYWxvZygpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIub3Blbk5ld0NvbXBvbmVudERpYWxvZygpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgQ29tcG9uZW50IFRhYmxlVmlld2VyCi0gICAgICAgIGNyZWF0ZUNvbXBvbmVudFRhYmxlVmlld2VyKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uY3JlYXRlV2lkZ2V0QWJvdmVRdWFsaWZpZXJCb3gobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgUXVhbGlmaWVyIExpc3Qgd2lkZ2V0Ci0gICAgICAgIExhYmVsIHF1YWxpZmllckxhYmVsID0gbmV3IExhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcXVhbGlmaWVyTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfUVVBTElGSUVSKTsKLQkJcXVhbGlmaWVyTGFiZWwuc2V0VGV4dChmaWxlTG9jYXRpb25MYWJlbCk7Ci0KLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldyA9IG5ldyBWaWV3Rm9ybShtYWluQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkZMQVQgKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSAyMjsKLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldy5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAKLSAgICAJbG9jYXRpb25MYWJlbCA9IG5ldyBDTGFiZWwoZmlsZUxvY2F0aW9uVmlldywgU1dULkZMQVQpOwotICAgICAgICBmaWxlTG9jYXRpb25WaWV3LnNldENvbnRlbnQobG9jYXRpb25MYWJlbCk7Ci0gICAgCWxvY2F0aW9uTGFiZWwuc2V0Rm9udChmaWxlTG9jYXRpb25WaWV3LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbi5jcmVhdGVXaWRnZXRCZWxvd1F1YWxpZmllckJveChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gUG9wdWxhdGUgdGhlIENvbXBvbmVudCBUYWJsZVZpZXdlciB2aWEgdGhlIHByb3ZpZGVyCi0gICAgICAgIC8vIFRPRE86IElzIHRoaXMgdGhlIHJpZ2h0IHdheSB0byBzZXQvZ2V0IHRoZSBDb250ZW50UHJvdmlkZXI/Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29tcG9uZW50VGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCkuZ2V0TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldElucHV0KGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGRvIHNvbWUgd29yayB0byBtYWtlIHRoZSBkZWZhdWx0IHNlYXJjaCBzY29wZQotICAgICAgICAvLyBtb3JlIHdlbGwgZGVmaW5lZCwgY3VycmVudGx5IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBwYXNzIGEgbnVsbAotICAgICAgICAvLyBhcmd1bWVudCBpbiB0byBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QgYnV0IHdlIHNob3VsZCBwcm92aWRlCi0gICAgICAgIC8vIGdldHRlcnMvc2V0dGVycyB0byBhbGxvdyB0aGUgZGVmYXVsdCB0byBiZSBjb250cm9sbGVkCi0gICAgICAgIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdChudWxsKTsKLSAgICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKCIiKTsKLQotICAgICAgICByZXR1cm4gbWFpbkNvbXBvc2l0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBDcmVhdGVzIHRoZSBDb21wb25lbnQgVGFibGVWaWV3ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudFRhYmxlVmlld2VyKENvbXBvc2l0ZSBiYXNlKSB7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyID0gY3JlYXRlRmlsdGVyTWVudUFuZFRhYmxlVmlld2VyKGJhc2UpOyAgICAKLSAgICAgICAgCi0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy9JU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAvL0xpc3QgcXVhbGlmaWVycyA9IHNlYXJjaExpc3RQcm92aWRlci5nZXRRdWFsaWZpZXJzKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlUXVhbGlmaWVyTGlzdChxdWFsaWZpZXJzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDYW5GaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAJLy8gQ2hhbmdpbmcgdGhlIHRleHQgZm9yIHRoZSBjb21wb25lbnQgc2VsZWN0ZWQgYW5kIGRpc3BsYXkgaXRzIHNvdXJjZQotICAgICAgICAJLy8gZmlsZSBpbiB0aGUgYm94IHVuZGVyIHRoZSB0YWJsZSB2aWV3ZXIKLSAgICAgICAgICAKLSAgICAgICAgCUlDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldERlc2NyaXB0aW9uUHJvdmlkZXIoKTsgICAgICAgIAkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkJCi0JCQkJcnVuKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIC8vIGJ1ZyAxNDQ1NDggLSB1bm5lY2Vzc2FyeQotICAgICAgICAvLyBydW4oKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJ1bigpIHsKLQkJCQkvLyByZXN0b3JlcyB0aGUgdGV4dCBvZiBwcmV2aW91cyBpdGVtCi0JCQkJaWYgKHByZXZJdGVtICE9IG51bGwgJiYgIXByZXZJdGVtLmlzRGlzcG9zZWQoKSl7Ci0JCQkJCXByZXZJdGVtLnNldFRleHQocHJldkl0ZW1UZXh0KTsKLQkJCQl9Ci0JCQkJVGFibGVJdGVtW10gaXRlbXMgPSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBjb21wb25lbnQgPSBpdGVtc1swXS5nZXREYXRhKCk7Ci0KLQkJCQlwcmV2SXRlbSA9IGl0ZW1zWzBdOwotCQkJCXByZXZJdGVtVGV4dCA9IGl0ZW1zWzBdLmdldFRleHQoKTsKLQotCQkJCS8vIGFkZCBjbGFyaWZpY2F0aW9uIGZvciB0aGUgZmlyc3Qgc2VsZWN0ZWQgaXRlbQotCQkJCWl0ZW1zWzBdLnNldFRleHQoICBkZXNjcmlwdGlvblByb3ZpZGVyLmdldE5hbWUoY29tcG9uZW50KSArICIgLSAiICsgCi0gICAgCQkJCQlkZXNjcmlwdGlvblByb3ZpZGVyLmdldFF1YWxpZmllcihjb21wb25lbnQpKTsKLQotCQkJCXVwZGF0ZUxvY2F0aW9uVmlldyhjb21wb25lbnQsIGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotCQkJfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJb2tQcmVzc2VkKCk7Ci0JCQl9Ci0gICAgICAgIAkKLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBUYWJsZVZpZXdlciBjcmVhdGVGaWx0ZXJNZW51QW5kVGFibGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXApIHsKLSAgICAJQ29tcG9zaXRlIGxhYmVsQW5kRmlsdGVyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0gICAgCWxhYmVsQW5kRmlsdGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsgbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLSAgICAJbGFiZWxBbmRGaWx0ZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgCQotICAgICAgICBMYWJlbCB0YWJsZUxhYmVsID0gbmV3IExhYmVsKGxhYmVsQW5kRmlsdGVyLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHRhYmxlTGFiZWwuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldExpc3RMYWJlbFRleHQoKSk7Ci0gICAgICAgIAotICAgICAgICBmaWx0ZXJUb29sQmFyID0gbmV3IFRvb2xCYXIobGFiZWxBbmRGaWx0ZXIsU1dULkZMQVQpOwotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVRvb2xCYXJJdGVtcyhmaWx0ZXJUb29sQmFyKTsKLQotICAgICAgICBUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihuZXcgVGFibGUobGFiZWxBbmRGaWx0ZXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKSk7Ci0gICAgICAgIENvbnRyb2wgVGFibGVXaWRnZXQgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIFRhYmxlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIHJldHVybiB0YWJsZVZpZXdlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvY2F0aW9uVmlldyhPYmplY3QgY29tcG9uZW50LCBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBscCkgewotICAgIAlJRmlsZSBmaWxlID0gbHAuZ2V0RmlsZShjb21wb25lbnQpOwotICAgIAkKLSAgICAJaWYgKCBmaWxlID09IG51bGwgKXsKLSAgICAJCWxvY2F0aW9uTGFiZWwuc2V0VGV4dCgiIik7Ci0gICAgCQlsb2NhdGlvbkxhYmVsLnNldEltYWdlKG51bGwpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCVN0cmluZyBmaWxlUGF0aCA9ICIiOwotICAgIAlmaWxlUGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAvL2xvY2F0aW9uVmlldy5yZWRyYXcoKTsKLSAgICAgICAgCi0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0VGV4dChUZXh0UHJvY2Vzc29yLnByb2Nlc3MoZmlsZVBhdGgpKTsKLSAgICAgICAgbG9jYXRpb25MYWJlbC5zZXRJbWFnZShscC5nZXRGaWxlSWNvbihjb21wb25lbnQpKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9jZXNzZWQgZmlsdGVyIHRleHQgZm9yIHRoZSBUZXh0IGZpZWxkLiAgSW5zZXJ0cyBhICIuIgotICAgICAqIGJlZm9yZSBlYWNoIHN1cHBvcnRlZCBtZXRhLWNoYXJhY3Rlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NGaWx0ZXJTdHJpbmcodGV4dEZpbHRlci5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgc3VwcG9ydGVkIG1ldGFjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIHRoZSBmaWx0ZXIgc3RyaW5nLCB3ZSBuZWVkIHRvCi0gICAgICogaW5zZXJ0IGEgIi4iIGJlZm9yZSBlYWNoIG1ldGFjaGFyYWN0ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0ZpbHRlclN0cmluZyhTdHJpbmcgaW5wdXRTdHJpbmcpIHsKLSAgICAgICAgaWYgKCEoaW5wdXRTdHJpbmcuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIGlucHV0U3RyaW5nID0gaW5zZXJ0U3RyaW5nKCIqIiwgIi4iLCBpbnB1dFN0cmluZyk7Ci0gICAgICAgICAgICBpbnB1dFN0cmluZyA9IGluc2VydFN0cmluZygiPyIsICIuIiwgaW5wdXRTdHJpbmcpOwotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSBpbnB1dFN0cmluZyArICIuKiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmluZyA9ICIuKiI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5wdXRTdHJpbmcudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGluc2VydCBhICIuIiBiZWZvcmUgZWFjaCBtZXRhY2hhcmFjdGVyIGluIHRoZQotICAgICAqIHNlYXJjaC9maWx0ZXIgc3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGluc2VydFN0cmluZyhTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgbmV3U3RyaW5nLCBTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cmluZyk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gc3RyaW5nQnVmZmVyLmluZGV4T2YodGFyZ2V0KTsKLSAgICAgICAgd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIgPSBzdHJpbmdCdWZmZXIuaW5zZXJ0KGluZGV4LCBuZXdTdHJpbmcpOwotICAgICAgICAgICAgaW5kZXggPSBzdHJpbmdCdWZmZXIuaW5kZXhPZih0YXJnZXQsIGluZGV4ICsgbmV3U3RyaW5nLmxlbmd0aCgpICsgdGFyZ2V0Lmxlbmd0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0KLQotICAgIC8qCi0gICAgICogTGlzdGVucyB0byBjaGFuZ2VzIG1hZGUgaW4gdGhlIHRleHQgZmlsdGVyIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVGV4dEZpbHRlck1vZGlmeUFkYXB0ZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKGUud2lkZ2V0ID09IHRleHRGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVsYXllZEV2ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsYXllZEV2ZW50LkNBTkNFTCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsYXllZEV2ZW50ID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLnRpbWVyRXhlYyg0MDAsIGRlbGF5ZWRFdmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1RPRE8uLi4gZG8gd2UgcmVhbGx5IG5lZWQgb25lIGluc3RhbmNlPwotICAgIHByaXZhdGUgRGVsYXllZEV2ZW50IGRlbGF5ZWRFdmVudDsKLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBjb21wb25lbnQgVGFibGVWaWV3ZXIgd2hlbiB0aGUgdGV4dCBmaWx0ZXIgaXMgbW9kaWZpZWQuCi0gICAgICogVXNlIGEgRGVsYXllZEV2ZW50IHNvIHdlIGRvbid0IHVwZGF0ZSBvbiBldmVyeSBrZXlzdHJva2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIENBTkNFTCA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmICghQ0FOQ0VMKSB7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKClbMF07Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtc1tdID0gbmV3IFRhYmxlSXRlbVsxXTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0gPSBpdGVtOwotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBxdWFsaWZpZXJMaXN0Ci0gICAgICAgICAgICAgICAgLy9JU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC4uLiBtYW5hZ2UgcXVhbGlmaWVycwotICAgICAgICAgICAgICAgIC8vTGlzdCBxdWFsaWZpZXJzID0gc2VhcmNoTGlzdFByb3ZpZGVyLmdldFF1YWxpZmllcnMoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgLy91cGRhdGVRdWFsaWZpZXJMaXN0KHF1YWxpZmllcnMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHVwZGF0ZUNhbkZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgQ29tcG9uZW50TGlzdCBpbXBsZW1lbnRzIElDb21wb25lbnRMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3Igb2JqZWN0VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBwcml2YXRlIGxvbmcgY3VycmVudENoYW5nZUNvdW50ZXIgPSAwOwotICAgICAgICBwcml2YXRlIGxvbmcgbGFzdFVwZGF0ZVRpbWUgPSAwOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBvYmplY3RWZWN0b3IuYWRkKG8pOwotICAgICAgICAgICAgY3VycmVudENoYW5nZUNvdW50ZXIrKzsKLSAgICAgICAgICAgIGRvVmlld2VyVXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBvYmplY3RWZWN0b3IuYWRkQWxsKGNvbGxlY3Rpb24pOwotICAgICAgICAgIGN1cnJlbnRDaGFuZ2VDb3VudGVyICs9IGNvbGxlY3Rpb24uc2l6ZSgpOwotICAgICAgICAgIGRvVmlld2VyVXBkYXRlKCk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgZG9WaWV3ZXJVcGRhdGUoKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB3ZSBzaG91bGQgYWxzbyBhZGQgYSB0aW1lciBjb25kaXRpb24/PwotICAgICAgICAgIC8vICBpZiAoY3VycmVudENoYW5nZUNvdW50ZXIgPj0gMTApIHsKLSAgICAgICAgICAvLyAgICAgIGN1cnJlbnRDaGFuZ2VDb3VudGVyID0gMDsKLSAgICAgICAgICAvLyAgICAgIGZpcmVVcGRhdGVMaXN0KHRoaXMpOwotICAgICAgICAgIC8vICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gY3M6IHllcCBJIHRoaW5rIHdlIHJlYWxseSBkbyBuZWVkIHRvIHVzZSBhIHRpbWUgYmFzZWQgYXBwcm9hY2gKLSAgICAgICAgICAvLyAgICAgICAgICAKLSAgICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICBpZiAodGltZSAtIGxhc3RVcGRhdGVUaW1lID4gMzAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBsYXN0VXBkYXRlVGltZSA9IHRpbWU7Ci0gICAgICAgICAgICAgZmlyZVVwZGF0ZUxpc3QoQ29tcG9uZW50TGlzdC50aGlzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdFZlY3Rvci5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdFZlY3Rvci5zdWJMaXN0KHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdFZlY3Rvci5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgCi0gICAgLy8gdGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgZnJvbSBhIG5vbi11aSB0aHJlYWQgc28gbmVlZHMgdG8gY2FsbAotICAgIC8vIGFzeW5jRXhlYyB0byBlbnN1cmUgdGhlIFVJIHVwZGF0ZXMgaGFwcGVuIG9uIHRoZSBVSSB0aHJlYWQKLSAgICAvLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVVcGRhdGVMaXN0KGZpbmFsIENvbXBvbmVudExpc3QgbGlzdCkgeyAgICAKLSAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKXsKLSAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IG9iamVjdHMKLSAgICAgICAgICAgICAgICBpbnQgZ3Jvd2luZ0xpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaW50IGN1cnJlbnRTaXplID0gbWFzdGVyQ29tcG9uZW50TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3dpbmdMaXN0U2l6ZSA+IGN1cnJlbnRTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hc3RlckNvbXBvbmVudExpc3QuYWRkQWxsKGxpc3Quc3ViTGlzdChjdXJyZW50U2l6ZSwgZ3Jvd2luZ0xpc3RTaXplKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOyAgICAgICAgCi0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHZvaWQgdXBkYXRlRm9yRmlsdGVyQ2hhbmdlKCkKLSAgICB7Ci0gICAgICBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QobnVsbCk7Ci0gICAgICByZWZyZXNoVGFibGVWaWV3ZXIoZ2V0UHJvY2Vzc2VkRmlsdGVyU3RyaW5nKCkpOwotICAgIH0gIAotICAgIAotICAgIC8qCi0gICAgICogUG9wdWxhdGUgdGhlIENvbXBvbmVudCBUcmVlVmlld2VyIHdpdGggaXRlbXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0KGZpbmFsIFNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlKSB7Ci0gICAgICAgIG1hc3RlckNvbXBvbmVudExpc3QuY2xlYXIoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbXBvbmVudExpc3QgY29tcG9uZW50TGlzdCA9IG5ldyBDb21wb25lbnRMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIChjcykgaXQgZG9lc24ndCBzZWVtIHRvIG1ha2Ugc2VubnNlIHRvIGRvIGFueSBvZiB0aGUgd29yayBvbiB0aGUgVUkgdGhyZWFkCi0gICAgICAgIC8vIEkndmUgY2hhbmdlIHRoZSBiZWhhdmlvdXIgaGVyZSB0byBkbyBhbGwgb2YgdGhlIHdvcmsgaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgLy8KLSAgICAgICAgLy9zZWFyY2hMaXN0UHJvdmlkZXIuX3BvcHVsYXRlQ29tcG9uZW50TGlzdFF1aWNrKGNvbXBvbmVudExpc3QsIDApOyAgICAgICAgCi0gICAgICAgIEpvYiBqb2IgPSBuZXcgSm9iKCJyZWFkIGNvbXBvbmVudHMiKSB7Ci0gICAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgLy8gdGhpcyBzdHVmZiBnZXRzIGV4ZWN1dGVkIG9uIGEgbm9uLVVJIHRocmVhZAotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFNlYXJjaExpc3RQcm92aWRlcigpLnBvcHVsYXRlQ29tcG9uZW50TGlzdChjb21wb25lbnRMaXN0LCBzZWFyY2hTY29wZSwgbnVsbCk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gRG8gYSBmaW5hbCB1cGRhdGUgb2Ygb3VyIElucHV0IGZvciB0aGUgY29tcG9uZW50IHRyZWUgdmlld2VyLgotICAgICAgICAgICAgICBmaXJlVXBkYXRlTGlzdChjb21wb25lbnRMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9OwotICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRhYmxlVmlld2VyKFN0cmluZyBmaWx0ZXJUZXh0KSB7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQuY2xlYXIoKTsKLSAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgUGF0dGVybiByZWdleCA9IFBhdHRlcm4uY29tcGlsZShmaWx0ZXJUZXh0KTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtYXN0ZXJDb21wb25lbnRMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGl0ZW1TdHJpbmcgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQoaXRlbSk7ICAgICAgICAgICAKLSAgICAgICAgICAgIE1hdGNoZXIgbSA9IHJlZ2V4Lm1hdGNoZXIoaXRlbVN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgIGlmIChpdGVtU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChmaWx0ZXJUZXh0KSB8fCBtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQuYWRkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIGRlY29yYXRlVGFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9va2luZyBhdCBlYWNoIGl0ZW0gaW4gdGhlIFRhYmxlLiBJZiB0aGVyZSBhcmUgb3RoZXIgaXRlbXMgd2l0aCBzYW1lIG5hbWUKLSAgICAgKiAsIHRoZW4gYWRkIGV4dHJhIGluZm8gKG5hbWVzcGFjZSwgZmlsZSkgaW50byB0aGUgdGhlIHRleHQgbGFiZWwgb2YgYWxsIHRoZXNlCi0gICAgICogZHVwbGljYXRlZCBpdGVtcy4KLSAgICAgKiAtIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBldmVyeXRpbWUgdGhlIFRhYmxlIHZpZXdlciBpcyByZWZyZXNoZWQuLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlY29yYXRlVGFibGUoKXsKLSAgICAJVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wuY2xlYXIoKTsKLSAgICAJCi0gICAgCUlDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGxwID0gY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0KLSAgICAJLy8gaW5pdCB0aGUgbmFtZS1kdXBsaWNhdGVzIGNvdW50ZXIKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LnNpemUoKTsgaSsrKXsKLSAgICAJCU9iamVjdCBjdXJyZW50SXRlbSA9IGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQuZ2V0KGkpOwotICAgIAkJU3RyaW5nIG5hbWUgPSBscC5nZXROYW1lKGN1cnJlbnRJdGVtKTsKLSAgICAJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wuZ2V0KG5hbWUpOwotCQkJaWYgKCBjb3VudCA9PSBudWxsKXsKLSAgICAJCQlUYWJsZURlY29yYXRvclRyYWNraW5nVG9vbC5wdXQobmFtZSwgbmV3IEludGVnZXIoMSkpOwotICAgIAkJfQotICAgIAkJZWxzZXsKLSAgICAJCQlUYWJsZURlY29yYXRvclRyYWNraW5nVG9vbC5wdXQoCi0gICAgCQkJCQluYW1lLCBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSkpOwotICAgIAkJfQotICAgIAl9Ci0KLSAgICAJLy8gTW9kaWZ5L2RlY29yYXRlIHRob3NlIGl0ZW1zIGluIHRoZSBUYWJsZSB0aGF0IGhhdmUgZHVwbGljYXRlZCBuYW1lCi0gICAgCVRhYmxlSXRlbVtdIGl0ZW1zID0gY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgIAlmb3IgKGludCBpID0wIDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKXsKLSAgICAJCU9iamVjdCBjdXJyZW50SXRlbSA9IGl0ZW1zW2ldLmdldERhdGEoKTsKLSAgICAJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wuZ2V0KGxwLmdldE5hbWUoY3VycmVudEl0ZW0pKTsKLSAgICAJCWlmICggY291bnQgIT0gbnVsbCAmJiBjb3VudC5pbnRWYWx1ZSgpID4gMSl7CQotICAgIAkJCWl0ZW1zW2ldLnNldFRleHQobHAuZ2V0TmFtZShjdXJyZW50SXRlbSkgKyAiIC0gIiArIAotICAgIAkJCQkJbHAuZ2V0UXVhbGlmaWVyKGN1cnJlbnRJdGVtKSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0KLSAgICAKLSAgICAvKgotICAgICAqIElmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIGluIHRoZSBDb21wb25lbnRUcmVlVmlld2VyLCBlbmFibGUgT0sKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYW5GaW5pc2goKSB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBjb21wb25lbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBjbGFzcyBDb21wb25lbnRUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChMaXN0KSBwYXJlbnRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChjb21wb25lbnRTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpOwotICAgICAgICBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBjb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5zZXROYW1lKGNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0TmFtZShjb21wb25lbnRTZWxlY3Rpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldFF1YWxpZmllcihjb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmdldFF1YWxpZmllcihjb21wb25lbnRTZWxlY3Rpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldEZpbGUoY29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5nZXRGaWxlKGNvbXBvbmVudFNlbGVjdGlvbikpOwotICAgICAgICByZXN1bHQuc2V0T2JqZWN0KGNvbXBvbmVudFNlbGVjdGlvbik7Ci0gICAgICB9ICAKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3MTEwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nIGZpbHRlckxhYmVsVGV4dCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT01QT05FTlRfTkFNRTsKLSAgcHJpdmF0ZSBTdHJpbmcgbGlzdExhYmVsVGV4dCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT01QT05FTlRTOwotICBwcml2YXRlIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyOyAKLSAgcHJpdmF0ZSBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyOwotICBwcml2YXRlIElOZXdDb21wb25lbnRIYW5kbGVyIG5ld0NvbXBvbmVudEhhbmRsZXI7Ci0gIHByaXZhdGUgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2c7Ci0KLSAgcHVibGljIHZvaWQgaW5pdChDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGRpYWxvZykKLSAgewotICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlV2lkZ2V0QXRUb3AoQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAgICAKLSAgfSAgICAKLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVdpZGdldEFib3ZlUXVhbGlmaWVyQm94KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVdpZGdldEJlbG93UXVhbGlmaWVyQm94KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVRvb2xCYXJJdGVtcyhUb29sQmFyIHRvb2xCYXIpCi0gIHsgICAgCi0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRpb25Qcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uUHJvdmlkZXIoSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMuZGVzY3JpcHRpb25Qcm92aWRlciA9IGRlc2NyaXB0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlciBnZXRTZWFyY2hMaXN0UHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlYXJjaExpc3RQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlYXJjaExpc3RQcm92aWRlcihJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlcikKLSAgewotICAgIHRoaXMuc2VhcmNoTGlzdFByb3ZpZGVyID0gc2VhcmNoTGlzdFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZ2V0RGlhbG9nKCkKLSAgewotICAgIHJldHVybiBkaWFsb2c7Ci0gIH0KLQotICBwdWJsaWMgSU5ld0NvbXBvbmVudEhhbmRsZXIgZ2V0TmV3Q29tcG9uZW50SGFuZGxlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3Q29tcG9uZW50SGFuZGxlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5ld0NvbXBvbmVudEhhbmRsZXIoSU5ld0NvbXBvbmVudEhhbmRsZXIgbmV3Q29tcG9uZW50SGFuZGxlcikKLSAgewotICAgIHRoaXMubmV3Q29tcG9uZW50SGFuZGxlciA9IG5ld0NvbXBvbmVudEhhbmRsZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTGFiZWxUZXh0KCkKLSAgewotICAgIHJldHVybiBmaWx0ZXJMYWJlbFRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGlzdExhYmVsVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gbGlzdExhYmVsVGV4dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbHRlckxhYmVsVGV4dChTdHJpbmcgZmlsdGVyTGFiZWxUZXh0KQotICB7Ci0gICAgdGhpcy5maWx0ZXJMYWJlbFRleHQgPSBmaWx0ZXJMYWJlbFRleHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMaXN0TGFiZWxUZXh0KFN0cmluZyBsaXN0TGFiZWxUZXh0KQotICB7Ci0gICAgdGhpcy5saXN0TGFiZWxUZXh0ID0gbGlzdExhYmVsVGV4dDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NhYmQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U3BlY2lmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLS8vIFRPRE8uLiB1c2UgUXVhbGlmaWVkTmFtZSBjb25zaXN0ZW50bHkgZm9yIG5hbWUgYW5kIG1ldGFOYW1lCi0vLwotcHVibGljIGNsYXNzIENvbXBvbmVudFNwZWNpZmljYXRpb24KLXsKLSAgU3RyaW5nIHF1YWxpZmllcjsKLSAgU3RyaW5nIG5hbWU7Ci0gIElGaWxlIGZpbGU7Ci0gIE9iamVjdCBvYmplY3Q7Ci0gIGJvb2xlYW4gaXNOZXc7Ci0gIFF1YWxpZmllZE5hbWUgbWV0YU5hbWU7Ci0gIAotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBuYW1lLCBJRmlsZSBmaWxlKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoSUZpbGUgZmlsZSkKLSAgewotICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkKLSAgewotICAgIHJldHVybiBxdWFsaWZpZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoU3RyaW5nIHF1YWxpZmllcikKLSAgewotICAgIHRoaXMucXVhbGlmaWVyID0gcXVhbGlmaWVyOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc05ldygpCi0gIHsKLSAgICByZXR1cm4gaXNOZXc7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBpc05ldykKLSAgewotICAgIHRoaXMuaXNOZXcgPSBpc05ldzsKLSAgfQotCi0gIHB1YmxpYyBRdWFsaWZpZWROYW1lIGdldE1ldGFOYW1lKCkKLSAgewotICAgIHJldHVybiBtZXRhTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1ldGFOYW1lKFF1YWxpZmllZE5hbWUgbWV0YU5hbWUpCi0gIHsKLSAgICB0aGlzLm1ldGFOYW1lID0gbWV0YU5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4OWZmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcgotewotICBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3QgY29tcG9uZW50KTsKLSAgCi0gIFN0cmluZyBnZXRRdWFsaWZpZXIoT2JqZWN0IGNvbXBvbmVudCk7Ci0KLSAgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGNvbXBvbmVudCk7Ci0KLSAgSUZpbGUgZ2V0RmlsZShPYmplY3QgY29tcG9uZW50KTsKLSAgCi0gIEltYWdlIGdldEZpbGVJY29uKE9iamVjdCBjb21wb25lbnQpOwotCi0gIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudExpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhMjQ4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudExpc3QgewotICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKTsKLSAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhNzlhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSU5ld0NvbXBvbmVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSU5ld0NvbXBvbmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1MDkzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lOZXdDb21wb25lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5ld0NvbXBvbmVudEhhbmRsZXIKLXsKLSAgdm9pZCBvcGVuTmV3Q29tcG9uZW50RGlhbG9nKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Njb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmNhNjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlByb2plY3RTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya2luZ1NldFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya3NwYWNlU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZXh0ZW5kcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTkFNRV9GSUVMRF9USVRMRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT01QT05FTlRfTkFNRTsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9MSVNUX1RJVExFID0gTWVzc2FnZXMuX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1NQRUNJRklFRF9GSUxFID0gTWVzc2FnZXMuX1VJX0xBQkVMX1NQRUNJRklFRF9GSUxFOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfV09SS1NQQUNFID0gTWVzc2FnZXMuX1VJX0xBQkVMX1dPUktTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfQ1VSUkVOVF9SRVNPVVJDRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DVVJSRU5UX1JFU09VUkNFOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9XT1JLSU5HX1NFVFMgPSBNZXNzYWdlcy5fVUlfTEFCRUxfV09SS0lOR19TRVRTOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFNlYXJjaFNjb3BlID0gU0NPUEVfQ1VSUkVOVF9SRVNPVVJDRTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBjaG9vc2VCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bNF07Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsdGVyTGFiZWw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbGlzdFRpdGxlOwotICBwcm90ZWN0ZWQgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZTsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWxlY3RXb3JraW5nU2V0c0dyb3VwOwotICBwcm90ZWN0ZWQgVGV4dCB3b3JraW5nU2V0c1RleHQ7Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dDsKLSAgLy8gU2hvdyAoZGVmYXVsdC90cnVlKSBvciBoaWRlIChmYWxzZSkgdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc2NvcGUgYnV0dG9uCi0gIHByaXZhdGUgYm9vbGVhbiBzaG93Q3VycmVudFJlc291cmNlU2NvcGUgPSB0cnVlOwotICAKLSAgLy8gd29ya2luZyBzZXRzIGN1cnJlbnRseSBjaG9zZW4gYnkgdGhlIHVzZXIKLSAgcHJpdmF0ZSBzdGF0aWMgSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0czsKLQotICBwdWJsaWMgU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICB7Ci0gICAgc3VwZXIoc2hlbGwsIGRpYWxvZ1RpdGxlLCBjb25maWd1cmF0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmlsdGVyTGFiZWwoU3RyaW5nIGZpbHRlckxhYmVsKQotICB7Ci0gICAgdGhpcy5maWx0ZXJMYWJlbCA9IGZpbHRlckxhYmVsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRMaXN0VGl0bGUoU3RyaW5nIGxpc3RUaXRsZSkKLSAgewotICAgIHRoaXMubGlzdFRpdGxlID0gbGlzdFRpdGxlOwotICB9ICAKLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvL3N1cGVyLnNldEZpbHRlckxhYmVsKGZpbHRlckxhYmVsICE9IG51bGwgPyBmaWx0ZXJMYWJlbCA6IERFRkFVTFRfTkFNRV9GSUVMRF9USVRMRSk7Ci0gICAgLy9zZXRMaXN0TGFiZWxUZXh0KGxpc3RUaXRsZSAhPSBudWxsID8gbGlzdFRpdGxlIDogREVGQVVMVF9MSVNUX1RJVExFKTsKLSAgICBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgLy8gV2UgdXNlIHRoZSBDb21wb3NpdGUgdG9wQ29tcG9zaXRlIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHdpZGdldHMKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoYm90dG9tQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgIGdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBncm91cC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9TRUFSQ0hfU0NPUEUpOwotICAgIFNjb3BlQ2hhbmdlTGlzdGVuZXIgc2NvcGVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBTY29wZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgcmFkaW9CdXR0b25bMF0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzBdLnNldFRleHQoU0NPUEVfV09SS1NQQUNFKTsKLSAgICByYWRpb0J1dHRvblsxXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgcmFkaW9CdXR0b25bMV0uc2V0VGV4dChTQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCk7Ci0gICAgcmFkaW9CdXR0b25bMl0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzJdLnNldFRleHQoU0NPUEVfQ1VSUkVOVF9SRVNPVVJDRSk7Ci0gICAgcmFkaW9CdXR0b25bM10gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzNdLnNldFRleHQoU0NPUEVfV09SS0lOR19TRVRTKTsKLSAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwODE1IAotICAgIC8vIElmIHRoZSBjdXJyZW50IHJlc291cmNlIHNjb3BlIGJ1dHRvbiBpcyBoaWRkZW4sIGl0IG5vIGxvbmdlciBpcyB0aGUgZGVmYXVsdCBzY29wZS4gIFdlIG11c3Qgc2VsZWN0IG9uZSBvZiB0aGUgcmVtYWluaW5nIAotICAgIC8vIHZpc2libGUgcmFkaW8gYnV0dG9ucyAoRW5jbG9zaW5nIFByb2plY3QpIGFuZCBtYWtlIGl0IHRoZSBkZWZhdWx0LiAgICAKLSAgICByYWRpb0J1dHRvblsyXS5zZXRWaXNpYmxlKHNob3dDdXJyZW50UmVzb3VyY2VTY29wZSk7Ci0gICAgaWYgKCFzaG93Q3VycmVudFJlc291cmNlU2NvcGUpCi0gICAgewotICAgICAgY3VycmVudFNlYXJjaFNjb3BlID0gU0NPUEVfRU5DTE9TSU5HX1BST0pFQ1Q7Ci0gICAgICBpZiAoY3VycmVudFJlc291cmNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgb25jZSB0aGUgZGlhbG9nIGlzIGludm9rZWQsIHRoZSBsaXN0IGlzIHBvcHVsYXRlZCB3aXRoIHRoZQotICAgICAgICAvLyBhcHByb3ByaWF0ZSBjb21wb25lbnRzIGJhc2VkIG9uIHRoaXMgc2VhcmNoIHNjb3BlLgotICAgICAgICBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QobmV3IFByb2plY3RTZWFyY2hTY29wZShjdXJyZW50UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpOwotICAgICAgfSAKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocmFkaW9CdXR0b25baV0uZ2V0VGV4dCgpLmVxdWFscyhjdXJyZW50U2VhcmNoU2NvcGUpKQotICAgICAgewotICAgICAgICByYWRpb0J1dHRvbltpXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB9Ci0gICAgICByYWRpb0J1dHRvbltpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzY29wZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgc2VsZWN0V29ya2luZ1NldHNHcm91cCA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBzZWxlY3RXb3JraW5nU2V0c0dyb3VwLnNldExheW91dERhdGEoZ2QpOwotICAgIEdyaWRMYXlvdXQgd29ya2luZ1NldEdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIHdvcmtpbmdTZXRHcm91cExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgd29ya2luZ1NldEdyb3VwTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgc2VsZWN0V29ya2luZ1NldHNHcm91cC5zZXRMYXlvdXQod29ya2luZ1NldEdyb3VwTGF5b3V0KTsKLSAgICAKLSAgICB3b3JraW5nU2V0c1RleHQgPSBuZXcgVGV4dChzZWxlY3RXb3JraW5nU2V0c0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgd29ya2luZ1NldHNUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGlmICh2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCAhPSBudWxsICkKLSAgICAJd29ya2luZ1NldHNUZXh0LnNldFRleHQodmFsdWVGb3JXb3JraW5nU2V0c1RleHQpOwotICAgIAotICAgIGNob29zZUJ1dHRvbiA9IG5ldyBCdXR0b24oc2VsZWN0V29ya2luZ1NldHNHcm91cCwgU1dULk5PTkUpOwotICAgIGNob29zZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9DSE9PU0UpOwotICAgIGNob29zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmNyZWF0ZVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIHRydWUpOwotCQkJaWYgKCBkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyl7Ci0JCQkJd29ya2luZ1NldHMgPSBkaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdmFsdWVGb3JXb3JraW5nU2V0c1RleHQgPSAiIjsKLQkJCQlpZiAod29ya2luZ1NldHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtpbmdTZXRzLmxlbmd0aDsgaSsrKXsKLQkJCQkJCXZhbHVlRm9yV29ya2luZ1NldHNUZXh0ICs9IHdvcmtpbmdTZXRzW2ldLmdldExhYmVsKCk7Ci0JCQkJCQkvLyBpZiBub3QgdGhlIGxhc3QgaXRlbSwgd2UgYWRkIGEgY29tbWEKLQkJCQkJCWlmICggaSAhPSB3b3JraW5nU2V0cy5sZW5ndGggLSAxKSAKLQkJCQkJCQl2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCArPSAiLCAiOwotCQkJCQl9Ci0JCQkJfQotCQkJCXdvcmtpbmdTZXRzVGV4dC5zZXRUZXh0KHZhbHVlRm9yV29ya2luZ1NldHNUZXh0KTsKLQkJCX0KLQkJCS8vIFNldCB3b3JraW5nIHNldHMgcmFkaW8gYnV0dG9uIGVuYWJsZWQsIGRpc2FibGUgb3RoZXIgYnV0dG9ucwotCQkJcmFkaW9CdXR0b25bMl0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXJhZGlvQnV0dG9uWzFdLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlyYWRpb0J1dHRvblswXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJcmFkaW9CdXR0b25bM10uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCQlzY29wZUNoYW5nZUhhbmRsZXIocmFkaW9CdXR0b25bM10pOwotCQl9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gcGFyZW50OwotICB9IC8qCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgc2VhcmNoIHNjb3BlLgotICAgICAqLwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoU2NvcGUoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRTZWFyY2hTY29wZTsKLSAgfQotCi1wcml2YXRlIHZvaWQgc2NvcGVDaGFuZ2VIYW5kbGVyKEJ1dHRvbiBiKSB7CSAgCi0JICBpZiAoKGIuZ2V0U3R5bGUoKSAmIFNXVC5SQURJTykgIT0gMCkKLQkgIHsKLQkJICBjdXJyZW50U2VhcmNoU2NvcGUgPSBiLmdldFRleHQoKTsKLQkJICAKLQkJICAvLyBUT0RPIChjcykgbmVlZCB0byBkbyBzb21lIHdvcmsgdG8gbWFrZSB0aGUgZGVmYXVsdCBzZWFyY2ggc2NvcGUKLQkJICAvLyBtb3JlIHdlbGwgZGVmaW5lZCwgY3VycmVudGx5IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBwYXNzIGEgbnVsbAotCQkgIC8vIGFyZ3VtZW50IGluIHRvIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdCBidXQgd2Ugc2hvdWxkIHByb3ZpZGUKLQkJICAvLyBnZXR0ZXJzL3NldHRlcnMgdG8gYWxsb3cgdGhlIGRlZmF1bHQgdG8gYmUgY29udHJvbGxlZCAgICAgICAgICAKLQkJICBTZWFyY2hTY29wZSBzY29wZSA9IG51bGw7Ci0JCSAgaWYgKGN1cnJlbnRTZWFyY2hTY29wZSA9PSBTQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCAmJgotCQkJCSAgY3VycmVudFJlc291cmNlICE9IG51bGwpIHsgCi0JCQkgIHNjb3BlID0gbmV3IFByb2plY3RTZWFyY2hTY29wZShjdXJyZW50UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCSAgfSAKLQkJICBlbHNlIGlmIChjdXJyZW50U2VhcmNoU2NvcGUgPT0gU0NPUEVfV09SS1NQQUNFKXsKLQkJCSAgc2NvcGUgPSBuZXcgV29ya3NwYWNlU2VhcmNoU2NvcGUoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoY3VycmVudFNlYXJjaFNjb3BlID09IFNDT1BFX1dPUktJTkdfU0VUUyl7Ci0JCQkgIAotCQkJICAvLyBDb25zdHJ1Y3RzIHRoZSB3b3JraW5nIHNldHMgc2NvcGUgZnJvbSB0aGUgd29ya2luZyBzZXRzIHRoZSB1c2VyCi0JCQkgIC8vIHNlbGVjdGVkCi0JCQkgIFdvcmtpbmdTZXRTZWFyY2hTY29wZSB3b3JraW5nU2V0c1Njb3BlID0gbmV3IFdvcmtpbmdTZXRTZWFyY2hTY29wZSgpOwotCQkJICBpZiAod29ya2luZ1NldHMgIT0gbnVsbCkgewotCQkJCSAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JraW5nU2V0cy5sZW5ndGg7IGkrKyl7Ci0JCQkJCSAgd29ya2luZ1NldHNTY29wZS5hZGRBV29ya2luZ1NldFRvU2NvcGUod29ya2luZ1NldHNbaV0uZ2V0RWxlbWVudHMoKSk7Ci0JCQkJICB9Ci0JCQkgIH0KLQkJCSAgc2NvcGUgPSB3b3JraW5nU2V0c1Njb3BlOwotCQkgIH0KLQkJICAKLQkJICBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3Qoc2NvcGUpOwotCQkgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0JCSAgLy8gU2VsZWN0IHRoZSBmaXJzdCBtYXRjaGluZyBjb21wb25lbnQuIFRob3VnaCB3ZSBzaG91bGQgYmUKLQkJICAvLyBzbWFydGVyIGhlcmUKLQkJICAvLyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXJlIHdhcyBhIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHNjb3BlCi0JCSAgLy8gc3dpdGNoIChhbmQgaWYKLQkJICAvLyB0aGUgY29tcG9uZW50IGlzIHN0aWxsIGF2YWlsYWJsZS4KLQkJICBUYWJsZSB0YWJsZSA9IGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCSAgVGFibGVJdGVtIGl0ZW1zW10gPSB0YWJsZS5nZXRJdGVtcygpOwotCQkgIGlmIChpdGVtcy5sZW5ndGggPiAwKQotCQkgIHsKLQkJCSAgVGFibGVJdGVtIHNlbGVjdFtdID0gbmV3IFRhYmxlSXRlbVsxXTsKLQkJCSAgc2VsZWN0WzBdID0gaXRlbXNbMF07Ci0JCQkgIHRhYmxlLnNldFNlbGVjdGlvbihzZWxlY3QpOwotCQkgIH0KLQkJICB1cGRhdGVDYW5GaW5pc2goKTsKLQkgIH0KLSAgfQotCi1wcml2YXRlIGNsYXNzIFNjb3BlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikgICAgICAgCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgQnV0dG9uIGIgPSAoQnV0dG9uKSBlLndpZGdldDsKLSAgICAgICAgaWYgKGIuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIHNjb3BlQ2hhbmdlSGFuZGxlcihiKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElSZXNvdXJjZSBnZXRDdXJyZW50UmVzb3VyY2UoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRSZXNvdXJjZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRSZXNvdXJjZShJUmVzb3VyY2UgY3VycmVudFJlc291cmNlKQotICB7Ci0gICAgdGhpcy5jdXJyZW50UmVzb3VyY2UgPSBjdXJyZW50UmVzb3VyY2U7Ci0gIH0KLSAKLSAgLyoqCi0gICAqIFRoaXMgaXMgbm9uLUFQSS4gIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwODE1Ci0gICAqIFNob3cgKGJ5IGRlZmF1bHQpLCBvciBoaWRlIHRoZSBjdXJyZW50IHJlc291cmNlIHNlYXJjaCBzY29wZSBidXR0b24KLSAgICogQHBhcmFtIHNob3dDdXJyZW50UmVzb3VyY2VTY29wZS4gIGZhbHNlIHRvIGhpZGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93Q3VycmVudFJlc291cmNlU2VhcmNoU2NvcGVCdWcyNTA4MTUoYm9vbGVhbiBzaG93Q3VycmVudFJlc291cmNlU2NvcGUpCi0gIHsKLSAgICB0aGlzLnNob3dDdXJyZW50UmVzb3VyY2VTY29wZSA9IHNob3dDdXJyZW50UmVzb3VyY2VTY29wZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvVGVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ODgzYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi1wdWJsaWMgY2xhc3MgVGVzdCBleHRlbmRzIEFjdGlvbkRlbGVnYXRlCi17Ci0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TGlzdExhYmVsVGV4dCgiTGlzdDoiKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmlsdGVyTGFiZWxUZXh0KCJGaWx0ZXI6Iik7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldFNlYXJjaExpc3RQcm92aWRlcihzZWFyY2hMaXN0UHJvdmlkZXIpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXREZXNjcmlwdGlvblByb3ZpZGVyKG5ldyBCYXNlQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigiZm9vIikpOwotICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhzaGVsbCwgInRlc3QiLCBjb25maWd1cmF0aW9uKTsKLSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotICBjbGFzcyBCYXNlQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcgotICB7Ci0gICAgU3RyaW5nIHByZWZpeDsKLQotICAgIEJhc2VDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKFN0cmluZyBwcmVmaXgpCi0gICAgewotICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIElGaWxlIGdldEZpbGUoT2JqZWN0IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGNvbXBvbmVudDsKLSAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSArIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIGdldE5hbWUoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBjb21wb25lbnQpLnN0YXJ0c1dpdGgocHJlZml4KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0RmlsZUljb24oT2JqZWN0IGNvbXBvbmVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0gIH0KLSAgCi0gIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyID0gbmV3IElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIoKQotICB7Ci0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKCJmb286IiArICJIZWxsbyEiKTsKLSAgICAgIGxpc3QuYWRkKCJmb286IiArICJIZXkhIik7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiSG93LWFyZS15b3U/Iik7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiV2hhdC1pcy10aGF0LXNtZWxsPyIpOwotICAgIH0KLSAgfTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9Db21tb25VSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvQ29tbW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDJlMzViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9Db21tb25VSU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotISBTZWxlY3RTaW5nbGVGaWxlUGFnZSBhbmQgU2VsZWN0TXVsdGlGaWxlUGFnZQotX1VJX0xBQkVMX1NPVVJDRV9GSUxFUyAgID0gV29ya3NwYWNlIEZpbGVzCi1fVUlfTEFCRUxfU0VMRUNURURfRklMRVMgPSBTZWxlY3RlZCBGaWxlcwotX1VJX1BPUFVQX0VYUEFORF9BTEwJID0gRXhwYW5kIEFsbAotX1VJX1BPUFVQX0NPTExBUFNFX0FMTAkgPSBDb2xsYXBzZSBBbGwKLQkKLV9VSV9JTVBPUlRfQlVUVE9OICAgICAgICAgID0gSW1wb3J0IEZpbGVzLi4uCi1fVUlfSU1QT1JUX0JVVFRPTl9UT09MX1RJUCA9IEltcG9ydCBmaWxlcyBmcm9tIGZpbGUgc3lzdGVtCi0KLQotISBTZWxlY3RNdWx0aUZpbGVQYWdlCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogdGhlIGZvbGxvd2luZyB0aHJlZSBsaW5lcyByZWZlcnMgdG8gX1VJX0xBQkVMX1NFTEVDVEVEX0ZJTEVTIGxhYmVsIGFib3ZlCi1fVUlfQUREX0JVVFRPTl9UT09MX1RJUCAgICA9IEFkZCBmaWxlcyB0byBTZWxlY3RlZCBGaWxlcyBsaXN0LgotX1VJX1JFTU9WRV9CVVRUT05fVE9PTF9USVAgPSBSZW1vdmUgZmlsZXMgZnJvbSBTZWxlY3RlZCBGaWxlcyBsaXN0LgotX1VJX1JFTU9WRV9BTExfQlVUVE9OX1RPT0xfVElQID0gIFJlbW92ZSBhbGwgZmlsZXMgZnJvbSBTZWxlY3RlZCBGaWxlcyBsaXN0LgotCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogTm8gdHJhbnNsYXRpb24gbmVlZGVkIG9mIGZvbGxvd2luZyB0aHJlZSBsaW5lcwotX1VJX0FERF9CVVRUT04gICAgICAgICAgICAgPSA+Ci1fVUlfUkVNT1ZFX0JVVFRPTiAgICAgICAgICA9IDwKLV9VSV9SRU1PVkVfQUxMX0JVVFRPTiAgICAgID0gPDwKLQotISBTZWxlY3RKYXZhUHJvamVjdFZpZXcKLV9VSV9MQUJFTF9DSE9PU0VfRk9MREVSID0gU2VsZWN0IGEgcHJvamVjdCBvciBmb2xkZXI6Ci0KLSEgU2VsZWN0SmF2YVByb2plY3REaWFsb2cKLV9VSV9MQUJFTF9GT0xERVJfU0VMRUNUSU9OID0gQ29udGFpbmVyIFNlbGVjdGlvbgotCi0hIFRleHRWaWV3ZXJPcGVyYXRpb25BY3Rpb24KLV9VSV9NRU5VX0NPUFkgICAgICAgICA9ICZDb3B5Ci1fVUlfTUVOVV9DVVQgICAgICAgICAgPSBDdSZ0Ci1fVUlfTUVOVV9ERUxFVEUgICAgICAgPSBEZWxldGUKLV9VSV9NRU5VX1BBU1RFICAgICAgICA9ICZQYXN0ZQotX1VJX01FTlVfUFJFRklYICAgICAgID0gUHJlZml4Ci1fVUlfTUVOVV9SRURPICAgICAgICAgPSBSZWRvCi1fVUlfTUVOVV9TRUxFQ1RfQUxMICAgPSBTZWxlY3QgQWxsCi1fVUlfTUVOVV9TSElGVF9MRUZUICAgPSBTaGlmdCBMZWZ0Ci1fVUlfTUVOVV9TSElGVF9SSUdIVCAgPSBTaGlmdCBSaWdodAotX1VJX01FTlVfU1RSSVBfUFJFRklYID0gU3RyaXAgUHJlZml4Ci1fVUlfTUVOVV9VTkRPICAgICAgICAgPSBVbmRvCi0KLSEgU291cmNlVmlld2VyR290b0xpbmVBY3Rpb24KLV9VSV9NRU5VX0dPVE9fTElORSAgICAgICAgICAgPSBHbyBUbyBMaW5lLi4uCi1fVUlfR09UT19MSU5FX0RJQUxPR19USVRMRSAgID0gR28gVG8gTGluZQotX1VJX0dPVE9fTElORV9ESUFMT0dfVEVYVCAgICA9IEVudGVyIExpbmUgTnVtYmVyCi0KLV9VSV9GSUxFX0NIQU5HRURfVElUTEUgPSBGaWxlIENoYW5nZWQKLV9VSV9GSUxFX0RFTEVURURfU0FWRV9DSEFOR0VTID0gVGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gRG8geW91IHdhbnQgdG8gc2F2ZSB5b3VyIGNoYW5nZXMgb3IgY2xvc2UgdGhlIGVkaXRvciB3aXRob3V0IHNhdmluZz8KLV9VSV9GSUxFX0RFTEVURURfRURJVE9SX0NMT1NFRCA9IFRoZSBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uIFRoaXMgZWRpdG9yIHdpbGwgYmUgY2xvc2VkLgotX1VJX0ZJTEVfQ0hBTkdFRF9MT0FEX0NIQU5HRVMgPSBUaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbS4gRG8geW91IHdhbnQgdG8gbG9hZCB0aGUgY2hhbmdlcz8KLV9VSV9TQVZFX0JVVFRPTiA9IFNhdmUKLV9VSV9DTE9TRV9CVVRUT04gPSBDbG9zZQotCi0KLSEgWFNMIFByZWZlcmVyZW5jZQotX1VJX1hTTFRfU0VMRUNUICAgICA9IFNlbGVjdCB3aGljaCBlbGVtZW50IHRvIHVzZSBmb3IgeW91ciBzdHlsZXNoZWV0Ci1fVUlfWFNMVF9TVFlMRVNIRUVUID0gJlVzZSA8eHNsOnN0eWxlc2hlZXQ+Ci1fVUlfWFNMVF9UUkFOU0ZPUk0gID0gVSZzZSA8eHNsOnRyYW5zZm9ybT4KLQotISBYU0wgRGVidWcgUHJlZmVyZXJlbmNlCi1fVUlfWFNMX0RFQlVHX1NFTEVDVF9MQVVOQ0hFUiA9IFNldCB0aGUgZGVmYXVsdCBYU0wgbGF1bmNoZXIgZm9yIHRoZSBYU0wgRGVidWdnaW5nIGFuZCBUcmFuc2Zvcm1hdGlvbiB0b29sCi1fVUlfWFNMX0RFQlVHX0xPQ0FMICAgICAgICAgICA9ICZYU0wgYXBwbGljYXRpb24KLV9VSV9YU0xfREVCVUdfUkVNT1RFICAgICAgICAgID0gWFMmTCByZW1vdGUgYXBwbGljYXRpb24KLV9VSV9YU0xfVElMRV9FRElUT1IgICAgICAgICAgID0gJlNob3cgYWxsIGRlYnVnZ2luZyBmaWxlcyBpbiBhIHRpbGUgZWRpdG9yCi1fVUlfWFNMX0RFQlVHX0FORF9UUkFOU0ZPUk0gICA9ICZSdW4gdHJhbnNmb3JtYXRpb24gYW5kIG9wZW4gYSBkZWJ1Z2dpbmcgc2Vzc2lvbgotX1VJX1hTTF9DT05URVhUX1VSSSAgICAgICAgICAgPSBDb250ZXh0IFBhdGggCi1fVUlfWFNMX0NPTlRFWFQgICAgICAgICAgICAgICA9IFNwZWNpZnkgYSAmY29udGV4dCBwYXRoIGZvciByZXNvbHZpbmcgVVJJcyBpbiB4c2w6aW1wb3J0LCB4c2w6aW5jbHVkZSBvciBkb2N1bWVudCgpCi0KLQotX1VJX09WRVJSSURFX0ZJTEUgICAgPSBPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMKLV9VSV9KQVZBX0VYSVNUX0ZJTEUxID0gVGhlIGZvbGxvd2luZyBKYXZhIGNsYXNzZXMgYWxyZWFkeSBleGlzdC4KLV9VSV9KQVZBX0VYSVNUX0ZJTEUyID0gRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBmaWxlPwotICAgICAgCi0hIHNvbWUgb3B0aW9ucyBzdHJpbmdzIGNvbW1vbiB0byBzZXZlcmFsIHBsdWdpbnMKLV9VSV9FUlJPUl9DUkVBVElOR19GSUxFX1RJVExFID0gRXJyb3IgQ3JlYXRpbmcgRmlsZQotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfU0hPUlRfREVTQyA9IEVycm9yIGNyZWF0aW5nIGZpbGUgInswfSIKLV9VSV9FUlJPUl9DUkVBVElOR19GSUxFX0xPTkdfREVTQyA9IEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBjcmVhdGUgdGhlIGZpbGUgInswfSIuCi1fVUlfUEFSRU5UX0ZPTERFUl9JU19SRUFEX09OTFkgPSBUaGUgcGFyZW50IGRpcmVjdG9yeSAiezB9IiBpcyByZWFkIG9ubHkuCi1fVUlfVU5LTk9XTl9FUlJPUl9XSVRIX0hJTlQgPSBVbmtub3duIGVycm9yLiBFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSAiezB9IiBpcyB3cml0ZWFibGUuCi1fVUlfVU5LTk9XTl9FUlJPUiA9IFVua25vd24gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHdyaXRlYWJsZS4KLQotISB1c2FnZSAtIHRoaXMgbGFiZWwgaXMgZm9sbG93ZWQgYnkgdHdvIHJhZGlvIGJ1dHRvbiBvcHRpb25zIGZvciB0aGUgZmlsZSBsb2NhdGlvbgotX1VJX0xBQkVMX0lOQ0xVREVfVVJMX0ZJTEUgPSBTZWxlY3QgZmlsZSBsb2NhdGlvbgotX1VJX1JBRElPX0ZJTEUgICAgICAgICAgICAgPSBXb3Jrc3BhY2UgcHJvamVjdHMKLV9VSV9SQURJT19VUkwgICAgICAgICAgICAgID0gSFRUUAotCi1fVUlfTEFCRUxfQ09NUE9ORU5UUwkJCQkgICA9IENvbXBvbmVudHM6Ci1fVUlfTEFCRUxfUVVBTElGSUVSCQkJCQkgICA9IFF1YWxpZmllcjoKLQotIS0gY29tcG9uZW50IHNlbGVjdGlvbiBkaWFsb2dzIAotX1VJX0xBQkVMX0NPTVBPTkVOVF9OQU1FCQkJICAgPSBDb21wb25lbnQgTmFtZToKLV9VSV9MQUJFTF9NQVRDSElOR19DT01QT05FTlRTCQkgICA9IE1hdGNoaW5nIENvbXBvbmVudHM6Ci1fVUlfTEFCRUxfU1BFQ0lGSUVEX0ZJTEUJCQkgICA9IFNwZWNpZmllZCBGaWxlCi1fVUlfTEFCRUxfRU5DTE9TSU5HX1BST0pFQ1QJCQkgICA9IEVuY2xvc2luZyBQcm9qZWN0Ci1fVUlfTEFCRUxfV09SS1NQQUNFCQkJCQkgICA9IFdvcmtzcGFjZQotX1VJX0xBQkVMX0NVUlJFTlRfUkVTT1VSQ0UJCQkgICA9IEN1cnJlbnQgUmVzb3VyY2UKLV9VSV9MQUJFTF9TRUFSQ0hfU0NPUEUJCQkJICAgPSBTZWFyY2ggU2NvcGUKLV9VSV9MQUJFTF9OQVJST1dfU0VBUkNIX1NDT1BFX1JFU09VUkNFID0gVXNlIHJlc291cmNlIHZpZXcgdG8gbmFycm93IHNlYXJjaCBzY29wZQotX1VJX0xBQkVMX0FWQUlMQUJMRV9UWVBFUwkJCSAgID0gQXZhaWxhYmxlIFR5cGVzCi1fVUlfTEFCRUxfV09SS0lOR19TRVRTICAgICAgICAgICAgICAgICA9IFdvcmtpbmcgU2V0cwotCi1fVUlfTEFCRUxfTmV3PU5ldy4uLgotX1VJX0xBQkVMX0RFQ0xBUkFUSU9OX0xPQ0FUSU9OPURlY2xhcmF0aW9uIExvY2F0aW9uOgotX1VJX0xBQkVMX0NIT09TRT1DaG9vc2UuLi4KLQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hCi0hIEhlcmUgaXMgdGhlIGxpc3Qgb2YgRXJyb3Igc3RyaW5nIHRoYXQgaGF2ZSBtZXNzYWdlIElEcyAtIG1ha2Ugc3VyZSB0aGV5IGFyZSB1bmlxdWUKLSEgIFJhbmdlIGZvciBiMmJndWkgbWVzc2FnZUlEczogSVdBWDEyMDEgLSBJV0FYMTQwMAotIQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLV9FUlJPUl9USEVfQ09OVEFJTkVSX05BTUUgPSBUaGUgc3BlY2lmaWVkIGNvbnRhaW5lciBtdXN0IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UgYW5kIGl0cyBwYXRoIG11c3Qgc3RhcnQgYXQgdGhlIHdvcmtzcGFjZSByb290LgotCi1fRVJST1JfTE9DQUxfTE9DQVRJT04gICAgID0gVGhlIGxvY2FsIGxvY2F0aW9uIG9mIHRoaXMgY29udGFpbmVyIGNhbm5vdCBiZSByZXNvbHZlZC4KLV9FUlJPUl9OT1RfSkFWQV9QUk9KRUNUICAgPSBUaGUgc3BlY2lmaWVkIHByb2plY3QgaXMgbm90IGEgSmF2YSBwcm9qZWN0LgotCi0hTk9URSBUTyBUUkFOU0xBVE9SOiB0aGlzIGVycm9yIG1lc3NhZ2UgdGV4dCBpcyBmb2xsb3dlZCBieSBhIG1lc3NhZ2UgZnJvbSBhbm90aGVyIHBsdWdpbgotX0VSUk9SX0lOVkFMSURfSkFWQV9QQUNLQUdFID0gSVdBWDEyMDFFIEludmFsaWQgcGFja2FnZSBuYW1lIGVycm9yOgotCi0hTk9URSBUTyBUUkFOU0xBVE9SOiAoX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gKyBzdHJpbmcgKyBfVUlfTEFCRUxfT1IgKyBzdHJpbmcpIG9yIChfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTikKLV9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OICAgICAgICAgPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIHdpdGgKLV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTICAgICAgICAgICAgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotCi1fRVJST1JfQ09OVEFJTkVSX05PVF9KQVZBX0JVSUxEUEFUSCA9IFRoZSBjb250YWluZXIgaXMgbm90IGEgSmF2YSBzb3VyY2UgZm9sZGVyIGZvciB0aGlzIHByb2plY3QKLV9FUlJPUl9VU0VfUFJPSkVDVF9KQVZBX1NPVVJDRV9GT0xERVIgPSBUaGUgcHJvamVjdCBpcyBub3Qgb24gdGhlIGJ1aWxkIHBhdGguICBTZWxlY3QgYSBKYXZhIHNvdXJjZSBmb2xkZXIgZm9yIHRoZSBwcm9qZWN0LgotCi1fVUlfRVJST1IgICAgICAgICAgICAgPSBFcnJvcgotCi0hTk9URSBUTyBUUkFOU0xBVE9SOiB0aGlzIHdhcm5pbmcgbWVzc2FnZSB0ZXh0IGlzIGZvbGxvd2VkIGJ5IGEgbWVzc2FnZSBmcm9tIGFub3RoZXIgcGx1Z2luCi1fV0FSTl9JTlZBTElEX0pBVkFfUEFDS0FHRSA9IEludmFsaWQgcGFja2FnZSBuYW1lIHdhcm5pbmc6Ci0KLV9FUlJPUl9ST09UX0VMRU1FTlQgPSBUaGUgWE1MIHNjaGVtYSBkb2VzIG5vdCBjb250YWluIGFueSBnbG9iYWwgZWxlbWVudHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHJvb3QgZWxlbWVudC4KLV9FUlJPUl9TQVZJTkdfRklMRSA9IEVycm9yIHNhdmluZyBmaWxlICJ7MH0iCi0KLSEgRmlsZSBWYWxpZGF0b3IKLV9VSV9FUlJPUl9WQUxJREFURV9GQUlMX1RJVExFID0gRmFpbGVkIHRvIGNoZWNrIG91dCBuZWNlc3NhcnkgZmlsZXMKLV9VSV9FUlJPUl9WQUxJREFURV9GQUlMX01FU1NBR0UgPSBHZW5lcmF0aW9uIGZhaWxlZC4gTmVjZXNzYXJ5IGZpbGVzIGNvdWxkIG5vdCBiZSBjaGVja2VkIG91dC4gCi0KLSEgUHJvcGVydHlEaXJ0eUNoYW5nZUxpc3RlbmVyIGFuZCBQcm9wZXJ0eVJlc291cmNlQ2hhbmdlTGlzdGVuZXIKLV9VSV9FUlJPUl9WQUxJREFURV9FRElUX0ZBSUxfT05FX0ZJTEUgPSBFcnJvcgotCi1TYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzPVNhdmUgQWxsIE1vZGlmaWVkIFJlc291cmNlcwotU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZT1BbGwgbW9kaWZpZWQgcmVzb3VyY2VzIG11c3QgYmUgc2F2ZWQgYmVmb3JlIHRoaXMgb3BlcmF0aW9uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkODE2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuQ29tbW9uVUlNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLS8vCSBTZWxlY3RTaW5nbGVGaWxlUGFnZSBhbmQgU2VsZWN0TXVsdGlGaWxlUGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TT1VSQ0VfRklMRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVEVEX0ZJTEVTOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BPUFVQX0VYUEFORF9BTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BPUFVQX0NPTExBUFNFX0FMTDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU1QT1JUX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU1QT1JUX0JVVFRPTl9UT09MX1RJUDsKLQkKLS8vCSBTZWxlY3RNdWx0aUZpbGVQYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FERF9CVVRUT05fVE9PTF9USVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFTU9WRV9CVVRUT05fVE9PTF9USVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFTU9WRV9BTExfQlVUVE9OX1RPT0xfVElQOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FERF9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFTU9WRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFTU9WRV9BTExfQlVUVE9OOwotCi0vLwkgU2VsZWN0SmF2YVByb2plY3RWaWV3Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NIT09TRV9GT0xERVI7Ci0KLS8vCSBTZWxlY3RKYXZhUHJvamVjdERpYWxvZwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9GT0xERVJfU0VMRUNUSU9OOwotCi0vLwkgVGV4dFZpZXdlck9wZXJhdGlvbkFjdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0NPUFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQ1VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9QQVNURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUkVETzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9TRUxFQ1RfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1NISUZUX0xFRlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfU0hJRlRfUklHSFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfU1RSSVBfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1VORE87Ci0KLS8vCSBTb3VyY2VWaWV3ZXJHb3RvTGluZUFjdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0dPVE9fTElORTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR09UT19MSU5FX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR09UT19MSU5FX0RJQUxPR19URVhUOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVfQ0hBTkdFRF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRV9ERUxFVEVEX1NBVkVfQ0hBTkdFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRV9ERUxFVEVEX0VESVRPUl9DTE9TRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVfQ0hBTkdFRF9MT0FEX0NIQU5HRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NBVkVfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DTE9TRV9CVVRUT047Ci0KLQotLy8JIFhTTCBQcmVmZXJlcmVuY2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMVF9TRUxFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTFRfU1RZTEVTSEVFVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMVF9UUkFOU0ZPUk07Ci0KLS8vCSBYU0wgRGVidWcgUHJlZmVyZXJlbmNlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9ERUJVR19TRUxFQ1RfTEFVTkNIRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9ERUJVR19MT0NBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0RFQlVHX1JFTU9URTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX1RJTEVfRURJVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfREVCVUdfQU5EX1RSQU5TRk9STTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0NPTlRFWFRfVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfQ09OVEVYVDsKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09WRVJSSURFX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0pBVkFfRVhJU1RfRklMRTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0pBVkFfRVhJU1RfRklMRTI7Ci0JICAgICAgCi0vLwkgc29tZSBvcHRpb25zIHN0cmluZ3MgY29tbW9uIHRvIHNldmVyYWwgcGx1Z2lucwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9DUkVBVElOR19GSUxFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9DUkVBVElOR19GSUxFX1NIT1JUX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfTE9OR19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QQVJFTlRfRk9MREVSX0lTX1JFQURfT05MWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVU5LTk9XTl9FUlJPUl9XSVRIX0hJTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1VOS05PV05fRVJST1I7Ci0KLS8vCSB1c2FnZSAtIHRoaXMgbGFiZWwgaXMgZm9sbG93ZWQgYnkgdHdvIHJhZGlvIGJ1dHRvbiBvcHRpb25zIGZvciB0aGUgZmlsZSBsb2NhdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9JTkNMVURFX1VSTF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19VUkw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09NUE9ORU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUVVBTElGSUVSOwotCi0vLwktIGNvbXBvbmVudCBzZWxlY3Rpb24gZGlhbG9ncyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09NUE9ORU5UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NQRUNJRklFRF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfV09SS1NQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DVVJSRU5UX1JFU09VUkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRUFSQ0hfU0NPUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BUlJPV19TRUFSQ0hfU0NPUEVfUkVTT1VSQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FWQUlMQUJMRV9UWVBFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfV09SS0lOR19TRVRTOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfREVDTEFSQVRJT05fTE9DQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NIT09TRTsKLQotCi0KLQotCi0KLQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JIQotCSEgSGVyZSBpcyB0aGUgbGlzdCBvZiBFcnJvciBzdHJpbmcgdGhhdCBoYXZlIG1lc3NhZ2UgSURzIC0gbWFrZSBzdXJlIHRoZXkgYXJlIHVuaXF1ZQotCSEgIFJhbmdlIGZvciBiMmJndWkgbWVzc2FnZUlEczogSVdBWDEyMDEgLSBJV0FYMTQwMAotCSEKLQkhPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9USEVfQ09OVEFJTkVSX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfTE9DQUxfTE9DQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX05PVF9KQVZBX1BST0pFQ1Q7Ci0KLS8vCSBOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgZXJyb3IgbWVzc2FnZSB0ZXh0IGlzIGZvbGxvd2VkIGJ5IGEgbWVzc2FnZSBmcm9tIGFub3RoZXIgcGx1Z2luCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0lOVkFMSURfSkFWQV9QQUNLQUdFOwotCi0vLwkgTk9URSBUTyBUUkFOU0xBVE9SOiAoX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gKyBzdHJpbmcgKyBfVUlfTEFCRUxfT1IgKyBzdHJpbmcpIG9yIChfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTikKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9DT05UQUlORVJfTk9UX0pBVkFfQlVJTERQQVRIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9VU0VfUFJPSkVDVF9KQVZBX1NPVVJDRV9GT0xERVI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9JTlZBTElEX0pBVkFfUEFDS0FHRTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfUk9PVF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9TQVZJTkdfRklMRTsKLQotLy8JIEZpbGUgVmFsaWRhdG9yCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfTUVTU0FHRTsKLQotLy8JIFByb3BlcnR5RGlydHlDaGFuZ2VMaXN0ZW5lciBhbmQgUHJvcGVydHlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX1ZBTElEQVRFX0VESVRfRkFJTF9PTkVfRklMRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9VSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZmMyNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBhUmVzb3VyY2VCdW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYVJlc291cmNlQnVuZGxlICE9IG51bGwpID8gYVJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KQotICAgIHsKLSAgICAgIHJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOyAgICAgCi0gICAgfQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGFuZCBkb2VzIG9uZSBzdWJzdGl0dXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkKLQl7Ci0JICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGFuZCBkb2VzIHR3byBzdWJzdGl0dXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikKLQl7Ci0JICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IHMxLCBzMiB9KTsKLQl9ICAgICAKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKHBsdWdpbi5nZXRCdW5kbGUoKSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlsb2coeCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmw9IG5ldyBVUkwoZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSwgbmFtZSk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotCQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaWNvbk5hbWUpCi0gICAgewotICAgICAgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotICAgICAgCi0gICAgICBpZiAoaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoZ2V0Q2xhc3MoKSwgaWNvbk5hbWUpKTsKLSAgICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCBJU3RhdHVzLkVSUk9SLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdCgpLmludGVybmFsR2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGludGVybmFsR2V0QWN0aXZlUGFnZSgpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBpZiAod2luZG93ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2F2ZURpcnR5RmlsZXNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NhdmVEaXJ0eUZpbGVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTgwZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2F2ZURpcnR5RmlsZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9nczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQSBnZW5lcmljIHNhdmUgZmlsZXMgZGlhbG9nLiBUaGUgYnVsayBvZiB0aGUgY29kZSBmb3IgdGhpcyBkaWFsb2cgd2FzIHRha2VuCi0gKiBmcm9tIHRoZSBKRFQgcmVmYWN0b3Jpbmcgc3VwcG9ydCBpbgotICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU2F2ZUhlbHBlci4gVGhpcyBjbGFzcyBpcwotICogYSBnb29kIGNhbmRpZGF0ZSBmb3IgcmV1c2UgYW1vdW5nIGNvbXBvbmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRGlydHlGaWxlc0RpYWxvZyBleHRlbmRzIExpc3REaWFsb2cKLXsKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVEaXJ0eUZpbGVzKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAvLyBUT0RPIChjcykgYWRkIHN1cHBvcnQgZm9yIHNhdmUgYXV0b21hdGljYWxseQotICAgIFNoZWxsIHNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotICAgIElFZGl0b3JQYXJ0W10gZGlydHlFZGl0b3JzID0gZ2V0RGlydHlFZGl0b3JzKCk7Ci0gICAgaWYgKGRpcnR5RWRpdG9ycy5sZW5ndGggPiAwKQotICAgIHsgIAotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBTYXZlRGlydHlGaWxlc0RpYWxvZyBzYXZlRGlydHlGaWxlc0RpYWxvZyA9IG5ldyBTYXZlRGlydHlGaWxlc0RpYWxvZyhzaGVsbCk7Ci0gICAgICBzYXZlRGlydHlGaWxlc0RpYWxvZy5zZXRJbnB1dChBcnJheXMuYXNMaXN0KGRpcnR5RWRpdG9ycykpOwotICAgICAgLy8gU2F2ZSBhbGwgb3BlbiBlZGl0b3JzLgotICAgICAgaWYgKHNhdmVEaXJ0eUZpbGVzRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRydWU7ICAgICAgICAKLSAgICAgICAgaW50IG51bURpcnR5RWRpdG9ycyA9IGRpcnR5RWRpdG9ycy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGlydHlFZGl0b3JzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBkaXJ0eUVkaXRvcnNbaV0uZG9TYXZlKG51bGwpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBJRWRpdG9yUGFydFtdIGdldERpcnR5RWRpdG9ycygpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMCk7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsKLSAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcGFnZXMubGVuZ3RoOyB4KyspCi0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOwotICAgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGVkaXRvcnMubGVuZ3RoOyB6KyspCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlcCA9IGVkaXRvcnNbel07Ci0gICAgICAgICAgcmVzdWx0LmFkZChlcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChJRWRpdG9yUGFydFtdKSByZXN1bHQudG9BcnJheShuZXcgSUVkaXRvclBhcnRbcmVzdWx0LnNpemUoKV0pOwotICB9Ci0KLSAgcHVibGljIFNhdmVEaXJ0eUZpbGVzRGlhbG9nKFNoZWxsIHBhcmVudCkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2V0VGl0bGUoTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlcyk7Ci0gICAgc2V0QWRkQ2FuY2VsQnV0dG9uKHRydWUpOwotICAgIHNldExhYmVsUHJvdmlkZXIoY3JlYXRlRGlhbG9nTGFiZWxQcm92aWRlcigpKTsKLSAgICBzZXRNZXNzYWdlKE1lc3NhZ2VzLlNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmUpOwotICAgIHNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikKLSAgewotICAgIENvbXBvc2l0ZSByZXN1bHQgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGNvbnRhaW5lcik7Ci0gICAgLy8gVE9ETy4uLiBwcm92aWRlIHByZWZlcmVuY2UgdGhhdCBzdXBwb3J0cyAnYWx3YXlzIHNhdmUnCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIAotICBwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNyZWF0ZURpYWxvZ0xhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotICAKLSAgLyoqIAotICAgKiBBIHNwZWNpYWxpemVkIGNvbnRlbnQgcHJvdmlkZXIgdG8gc2hvdyBhIGxpc3Qgb2YgZWRpdG9yIHBhcnRzLgotICAgKiBUaGlzIGNsYXNzIGhhcyBiZWVuIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5MaXN0Q29udGVudFByb3ZpZGVyCi0gICAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSBhIGdlbmVyaWMgc29sdXRpb24gaXMgbWFkZSBhdmFpbGFibGUuCi0gICAqLyAgIAotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIExpc3QgZkNvbnRlbnRzOwotCi0gICAgcHVibGljIExpc3RDb250ZW50UHJvdmlkZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KQotICAgIHsKLSAgICAgIGlmIChmQ29udGVudHMgIT0gbnVsbCAmJiBmQ29udGVudHMgPT0gaW5wdXQpCi0gICAgICAgIHJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgIGZDb250ZW50cyA9IChMaXN0KSBuZXdJbnB1dDsKLSAgICAgIGVsc2UKLSAgICAgICAgZkNvbnRlbnRzID0gbnVsbDsKLSAgICAgIC8vIHdlIHVzZSBhIGZpeGVkIHNldC4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvKQotICAgIHsKLSAgICAgIHJldHVybiBmQ29udGVudHMgIT0gbnVsbCAmJiAhZkNvbnRlbnRzLmNvbnRhaW5zKG8pOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzUwM2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5EZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVWaWV3OwotCi0KLQotcHVibGljIGNsYXNzIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCXByb3RlY3RlZCBTZWxlY3RTaW5nbGVGaWxlVmlldyBzZWxlY3RTaW5nbGVGaWxlVmlldzsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3I7Ci0KLQlwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJfQotCQlzZWxlY3RTaW5nbGVGaWxlVmlldyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldyhzZWxlY3Rpb24sIGlzRmlsZU1hbmRhdG9yeSkgewotCQkJcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQkJU2VsZWN0U2luZ2xlRmlsZURpYWxvZy50aGlzLmNyZWF0ZUZpbHRlckNvbnRyb2woY29tcG9zaXRlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJLy8gVE9ETy4uIGVuYWJsZSBjb250ZXh0IGhlbHAKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGRpYWxvZ0FyZWEsCi0JCS8vIEIyQkdVSUNvbnRleHRJZHMuQlRCR19TRUxFQ1RfU0lOR0xFX0ZJTEVfRElBTE9HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLndpZHRoSGludCA9IDM1MDsKLQkJZ2QuaGVpZ2h0SGludCA9IDM1MDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCVNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSkgewotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoaXNDb21wbGV0ZSk7Ci0JCQl9Ci0JCX07Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldFZpc2libGVIZWxwZXIodHJ1ZSk7Ci0JCWltYWdlID0gZ2V0U2F2ZUFzSW1hZ2UoKTsKLQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBpbWFnZSB3YXMgY29waWVkIGZyb20gb3JnLmVjbGlwc2UudWkuaWRlL2ljb25zL2Z1bGwvd2l6YmFuLyB3aGVyZQotCSAqIGl0IGlzIGEgbm9uLUFQSSBpbWFnZSwgZGVub3RlZCBieQotCSAqIElERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19ETEdCQU5fU0FWRUFTX0RMRy4KLQkgKi8KLQlwcml2YXRlIEltYWdlIGdldFNhdmVBc0ltYWdlKCkgewotCQlJbWFnZSBsb2NhbGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3NhdmVhc193aXoucG5nIik7Ci0JCQl9Ci0JCQlsb2NhbGltYWdlID0gKEltYWdlKSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlUmVzb3VyY2UoZ2V0Q29udGVudHMoKS5nZXREaXNwbGF5KCkpOwotCQl9Ci0JCWNhdGNoIChEZXZpY2VSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBpbWFnZSBub3QgZm91bmQKLQkJCWxvY2FsaW1hZ2UgPSAoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gbG9jYWxpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb21ibyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBzZWxlY3RTaW5nbGVGaWxlVmlldy5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zLCBJRmlsZVtdIGV4Y2x1ZGVkRmlsZXMpIHsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zLCBleGNsdWRlZEZpbGVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKGltYWdlICE9IG51bGwgJiYgaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvci5kZXN0cm95UmVzb3VyY2UoaW1hZ2UpOwotCQkJaW1hZ2UgPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzFlNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLQotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCBpbXBsZW1lbnRzIERyYWdBbmREcm9wQ29tbWFuZAotewotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb3duZXIgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBkcmFnIGFuZCBkcm9wLgotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdCB0YXJnZXQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBkcmFnIGFuZCBkcm9wLgotICAgKi8KLSAgcHJvdGVjdGVkIGZsb2F0IGxvY2F0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBsb3dlciByYW5nZSBvZiBsb2NhdGlvbnMgaW4gd2hpY2ggdGhlIGVmZmVjdCBvZiB0aGlzIGNvbW1hbmQgcmVtYWlucyB1bmNoYW5nZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgZmxvYXQgbG93ZXJMb2NhdGlvbkJvdW5kOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSB1cHBlciByYW5nZSBvZiBsb2NhdGlvbnMgaW4gd2hpY2ggdGhlIGVmZmVjdCBvZiB0aGlzIGNvbW1hbmQgcmVtYWlucyB1bmNoYW5nZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgZmxvYXQgdXBwZXJMb2NhdGlvbkJvdW5kOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBwZXJtaXR0ZWQgb3BlcmF0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgb3BlcmF0aW9uczsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0T3BlcmF0aW9ufS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgb3BlcmF0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBmZWVkYmFjayB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRGZWVkYmFja30uCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGZlZWRiYWNrOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBjb2xsZWN0aW9uIG9mIGRyYWdnZWQgc291cmNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIHNvdXJjZXM7Ci0KLSAgcHVibGljIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMpCi0gIHsKLSAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICB0aGlzLnNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KHNvdXJjZXMpOwotICAgIGlmICghY2FuRXhlY3V0ZSgpKSAKLSAgICB7Ci0gICAgICB0aGlzLm9wZXJhdGlvbiA9IERORC5EUk9QX05PTkU7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHVibGljIGludCBnZXRGZWVkYmFjaygpCi0gIHsKLSAgICBpZiAoaXNBZnRlcigpKQotICAgIHsKLSAgICAgIHJldHVybiBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHJldHVybiBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLSAgICB9Ci0gIH0gICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNBZnRlcigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb24gPiAwLjU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVpbml0aWFsaXplKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKQotICB7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgdGhpcy5zb3VyY2VzID0gbmV3IEFycmF5TGlzdChzb3VyY2VzKTsKLSAgICBpZiAoIWNhbkV4ZWN1dGUoKSkgCi0gICAgewotICAgICAgdGhpcy5vcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotICAgIH0KLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ViNDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRHJhZ0FuZERyb3BDb21tYW5kCi17Ci0gIC8vICBwdWJsaWMgRHJhZ0FuZERyb3BDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKTsKLQotICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCk7Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpOwotCi0gIHB1YmxpYyBpbnQgZ2V0RmVlZGJhY2soKTsKLSAgCi0gIHB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgcHVibGljIHZvaWQgcmVpbml0aWFsaXplKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTNhNWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRHJhZ0FuZERyb3BNYW5hZ2VyCi17Ci0gIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvT2JqZWN0VHJhbnNmZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvT2JqZWN0VHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0ZWFmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL09iamVjdFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLQotCi0vKioKLSAqIFRoaXMgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ5dGUgYXJyYXkgdHJhbnNmZXIgc2hvcnQgY2lyY3VpdHMgdGhlIHRyYW5zZmVyIHByb2Nlc3MKLSAqIHNvIHRoYXQgYSBsb2NhbCB0cmFuc2ZlciBkb2VzIG5vdCBzZXJpYWxpemUgdGhlIG9iamVjdAotICogYW5kIGhlbmNlIGNhbiBhbmQgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIG9iamVjdCwgbm90IGp1c3QgYSBjbG9uZS4KLSAqIFlvdSBvbmx5IHJlYWxseSBuZWVkIGV2ZXIga25vdyBhYm91dCB7QGxpbmsgI2dldEluc3RhbmNlIE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCl9LAotICogc28gdGhhdCB5b3UgY2FuIGluY2x1ZGUgaXQgaW4gd2hlbiBhZGRpbmcgZHJhZyBzdXBwb3J0IHRvIGEgdmlld2VyLgotICogU2VlIHtAbGluayBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXJ9IGFuZCB7QGxpbmsgVmlld2VyRHJhZ0FkYXB0ZXJ9IGZvciBtb3JlIGRldGFpbHMuCi0gKiA8cD4KLSAqIEFzIGFuIGFkZGRlZCBndWFyZCwgdGhlIHRpbWUgaXMgcmVjb3JkZWQgYW5kIHNlcmlhbGl6ZWQgaW4gamF2YVRvTmF0aXZlCi0gKiB0byB0aGF0IG5hdml2ZSB0byBqYXZhIGNhbiBlbnN1cmUgdGhhdCBpdCdzIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWxseSB0byBoYXZlIGJlZW4gdHJhbnNmZXJyZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyCi17Ci0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSByZWdpc3RlciB0cmFuc2ZlciB0eXBlIG5hbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAibG9jYWwtdHJhbnNmZXItZm9ybWF0IjsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgSUQgdGhhdCBpcyByZWdpc3RlcmVkIHRvIHRoZSBuYW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JRCA9IHJlZ2lzdGVyVHlwZShUWVBFX05BTUUpOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIGluaXRpYWxpemVkIGFuZCByZXR1cm5lZCBieSB7QGxpbmsgI2dldEluc3RhbmNlfS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0VHJhbnNmZXIgaW5zdGFuY2U7Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmV0dXJucyB0aGUgb25lIGluc3RhbmNlIG9mIHRoaXMgdHJhbnNmZXIgYWdlbnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE9iamVjdFRyYW5zZmVyIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IE9iamVjdFRyYW5zZmVyKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmVjb3JkcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgdHJhbnNmZXIgZGF0YSB3YXMgcmVjb3JkZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgbG9uZyBzdGFydFRpbWU7Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmVjb3JkcyB0aGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZC4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OwotCi0gIC8qKgotICAgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2U7IHR5cGljYWxseSB5b3UgZ2V0IG9uZSBmcm9tIHtAbGluayAjZ2V0SW5zdGFuY2V9LgotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdFRyYW5zZmVyKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmV0dXJucyB0aGUgdHJhbnNmZXIgaWRzIHRoYXQgdGhpcyBhZ2VudCBzdXBwb3J0cy4KLSAgICovCi0gIHByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IGludFtdIHsgVFlQRV9JRCB9OwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmV0dXJucyB0aGUgdHJhbnNmZXIgbmFtZXMgdGhhdCB0aGlzIGFnZW50IHN1cHBvcnRzLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IFRZUEVfTkFNRSB9OwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmVjb3JkcyB0aGUgb2JqZWN0IGFuZCBjdXJyZW50IHRpbWUgYW5kIGVuY29kZXMgb25seSB0aGUgY3VycmVudCB0aW1lIGludG8gdGhlIHRyYW5zZmVyIGRhdGEuCi0gICAqLwotICBwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgCi0gIHsKLSAgICBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICBpZiAodHJhbnNmZXJEYXRhICE9IG51bGwpCi0gICAgewotICAgICAgc3VwZXIuamF2YVRvTmF0aXZlKFN0cmluZy52YWx1ZU9mKHN0YXJ0VGltZSkuZ2V0Qnl0ZXMoKSwgdHJhbnNmZXJEYXRhKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBkZWNvZGVzIHRoZSB0aW1lIG9mIHRoZSB0cmFuc2ZlciBhbmQgcmV0dXJucyB0aGUgcmVjb3JkZWQgdGhlIG9iamVjdCBpZiB0aGUgcmVjb3JkZWQgdGltZSBhbmQgdGhlIGRlY29kZWQgdGltZSBtYXRjaC4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIAotICB7Ci0gICAgbG9uZyBzdGFydFRpbWUgID0gTG9uZy52YWx1ZU9mKG5ldyBTdHJpbmcoKGJ5dGVbXSlzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKSkpLmxvbmdWYWx1ZSgpOwotICAgIHJldHVybgotICAgICAgdGhpcy5zdGFydFRpbWUgPT0gc3RhcnRUaW1lID8KLSAgICAgICAgb2JqZWN0IDoKLSAgICAgICAgbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcmFnQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcmFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2FhMzQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYW4gaW1wbGVtZW50aW9uIG9mIHtAbGluayBEcmFnU291cmNlTGlzdGVuZXJ9LgotICogSXQgYWxsb3dzIHRoZSBzZWxlY3Rpb24gaW4gZWZmZWN0IGF0IHRoZSBzdGFydCBvZiB0aGUgZHJhZyBhbmQgZHJvcCBpbnRlcmFjdGlvbiB0byBiZSByZWNvcmRlZCwKLSAqIHdoaWNoIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBhIGRyYWcgYW5kIGRyb3AgaW50ZXJhY3Rpb24gd2l0aGluIGEgc2luZ2xlIHZpZXcuCi0gKiBUaGlzIGlzIGhvdyBvbmUgb2YgdGhlc2UgYWRhcHRlcnMgaXMgdHlwaWNhbGx5IGhvb2tlZCB1cDoKLSAqIDxwcmU+Ci0gKiAgIHZpZXdlci5hZGREcmFnU3VwcG9ydAotICogICAgIChETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkssIAotICogICAgICBuZXcgVHJhbnNmZXIgW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSwKLSAqICAgICAgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0gKiA8L3ByZT4KLSAqIERvaW5nIHNvIHNpbXBseSBhbGxvd3MgYSBkcmFnIG9wZXJhdGlvbiB0byBiZSBpbml0aWF0ZWQgZnJvbSB0aGUgdmlld2VyCi0gKiBzdWNoIHRoYXQgdGhlIHZpZXdlcidzIHNlbGVjdGlvbiBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgZHJvcCB0YXJnZXQuCi0gKiBTZWUge0BsaW5rIEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcn0gYW5kIHtAbGluayBMb2NhbFRyYW5zZmVyfSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyRHJhZ0FkYXB0ZXIgaW1wbGVtZW50cyBEcmFnU291cmNlTGlzdGVuZXIKLXsKLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHZpZXdlciB0byB3aGljaCB3ZSBhcmUgbGlzdGVuaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiB0aGF0IGlzIGluIGVmZmVjdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRyYWcgb3BlcmF0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgLyoqCi0gICAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHZpZXdlci4KLSAgICovCi0gIHB1YmxpYyBWaWV3ZXJEcmFnQWRhcHRlcihWaWV3ZXIgdmlld2VyKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIC8vIFJlbWVtYmVyIHRoZSB2aWV3ZXIgYW5kIGxpc3RlbiB0byBTV1QuRHJhZ0RldGVjdCB0byBhbGVydCB0aGUgc3RhcnQgb2YgdGhlIGRyYWcgb3BlcmF0aW9uLgotICAgIC8vCi0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBkcmFnZ2luZyBpcyBpbml0aWF0ZWQ7IGl0IHJlY29yZHMgdGhlIHtAbGluayAjc2VsZWN0aW9ufSBvZiB7QGxpbmsgI3ZpZXdlcn0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KQotICB7Ci0gICAgc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgaXMgY29tcGxldGVkOyBpdCBmb3JnZXRzIHRoZSB7QGxpbmsgI3NlbGVjdGlvbn0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KQotICB7Ci0gICAgc2VsZWN0aW9uID0gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHRvIHRyYW5zZmVyIHRoZSBkYXRhLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkKLSAgICB7Ci0gICAgICBldmVudC5kYXRhID0gc2VsZWN0aW9uOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcm9wQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQwM2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJvcEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYSBkcm9wIHRhcmdldCBsaXN0ZW5lciAKLSAqIGlzIGRlc2lnbmVkIHRvIHR1cm4gYSBkcmFnIGFuZCBkcm9wIG9wZXJhdGlvbiBpbnRvIGEge0BsaW5rIENvbW1hbmR9IGJhc2VkIG9uIHRoZSBtb2RlbCBvYmplY3RzIG9mIGFuIHtAbGluayBFZGl0aW5nRG9tYWlufQotICogYW5kIGNyZWF0ZWQgYnkge0BsaW5rIERyYWdBbmREcm9wTWFuYWdlciNjcmVhdGV9LgotICogSXQgaXMgZGVzaWduZWQgdG8gZG8gZWFybHkgZGF0YSB0cmFuc2ZlciBzbyB0aGUgdGhlIGVuYWJsZW1lbnQgYW5kIGZlZWRiYWNrIG9mIHRoZSBkcmFnIGFuZCBkcm9wIGludGVyYWN0aW9uCi0gKiBjYW4gaW50aW1hdGVseSBkZXBlbmQgb24gdGhlIHN0YXRlIG9mIHRoZSBtb2RlbCBvYmplY3RzIGludm9sZWQuCi0gKiA8cD4KLSAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIG1vc3QgYXBwbGljYXRpb25zLgotICogQW55IGNoYW5nZSBpbiBiZWhhdmlvdXIgaXMgdHlwaWNhbGx5IGFjY29tcGxpc2hlZCBieSBvdmVycmlkaW5nIAotICoge0BsaW5rIEl0ZW1Qcm92aWRlckFkYXB0ZXJ9LmNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZAotICogdG8gcmV0dXJuIGEgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgRHJhZ0FuZERyb3BDb21tYW5kfS4KLSAqIFRoaXMgaXMgaG93IG9uZSB0aGVzZSBhZGFwdGVycyBpcyB0eXBpY2FsbHkgaG9va2VkIHVwOgotICogPHByZT4KLSAqICAgdmlld2VyLmFkZERyb3BTdXBwb3J0Ci0gKiAgICAgKERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSywKLSAqICAgICAgbmV3IFRyYW5zZmVyIFtdIHsgT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9LAotICogICAgICBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIodmlld2VyKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBwcmVmZXJzIHRvIHVzZSBhIHtAbGluayBPYmplY3RUcmFuc2Zlcn0sIAotICogd2hpY2ggc2hvcnQtY2lyY3VpdHMgdGhlIHRyYW5zZmVyIHByb2Nlc3MgZm9yIHNpbXBsZSB0cmFuc2ZlcnMgd2l0aGluIHRoZSB3b3JrYmVuY2gsCi0gKiB0aGUgbWV0aG9kIHtAbGluayAjZ2V0RHJhZ1NvdXJjZX0gY2FuIGJlIG92ZXJyaWRlbiB0byBjaGFuZ2UgdGhlIGJlaGF2aW91ci4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBhbHNvIG9ubHkgaGFuZGxlcyBhbiB7QGxpbmsgSVN0cnVjdHVyZWRTZWxlY3Rpb259LAotICogYnV0IHRoZSBtZXRob2Qge0BsaW5rICNleHRyYWN0RHJhZ1NvdXJjZX0gY2FuIGJlIG92ZXJyaWRlbiB0byBjaGFuZ2UgdGhlIGJlaGF2aW91ci4KLSAqIDxwPgotICogWW91IGNhbiBjYWxsIHtAbGluayAjc2V0SG92ZXJUaHJlc2hvbGR9IHRvIHNldCB0aGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgCi0gKiB0byBob3ZlciBvdmVyIGFuIGl0ZW0gYmVmb3JlIHtAbGluayAjaG92ZXJ9IGlzIGNhbGxlZDsKLSAqIHRoZSBkZWZhdWx0IGlzIDE1MDAgbWlsbGlzZWNvbmRzLgotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyRHJvcEFkYXB0ZXIgZXh0ZW5kcyBEcm9wVGFyZ2V0QWRhcHRlcgotewotICAvKioKLSAgICogVGhpcyBpcyB0aGUgdmlld2VyIGZvciB3aGljaCB0aGlzIGlzIGEgZHJvcCB0YXJnZXQgbGlzdGVuZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBvZiBzb3VyY2Ugb2JqZWN0cyBiZWluZyBkcmFnZ2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gc291cmNlOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBjb21tYW5kIGNyZWF0ZWQgZHVyaW5nIGRyYWdnaW5nIHdoaWNoIHByb3ZpZGVzIHRoZSBmZWVkYmFjayBhbmQgd2lsbCBjYXJyeSBvdXQgdGhlIGFjdGlvbiB1cG9uIGNvbXBsZXRpb24uCi0gICAqLwotICAvLyAgcHJvdGVjdGVkIENvbW1hbmQgY29tbWFuZDsKLSAgcHJvdGVjdGVkIERyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kOwotIAotICAvKioKLSAgICogVGhpcyByZWNvcmRzIHRoZSBvYmplY3QgZm9yIHdoaWNoIHRoZSB7QGxpbmsgI2NvbW1hbmR9IHdhcyBjcmVhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdCBjb21tYW5kVGFyZ2V0OwotCi0gIC8qKgotICAgKiBUaGUgYW1vdW50IG9mIHRpbWUgdG8gaG92ZXIgb3ZlciBhIHRyZWUgaXRlbSBiZWZvcmUgZXhwYW5kaW5nIGl0Ci0gICAqLwotICBwcm90ZWN0ZWQgaW50IGhvdmVyVGhyZXNob2xkID0gMTUwMDsKLQotICAvKioKLSAgICogVGhlIGlzIHRoZSB0aW1lIHRoZSBtb3VzZSBmaXJzdCBzdGFydGVkIGhvdmVyaW5nIG92ZXIgdGhlIGN1cnJlbnQgaXRlbS4KLSAgICovCi0gIHByb3RlY3RlZCBsb25nIGhvdmVyU3RhcnQgPSAwOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBtb3N0IHJlY2VudCBpdGVtIGZvciB0aGUge0BsaW5rICNob3ZlclN0YXJ0fS4KLSAgICovCi0gIHByb3RlY3RlZCBXaWRnZXQgcHJldmlvdXNJdGVtOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBvcGVyYXRpb24gdGhhdCB3YXMgaW4gZWZmZWN0IGJlZm9yZSB3ZSBzZXQgdGhlIGV2ZW50LmRldGFpbCBpbiBoZXJlLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBvcmlnaW5hbE9wZXJhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgaW5mb3JtYXRpb24gdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgY29tbWFuZC4KLSAgICovCi0gIHByb3RlY3RlZCBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbjsKLQotICBwcm90ZWN0ZWQgRHJhZ0FuZERyb3BNYW5hZ2VyIGRyYWdBbmREcm9wTWFuYWdlcjsKLQotICAvKioKLSAgICogVGhpcyBjcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gZG9tYWluIGFuZCB2aWV3ZXIuCi0gICAqLwotICBwdWJsaWMgVmlld2VyRHJvcEFkYXB0ZXIoVmlld2VyIHZpZXdlciwgRHJhZ0FuZERyb3BNYW5hZ2VyIGRyYWdBbmREcm9wTWFuYWdlcikKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIHRoaXMuZHJhZ0FuZERyb3BNYW5hZ2VyID0gZHJhZ0FuZERyb3BNYW5hZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIGZpcnN0IGVudGVycyBvciBzdGFydHMgZHJhZ2dpbmcgaW4gdGhlIHZpZXdlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBvcmlnaW5hbE9wZXJhdGlvbiA9IGV2ZW50LmRldGFpbDsKLSAgICBoZWxwZXIoZXZlbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyBvciBzdG9wcyBkcmFnZ2luZyBpbiB0aGUgdmlld2VyCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gQ2xlYW4gdXAgdGhlIGNvbW1hbmQgaWYgdGhlcmUgaXMgb25lLgotICAgIC8vCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0vLyAgICAgICAgY29tbWFuZC5kaXNwb3NlKCk7Ci0gICAgICBjb21tYW5kID0gbnVsbDsKLSAgICAgIGNvbW1hbmRUYXJnZXQgPSBudWxsOwotICAgIH0KLQotICAgIC8vIFJlc2V0IHRoZSBvdGhlciB2YWx1ZXMuCi0gICAgLy8KLSAgICBwcmV2aW91c0l0ZW0gPSBudWxsOwotICAgIGhvdmVyU3RhcnQgPSAwOwotICAgIHNvdXJjZSA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBjaGFuZ2VkIGluIHNvbWUgd2F5LCB0eXBpY2FsbHkgYmVjYXVzZSB0aGUgdXNlciBjaGFuZ2VzIGtleWJvYXJkIG1vZGlmaWVycy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIG9yaWdpbmFsT3BlcmF0aW9uID0gZXZlbnQuZGV0YWlsOwotICAgIGhlbHBlcihldmVudCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgcmVwZWF0ZWQgd2hlbiB0aGUgbW91c2Ugb3ZlciB0aGUgdmlld2VyLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSAKLSAgewotICAgIGhlbHBlcihldmVudCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQganVzdCBhcyB0aGUgbW91c2UgaXMgcmVsZWFzZWQgb3ZlciB0aGUgdmlld2VyIHRvIGluaXRpYXRlIGEgZHJvcC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyb3BBY2NlcHQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSAKLSAgewotICAgIC8vIFRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIFNXVCB0aGF0IHRoZSB2aWV3IG1heSBoYXZlIHNjcm9sbGVkLgotICAgIC8vIGhlbHBlcihldmVudCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBjYWxsZWQgdG8gaW5kYXRlIHRoYXQgdGhlIGRyb3AgYWN0aW9uIHNob3VsZCBiZSBpbnZva2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBTV1QgdGhhdCB0aGUgdmlldyBtYXkgaGF2ZSBzY3JvbGxlZC4KLSAgICAvLyBoZWxwZXIoZXZlbnQpOwotICAgIGlmIChkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0KLSAgICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotCi0gICAgICAvLyBDbGVhbiB1cCB0aGUgc3RhdGUuCi0gICAgICAvLwotICAgICAgY29tbWFuZCA9IG51bGw7Ci0gICAgICBjb21tYW5kVGFyZ2V0ID0gbnVsbDsKLSAgICAgIHByZXZpb3VzSXRlbSA9IG51bGw7Ci0gICAgICBob3ZlclN0YXJ0ID0gMDsKLSAgICAgIHNvdXJjZSA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0aGUgc2FtZSB3YXkgZm9yIGVhY2ggb2YgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcn0gbWV0aG9kcywgZXhjZXB0IGR1cmluZyBsZWF2ZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBUcnkgdG8gZ2V0IHRoZSBzb3VyY2UgaWYgdGhlcmUgaXNuJ3Qgb25lLgotICAgIC8vCi0gICAgaWYgKHNvdXJjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHNvdXJjZSA9IGdldERyYWdTb3VyY2UoZXZlbnQpOwotICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZSBpZiAoZXZlbnQuY3VycmVudERhdGFUeXBlID09IG51bGwpCi0gICAgewotICAgICAgc2V0Q3VycmVudERhdGFUeXBlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSdzIHN0aWxsIG5vIHNvdXJjZSwgd2FpdCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRvIHRyeSBhZ2Fpbi4KLSAgICAvLwotICAgIGlmIChzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotICAgIH0KLSAgICAvLyBPdGhlcndpc2UsIGlmIHdlIG5lZWQgdG8gc2Nyb2xsLi4uCi0gICAgLy8KLSAgICBlbHNlIGlmIChzY3JvbGxJZk5lZWRlZChldmVudCkpCi0gICAgewotICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB3ZSBzY3JvbGwsIHdlIGp1c3QgZG8gYWxsIHRoZSB3b3JrIG9uIHRoZSBuZXh0IGV2ZW50IGFuZCBvbmx5IGp1c3Qgc2Nyb2xsIG5vdy4KLSAgICAgIC8vCi0gICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgaXRlbSwgaWYgdGhlcmUgaXMgb25lLgotICAgICAgLy8KLSAgICAgIE9iamVjdCB0YXJnZXQgPSBldmVudC5pdGVtID09IG51bGwgPyBudWxsIDogZXZlbnQuaXRlbS5nZXREYXRhKCk7Ci0gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGFibGVUcmVlSXRlbSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gKChUYWJsZVRyZWVJdGVtKXRhcmdldCkuZ2V0RGF0YSgpOwotICAgICAgfQotCi0gICAgICAvLyBEbyB0aGUgbG9naWMgdG8gZGV0ZXJtaW5lIHRoZSBob3ZlciBpbmZvcm1hdGlvbi4KLSAgICAgIC8vIElmIHdlJ3JlIG92ZXIgYSBuZXcgaXRlbSBmcm9tIGJlZm9yZS4KLSAgICAgIC8vCi0gICAgICBpZiAoZXZlbnQuaXRlbSAhPSBwcmV2aW91c0l0ZW0pCi0gICAgICB7Ci0gICAgICAgIC8vIFJlbWVtYmVyIHRoZSBpdGVtIGFuZCB0aGUgdGltZS4KLSAgICAgICAgLy8KLSAgICAgICAgcHJldmlvdXNJdGVtID0gZXZlbnQuaXRlbTsKLSAgICAgICAgaG92ZXJTdGFydCA9IGV2ZW50LnRpbWU7Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChldmVudC50aW1lIC0gaG92ZXJTdGFydCA+IGhvdmVyVGhyZXNob2xkKQotICAgICAgICB7Ci0gICAgICAgICAgaG92ZXIodGFyZ2V0KTsKLQotICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gaG92ZXIgb3ZlciB0aGlzIGd1eSBhZ2Fpbi4KLSAgICAgICAgICAvLwotICAgICAgICAgIGhvdmVyU3RhcnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBEZXRlcm1pbmUgaWYgd2UgY2FuIGNyZWF0ZSBhIHZhbGlkIGNvbW1hbmQgYXQgdGhlIGN1cnJlbnQgbW91c2UgbG9jYXRpb24uCi0gICAgICAvLwotICAgICAgYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcHJldmlvdXMgY2FjaGVkIGNvbW1hbmQuLi4KLSAgICAgIC8vCi0gICAgICBpZiAoY29tbWFuZCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbW1hbmQgYW5kIHRlc3QgaWYgaXQgaXMgZXhlY3V0YWJsZS4KLSAgICAgICAgLy8KLSAgICAgICAgY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgY29tbWFuZCA9IGRyYWdBbmREcm9wTWFuYWdlci5jcmVhdGVDb21tYW5kKHRhcmdldCwgZ2V0TG9jYXRpb24oZXZlbnQpLCBldmVudC5vcGVyYXRpb25zLCBldmVudC5kZXRhaWwsIHNvdXJjZSk7Ci0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgCXZhbGlkID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW50IG9wZXJhdGlvbiA9IG9yaWdpbmFsT3BlcmF0aW9uICE9IGV2ZW50LmRldGFpbCA/IG9yaWdpbmFsT3BlcmF0aW9uIDogZXZlbnQuZGV0YWlsOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjYWNoZWQgY29tbWFuZCBpcyBhYmxlIHRvIHByb3ZpZGUgZHJhZyBhbmQgZHJvcCBmZWVkYmFjay4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKHRhcmdldCA9PSBjb21tYW5kVGFyZ2V0KS8vICYmIGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcEZlZWRiYWNrKQotICAgICAgICB7Ci0gICAgICAgICAgZmxvYXQgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihldmVudCk7Ci0KLSAgICAgICAgICBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IAotICAgICAgICAgICAgbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQotICAgICAgICAgIC8vIElmIHNvLCByZXZhbGlkYXRlIHRoZSBjb21tYW5kLgotICAgICAgICAgIC8vCi0gICAgICAgICAgY29tbWFuZC5yZWluaXRpYWxpemUodGFyZ2V0LCBsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgIHZhbGlkID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIG5vdCwgZGlzcG9zZSB0aGUgY3VycmVudCBjb21tYW5kIGFuZCBjcmVhdGUgYSBuZXcgb25lLgotICAgICAgICAgIC8vCi0gICAgICAgICAgLy8gICAgICAgICAgY29tbWFuZC5kaXNwb3NlKCk7Ci0gICAgICAgICAgY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLQotICAgICAgICAgIGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uID0gCi0gICAgICAgICAgICBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24odGFyZ2V0LCBnZXRMb2NhdGlvbihldmVudCksIGV2ZW50Lm9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQotICAgICAgICAgIC8vIERyYWdBbmREcm9wTWFuYWdlci5jcmVhdGUoZG9tYWluLCB0YXJnZXQsIGdldExvY2F0aW9uKGV2ZW50KSwgZXZlbnQub3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotICAgICAgICAgIC8vCi0gICAgICAgICAgY29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uLmNyZWF0ZUNvbW1hbmQoKTsKLQotICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgIAl2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGlzIGNvbW1hbmQgY2FuIHByb3ZpZGUgZGV0YWlsZWQgZHJhZyBhbmQgZHJvcCBmZWVkYmFjay4uLgotICAgICAgLy8KLSAgICAgIC8vaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcENvbW1hbmQpCi0gICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBVc2UgdGhlIGZlZWRiYWNrIGZvciB0aGUgb3BlcmF0aW9uIGFuZCBtb3VzZSBwb2ludCBmcm9tIHRoZSBjb21tYW5kLgotICAgICAgICAvLwotICAgICAgICBldmVudC5kZXRhaWwgPSBjb21tYW5kLmdldE9wZXJhdGlvbigpOwotICAgICAgICBldmVudC5mZWVkYmFjayA9IGNvbW1hbmQuZ2V0RmVlZGJhY2soKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHZhbGlkKQotICAgICAgewotICAgICAgICAvLyBBbGwgd2UgY2FuIGtub3cgaXMgdG8gcHJvdmlkZSBzZWxlY3Rpb24gZmVlZGJhY2suCi0gICAgICAgIC8vCi0gICAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgbm8gZXhlY3V0YWJsZSBjb21tYW5kLCBzbyB3ZSdkIGJldHRlciBuaXggdGhlIHdob2xlIGRlYWwuCi0gICAgICAgIC8vCi0gICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0gICAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50RGF0YVR5cGUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPYmplY3RUcmFuc2ZlciBvYmplY3RUcmFuc2ZlciA9IE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0gICAgVHJhbnNmZXJEYXRhIFtdIGRhdGFUeXBlcyA9IGV2ZW50LmRhdGFUeXBlczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFUeXBlcy5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhID0gZGF0YVR5cGVzW2ldOwotICAgICAgLy8gSWYgdGhlIGxvY2FsIHRhbnNmZXIgc3VwcG9ydHMgdGhpcyBkYXRhdHlwZSwgc3dpdGNoIHRvIHRoYXQgZGF0YSB0eXBlCi0gICAgICAvLwotICAgICAgaWYgKG9iamVjdFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKQotICAgICAgewotICAgICAgICBldmVudC5jdXJyZW50RGF0YVR5cGUgPSB0cmFuc2ZlckRhdGE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqIAotICAgKiBUaGlzICBhdHRlbXB0cyB0byBleHRyYWN0IHRoZSBkcmFnIHNvdXJjZSBmcm9tIHRoZSBldmVudCBlYXJseSwgaS5lLiwgYmVmb3JlIHRoZSBkcm9wIG1ldGhvZC4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byB1c2UgYSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuT2JqZWN0VHJhbnNmZXJ9LgotICAgKi8KLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RHJhZ1NvdXJjZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IGRhdGEgdHlwZSBjYW4gYmUgdHJhbnNmZXJlZCBsb2NhbGx5LgotICAgIC8vCi0gICAgT2JqZWN0VHJhbnNmZXIgb2JqZWN0VHJhbnNmZXIgPSBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICAgIGlmICghb2JqZWN0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpCi0gICAgewotICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBkYXRhIHR5cGVzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRhdGF0eXBlIHRoYXQgc3VwcG9ydHMgYSBsb2NhbCB0cmFuc2Zlci4KLSAgICAgIC8vCi0gICAgICBzZXRDdXJyZW50RGF0YVR5cGUoZXZlbnQpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUcmFuc2ZlciB0aGUgZGF0YSBhbmQgZXh0cmFjdCBpdC4KLSAgICAgIC8vCi0gICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqZWN0VHJhbnNmZXIubmF0aXZlVG9KYXZhKGV2ZW50LmN1cnJlbnREYXRhVHlwZSk7Ci0gICAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIGV4dHJhY3REcmFnU291cmNlKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZXh0cmFjdHMgYSBjb2xsZWN0aW9uIG9mIGRyYWdnZWQgc291cmNlIG9iamVjdHMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0IHJldHJpZXZlZCBmcm9tIHRoZSB0cmFuc2ZlciBhZ2VudC4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNvbnZlcnRzIGEgc3RydWN0dXJlZCBzZWxlY3Rpb24gaW50byBhIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBleHRyYWN0RHJhZ1NvdXJjZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgLy8gVHJhbnNmZXIgdGhlIGRhdGEgYW5kIGNvbnZlcnQgdGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIHRvIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzLgotICAgIC8vCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIENvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgZm9yIChJdGVyYXRvciBlbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pb2JqZWN0KS5pdGVyYXRvcigpOyBlbGVtZW50cy5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZChlbGVtZW50cy5uZXh0KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGdldHMgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGhvdmVyIG92ZXIgYW4gaXRlbSBiZWZvcmUge0BsaW5rICNob3Zlcn0gaXMgY2FsbGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRIb3ZlclRocmVzaG9sZCgpCi0gIHsKLSAgICByZXR1cm4gaG92ZXJUaHJlc2hvbGQ7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBzZXQgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGhvdmVyIG92ZXIgYW4gaXRlbSBiZWZvcmUge0BsaW5rICNob3Zlcn0gaXMgY2FsbGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SG92ZXJUaHJlc2hvbGQoaW50IGhvdmVyVGhyZXNob2xkKQotICB7Ci0gICAgdGhpcy5ob3ZlclRocmVzaG9sZCA9IGhvdmVyVGhyZXNob2xkOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGN1cnNvciBoYXMgaG92ZXJlZCBvdmVyIHRoZSBnaXZlbiB0YXJnZXQgZm9yIGxvbmdlciB0aGFuIHtAbGluayAjaG92ZXJUaHJlc2hvbGR9LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaG92ZXIoT2JqZWN0IHRhcmdldCkKLSAgewotICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpCi0gICAgewotICAgICAgKChBYnN0cmFjdFRyZWVWaWV3ZXIpdmlld2VyKS5leHBhbmRUb0xldmVsKHRhcmdldCwgMSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIAotICAgKiBUaGlzIHJldHVybnMgd2hldGhlciBhIHNjcm9sbCB3YXMgcGVyZm9ybWVkIGJhc2VkIG9uIHRoZSBnaXZlbiBkcmFnIGNvb3JkaW5hdGVzLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2Nyb2xsSWZOZWVkZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gQnkgZGVmYXVsdCB3ZSdsbCBub3Qgc2Nyb2xsCi0gICAgLy8KLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgLy8gV2Ugb25seSBoYW5kbGUgYSB0cmVlIGl0ZW0gcmlnaHQgbm93LgotICAgIC8vCi0gICAgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkKLSAgICB7Ci0gICAgICAvLyBUcmVlIGl0ZW1zIGhhdmUgc3BlY2lhbCBkYXRhIHRoYXQgd2lsbCBoZWxwLgotICAgICAgLy8KLSAgICAgIFRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0KLSAgICAgIC8vIFdlIG5lZWQgbmVlZCB0aGUgcG9pbnQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjb250cm9sIGFuZCB0aGUgY29udHJvbCdzIGJvdW5kcy4KLSAgICAgIC8vCi0gICAgICBUcmVlIHRyZWUgPSB0cmVlSXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgIFBvaW50IHBvaW50ID0gdHJlZS50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSB0cmVlLmdldENsaWVudEFyZWEoKTsKLQotICAgICAgLy8gVGhpcyBpcyB0aGUgZGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gdGhlIHRvcCBvciBib3R0b20gdGhhdCB3aWxsIGNhdXNlIHNjcm9sbGluZy4KLSAgICAgIC8vCi0gICAgICBpbnQgc2Nyb2xsRXBzaWxvbiA9IE1hdGgubWluKHRyZWVJdGVtLmdldEJvdW5kcygpLmhlaWdodCwgYm91bmRzLmhlaWdodCAvIDMpOwotCi0gICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGl0ZW0gdGhhdCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB0aGUgdmlldy4KLSAgICAgIC8vCi0gICAgICBUcmVlSXRlbSBzY3JvbGxUcmVlSXRlbSA9IG51bGw7Ci0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwgdXAuCi0gICAgICAvLwotICAgICAgaWYgKHBvaW50LnkgPCBzY3JvbGxFcHNpbG9uKQotICAgICAgewotICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHBhcmVudCB0byBmaW5kIHRoZSBzaWJsaW5nLgotICAgICAgICAvLwotICAgICAgICBUcmVlSXRlbSBwYXJlbnQgPSB0cmVlSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0gICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc2libGluZ3MuCi0gICAgICAgIC8vCi0gICAgICAgIFRyZWVJdGVtIFtdIGNoaWxkcmVuID0gcGFyZW50ID09IG51bGwgPyB0cmVlLmdldEl0ZW1zKCkgOiBwYXJlbnQuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKLSAgICAgICAgewotICAgICAgICAgIC8vIElzIHRoaXMgYSBtYXRjaC4KLSAgICAgICAgICAvLwotICAgICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSB0cmVlSXRlbSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIHNpYmxpbmcuLi4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gY2hpbGRyZW5baSAtIDFdOwotCi0gICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBkZWVwZXN0IGRlc2NlbmRlbnQgb2YgdGhpcyBwcmV2aW91cyBzaWJsaW5nLgotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBzY3JvbGxUcmVlSXRlbS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCAhPSAwICYmIHNjcm9sbFRyZWVJdGVtLmdldEV4cGFuZGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2Nyb2xsVHJlZUl0ZW0gPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IG11c3QgYmUgdGhlIHByZXZpb3VzLgotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBzY3JvbGxUcmVlSXRlbSA9IHBhcmVudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UncmUgZG9uZSBhZnRlciB0aGUgbWF0Y2guCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsIGRvd24uLi4KLSAgICAgIC8vCi0gICAgICBlbHNlIGlmIChib3VuZHMuaGVpZ2h0IC0gcG9pbnQueSA8IHNjcm9sbEVwc2lsb24pCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoaXMgdGhpbmcgaGFzIHZpc2libGUgY2hpbGRyZW4sIHRoZW4gdGhlIGZpcnN0IGNoaWxkIG11c3QgYmUgbmV4dC4KLSAgICAgICAgLy8KLSAgICAgICAgVHJlZUl0ZW0gW10gY2hpbGRyZW4gPSB0cmVlSXRlbS5nZXRJdGVtcygpOwotICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggIT0gMCAmJiB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc2Nyb2xsVHJlZUl0ZW0gPSBjaGlsZHJlblswXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZSBuZWVkIHRoZSBwYXJlbnQgdG8gZGV0ZXJtaW5lIHNpYmxpbmdzIGFuZCB3aWxsIHdhbGsgdXAgdGhlIHRyZWUgaWYgd2UgYXJlIHRoZSBsYXN0IHNpYmxpbmcuCi0gICAgICAgICAgLy8KLSAgICAgICAgICB3aGlsZSAoc2Nyb2xsVHJlZUl0ZW0gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UncmUgZG9uZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBUcmVlSXRlbSBwYXJlbnQgPSB0cmVlSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0gICAgICAgICAgICAvLyBXYWxrIHRoZSBjaGlsZHJlbi4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBjaGlsZHJlbiA9IHBhcmVudCA9PSBudWxsID8gdHJlZS5nZXRJdGVtcygpIDogcGFyZW50LmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBXaGVuIHdlIGZpbmQgdGhlIGNoaWxkLgotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gdHJlZUl0ZW0pCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBpbmRleCBpcyBhIHZhbGlkIGluZGV4Li4uCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBpZiAoKytpIDwgY2hpbGRyZW4ubGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGZvdW5kIHRoZSBpdGVtLgotICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcGFyZW50LgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2FsayB1cC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICB0cmVlSXRlbSA9IHBhcmVudDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbC4KLSAgICAgIC8vCi0gICAgICBpZiAoc2Nyb2xsVHJlZUl0ZW0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gT25seSBzY3JvbGwgaWYgd2UncmUgb24gYW4gaXRlbSBmb3IgYSB3aGlsZS4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKHByZXZpb3VzSXRlbSAhPSBudWxsICYmIGV2ZW50LnRpbWUgLSBob3ZlclN0YXJ0ID4gMjAwKQotICAgICAgICB7Ci0gICAgICAgICAgU2Nyb2xsQmFyIHZlcnRpY2FsU2Nyb2xsQmFyID0gdHJlZS5nZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICAgIGlmICh2ZXJ0aWNhbFNjcm9sbEJhciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBiZWZvcmUgPSB2ZXJ0aWNhbFNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBpdGVtIGlzIHNjcm9sbGVkIGluIHBsYWNlLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHRyZWUuc2hvd0l0ZW0oc2Nyb2xsVHJlZUl0ZW0pOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2Nyb2xsIGFnYWluIHF1aWNrbHkuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgcHJldmlvdXNJdGVtID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB3ZSd2ZSBkb25lIGEgc2Nyb2xsIGFuZCBub3RoaW5nIGVsc2Ugc2hvdWxkIGJlIGRvbmUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgcmVzdWx0ID0gYmVmb3JlICE9IHZlcnRpY2FsU2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiB0aGUgaXRlbSBjaGFuZ2VzLCByZXNldCB0aGUgdGltZXIgaW5mb3JtYXRpb24uCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAoZXZlbnQuaXRlbSAhPSBwcmV2aW91c0l0ZW0pCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJldmlvdXNJdGVtID0gZXZlbnQuaXRlbTsKLSAgICAgICAgICAgIGhvdmVyU3RhcnQgPSBldmVudC50aW1lOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKQotICAgIHsKLSAgICAgIC8vIFRhYmxlIGl0ZW1zIGhhdmUgc3BlY2lhbCBkYXRhIHRoYXQgd2lsbCBoZWxwLgotICAgICAgLy8KLSAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0KLSAgICAgIC8vIFdlIG5lZWQgbmVlZCB0aGUgcG9pbnQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjb250cm9sIGFuZCB0aGUgY29udHJvbCdzIGJvdW5kcy4KLSAgICAgIC8vCi0gICAgICBUYWJsZSB0YWJsZSA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgIFBvaW50IHBvaW50ID0gdGFibGUudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgaWYgKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSkKLSAgICAgIHsKLSAgICAgICAgaW50IG9mZnNldCA9IHRhYmxlLmdldEl0ZW1IZWlnaHQoKTsKLSAgICAgICAgYm91bmRzLnkgKz0gb2Zmc2V0OwotICAgICAgICBib3VuZHMuaGVpZ2h0IC09IG9mZnNldDsKLSAgICAgICAgcG9pbnQueSAtPSBvZmZzZXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGlzIGl0ZW0uCi0gICAgICAvLwotICAgICAgaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZih0YWJsZUl0ZW0pOwotCi0gICAgICAvLyBUaGlzIGlzIHRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wIG9yIGJvdHRvbSB0aGF0IHdpbGwgY2F1c2Ugc2Nyb2xsaW5nLgotICAgICAgLy8KLSAgICAgIGludCBzY3JvbGxFcHNpbG9uID0gTWF0aC5taW4odGFibGVJdGVtLmdldEJvdW5kcygwKS5oZWlnaHQsIGJvdW5kcy5oZWlnaHQgLyAzKTsKLQotICAgICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBpdGVtIHRoYXQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdGhlIHZpZXcuCi0gICAgICAvLwotICAgICAgVGFibGVJdGVtIHNjcm9sbFRhYmxlSXRlbSA9IG51bGw7Ci0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwgdXAuCi0gICAgICAvLwotICAgICAgaWYgKHBvaW50LnkgPCBzY3JvbGxFcHNpbG9uKQotICAgICAgewotICAgICAgICBpZiAoaW5kZXggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgc2Nyb2xsVGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbXMoKVtpbmRleCAtIDFdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsIGRvd24uLi4KLSAgICAgIC8vCi0gICAgICBlbHNlIGlmIChib3VuZHMuaGVpZ2h0IC0gcG9pbnQueSA8IHNjcm9sbEVwc2lsb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmRleCArIDEgPCB0YWJsZS5nZXRJdGVtcygpLmxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgIHNjcm9sbFRhYmxlSXRlbSA9ICB0YWJsZS5nZXRJdGVtcygpW2luZGV4ICsgMV07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbC4KLSAgICAgIC8vCi0gICAgICBpZiAoc2Nyb2xsVGFibGVJdGVtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIE9ubHkgc2Nyb2xsIGlmIHdlJ3JlIG9uIGFuIGl0ZW0gZm9yIGEgd2hpbGUuCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChwcmV2aW91c0l0ZW0gIT0gbnVsbCAmJiBldmVudC50aW1lIC0gaG92ZXJTdGFydCA+IDIwMCkKLSAgICAgICAgewotICAgICAgICAgIFNjcm9sbEJhciB2ZXJ0aWNhbFNjcm9sbEJhciA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci0gICAgICAgICAgaWYgKHZlcnRpY2FsU2Nyb2xsQmFyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGJlZm9yZSA9IHZlcnRpY2FsU2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGl0ZW0gaXMgc2Nyb2xsZWQgaW4gcGxhY2UuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgdGFibGUuc2hvd0l0ZW0oc2Nyb2xsVGFibGVJdGVtKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNjcm9sbCBhZ2FpbiBxdWlja2x5LgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHByZXZpb3VzSXRlbSA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UndmUgZG9uZSBhIHNjcm9sbCBhbmQgbm90aGluZyBlbHNlIHNob3VsZCBiZSBkb25lLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHJlc3VsdCA9IGJlZm9yZSAhPSB2ZXJ0aWNhbFNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gY2hhbmdlcywgcmVzZXQgdGhlIHRpbWVyIGluZm9ybWF0aW9uLgotICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKGV2ZW50Lml0ZW0gIT0gcHJldmlvdXNJdGVtKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXZpb3VzSXRlbSA9IGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICBob3ZlclN0YXJ0ID0gZXZlbnQudGltZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmbG9hdCBnZXRMb2NhdGlvbihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIAotICB7Ci0gICAgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkKLSAgICB7Ci0gICAgICBUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotICAgICAgQ29udHJvbCBjb250cm9sID0gdHJlZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAgICBQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0gICAgICByZXR1cm4gKGZsb2F0KShwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KWJvdW5kcy5oZWlnaHQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pCi0gICAgewotICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLSAgICAgIENvbnRyb2wgY29udHJvbCA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLSAgICAgIFBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotICAgICAgcmV0dXJuIChmbG9hdCkocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdClib3VuZHMuaGVpZ2h0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDAuMEY7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uCi0gIHsKLSAgICAvLyAgICBwcm90ZWN0ZWQgRWRpdGluZ0RvbWFpbiBkb21haW47Ci0gICAgcHJvdGVjdGVkIE9iamVjdCB0YXJnZXQ7Ci0gICAgcHJvdGVjdGVkIGZsb2F0IGxvY2F0aW9uOwotICAgIHByb3RlY3RlZCBpbnQgb3BlcmF0aW9uczsKLSAgICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbjsKLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzb3VyY2U7Ci0gICAgcHVibGljIERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uCi0gICAgICAoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZSkKLSAgICB7Ci0gICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICAgIHRoaXMuc291cmNlID0gbmV3IEFycmF5TGlzdChzb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZCgpCi0gICAgewotICAgICAgcmV0dXJuIGRyYWdBbmREcm9wTWFuYWdlci5jcmVhdGVDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSUxvYWRpbmdERE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSUxvYWRpbmdERE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMTBkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0lMb2FkaW5nREROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgCi0gKiBBbiBpbnRlcmZhY2UgdXNlZCBieSBuYXZpZ2F0b3IgY29udHJpYnV0aW9uIHRvIGRpc3BsYXkgdGV4dCBhbmQgaW1hZ2UKLSAqIHdoaWxlIGxvYWRpbmcgdGhlIG1vZGVsIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2FkaW5nREROb2RlIHsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldFRleHQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSW1hZ2UgZ2V0SW1hZ2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9OYXZpZ2FibGVUYWJsZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvTmF2aWdhYmxlVGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwM2QzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9OYXZpZ2FibGVUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotcHVibGljIGNsYXNzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIKLXsKLSAgIFRhYmxlTmF2aWdhdG9yIG5hdmlnYXRvcjsKLQotICAgcHVibGljIE5hdmlnYWJsZVRhYmxlVmlld2VyKFRhYmxlIHBhcmVudCkKLSAgIHsKLSAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICBuYXZpZ2F0b3IgPSBuZXcgVGFibGVOYXZpZ2F0b3IoZ2V0VGFibGUoKSwgdGhpcyk7Ci0gICB9Ci0KLSAgIC8vb3ZlcnJpZGUgc2V0Q2VsbEVkaXRvcnMgdG8gcHV0IGluIGNhbGwgdG8gbW92ZUFib3ZlQ2VsbEVkaXRvcnMgZm9yIFRhYmxlTmF2aWdhdG9yCi0gICBwdWJsaWMgdm9pZCBzZXRDZWxsRWRpdG9ycyhDZWxsRWRpdG9yW10gZWRpdG9ycykKLSAgIHsKLSAgICAgc3VwZXIuc2V0Q2VsbEVkaXRvcnMoZWRpdG9ycyk7Ci0gICAgIG5hdmlnYXRvci5tb3ZlQ2VsbEVkaXRvcnNBYm92ZShlZGl0b3JzKTsKLQotICAgfQotCi0gICAvL292ZXJyaWRlIHJlZnJlc2ggc28gdGhhdCBUYWJsZU5hdmlnYXRvciBpcyByZWZyZXNoZWQgZm9yIGFsbCBtb2RlbCBjaGFuZ2VzCi0gICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgIHsKLSAgIAlpZiggIXRoaXMuZ2V0VGFibGUoKS5pc0Rpc3Bvc2VkKCkgKQotICAgCXsKLSAgICAgIAlzdXBlci5yZWZyZXNoKCk7Ci0gICAgICAJbmF2aWdhdG9yLnJlZnJlc2goKTsKLSAgIAl9Ci0gICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1Jlc291cmNlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9SZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWEzZjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1Jlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgCi17Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBmRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElGaWxlW10gZkV4Y2x1ZGVkRmlsZXM7Ci0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIGZFeGNsdWRlczsKLQkKLSAgcHVibGljIFJlc291cmNlRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMsIENvbGxlY3Rpb24gZXhjbHVkZSkgCi0gIHsKLSAgICBmRXh0ZW5zaW9ucz0gZXh0ZW5zaW9uczsKLSAgICBmRXhjbHVkZXM9IGV4Y2x1ZGU7Ci0gICAgZkV4Y2x1ZGVkRmlsZXMgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMsIElGaWxlW10gZXhjbHVkZWRGaWxlcywgQ29sbGVjdGlvbiBleGNsdWRlKSAKLSAgewotICAgIGZFeHRlbnNpb25zPSBleHRlbnNpb25zOwotICAgIGZFeGNsdWRlcz0gZXhjbHVkZTsKLSAgICBmRXhjbHVkZWRGaWxlcyA9IGV4Y2x1ZGVkRmlsZXM7Ci0gIH0KLQkKLSAgcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSAKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCQotICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIAotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgewotICAgICAgaWYgKGZFeGNsdWRlcyAhPSBudWxsICYmIGZFeGNsdWRlcy5jb250YWlucyhlbGVtZW50KSkgCi0gICAgICB7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgU3RyaW5nIG5hbWU9ICgoSUZpbGUpZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgaWYgKGZFeGNsdWRlZEZpbGVzICE9IG51bGwpIAotICAgICAgewotICAgICAgICBmb3IgKGludCBqPSAwOyBqIDwgZkV4Y2x1ZGVkRmlsZXMubGVuZ3RoOyBqKyspIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAoKElGaWxlKWVsZW1lbnQpLmdldExvY2F0aW9uKCkuCi0gICAgICAgICAgICAgICB0b09TU3RyaW5nKCkuY29tcGFyZVRvKChmRXhjbHVkZWRGaWxlc1tqXSkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpID09IDAgKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAoZkV4dGVuc2lvbnMubGVuZ3RoID09IDApIAotICAgICAgewotICAgICAgICAvLyBhc3N1bWUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGZpbHRlciBhbnkgZmlsZXMgYmFzZWQgb24gCi0gICAgICAgIC8vIGV4dGVuc2lvbgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgCi0gICAgICB7Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKGZFeHRlbnNpb25zW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIAotICAgIHsgLy8gSVByb2plY3QsIElGb2xkZXIKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgIAlJUmVzb3VyY2VbXSByZXNvdXJjZXM9ICgoSUNvbnRhaW5lcillbGVtZW50KS5tZW1iZXJzKCk7Ci0JZm9yIChpbnQgaT0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgCi0gICAgICAgIHsKLQkgIC8vIHJlY3Vyc2l2ZSEKLQkgIGlmIChzZWxlY3Qodmlld2VyLCBwYXJlbnQsIHJlc291cmNlc1tpXSkpIAotICAgICAgICAgIHsKLQkgICAgcmV0dXJuIHRydWU7Ci0JICB9Ci0JfQotICAgICAgfSAKLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIAotICAgICAgewotICAgICAgfQkJCQkKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RNdWx0aUZpbGVQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RNdWx0aUZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTkwODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0TXVsdGlGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotCi0vLyBQYWdlIHRvIHNwZWNpZnkgdGhlIHNvdXJjZSBmaWxlcwotcHVibGljIGNsYXNzIFNlbGVjdE11bHRpRmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0gIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLSAgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnk7Ci0gIFRyZWVWaWV3ZXIgc291cmNlRmlsZVZpZXdlcjsKLSAgQnV0dG9uIGFkZEJ1dHRvbjsKLSAgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLSAgQnV0dG9uIHJlbW92ZUFsbEJ1dHRvbjsKLSAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBzZWxlY3RlZExpc3RCb3g7Ci0gIEJ1dHRvbiBpbXBvcnRCdXR0b247Ci0gIHByaXZhdGUgVmVjdG9yIGZGaWx0ZXJzOwotICBwcm90ZWN0ZWQgSUZpbGVbXSBmaWxlTmFtZXM7Ci0gIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3Q7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNJWklOR19MSVNUU19IRUlHSFQgPSAyMDA7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfTElTVFNfV0lEVEggPSAxNTA7Ci0KLSAgLy8gcGFyYW1ldGVyIGlzRmlsZU1hbmRhdG9yeSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhdCBsZWFzdCBvbmUgZmlsZSBtdXN0IGJlIHNlbGVjdGVkICAKLSAgLy8gYmVmb3JlIGJlaW5nIGFibGUgdG8gcHJvY2VlZCB0byB0aGUgbmV4dCBwYWdlCi0gIHB1YmxpYyBTZWxlY3RNdWx0aUZpbGVQYWdlKAotICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2gsCi0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sCi0gICAgICBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkgewotICAgIHN1cGVyKCJTZWxlY3RNdWx0aUZpbGVQYWdlIik7Ci0gICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgdGhpcy5pc0ZpbGVNYW5kYXRvcnkgPSBpc0ZpbGVNYW5kYXRvcnk7Ci0gICAgdGhpcy53b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICB0aGlzLmZpbGVOYW1lcyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAKLSAgICBDb21wb3NpdGUgcGFnZUNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgcGFnZUNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgcGFnZUNvbnRlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAvLyB2YXJpYWJsZSBuZXZlciB1c2VkIC4uLiBpcyBwYWdlQ29udGVudC5nZXRMYXlvdXREYXRhKCkgbmVlZGVkPwotICAgIC8vR3JpZERhdGEgb3V0ZXJGcmFtZUdyaWREYXRhID0gKEdyaWREYXRhKSAKLSAgICBwYWdlQ29udGVudC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgCi0gICAgLy8JCW91dGVyRnJhbWVHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotICAgIC8vCQlvdXRlckZyYW1lR3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMOwotCi0gICAgLy8gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKAotICAgIC8vICAgICAgICBwYWdlQ29udGVudCwKLSAgICAvLyAgICAgICAgQjJCR1VJQ29udGV4dElkcy5CVEJHX1NFTEVDVF9NVUxUSV9GSUxFX1BBR0UpOwotCi0gICAgY3JlYXRlTGFiZWxzKHBhZ2VDb250ZW50KTsKLSAgICBjcmVhdGVTb3VyY2VWaWV3ZXIocGFnZUNvbnRlbnQpOwotICAgIGNyZWF0ZUJ1dHRvblBhbmVsKHBhZ2VDb250ZW50KTsKLSAgICBjcmVhdGVTZWxlY3RlZExpc3RCb3gocGFnZUNvbnRlbnQpOwotICAgIGNyZWF0ZUltcG9ydEJ1dHRvbihwYWdlQ29udGVudCk7Ci0KLSAgICBzZXRDb250cm9sKHBhZ2VDb250ZW50KTsKLSAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KQotICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQotICB9Ci0KLSAgcHVibGljIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0gICAgcmV0dXJuIGZpbGVOYW1lczsKLSAgfQotCi0gIC8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBnaXZlbiBmaWxlCi0gIC8vIGV4ZW5zaW9ucy4gSXQgaW50ZXJuYWxseSBjcmVhdGVzIGEgUmVzb3VyY2VGaWx0ZXIgc28gdGhhdCB1c2VycyBvZiB0aGlzCi0gIC8vIGNsYXNzIGRvbid0IGhhdmUgdG8gY29uc3RydWN0IG9uZS4KLSAgLy8gSWYgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgZG9uJ3QgaGF2ZSAnLicsIG9uZSB3aWxsIGJlIGFkZGVkLgotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpIHsKLSAgICAvLyBGaXJzdCBhZGQgdGhlICcuJyB0byB0aGUgZmlsdGVyRXh0ZW5zaW9ucyBpZiB0aGV5IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLSAgICBTdHJpbmdbXSBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zID0KLSAgICAgIG5ldyBTdHJpbmdbZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgLy8gSWYgdGhlIGV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggYSAnLicsIHRoZW4gYWRkIG9uZS4KLSAgICAgIGlmIChmaWx0ZXJFeHRlbnNpb25zW2ldLnN0YXJ0c1dpdGgoIi4iKSkKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9IGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICBlbHNlCi0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSAiLiIgKyBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgIH0KLQotICAgIFZpZXdlckZpbHRlciBmaWx0ZXIgPQotICAgICAgbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgIGFkZEZpbHRlcihmaWx0ZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFNvdXJjZUZpbGVWaWV3ZXJTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgaWYgKHZpc2libGUgPT0gdHJ1ZSkgewotICAgICAgaWYgKGZGaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5yZXNldEZpbHRlcnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZkZpbHRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuYWRkRmlsdGVyKChWaWV3ZXJGaWx0ZXIpIGkubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgfQotICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWxlcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLSAgICBpbnQgc2l6ZSA9IEFycmF5cy5hc0xpc3QoZmlsZU5hbWVzKS5zaXplKCk7Ci0gICAgVmVjdG9yIGlGaWxlTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihmaWxlTmFtZXNbaV0pOwotICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgIGlGaWxlTmFtZXMuYWRkRWxlbWVudChyZXNvdXJjZSk7Ci0gICAgfQotICAgIElGaWxlW10gZHVtbXlBcnJheSA9IG5ldyBJRmlsZVtpRmlsZU5hbWVzLnNpemUoKV07Ci0gICAgdGhpcy5maWxlTmFtZXMgPSAoSUZpbGVbXSkgKGlGaWxlTmFtZXMudG9BcnJheShkdW1teUFycmF5KSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXNldEZpbHRlcnMoKSB7Ci0gICAgZkZpbHRlcnMgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpIHsKLSAgICBpZiAoZkZpbHRlcnMgPT0gbnVsbCkKLSAgICAgIGZGaWx0ZXJzID0gbmV3IFZlY3RvcigpOwotICAgIGZGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWRkQnV0dG9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVCdXR0b25FbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKSB7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVMYWJlbHMoQ29tcG9zaXRlIHBhZ2VDb250ZW50KSB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFnZUNvbnRlbnQsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9TT1VSQ0VfRklMRVMpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGxhYmVsID0gbmV3IExhYmVsKHBhZ2VDb250ZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNURURfRklMRVMpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2hlY2tJZkZpbGVJblRhcmdldChJRmlsZSBmaWxlVG9DaGVjaykgewotICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBzZWxlY3RlZExpc3RCb3guZ2V0SXRlbXMoKTsKLSAgICBpbnQgc2l6ZSA9IHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtQ291bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKHN0cmluZ3NbaV0uY29tcGFyZVRvKGZpbGVUb0NoZWNrLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkKLSAgICAgICAgICA9PSAwKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNvdXJjZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgc291cmNlRmlsZVZpZXdlciA9Ci0gICAgICBuZXcgVHJlZVZpZXdlcigKLSAgICAgICAgICBuZXcgVHJlZSgKLSAgICAgICAgICAgICAgcGFyZW50LAotICAgICAgICAgICAgICBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlcgotICAgIC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0OwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBib29sZWFuIG5ld0ZpbGVzU2VsZWN0ZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICBpZiAoY2hlY2tJZkZpbGVJblRhcmdldCgoSUZpbGUpIHJlc291cmNlKSA9PSBmYWxzZSkKLSAgICAgICAgICAgICAgICBuZXdGaWxlc1NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgc2V0QWRkQnV0dG9uRW5hYmxlZChuZXdGaWxlc1NlbGVjdGVkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGFkZFNlbGVjdGVkRmlsZXNUb1RhcmdldExpc3QoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIENvbnRyb2wgdHJlZVdpZGdldCA9IHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gU0laSU5HX0xJU1RTX1dJRFRIOwotICAgIGdkLmhlaWdodEhpbnQgPSBTSVpJTkdfTElTVFNfSEVJR0hUOwotICAgIHRyZWVXaWRnZXQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uUGFuZWwoQ29tcG9zaXRlIHBhZ2VDb250ZW50KSB7Ci0gICAgQ29tcG9zaXRlIGJ1dHRvblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYWdlQ29udGVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgYnV0dG9uUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgCi0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgYnV0dG9uUGFuZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvblBhbmVsLCBTV1QuUFVTSCk7Ci0gICAgYWRkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0FERF9CVVRUT04pOwotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQnV0dG9uU2VsZWN0TGlzdGVuZXIoKSk7Ci0gICAgYWRkQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9BRERfQlVUVE9OX1RPT0xfVElQKTsKLSAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvblBhbmVsLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX1JFTU9WRV9CVVRUT04pOwotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQnV0dG9uU2VsZWN0TGlzdGVuZXIoKSk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9SRU1PVkVfQlVUVE9OX1RPT0xfVElQKTsKLSAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICByZW1vdmVBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvblBhbmVsLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlQWxsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX1JFTU9WRV9BTExfQlVUVE9OKTsKLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICByZW1vdmVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJ1dHRvblNlbGVjdExpc3RlbmVyKCkpOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfUkVNT1ZFX0FMTF9CVVRUT05fVE9PTF9USVApOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVTZWxlY3RlZExpc3RCb3goQ29tcG9zaXRlIHBhcmVudCkgewotICAgIHNlbGVjdGVkTGlzdEJveCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgc2VsZWN0ZWRMaXN0Qm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAKLSAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEJveC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkKLSAgICAgICAgICBzZXRSZW1vdmVCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gU0laSU5HX0xJU1RTX1dJRFRIOwotICAgIGdkLmhlaWdodEhpbnQgPSBTSVpJTkdfTElTVFNfSEVJR0hUOwotICAgIHNlbGVjdGVkTGlzdEJveC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgfQotCi0gIHZvaWQgY3JlYXRlSW1wb3J0QnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBpbXBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgIGltcG9ydEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9JTVBPUlRfQlVUVE9OKTsKLSAgICAKLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgaW1wb3J0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIGltcG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQgaW1wb3J0V2l6YXJkID0KLSAgICAgICAgICBuZXcgRmlsZVN5c3RlbUltcG9ydFdpemFyZCgpOwotICAgICAgICBpbXBvcnRXaXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9Ci0gICAgICAgICAgbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgaW1wb3J0V2l6YXJkKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICB3aXphcmREaWFsb2cub3BlbigpOwotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBpbXBvcnRCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRGaWxlc1RvVGFyZ2V0TGlzdCgpIHsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNvdXJjZUZpbGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICBpZiAoaXNWYWxpZFNvdXJjZUZpbGVWaWV3ZXJTZWxlY3Rpb24oc2VsZWN0aW9uKSkgewotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdCA9IG51bGw7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7Ci0KLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgIGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0cyBpbiB0aGUgbGlzdC4gRG9uJ3QgYWRkIGl0IGlmIGl0IGlzLgotICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0KLSAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guaW5kZXhPZihyZXNvdXJjZU5hbWUpID09IC0xKQotICAgICAgICAgICAgICAgIHNlbGVjdGVkTGlzdEJveC5hZGQocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgc2V0RmlsZXMoc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1zKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0QWRkQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtQ291bnQoKSA+IDApIHsKLSAgICAgICAgICByZW1vdmVBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KQotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApCi0gICAgICAgICAgICBzZXRSZW1vdmVCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNldFJlbW92ZUJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgQnV0dG9uU2VsZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKSB7Ci0gICAgICAgIGFkZFNlbGVjdGVkRmlsZXNUb1RhcmdldExpc3QoKTsKLSAgICAgIH0gZWxzZSBpZiAoZS53aWRnZXQgPT0gcmVtb3ZlQnV0dG9uKSB7Ci0gICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBzZWxlY3RlZExpc3RCb3guZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGludCBzaXplID0gc2VsZWN0ZWRMaXN0Qm94LmdldFNlbGVjdGlvbkNvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgc2VsZWN0ZWRMaXN0Qm94LnJlbW92ZShzdHJpbmdzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotICAgICAgICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KQotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBzZXRGaWxlcyhzZWxlY3RlZExpc3RCb3guZ2V0SXRlbXMoKSk7Ci0gICAgICB9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbW92ZUFsbEJ1dHRvbikgewotICAgICAgICBzZWxlY3RlZExpc3RCb3gucmVtb3ZlQWxsKCk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgcmVtb3ZlQWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KQotICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIHNldEZpbGVzKHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtcygpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFmMjk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RTaW5nbGVGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLXsKLSAgcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotICBwcm90ZWN0ZWQgU2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0gIAotICAvLyBwYXJhbWV0ZXIgaXNGaWxlTWFuZGF0b3J5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgZmlsZSBtdXN0IGJlIHNlbGVjdGVkICAKLSAgLy8gYmVmb3JlIGJlaW5nIGFibGUgdG8gcHJvY2VlZCB0byB0aGUgbmV4dCBwYWdlCi0gIHB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkKLSAgewotICAgIHN1cGVyKCJTZWxlY3RTaW5nbGVGaWxlUGFnZSIpOwotICAgIHRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOyAgICAgICAgICAgCi0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZVZpZXcoc2VsZWN0aW9uLCBpc0ZpbGVNYW5kYXRvcnkpOyAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICB7Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0VmlzaWJsZUhlbHBlcih2aXNpYmxlKTsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lcigpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSkKLSAgICAgIHsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGlzQ29tcGxldGUpOwotICAgICAgfQotICAgIH07Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgIENvbnRyb2wgY29udHJvbCA9IHNlbGVjdFNpbmdsZUZpbGVWaWV3LmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChjb250cm9sLCBCMkJHVUlDb250ZXh0SWRzLkJUQkdfU0VMRUNUX1NJTkdMRV9GSUxFX1BBR0UpOwotICAgIHNldENvbnRyb2woY29udHJvbCk7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKSAKLSAgeyAKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXIoZmlsdGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykKLSAgeyAKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotICB9ICAgICAKLQotICBwdWJsaWMgdm9pZCByZXNldEZpbHRlcnMoKQotICB7ICAgIAotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LnJlc2V0RmlsdGVycygpOwotICB9Ci0gIAotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsgIAotICAgIHJldHVybiBzZWxlY3RTaW5nbGVGaWxlVmlldy5nZXRGaWxlKCk7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2VsZWN0U2luZ2xlRmlsZVZpZXcuCi0gICAqIEByZXR1cm4gU2VsZWN0U2luZ2xlRmlsZVZpZXcKLSAgICovCi0gIHB1YmxpYyBUcmVlVmlld2VyIGdldFNvdXJjZUZpbGVWaWV3ZXIoKSB7Ci0gICAgcmV0dXJuIHNlbGVjdFNpbmdsZUZpbGVWaWV3LnNvdXJjZUZpbGVWaWV3ZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2VsZWN0U2luZ2xlRmlsZVZpZXcuCi0gICAqIEByZXR1cm4gU2VsZWN0U2luZ2xlRmlsZVZpZXcKLSAgICovCi0gIHB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlVmlldyBnZXRTZWxlY3RTaW5nbGVGaWxlVmlldygpIHsKLSAgICByZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUzM2M3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLQotICAgIAotCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZVZpZXcKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ29tcG9zaXRlICAgICAgICAgICAgY29tcG9zaXRlOwotICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiAgICAgICAgICAgICAgaXNGaWxlTWFuZGF0b3J5OwotICBwcm90ZWN0ZWQgVHJlZVZpZXdlciAgICAgICAgICAgc291cmNlRmlsZVZpZXdlcjsKLSAgcHJvdGVjdGVkIEJ1dHRvbiAgICAgICAgICAgICAgIGltcG9ydEJ1dHRvbjsKLSAgcHJvdGVjdGVkIFZlY3RvciAgICAgICAgICAgICAgIGZGaWx0ZXJzOwotICBwcm90ZWN0ZWQgSUZpbGUgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlOwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiAgICAgICAgICAgZGVmYXVsdFNlbGVjdGlvbjsgIAotICBwcm90ZWN0ZWQgTGlzdGVuZXIgICAgICAgICAgICAgbGlzdGVuZXI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSk7IAotICB9Ci0KLSAgcHVibGljIFNlbGVjdFNpbmdsZUZpbGVWaWV3KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgdGhpcy5pc0ZpbGVNYW5kYXRvcnkgPSBpc0ZpbGVNYW5kYXRvcnk7Ci0gICAgdGhpcy5zZWxlY3RlZEZpbGU9IG51bGw7Ci0gICAgdGhpcy5kZWZhdWx0U2VsZWN0aW9uID0gbnVsbDsgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgICAgICAgICAgICAKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgIENvbXBvc2l0ZSBzbWFsbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgc21hbGxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMLCB0cnVlLCBmYWxzZSkpOwotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgc21hbGxDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIAotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNtYWxsQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU09VUkNFX0ZJTEVTKTsJCi0JbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcsIEdyaWREYXRhLkVORCwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAvL0NvbGxhcHNlIGFuZCBFeHBhbmQgYWxsIGJ1dHRvbnMKLSAgICBUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhcihzbWFsbENvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIHRvb2xCYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5FTkQsIHRydWUsIGZhbHNlKSk7Ci0gICAgCi0gICAgVG9vbEl0ZW0gdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULk5PTkUpOwotICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9leHBhbmRBbGwuZ2lmIik7Ci0gICAgSW1hZ2UgaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICB0b29sSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0gICAgdG9vbEl0ZW0uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1BPUFVQX0VYUEFORF9BTEwpOwotICAgIHRvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotICAgIAkKLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJc291cmNlRmlsZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCi0JfX0pOwotICAgIAotICAgIAotICAgIHRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5OT05FKTsKLSAgICBpbWFnZURlc2NyaXB0b3IgPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9jb2xsYXBzZUFsbC5naWYiKTsKLSAgICBpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgIHRvb2xJdGVtLnNldEltYWdlKGltYWdlKTsKLSAgICB0b29sSXRlbS5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfUE9QVVBfQ09MTEFQU0VfQUxMKTsKLSAgICB0b29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlzb3VyY2VGaWxlVmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCQotCX19KTsKLQotICAgIGNyZWF0ZVNvdXJjZVZpZXdlcihjb21wb3NpdGUpOwotICAgIGNyZWF0ZUZpbHRlckNvbnRyb2woY29tcG9zaXRlKTsgICAKLSAgICBjcmVhdGVJbXBvcnRCdXR0b24oY29tcG9zaXRlKTsgIAotICAgIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvY3VzKCk7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSAKLSAgewkKLSAgfSAKLQotcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc291cmNlRmlsZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKG5ldyBUcmVlKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIAotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSAKLSAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgamF2YS51dGlsLkxpc3QgbGlzdDsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGVkRmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0gICAgICAgICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkpIAotICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsgICAgIAotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGVkRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkpIAotICAgICAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaXNDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICAgIGxpc3RlbmVyLnNldENvbnRyb2xDb21wbGV0ZShpc0NvbXBsZXRlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0JCi0gICAgfSk7Ci0gICAgQ29udHJvbCB0cmVlV2lkZ2V0ID0gc291cmNlRmlsZVZpZXdlci5nZXRUcmVlKCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICB0cmVlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotICB9Ci0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbXBvcnRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAgIAotICAgIGltcG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgaW1wb3J0QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0lNUE9SVF9CVVRUT04pOwotICAgIAotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7ICAgIAotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgaW1wb3J0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIGltcG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgeyAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgbGlzdGVuZXIgaXMgaWYgdGhlIEltcG9ydCBXaXphcmQgYWRkcyBhIG5ldyBmZXcsIHdlIHdhbnQKLSAgICAgICAgLy8gaXQgdG8gYmUgc2VsZWN0ZWQgd2hlbiB3ZSBjb21lIGJhY2sgZnJvbSBpdAotICAgICAgICBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyIGltcG9ydEFkZFJlc291cmNlTGlzdGVuZXI9IG5ldyBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihpbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKTsKLSAgICAgICAgICAKLSAgICAgICAgRmlsZVN5c3RlbUltcG9ydFdpemFyZCBpbXBvcnRXaXphcmQgPSBuZXcgRmlsZVN5c3RlbUltcG9ydFdpemFyZCgpOwotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzb3VyY2VGaWxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpbXBvcnRXaXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbiAhPSBudWxsID8gc2VsZWN0aW9uIDogbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIGltcG9ydFdpemFyZCk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIpOwotICAgICAgICBJRmlsZSBpbXBvcnRlZEZpbGUgPSBpbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyLmdldEltcG9ydGVkRmlsZSgpOwotICAgICAgICBpZiAoaW1wb3J0ZWRGaWxlICE9IG51bGwpIAotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGltcG9ydGVkRmlsZSk7Ci0gICAgICAgICAgc291cmNlRmlsZVZpZXdlci5zZXRTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsgICAgICAgICAgICAgICAgICAKLSAgICBpbXBvcnRCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVApOwotICB9IAotCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLSAgewotICAgIHJldHVybiBzZWxlY3RlZEZpbGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZhdWx0U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHJlc2V0RmlsdGVycygpCi0gIHsKLSAgICBmRmlsdGVycz1udWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpIAotICB7Ci0gICAgaWYgKGZGaWx0ZXJzID09IG51bGwpCi0gICAgewotICAgICAgZkZpbHRlcnM9IG5ldyBWZWN0b3IoKTsKLSAgICB9Ci0gICAgZkZpbHRlcnMuYWRkKGZpbHRlcik7Ci0gIH0KLQotICAvLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ2l2ZW4gZmlsZQotICAvLyBleGVuc2lvbnMuIEl0IGludGVybmFsbHkgY3JlYXRlcyBhIFJlc291cmNlRmlsdGVyIHNvIHRoYXQgdXNlcnMgb2YgdGhpcwotICAvLyBjbGFzcyBkb24ndCBoYXZlIHRvIGNvbnN0cnVjdCBvbmUuCi0gIC8vIElmIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGRvbid0IGhhdmUgJy4nLCBvbmUgd2lsbCBiZSBhZGRlZC4KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKQotICB7Ci0gICAgLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0gICAgU3RyaW5nW10gY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGk9MDsgaSA8IGZpbHRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIAotICAgIHsKLSAgICAgIC8vIElmIHRoZSBleHRlbnNpb24gZG9lc24ndCBzdGFydCB3aXRoIGEgJy4nLCB0aGVuIGFkZCBvbmUuCi0gICAgICBpZiAoZmlsdGVyRXh0ZW5zaW9uc1tpXS5zdGFydHNXaXRoKCIuIikpCi0gICAgICB7Ci0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gIi4iICsgZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgIGFkZEZpbHRlcihmaWx0ZXIpOwotICB9ICAgICAgICAgICAgICAgICAgICAgCi0KLS8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBnaXZlbiBmaWxlCi0vLyBleGVuc2lvbnMuIEl0IGludGVybmFsbHkgY3JlYXRlcyBhIFJlc291cmNlRmlsdGVyIHNvIHRoYXQgdXNlcnMgb2YgdGhpcwotLy8gY2xhc3MgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1Y3Qgb25lLgotLy8gSWYgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgZG9uJ3QgaGF2ZSAnLicsIG9uZSB3aWxsIGJlIGFkZGVkLgotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMsIElGaWxlIFtdIGV4Y2x1ZGVkRmlsZXMpCi0gIHsKLSAgICAvLyBGaXJzdCBhZGQgdGhlICcuJyB0byB0aGUgZmlsdGVyRXh0ZW5zaW9ucyBpZiB0aGV5IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLSAgICBTdHJpbmdbXSBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zID0gbmV3IFN0cmluZ1tmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpIDwgZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgZXh0ZW5zaW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhICcuJywgdGhlbiBhZGQgb25lLgotICAgICAgaWYgKGZpbHRlckV4dGVuc2lvbnNbaV0uc3RhcnRzV2l0aCgiLiIpKQotICAgICAgewotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9ICIuIiArIGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICB9Ci0gICAgfQotICAgIFZpZXdlckZpbHRlciBmaWx0ZXI7Ci0gICAgaWYgKGV4Y2x1ZGVkRmlsZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIoY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucywgZXhjbHVkZWRGaWxlcywgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIoY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucywgbnVsbCk7Ci0gICAgfQotICAgIGFkZEZpbHRlcihmaWx0ZXIpOwotICB9Ci0gIAotICAvLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ2l2ZW4gZmlsZQotICAvLyBleGVuc2lvbnMuIEl0IGludGVybmFsbHkgY3JlYXRlcyBhIFJlc291cmNlRmlsdGVyIHNvIHRoYXQgdXNlcnMgb2YgdGhpcwotICAvLyBjbGFzcyBkb24ndCBoYXZlIHRvIGNvbnN0cnVjdCBvbmUuCi0gIC8vIElmIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGRvbid0IGhhdmUgJy4nLCBvbmUgd2lsbCBiZSBhZGRlZC4KLSAgcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKQotICB7Ci0JLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0JU3RyaW5nW10gY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGhdOwotCWZvciAoaW50IGk9MDsgaSA8IGZpbHRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIAotCXsJCQotCSAgLy8gSWYgdGhlIGV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggYSAnLicsIHRoZW4gYWRkIG9uZS4KLQkgIGlmIChmaWx0ZXJFeHRlbnNpb25zW2ldLnN0YXJ0c1dpdGgoIi4iKSkKLQkgIHsKLQkJY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9IGZpbHRlckV4dGVuc2lvbnNbaV07Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCWNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSAiLiIgKyBmaWx0ZXJFeHRlbnNpb25zW2ldOwotCSAgfQotCX0KLQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgIGZGaWx0ZXJzPSBuZXcgVmVjdG9yKCk7Ci0JZkZpbHRlcnMuYWRkKGZpbHRlcik7Ci0JaWYgKHNvdXJjZUZpbGVWaWV3ZXIgIT0gbnVsbCkKLQl7CQotCSAgc291cmNlRmlsZVZpZXdlci5nZXRUcmVlKCkuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgIHNvdXJjZUZpbGVWaWV3ZXIucmVzZXRGaWx0ZXJzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGk9ZkZpbHRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgeyAgICAgCi0JICAgIHNvdXJjZUZpbGVWaWV3ZXIuYWRkRmlsdGVyKChWaWV3ZXJGaWx0ZXIpaS5uZXh0KCkpOwotIAkgIH0KLQkgIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpLnNldFJlZHJhdyh0cnVlKTsKLQkgIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpLnJlZHJhdygpOwotCX0JCi0gIH0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8vIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgYSBXaXphcmQgcGFnZSBvciBEaWFsb2cgd2hlbiBpdCBiZWNvbWVzIHZpc2libGUKLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIHZpc2libGUpCi0gIHsgICAgCi0gICAgaWYgKHZpc2libGUgPT0gdHJ1ZSkgCi0gICAgewotICAgICAgaWYgKGZGaWx0ZXJzICE9IG51bGwpIAotICAgICAgewotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnJlc2V0RmlsdGVycygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGk9ZkZpbHRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSAKLSAgICAgICAJICBzb3VyY2VGaWxlVmlld2VyLmFkZEZpbHRlcigoVmlld2VyRmlsdGVyKWkubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgICBzb3VyY2VGaWxlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMSk7Ci0KLSAgICAgIGlmIChkZWZhdWx0U2VsZWN0aW9uICE9IG51bGwpIAotICAgICAgewotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnNldFNlbGVjdGlvbihkZWZhdWx0U2VsZWN0aW9uLCB0cnVlKTsgICAgICAgIAotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAoIXNvdXJjZUZpbGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotICAgICAgeyAgICAgCi0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNvdXJjZUZpbGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkgJiYgbGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgbGlzdGVuZXIuc2V0Q29udHJvbENvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0gIAotICBjbGFzcyBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvcgotICB7Ci0JVmVjdG9yIGltcG9ydGVkRmlsZXM7Ci0KLQlJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKCkKLQl7Ci0JICBpbXBvcnRlZEZpbGVzID0gbmV3IFZlY3RvcigpOyAKLQl9Ci0gIAotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkKLQl7Ci0JICBJUmVzb3VyY2VEZWx0YSByZXNvdXJjZURlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAKLQkgIHRyeQotCSAgewotCQlpZiAocmVzb3VyY2VEZWx0YSAhPSBudWxsKSAKLQkJewotCQkgIHJlc291cmNlRGVsdGEuYWNjZXB0KHRoaXMpOwotCQl9Ci0JICB9Ci0JICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7Ci0JCS8vVE9ETy4uLiBsb2cgZXhjZXB0aW9uCi0JCS8vVUlQbHVnaW4uZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIkV4Y2VwdGlvbiBjYXVnaHQgZHVyaW5nIHJlc291cmNlIGNoYW5nZSIgKyBlKTsKLQkJLy9VSVBsdWdpbi5nZXRNc2dMb2dnZXIoKS53cml0ZUN1cnJlbnRUaHJlYWQoKTsgCi0JICB9ICAgICAgCi0JfQotCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpCi0JewotCSAgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkKLQkgIHsKLQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkgCi0JCSAgaW1wb3J0ZWRGaWxlcy5hZGQoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JICB9Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRJbXBvcnRlZEZpbGVzKCkKLQl7Ci0JICByZXR1cm4gaW1wb3J0ZWRGaWxlczsKLQl9Ci0gICAgCi0JLy8gVGhpcyByZXR1cm5zIHRoZSBmaXJzdCBpbXBvcnRlZCBmaWxlIGluIHRoZSBsaXN0IG9mIGltcG9ydGVkIGZpbGVzCi0JcHVibGljIElGaWxlIGdldEltcG9ydGVkRmlsZSgpCi0JewotCSAgaWYgKGltcG9ydGVkRmlsZXMuaXNFbXB0eSgpID09IGZhbHNlKSAKLQkJcmV0dXJuIChJRmlsZSlpbXBvcnRlZEZpbGVzLmZpcnN0RWxlbWVudCgpOwotICAKLQkgIHJldHVybiBudWxsOwotCX0KLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkVHJlZUxpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgdHJlZUxpc3RlbmVyKSB7Ci0gIAlzb3VyY2VGaWxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlTGlzdGVuZXIpOwotICB9Ci19ICAgICAgICAgICAgICAKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFibGVOYXZpZ2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmxlTmF2aWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDM3YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFibGVOYXZpZ2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotCi0KLSAgLyoqCi0gICAqIEFkZHMgYSBUYWJsZUN1cnNvciB0byBhIFN0cnVjdHVyZWRWaWV3ZXIgLSBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbiBvZiB0aGUgdGFibGUKLSAgICogVGhlIGludGVudCBvZiB0aGlzIGNsYXNzIGlzIHRvIHByb3ZpZGUgdGhlIHN0YW5kYXJkIGxpc3RlbmVycyBmb3IgdXNpbmcgRjIgdG8KLSAgICogYWN0aXZhdGUgY2VsbCBlZGl0b3JzLgotICAgKgotICAgKiBEdWUgdG8gYSBjdXJyZW50IGJ1ZyBpbiB0aGUgVGFibGVDdXJzb3IsIFRhYmxlVmlld2VycyB1c2luZyB0aGlzIGNsYXNzIG11c3QgbWFrZQotICAgKiBhIGNhbGwgc2ltaWxhciB0byB0aGUgVGFibGVOYXZpZ2F0b3IgbWV0aG9kIG1vdmVDZWxsRWRpdG9yc0Fib3ZlKGNlbGxFZGl0b3JzKQotICAgKiB3aGVuZXZlciBhIHNldENlbGxFZGl0b3JzIGNhbGwgaXMgbWFkZSBpbiB0aGUgU3RydWN0dXJlZFZpZXdlci4gIFRoaXMgaXMgc28gdGhhdCB0aGUKLSAgICogY2VsbCBlZGl0b3IgY29udHJvbCBzaG93cyB1cCBhYm92ZSB0aGUgdGFibGUgY3Vyc29yIGNvbnRyb2wuCi0gICAqLwotCi1wdWJsaWMgY2xhc3MgVGFibGVOYXZpZ2F0b3IgZXh0ZW5kcyBUYWJsZUN1cnNvcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVUUkVFSVRFTV9JRCA9ICJUYWJsZVRyZWVJdGVtSUQiOwotCi0gICBmaW5hbCBUYWJsZSB0YWJsZTsKLQotICAgcHVibGljIFRhYmxlTmF2aWdhdG9yKFRhYmxlIHRhYmxlLCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgIHsKLSAgICAgIHN1cGVyKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICB0aGlzLnRhYmxlID0gdGFibGU7Ci0gICAgICBmaW5hbCBUYWJsZSBjdXJyZW50VGFibGUgPSB0YWJsZTsKLSAgICAgIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgc1ZpZXdlciA9IHZpZXdlcjsKLQotICAgICAgLy8gTGludXggaW5kZXggb3V0IG9mIGJvdW5kcyBmaXguICBTZWUgZGVmZWN0IDI1MzQyOSwgMjUzNDMzLCBhbmQgbW9yZQotICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0KLSAgICAgIGFkZFBhaW50TGlzdGVuZXIodmlld2VyKTsKLSAgICAgIGFkZEtleUxpc3RlbmVycyh2aWV3ZXIpOwotICAgICAgYWRkTW91c2VMaXN0ZW5lcnModmlld2VyKTsKLSAgICAgIGFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgIAkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCSAgICAgaWYgKHNWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlnZXRSb3coKS5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwotICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGFibGVUcmVlSXRlbS5nZXREYXRhKCkpOwotICAgICAgICAgICAgICAgICAgIHNWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgIH0KLQkJfQotCi0KLSAgICAgIH0pOwotICAgICAgYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCl7Ci0gICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgICAgICB7Ci0gICAgICAgICAJLy8gaWYgZS5zb3VyY2UgaXMgbm90IGEgY2hpbGQgb2YgdGhlIHRhYmxlIHRoZW4gc2V0IHNlbGVjdGlvbiAtIHRoaXMgaXMgZm9yIHRhYiBpbnRvIHZpZXdlcgotICAgICAgICAgCU9iamVjdCBldmVudFNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAJaWYgKGV2ZW50U291cmNlIGluc3RhbmNlb2YgQ29udHJvbCkKLSAgICAgICAgIAl7Ci0gICAgICAgICAJaWYgKCFpc0NoaWxkKGN1cnJlbnRUYWJsZSwgKENvbnRyb2wpZXZlbnRTb3VyY2UpKQotICAgICAgICAgCXsKLSAgICAgICAgIAkgIGlmIChjdXJyZW50VGFibGUuZ2V0SXRlbUNvdW50KCkgPiAwICYmIGN1cnJlbnRUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpIDw9IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgaWYgKHNWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlnZXRSb3coKS5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwotICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGFibGVUcmVlSXRlbS5nZXREYXRhKCkpOwotICAgICAgICAgICAgICAgICAgIHNWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAJICAgY3VycmVudFRhYmxlLnNldFNlbGVjdGlvbigwKTsgCi0gICAgICAgICAgICAgICAJICAgc2V0U2VsZWN0aW9uKDAsMCk7Ci0gICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAJICAgIH0KLSAgICAgICAJICAgIGVsc2UgCi0gICAgICAgCSAgICB7Ci0gICAgICAgCSAgICAgIGlmIChjdXJyZW50VGFibGUuZ2V0SXRlbXMoKS5sZW5ndGggPiAwKQotICAgICAgIAkgICAgICB7Ci0gICAgICAgCSAgICAgIAkgLy8gY3Vyc29yIGNhbiBlbmQgdXAgb24gYSBub24tZXhpc3RlbnQgdGFibGUgcm93IAotICAgICAgIAkgICAgICAgICAvLyAgIGN1cnJlbnRseSBubyB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50IHRhYmxlIGN1cnNvciByb3cgCi0gICAgICAgCSAgICAgIAkgLy8gICBzbyBmb3Igbm93IGp1c3QgY2F0Y2ggdGhlIGV4Y2VwdGlvbiBzaW5jZSBpdCBkb2Vzbid0Ci0gICAgICAgCSAgICAgIAkgLy8gICBjYXVzZSBhbnkgc2lkZSBlZmZlY3RzLgotICAgICAgIAkgICAgICAJIHRyeQotICAgICAgIAkgICAgICAJIHsKLSAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgICAgIAkgICAgICAJIH0KLSAgICAgICAJICAgICAgCSBjYXRjaCAoRXhjZXB0aW9uIGVlKQotICAgICAgIAkgICAgICAJIHsgICAgIAkgICAgICAgICAgICAJICAgICAgCQotICAgICAgIAkgICAgICAJCWN1cnJlbnRUYWJsZS5zZXRTZWxlY3Rpb24oMCk7ICAgICAgIAkgICAgICAJCSAgICAgICAgIAotICAgICAgIAkgICAgICAJCXNldFNlbGVjdGlvbigwLDApOwotICAgICAgIAkgICAgICAJIH0KLSAgICAgICAJICAgICAgIH0gICAgICAgCSAgICAKLSAgICAgICAJICAgICAgIGVsc2UgIC8vIGRvIG5vdCBzaG93IHRhYmxlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIHRhYmxlIC0gYXZvaWQgcmVwYWludAotICAgICAgIAkgICAgICAgewotICAgICAgIAkgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAJICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgCX0gICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2hpbGQoQ29udHJvbCBwYXJlbnQsIENvbnRyb2wgY2hpbGQpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29udHJvbCB0ZW1wQ2hpbGQgPSBjaGlsZDsKLSAgICAgICAgICAgIHdoaWxlICh0ZW1wQ2hpbGQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHRlbXBDaGlsZCA9PSBwYXJlbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB0ZW1wQ2hpbGQgPSB0ZW1wQ2hpbGQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNMb3N0KEZvY3VzRXZlbnQpCi0gICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIHRhYmxlIG5hdmlnYXRvciB0byBiZSBub3QgdmlzaWJsZSBpZiB0aGUgdGhlIHRhYmxlCi0gICAgICAgICAgICAvLyBpcyBub3QgaW4gZm9jdXMgYW5kIGEgY2hpbGQgb2YgdGhlIHRhYmxlIGlzIG5vdCBpbiBmb2N1cwotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvIHRoaXMgYXN5bmNocm9ub3VzbHkgc28gd2UgZG9uJ3QgbWVzcyB1cCB0aGUKLSAgICAgICAgICAgIC8vIGN1cnJlbnQgZm9jdXMgaGFuZGxpbmcuCi0gICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGFibGUgIT0gbnVsbCAmJiAhY3VycmVudFRhYmxlLmlzRGlzcG9zZWQoKSAmJiAhY3VycmVudFRhYmxlLmlzRm9jdXNDb250cm9sKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlzQ2hpbGQoY3VycmVudFRhYmxlLCBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRGb2N1c0NvbnRyb2woKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICB9Ci0KLSAgICAgIH0pOyAKLSAgICAgIAotICAgICAKLSAgICAgIAotCi0gICAgICB0YWJsZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKQotICAgICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIjZm9jdXNHYWluZWQoRm9jdXNFdmVudCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSBuYXZpZ2F0b3IgaWYgdGhlcmUgYXJlIGl0ZW1zIGluIHRoZSB0YWJsZSAKLSAgICAgICAgICAvLyBhbmQgaWYgdGhlIGZvY3VzIHdhc24ndCBnYWluZWQgZnJvbSBvdXIgb3duIHRhYmxlIG5hdmlnYXRvcgotICAgICAgICAgIC8vIChpZSBmb2N1cyBjYW1lIGZyb20gb3V0c2lkZSkKLSAgICAgICAgICBpZiAoY3VycmVudFRhYmxlLmdldEl0ZW1Db3VudCgpID4gMCAmJgotICAgICAgICAgICAgICAoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0Rm9jdXNDb250cm9sKCkgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgIURpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEZvY3VzQ29udHJvbCgpLmVxdWFscyhUYWJsZU5hdmlnYXRvci50aGlzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBub3RlIHRoYXQgd2UgZG8gdGhpcyBhc3luY2hyb25vdXNseSBzbyB3ZSBkb24ndCBtZXNzIHVwIHRoZQotICAgICAgICAgICAgLy8gY3VycmVudCBmb2N1cyBoYW5kbGluZy4KLSAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzVmlzaWJsZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzZXRGb2N1cygpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIC8vIGNhdGNoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbnMgaGVyZSAtIGluZGV4IG91dCBvZiBib3VuZHMgb24gdGFibGV2aWV3ZXIKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRhYmxlLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhYmxlLnNldFNlbGVjdGlvbigwKTsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oMCwwKTsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIC8vIGRvIG5vdCBzaG93IHRhYmxlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIHRhYmxlIC0gYXZvaWQgcmVwYWludAotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7ICAgICAgICAgICAKLSAgIH0KLQotICAgcHVibGljIFRhYmxlIGdldFRhYmxlKCkKLSAgIHsKLSAgICAgcmV0dXJuIHRhYmxlOwotICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFpbnRMaXN0ZW5lcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgIAotICAgICAgYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIAotICAgICAgewotICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkKLSAgICAgICAgIHsKLSAgICAgICAgIAlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGZpbmFsIFRhYmxlSXRlbSByb3cgPSAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSA/IHRhYmxlLmdldEl0ZW0odGFibGUuZ2V0VG9wSW5kZXgoKSkgOiBzZWxlY3Rpb25bMF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2VsbFRleHQgPSByb3cuZ2V0VGV4dChnZXRDb2x1bW4oKSk7Ci0gICAgICAgICAgICBmaW5hbCBJbWFnZSBjZWxsSW1hZ2UgPSByb3cuZ2V0SW1hZ2UoZ2V0Q29sdW1uKCkpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbCA9IGdldENvbHVtbigpOwotCi0gICAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoIXJvdy5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHJvdy5nZXRUZXh0KGdldENvbHVtbigpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmICghbmV3VGV4dC5lcXVhbHMoY2VsbFRleHQpIHx8ICEocm93LmdldEltYWdlKGNvbCkgPT0gY2VsbEltYWdlKSkgCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgfQotICAgICAgIH0pOwotICAgIH0KLQotCi0gICAgcHVibGljIFNlbGVjdGlvbktleUFkYXB0ZXIgZ2V0S2V5QWRhcHRlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICAgIGlmIChrZXlBZGFwdGVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25LZXlBZGFwdGVyKHZpZXdlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSByZXR1cm4ga2V5QWRhcHRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXlBZGFwdGVyKFNlbGVjdGlvbktleUFkYXB0ZXIga0FkYXB0ZXIpCi0gICAgewotICAgICAgIGtleUFkYXB0ZXIgPSBrQWRhcHRlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2VsZWN0aW9uS2V5QWRhcHRlciBrZXlBZGFwdGVyID0gbnVsbDsKLQotICAgIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25LZXlBZGFwdGVyIGV4dGVuZHMgS2V5QWRhcHRlcgotICAgIHsKLSAgICAgICBTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXI7Ci0KLSAgICAgICBwdWJsaWMgU2VsZWN0aW9uS2V5QWRhcHRlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgICAgICB7Ci0gICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICB0aGlzLnN0cnVjdHVyZWRWaWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgfQotCi0gICAgICAgaW50IGxhc3RLZXlQcmVzc2VkID0gLTE7ICAvLyB1c2VkIHRvIGNhY2hlIHRoZSBsYXN0IGtleSBmb3Iga2V5IGNvbWJvcwotCi0gICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSAKLSAgICAgICB7ICAgICAgIAkKLSAgICAgICAgICAgICAgIFRhYmxlSXRlbSByb3cgPSBnZXRSb3coKTsKLSAgICAgICAgICAgICAgIGludCBjb2x1bW4gPSBnZXRDb2x1bW4oKTsgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgIC8vIGhhY2sgdG8gZW11bGF0ZSBTSElGVCtGMTAgcG9wdXAgbWVudSAtIG90aGVyd2lzZSB0YWJsZSBjdXJzb3IKLSAgICAgICAgICAgICAgIC8vICAgb2JzY3VyZXMgdGhlIHRhYmxlIHBvcHVwIG1lY2hhbmlzbSBhbmQgaXQgZG9lc24ndCB3b3JrLgotICAgICAgICAgICAgICAgaWYgKGxhc3RLZXlQcmVzc2VkID09IFNXVC5TSElGVCAmJiBlLmtleUNvZGUgPT0gU1dULkYxMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIE1lbnUgcG9wdXAgPSBnZXRUYWJsZSgpLmdldE1lbnUoKTsKLSAgICAgICAgICAgICAgICAgIHBvcHVwLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBsYXN0S2V5UHJlc3NlZCA9IGUua2V5Q29kZTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgLy9qdmggLSBsb29rIGZvciArIG9yIC0ga2V5Ci0gICAgICAgICAgICAgICAvLyBjb2x1bW4gPT0gMAotICAgICAgICAgICAgICAgaWYgKHJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpIGluc3RhbmNlb2YgVGFibGVUcmVlSXRlbSkKLSAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICBpZiAoY29sdW1uID09IDAgJiYgZS5jaGFyYWN0ZXIgPT0gJysnKSAKLQkgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAJICAJICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsJICAgICAgICAgICAgICAgCQotCSAgICAgICAgICAgICAgIAkgICgoVGFibGVUcmVlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLnNldEV4cGFuZGVkU3RhdGUodGFibGVUcmVlSXRlbS5nZXREYXRhKCksIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgCSAgcmVmcmVzaCgpOwotCSAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICBlbHNlIGlmIChjb2x1bW4gPT0gMCAmJiBlLmNoYXJhY3RlciA9PSAnLScpIAotCSAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAJICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsJICAgICAgICAgICAgICAgCQotCSAgICAgICAgICAgICAgIAkgICgoVGFibGVUcmVlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLnNldEV4cGFuZGVkU3RhdGUodGFibGVUcmVlSXRlbS5nZXREYXRhKCksIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2goKTsKLQkgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAvLyB1c2UgRjIgdG8gaW52b2tlIGVkaXRpbmcgZm9yIGEgY2VsbAotICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSBTV1QuRjIpICAgICAKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIAkgIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpCi0gICAgICAgICAgICAgICAJICB7Ci0gICAgICAgICAgICAgICAgICAgICgoVGFibGVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuZWRpdEVsZW1lbnQocm93LmdldERhdGEoKSwgY29sdW1uKTsgICAKLSAgICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgIAkgIGVsc2UgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpCi0gICAgICAgICAgICAgICAJICB7ICAKLSAgICAgICAgICAgICAgIAkgIAkgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKXJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwotICAgICAgICAgICAgICAgCSAgCSAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5lZGl0RWxlbWVudCh0YWJsZVRyZWVJdGVtLmdldERhdGEoKSwgY29sdW1uKTsgICAKLSAgICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEtleUxpc3RlbmVycyhTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGFkZEtleUxpc3RlbmVyKGdldEtleUFkYXB0ZXIoc3RydWN0dXJlZFZpZXdlcikpOwotICAgIH0gICAgICAKLSAgICAKLSAgIHB1YmxpYyB2b2lkIGFkZE1vdXNlTGlzdGVuZXJzKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKQotICAgewotICAgICAgZmluYWwgU3RydWN0dXJlZFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyID0gdmlld2VyOwotCi0gICAgICBhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKQotICAgICAgewotCi0gICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgCi0gICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgICAgIFRhYmxlSXRlbSByb3cgPSBnZXRSb3coKTsKLSAgICAgICAgICAgICAgIGludCBjb2x1bW4gPSBnZXRDb2x1bW4oKTsgCi0gICAgICAgICAKLSAgICAgICAgICAgICAgIC8vIHVzZSBtb3VzZSBidXR0b24gMSB0byBpbnZva2UgZWRpdGluZyBmb3IgYSBjZWxsCi0gICAgICAgICAgICAgICBpZiAoZS5idXR0b24gPT0gMSkgICAgIAotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICgoVGFibGVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuZWRpdEVsZW1lbnQocm93LmdldERhdGEoKSwgY29sdW1uKTsgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIgJiYgY29sdW1uID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUYWJsZVRyZWVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuZWRpdEVsZW1lbnQodGFibGVUcmVlSXRlbS5nZXREYXRhKCksIGNvbHVtbik7ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICBpZiAoc3RydWN0dXJlZFZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlciAmJiByb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKSBpbnN0YW5jZW9mIFRhYmxlVHJlZUl0ZW0pCi0gICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKXJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cGFuZFN0YXRlID0gdGFibGVUcmVlSXRlbS5nZXRFeHBhbmRlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5zZXRFeHBhbmRlZFN0YXRlKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCAhZXhwYW5kU3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgIH0pOwotICAgICB9Ci0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgY2VsbCBlZGl0b3IgY29udHJvbCBzaG93cyB1cCBhYm92ZSB0aGUgdGFibGUgY3Vyc29yIGNvbnRyb2wuCi0gICAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIHRhYmxlIHZpZXdlciBtYWtlcyBhIG5ldyBjYWxsIHRvIHNldENlbGxFZGl0b3JzCi0gICAqIGkuZS4gaW4gY29uc3RydWN0b3IgYW5kIGluIHJlZnJlc2hDZWxsRWRpdG9ycwotICAgKgotICAgKiBAcGFyYW0gLSBhcnJheSBvZiBjZWxsIGVkaXRvcnMgZm9yIHRoZSBTdHJ1Y3R1cmVkVmlld2VyCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIG1vdmVDZWxsRWRpdG9yc0Fib3ZlKENlbGxFZGl0b3JbXSBlZGl0b3JBcnJheSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yQXJyYXkubGVuZ3RoIDsgaSsrKQotICAgIHsKLSAgICAgIENlbGxFZGl0b3IgY0VkID0gZWRpdG9yQXJyYXlbaV07Ci0gICAgICBpZiAoY0VkICE9IG51bGwgJiYgY0VkLmdldENvbnRyb2woKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjRWQuZ2V0Q29udHJvbCgpLm1vdmVBYm92ZShudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmICghaXNEaXNwb3NlZCgpICYmIGlzVmlzaWJsZSgpKQotICAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICB9Ci0gICAgIH0pOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDMzNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdXJpcmVzb2x2ZXIuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyXzEuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTliNjkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTBkNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gSmFuIDMwIDE5OjQ4OjA3IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmFmOTkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvUkVBRE1FLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FmNTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBJIGZvciBhbiBVUkkgcmVzb2x2ZXIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhYTk4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NjY0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPUNvbW1vbiBVUkkgUmVzb2x2ZXIgRnJhbWV3b3JrCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXJlc29sdmVyRXh0ZW5zaW9ucz1VUkkgUmVzb2x2ZXIgRXh0ZW5zaW9ucyBQb2ludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYTk5YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb2x2ZXJFeHRlbnNpb25zIiBuYW1lPSIlcmVzb2x2ZXJFeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS9yZXNvbHZlckV4dGVuc2lvbnMuZXhzZCIvPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NjaGVtYS9yZXNvbHZlckV4dGVuc2lvbnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zY2hlbWEvcmVzb2x2ZXJFeHRlbnNpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTY1ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NjaGVtYS9yZXNvbHZlckV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiBpZD0icmVzb2x2ZXJFeHRlbnNpb25zIiBuYW1lPSJVUkkgUmVzb2x2ZXIgRXh0ZW5zaW9ucyBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgVVJJIFJlc29sdmVyIEV4dGVuc2lvbnMgcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gcmVnaXN0ZXIgY3VzdG9tIFVSSSByZXNvbHZlcnMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJlc29sdXRpb24gb2YgcmVzb3VyY2VzIGJ5IHRvb2xzIHN1Y2ggYXMgZWRpdG9ycywgZ2VuZXJhdG9ycywgdmFsaWRhdG9ycywgYW5kIHdpemFyZHMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc29sdmVyRXh0ZW5zaW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvbHZlckV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3ROYXR1cmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0YWdlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzdGFnZSBpbiB3aGljaCB0byBydW4gdGhpcyBleHRlbnNpb24gcmVzb2x2ZXI6IHByZW5vcm1hbGl6YXRpb24sIHBvc3Rub3JtYWxpemF0aW9uLCBvciBwaHlzaWNhbC4gRGVmYXVsdHMgdG8gcG9zdG5vcm1hbGl6YXRpb24uJmx0O2JyJmd0OwotcHJlbm9ybWFsaXphdGlvbjogIHJ1biBiZWZvcmUgbm9ybWFsaXphdGlvbiBvZiB0aGUgaW5wdXQmbHQ7YnImZ3Q7Ci1wb3N0bm9ybWFsaXphdGlvbjogcnVuIGFmdGVyIG5vcm1hbGl6YXRpb24gb2YgdGhlIGlucHV0Jmx0O2JyJmd0OwotcGh5c2ljYWw6ICAgICAgICAgIHJ1biBhZnRlciBhbGwgcHJlIGFuZCBwb3N0bm9ybWFsaXphdGlvbiByZXNvbHZlcnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb24iLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcHJpb3JpdHkgb2YgdGhpcyByZXNvbHZlcjogaGlnaCwgbWVkaXVtLCBvciBsb3cuIERlZmF1bHRzIHRvIG1lZGl1bS4gVGhlIHByaW9yaXR5IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGVuIHRoaXMgcmVzb2x2ZXIgc2hvdWxkIHJ1biB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgcmVzb2x2ZXJzIGRlZmluZWQgZm9yIHRoZSBzYW1lIHN0YWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9qZWN0TmF0dXJlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBJZiBhIHByb2plY3QgbmF0dXJlIGlzIHNwZWNpZmllZCB0aGUgVVJJIHJlc29sdmVyIHdpbGwgb25seSBiZSB1c2VkIGZvciBwcm9qZWN0cyB0aGF0IGNvbnRhaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBuYXR1cmVzLiBJZiBubyBwcm9qZWN0IG5hdHVyZXMgYXJlIHNwZWNpZmllZCB0aGUgVVJJIHJlc29sdmVyIHdpbGwgYmUgdXNlZCBmb3IgYWxsIHByb2plY3RzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHByb2plY3QgbmF0dXJlIElEIGZvciB3aGljaCB0aGUgVVJJIHJlc29sdmVyIHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIFVSSSByZXNvbHZlciBjb250cmlidXRpb246Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAgIHN0YWdlPSZxdW90O3BoeXNpY2FsJnF1b3Q7Ci0gICAgICAgICAgICBwcmlvcml0eT0mcXVvdDtsb3cmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuU2FtcGxlUmVzb2x2ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L3Jlc29sdmVyRXh0ZW5zaW9uJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgc3VwcGxpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtjb2RlJmd0Owotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVzb2x2ZXIKLSZsdDsvY29kZSZndDsKLXByb3ZpZGVzIGFuIFVSSSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHJlZmVyZW5jZXMgaW4gYSBwcm9qZWN0IHdpdGggbXVsdGlwbGUgY29tcG9uZW50cwotJmx0O2NvZGUmZ3Q7Ci1vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbgotJmx0Oy9jb2RlJmd0OwotcHJvdmlkZXMgYW4gVVJJIHJlc29sdmVyIHRoYXQgcmVzb2x2ZXMgcmVmZXJlbmNlcyBpbiBhIGNhY2hlCi0mbHQ7Y29kZSZndDsKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dVUklSZXNvbHZlckV4dGVuc2lvbgotJmx0Oy9jb2RlJmd0OwotcHJvdmlkZXMgYW4gVVJJIHJlc29sdmVyIHRoYXQgcmVzb2x2ZXMgcmVmZXJlbmNlcyBmcm9tIGFuIFhNTCBjYXRhbG9nCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9FeHRlbnNpYmxlVVJJUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9FeHRlbnNpYmxlVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliMmMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvRXh0ZW5zaWJsZVVSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIEBhdXRob3IgY3NhbHRlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlVVJJUmVzb2x2ZXIgaW1wbGVtZW50cyBVUklSZXNvbHZlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9nRXhjZXB0aW9ucyA9IGZhbHNlOwotCi0JLy9wcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCS8vVE9ETy4uLiBjb25zaWRlciBjdG9yIHRoYXQgdGFrZXMgYSBwcm9qZWN0IGFyZwotCS8vcHVibGljIEV4dGVuc2libGVVUklSZXNvbHZlcihJUHJvamVjdCBwcm9qZWN0KQotCS8vewotCS8vCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JLy99Ci0KLQlwdWJsaWMgRXh0ZW5zaWJsZVVSSVJlc29sdmVyKCkKLQl7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCXsKLQkJU3RyaW5nIHJlc3VsdCA9IHN5c3RlbUlkOwotCi0JCS8vIGNvbXB1dGUgdGhlIHByb2plY3QgdGhhdCBob2xkcyB0aGUgcmVzb3VyY2UKLQkJLy8KLSAgICBJRmlsZSBmaWxlID0gY29tcHV0ZUZpbGUoYmFzZUxvY2F0aW9uKTsKLQkJSVByb2plY3QgcHJvamVjdCA9ICBmaWxlICE9IG51bGwgPyBmaWxlLmdldFByb2plY3QoKSA6IG51bGw7Ci0KLQkJVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSByZXNvbHZlclJlZ2lzdHJ5ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5nZXRJbnRhbmNlKCk7Ci0JCUxpc3QgbGlzdCA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uRGVzY3JpcHRvcnMocHJvamVjdCk7Ci0KLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGFwcGxpY2FibGUgcHJlLW5vcm1hbGl6ZWQgcmVzb2x2ZXJzIGZyb20gdGhlCi0JCS8vIGV4dGVuc2lvbiByZWdpc3RyeQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlclJlZ2lzdHJ5LmdldE1hdGNoaW5nVVJJUmVzb2x2ZXJzKGxpc3QsIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUFJFTk9STUFMSVpBVElPTikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlVUklSZXNvbHZlckV4dGVuc2lvbiByZXNvbHZlciA9IChVUklSZXNvbHZlckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdGVtcHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoZmlsZSwgYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgcmVzdWx0KTsKLQkJCWlmKHRlbXByZXN1bHQgIT0gbnVsbCkKLQkJCXsKLQkJCSAgcmVzdWx0ID0gdGVtcHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCS8vIG5vcm1hbGl6ZSB0aGUgdXJpCi0JCS8vCi0JCXJlc3VsdCA9IG5vcm1hbGl6ZShiYXNlTG9jYXRpb24sIHJlc3VsdCk7Ci0KLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGFwcGxpY2FibGUgcG9zdC1ub3JtYWxpemVkIHJlc29sdmVycyBmcm9tIHRoZQotCQkvLyBleHRlbnNpb24gcmVnaXN0cnkKLQkJLy8JCQotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlclJlZ2lzdHJ5LmdldE1hdGNoaW5nVVJJUmVzb2x2ZXJzKGxpc3QsIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUE9TVE5PUk1BTElaQVRJT04pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJeyAKLQkJCVVSSVJlc29sdmVyRXh0ZW5zaW9uIHJlc29sdmVyID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uKSBpLm5leHQoKTsKLQkJCVN0cmluZyB0ZW1wcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShmaWxlLCBiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCByZXN1bHQpOwotCQkJaWYodGVtcHJlc3VsdCAhPSBudWxsKQotCQkJewotCQkJICByZXN1bHQgPSB0ZW1wcmVzdWx0OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyByZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBsb2dpY2FsTG9jYXRpb24pCi0gICAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9IGxvZ2ljYWxMb2NhdGlvbjsKLSAgICAgIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgcmVzb2x2ZXJSZWdpc3RyeSA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0SW50YW5jZSgpOwotICAgICAgSUZpbGUgZmlsZSA9IGNvbXB1dGVGaWxlKGJhc2VMb2NhdGlvbik7Ci0gICAgICAKLSAgICAgIC8vIGNvbXB1dGUgdGhlIHByb2plY3QgdGhhdCBob2xkcyB0aGUgcmVzb3VyY2UKLSAgICAgIC8vICAgICAgCi0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gIGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbDsgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uRGVzY3JpcHRvcnMocHJvamVjdCk7ICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlclJlZ2lzdHJ5LmdldE1hdGNoaW5nVVJJUmVzb2x2ZXJzKGxpc3QsIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUEhZU0lDQUwpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIGFwcGxpY2FibGUgcGh5c2ljYWwgcmVzb2x2ZXJzIGZyb20gdGhlIGV4dGVuc2lvbiByZWdpc3RyeQotICAgICAgICAvLwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBVUklSZXNvbHZlckV4dGVuc2lvbiByZXNvbHZlciA9IChVUklSZXNvbHZlckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIHRlbXByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKGZpbGUsIGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHJlc3VsdCk7Ci0gICAgICAgICAgaWYodGVtcHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRlbXByZXN1bHQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotCi0JcHJvdGVjdGVkIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHN5c3RlbUlkKQotCXsKLQkgIC8vIElmIG5vIHN5c3RlbUlkIGhhcyBiZWVuIHNwZWNpZmllZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0JICAvLyBzbyByZXR1cm4gbnVsbDsKLQkgIGlmKHN5c3RlbUlkID09IG51bGwpCi0JICAgIHJldHVybiBudWxsOwotCSAgU3RyaW5nIHJlc3VsdCA9IHN5c3RlbUlkOwotICAgICAgCi0gICAgICAvLyBjcyA6IHNvbWV0aW1lcyBub3JtYWxpemluZyB0aGUgVVJJIHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uIHRvIGdldCB0aHJvd24KLSAgICAgIC8vIGZvciBleGFtcGxlIHRoZSAnYmFkJyB2ZXJzaW9uIG9mIHRoZSBVUkkgYmVsb3cgLi4uCi0gICAgICAvLwotICAgICAgLy8gICBnb29kID0gImphcjovcmVzb3VyY2UvcHJvamVjdC1uYW1lL1dlYkNvbnRlbnQvV0VCLUlORi9saWIvZ2VuZXJhdG9yLmphciEvTUVUQS1JTkYvc2NoZW1hL2NvbmZpZy5kdGQiCi0gICAgICAvLyAgIGJhZCAgPSAiamFyOi9yZXNvdXJjZS9wcm9qZWN0LW5hbWUvV2ViQ29udGVudC9XRUItSU5GL2xpYi9nZW5lcmF0b3IuamFyL01FVEEtSU5GL3NjaGVtYS9jb25maWcuZHRkIgotICAgICAgLy8KLSAgICAgIC8vIEhlcmUgd2UgZW5jbG9zZSB0aGUgbm9ybWFsaXphdGlvbiBpbiBhIHRyeS9jYXRjaCBibG9jayB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGNhbGxlcgotICAgICAgLy8gKGkuZS4gdGhlICdyZXNvbHZlJyBtZXRob2QpIGlzbid0IGludGVyZXN0ZWQgaW4gaGFuZGxpbmcgdGhpcyBleGNlcHRpb24uICAgICAgICAKLQkgIHRyeQotCSAgewotCSAgICAvLyBub3JtYWxpemUgdGhlIFVSSQotCSAgICBVUkkgc3lzdGVtVVJJID0gVVJJLmNyZWF0ZVVSSShzeXN0ZW1JZCk7Ci0JICAgIGlmIChzeXN0ZW1VUkkuaXNSZWxhdGl2ZSgpKQotCSAgICB7Ci0JICAgICAgYmFzZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uLnJlcGxhY2UoJ1xcJywnLycpOwotCSAgICAgIFVSSSBiYXNlVVJJID0gVVJJLmNyZWF0ZVVSSShiYXNlTG9jYXRpb24pOwotICAgICAgICAgIAotICAgICAgICAgIC8vIFRPRE8gKGNzKSB3ZSBzaG91bGQgYWRkIG1vcmUgY29tbWVudHMgdG8gZXhwbGFpbiB0aGlzIGluIGEgYml0IG1vcmUgZGV0YWlsCi0JICAgICAgdHJ5Ci0JICAgICAgewotCSAgICAgICAgcmVzdWx0ID0gc3lzdGVtVVJJLnJlc29sdmUoYmFzZVVSSSkudG9TdHJpbmcoKTsKLQkgICAgICB9Ci0JICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICBCdW5kbGUgYnVuZGxlID0gVVJJUmVzb2x2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKTsKLQkgICAgICAgIElTdGF0dXMgc3RhdHVzT2JqID0gbnVsbDsKLQkgICAgICAgIGphdmEubmV0LlVSSSBiYXNlVVJJMiA9IG51bGw7Ci0JICAgICAgICB0cnkgewotCSAgICAgICAgICBiYXNlVVJJMiA9IGphdmEubmV0LlVSSS5jcmVhdGUoYmFzZUxvY2F0aW9uKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZTIpIHsKLQkgICAgICAgICAgaWYobG9nRXhjZXB0aW9ucykgewotCSAgICAgICAgICAgIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCAiUHJvYmxlbSBpbiBjcmVhdGluZyBqYXZhLm5ldC5VUkkgaW4gRXh0ZW5zaWJsZVVSSVJlc29sdmVyOiIgKyBlMi5nZXRNZXNzYWdlKCksIGUyKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgIFBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICB0cnkgewotCSAgICAgICAgICBpZihiYXNlVVJJMiAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgamF2YS5uZXQuVVJJIHJlc3VsdFVSSSA9IGJhc2VVUkkyLnJlc29sdmUoc3lzdGVtSWQpOwotCSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFVSSS50b1N0cmluZygpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUyKSB7Ci0JICAgICAgICAgIGlmKGxvZ0V4Y2VwdGlvbnMpIHsKLQkgICAgICAgICAgICBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgIlByb2JsZW0gaW4gcmVzb2x2aW5nIHdpdGggamF2YS5uZXQuVVJJIGluIEV4dGVuc2libGVVUklSZXNvbHZlcjoiICsgZTIuZ2V0TWVzc2FnZSgpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgIFBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7ICAgICAKLSAgICAgICAgLy8ganVzdCBlYXQgdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGJhY2sgdGhlIG9yaWdpbmFsIHN5c3RlbUlkCi0JICB9Ci0JICByZXR1cm4gcmVzdWx0OwotCX0KLQotICBwcm90ZWN0ZWQgSUZpbGUgY29tcHV0ZUZpbGUoU3RyaW5nIGJhc2VMb2NhdGlvbikKLSAgewotICAgIElGaWxlIGZpbGUgPSBudWxsOwotICAgIGlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGF0dGVybiA9ICJmaWxlOi8vLyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChiYXNlTG9jYXRpb24uc3RhcnRzV2l0aChwYXR0ZXJuKSkKLSAgICAgIHsKLSAgICAgICAgYmFzZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uLnN1YnN0cmluZyhwYXR0ZXJuLmxlbmd0aCgpKTsKLSAgICAgIH0KLSAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotICAgICAgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotICAgIH0KLSAgICByZXR1cm4gZmlsZTsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0ZDIwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpLCBhcyBzcGVjaWZpZWQgYnkKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkMgMjM5NjwvYT4sIHdpdGggY2VydGFpbgotICogZW5oYW5jZW1lbnRzLiAgQSA8Y29kZT5VUkk8L2NvZGU+IGluc3RhbmNlIGNhbiBiZSBjcmVhdGVkIGJ5IHNwZWNpZnlpbmcKLSAqIHZhbHVlcyBmb3IgaXRzIGNvbXBvbmVudHMsIG9yIGJ5IHByb3ZpZGluZyBhIHNpbmdsZSBVUkkgc3RyaW5nLCB3aGljaCBpcwotICogcGFyc2VkIGludG8gaXRzIGNvbXBvbmVudHMuICBTdGF0aWMgZmFjdG9yeSBtZXRob2RzIHdob3NlIG5hbWVzIGJlZ2luCi0gKiB3aXRoICJjcmVhdGUiIGFyZSB1c2VkIGZvciBib3RoIGZvcm1zIG9mIG9iamVjdCBjcmVhdGlvbi4gIE5vIHB1YmxpYyBvcgotICogcHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhcmUgcHJvdmlkZWQ7IHRoaXMgY2xhc3MgY2FuIG5vdCBiZSBzdWJjbGFzc2VkLgotICoKLSAqIDxwPkxpa2UgPGNvZGU+U3RyaW5nPC9jb2RlPiwgPGNvZGU+VVJJPC9jb2RlPiBpcyBhbiBpbW11dGFibGUgY2xhc3M7Ci0gKiBhIDxjb2RlPlVSSTwvY29kZT4gaW5zdGFuY2Ugb2ZmZXJzIHNldmVyYWwgYnktdmFsdWUgbWV0aG9kcyB0aGF0IHJldHVybiBhCi0gKiBuZXcgPGNvZGU+VVJJPC9jb2RlPiBvYmplY3QgYmFzZWQgb24gaXRzIGN1cnJlbnQgc3RhdGUuICBNb3N0IHVzZWZ1bCwKLSAqIGEgcmVsYXRpdmUgPGNvZGU+VVJJPC9jb2RlPiBjYW4gYmUge0BsaW5rICNyZXNvbHZlKFVSSSkgcmVzb2x2ZX1kIGFnYWluc3QKLSAqIGEgYmFzZSBhYnNvbHV0ZSA8Y29kZT5VUkk8L2NvZGU+IC0tIHRoZSBsYXR0ZXIgdHlwaWNhbGx5IGlkZW50aWZpZXMgdGhlCi0gKiBkb2N1bWVudCBpbiB3aGljaCB0aGUgZm9ybWVyIGFwcGVhcnMuICBUaGUgaW52ZXJzZSB0byB0aGlzIGlzIHtAbGluawotICogI2RlcmVzb2x2ZShVUkkpIGRlcmVzb2x2ZX0sIHdoaWNoIGFuc3dlcnMgdGhlIHF1ZXN0aW9uLCAid2hhdCByZWxhdGl2ZQotICogVVJJIHdpbGwgcmVzb2x2ZSwgYWdhaW5zdCB0aGUgZ2l2ZW4gYmFzZSwgdG8gdGhpcyBhYnNvbHV0ZSBVUkk/IgotICoKLSAqIDxwPkluIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDPC9hPiwgbXVjaAotICogYXR0ZW50aW9uIGlzIGZvY3VzZWQgb24gYSBoaWVyYXJjaGljYWwgbmFtaW5nIHN5c3RlbSB1c2VkIHdpZGVseSB0bwotICogbG9jYXRlIHJlc291cmNlcyB2aWEgY29tbW9uIHByb3RvY29scyBzdWNoIGFzIEhUVFAsIEZUUCwgYW5kIEdvcGhlciwgYW5kCi0gKiB0byBpZGVudGlmeSBmaWxlcyBvbiBhIGxvY2FsIGZpbGUgc3lzdGVtLiAgQWNvcmRpbmdseSwgbW9zdCBvZiB0aGlzCi0gKiBjbGFzcydzIGZ1bmN0aW9uYWxpdHkgaXMgZm9yIGhhbmRsaW5nIHN1Y2ggVVJJcywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQKLSAqIHZpYSB7QGxpbmsgI2lzSGllcmFyY2hpY2FsIGlzSGllcmFyY2hpY2FsfS4KLSAqCi0gKiA8cD48YSBuYW1lPSJkZXZpY2VfZXhwbGFuYXRpb24iPgotICogVGhlIHByaW1hcnkgZW5oYW5jZW1lbnQgYmV5b25kIHRoZSBSRkMgZGVzY3JpcHRpb24gaXMgYW4gb3B0aW9uYWwKLSAqIGRldmljZSBjb21wb25lbnQuICBJbnN0ZWFkIG9mIHRyZWF0aW5nIHRoZSBkZXZpY2UgYXMganVzdCBhbm90aGVyIHNlZ21lbnQKLSAqIGluIHRoZSBwYXRoLCBpdCBjYW4gYmUgc3RvcmVkIGFzIGEgc2VwYXJhdGUgY29tcG9uZW50IChhbG1vc3QgYQotICogc3ViLWF1dGhvcml0eSksIHdpdGggdGhlIHJvb3QgYmVsb3cgaXQuICBGb3IgZXhhbXBsZSwgcmVzb2x2aW5nCi0gKiA8Y29kZT4vYmFyPC9jb2RlPiBhZ2FpbnN0IDxjb2RlPmZpbGU6Ly8vYzovZm9vPC9jb2RlPiB3b3VsZCByZXN1bHQgaW4KLSAqIDxjb2RlPmZpbGU6Ly8vYzovYmFyPC9jb2RlPiBiZWluZyByZXR1cm5lZC4gIEFsc28sIHlvdSBjYW5ub3QgdGFrZQotICogdGhlIHBhcmVudCBvZiBhIGRldmljZSwgc28gcmVzb2x2aW5nIDxjb2RlPi4uPC9jb2RlPiBhZ2FpbnN0Ci0gKiA8Y29kZT5maWxlOi8vL2M6LzwvY29kZT4gd291bGQgbm90IHlpZWxkIDxjb2RlPmZpbGU6Ly8vPC9jb2RlPiwgYXMgeW91Ci0gKiBtaWdodCBleHBlY3QuICBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIHdoZW4gd29ya2luZyB3aXRoIGZpbGUtc2NoZW1lCi0gKiBVUklzLCBhcyBkZXZpY2VzIGRvIG5vdCB0eXBpY2FsbHkgb2NjdXIgaW4gcHJvdG9jb2wtYmFzZWQgb25lcy4gIEEKLSAqIGRldmljZS1lbmFibGVkIDxjb2RlPlVSSTwvY29kZT4gaXMgY3JlYXRlZCBieSBwYXJzaW5nIGEgc3RyaW5nIHdpdGgKLSAqIHtAbGluayAjY3JlYXRlVVJJKFN0cmluZykgY3JlYXRlVVJJfTsgaWYgdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGgKLSAqIGVuZHMgd2l0aCB0aGUgPGNvZGU+OjwvY29kZT4gY2hhcmFjdGVyLCBpdCBpcyBzdG9yZWQgKGluY2x1ZGluZyB0aGUgY29sb24pCi0gKiBhcyB0aGUgZGV2aWNlLCBpbnN0ZWFkLiAgQWx0ZXJuYXRlbHksIGVpdGhlciB0aGUge0BsaW5rCi0gKiAjY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKSBuby1wYXRofQotICogb3IgdGhlIHtAbGluayAjY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdLAotICogU3RyaW5nLCBTdHJpbmcpIGFic29sdXRlLXBhdGh9IGZvcm0gb2YgPGNvZGU+Y3JlYXRlSGllcmFyY2hpY2FsVVJJKCk8L2NvZGU+Ci0gKiBjYW4gYmUgdXNlZCwgaW4gd2hpY2ggYSBub24tbnVsbCA8Y29kZT5kZXZpY2U8L2NvZGU+IHBhcmFtZXRlciBjYW4gYmUKLSAqIHNwZWNpZmllZC4KLSAqCi0gKiA8cD48YSBuYW1lPSJhcmNoaXZlX2V4cGxhbmF0aW9uIj4gCi0gKiBUaGUgb3RoZXIgZW5oYW5jZW1lbnQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGFsbW9zdC1oaWVyYXJjaGljYWwKLSAqIGZvcm0gdXNlZCBmb3IgZmlsZXMgd2l0aGluIGFyY2hpdmVzLCBzdWNoIGFzIHRoZSBKQVIgc2NoZW1lLCBkZWZpbmVkCi0gKiBmb3IgdGhlIEphdmEgUGxhdGZvcm0gaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHtAbGluawotICogamF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbn0uIEJ5IGRlZmF1bHQsIHRoaXMgc3VwcG9ydCBpcyBlbmFibGVkIGZvcgotICogYWJzb2x1dGUgVVJJcyB3aXRoIHNjaGVtZSBlcXVhbCB0byAiamFyIiwgInppcCIsIG9yICJhcmNoaXZlIiAoaWdub3JpbmcgY2FzZSksIGFuZAotICogaXMgaW1wbGVtZW50ZWQgYnkgYSBoaWVyYXJjaGljYWwgVVJJLCB3aG9zZSBhdXRob3JpdHkgaW5jbHVkZXMgdGhlCi0gKiBlbnRpcmUgVVJJIG9mIHRoZSBhcmNoaXZlLCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSA8Y29kZT4hPC9jb2RlPgotICogY2hhcmFjdGVyLiAgVGhlIFVSSSBvZiB0aGUgYXJjaGl2ZSBtdXN0IGhhdmUgbm8gZnJhZ21lbnQuICBUaGUgd2hvbGUKLSAqIGFyY2hpdmUgVVJJIG11c3QgaGF2ZSBubyBkZXZpY2UgYW5kIGFuIGFic29sdXRlIHBhdGguICBTcGVjaWFsIGhhbmRsaW5nCi0gKiBpcyBzdXBwb3J0ZWQgZm9yIHtAbGluayAjY3JlYXRlVVJJIGNyZWF0aW5nfSwge0BsaW5rCi0gKiAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5IHZhbGlkYXRpbmd9LCB7QGxpbmsgI2RldmljZVBhdGggZ2V0dGluZyB0aGUgcGF0aH0KLSAqIGZyb20sIGFuZCB7QGxpbmsgI3RvU3RyaW5nIGRpc3BsYXlpbmd9IGFyY2hpdmUgVVJJcy4gSW4gYWxsIG90aGVyCi0gKiBvcGVyYXRpb25zLCBpbmNsdWRpbmcge0BsaW5rICNyZXNvbHZlKFVSSSkgcmVzb2x2aW5nfSBhbmQge0BsaW5rCi0gKiAjZGVyZXNvbHZlKFVSSSkgZGVyZXNvbHZpbmd9LCB0aGV5IGFyZSBoYW5kbGVkIGxpa2UgYW55IG9yZGluYXJ5IFVSSS4KLSAqCi0gKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGltcG9zZSB0aGUgYWxsIG9mIHRoZSByZXN0cmljdGlvbnMgb24KLSAqIGNoYXJhY3RlciB2YWxpZGl0eSB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIFJGQy4gIFN0YXRpYyBtZXRob2RzIHdob3NlCi0gKiBuYW1lcyBiZWdpbiB3aXRoICJ2YWxpZCIgYXJlIHVzZWQgdG8gdGVzdCB3aGV0aGVyIGEgZ2l2ZW4gc3RyaW5nIGlzIHZhbGlkCi0gKiB2YWx1ZSBmb3IgdGhlIHZhcmlvdXMgVVJJIGNvbXBvbmVudHMuICBQcmVzZW50bHksIHRoZXNlIHRlc3RzIHBsYWNlIG5vCi0gKiByZXN0cmljdGlvbnMgYmV5b25kIHdoYXQgd291bGQgaGF2ZSBiZWVuIHJlcXVpcmVkIGluIG9yZGVyIGZvciB7QGxpbmsKLSAqIGNyZWF0ZVVSSShTdHJpbmcpIGNyZWF0ZVVSSX0gdG8gaGF2ZSBwYXJzZWQgdGhlbSBjb3JyZWN0bHkgZnJvbSBhIHNpbmdsZQotICogVVJJIHN0cmluZy4gIElmIG5lY2Vzc2FyeSBpbiB0aGUgZnV0dXJlLCB0aGVzZSB0ZXN0cyBtYXkgYmUgbWFkZSBtb3JlCi0gKiBzdHJpY3QsIHRvIGJldHRlciBjb2Zvcm0gdG8gdGhlIFJGQy4KLSAqIAotICogPHA+QW5vdGhlciBncm91cCBvZiBzdGF0aWMgbWV0aG9kcywgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCAiZW5jb2RlIiwgdXNlCi0gKiBwZXJjZW50IGVzY2FwaW5nIHRvIGVuY29kZSBhbnkgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgcGVybWl0dGVkIGluIHRoZQotICogdmFyaW91cyBVUkkgY29tcG9uZW50cy4gQW5vdGhlciBzdGF0aWMgbWV0aG9kIGlzIHByb3ZpZGVkIHRvIHtAbGluawotICogI2RlY29kZSBkZWNvZGV9IGVuY29kZWQgc3RyaW5ncy4gIEFuIGVzY2FwZWQgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIGFzCi0gKiBhIHBlcmNlbnQgc3lib2wgKDxjb2RlPiU8L2NvZGU+KSwgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMgdGhhdCBzcGVjaWZ5Ci0gKiB0aGUgY2hhcmFjdGVyIGNvZGUuICBUaGVzZSBlbmNvZGluZyBtZXRob2RzIGFyZSBtb3JlIHN0cmljdCB0aGFuIHRoZQotICogdmFsaWRhdGlvbiBtZXRob2RzIGRlc2NyaWJlZCBhYm92ZS4gIFRoZXkgZW5zdXJlIHZhbGlkaXR5IGFjY29yZGluZyB0byB0aGUKLSAqIFJGQywgd2l0aCBvbmUgZXhjZXB0aW9uOiBub24tQVNDSUkgY2hhcmFjdGVycy4KLSAqCi0gKiA8cD5UaGUgUkZDIGFsbG93cyBvbmx5IGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgbWFwcGVkIHRvIDctYml0IFVTLUFTQ0lJCi0gKiByZXByZXNlbnRhdGlvbnMuICBOb24tQVNDSUksIHNpbmdsZS1ieXRlIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQgb25seSB2aWEKLSAqIHBlcmNlbnQgZXNjYXBpbmcsIGFzIGRlc2NyaWJlZCBhYm92ZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBKYXZhJ3MKLSAqIFVuaWNvZGUgPGNvZGU+Y2hhcjwvY29kZT4gYW5kIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb25zLCBhbmQKLSAqIG1ha2VzIG5vIGF0dGVtcHQgdG8gZW5jb2RlIGNoYXJhY3RlcnMgMHhBMCBhbmQgYWJvdmUuICBDaGFyYWN0ZXJzIGluIHRoZQotICogcmFuZ2UgMHg4MC0weDlGIGFyZSBzdGlsbCBlc2NhcGVkLiAgSW4gdGhpcyByZXNwZWN0LCB0aGlzIG5vdGlvbiBvZiBhIFVSSQotICogaXMgYWN0dWFsbHkgbW9yZSBsaWtlIGFuIElSSSAoSW50ZXJuYXRpb25hbGl6ZWQgUmVzb3VyY2UgSWRlbnRpZmllciksIGZvcgotICogd2hpY2ggYW4gUkZDIGlzIG5vdyBpbiA8aHJlZj0iaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9pcmktZWRpdC9kcmFmdC1kdWVyc3QtaXJpLTA5LnR4dCI+ZHJhZnQKLSAqIGZvcm08L2E+LgotICoKLSAqIDxwPkZpbmFsbHksIG5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIDxjb2RlPm51bGw8L2NvZGU+IHBhcmFtZXRlciB0bwotICogdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgYW5kIGFuIGVtcHR5IHN0cmluZy4gIFRoZSBmb3JtZXIgc2lnbmlmaWVzIHRoZQotICogYWJzZW5zZSBvZiBhIGdpdmVuIFVSSSBjb21wb25lbnQsIHdoaWxlIHRoZSBsYXR0ZXIgc2ltcGx5IG1ha2VzIHRoZQotICogY29tcG9uZW50IGJsYW5rLiAgVGhpcyBjYW4gaGF2ZSBhIHNpZ25pZmljYW50IGVmZmVjdCB3aGVuIHJlc29sdmluZy4gIEZvcgotICogZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gVVJJczogPGNvZGU+L2JhcjwvY29kZT4gKHdpdGggbm8KLSAqIGF1dGhvcml0eSkgYW5kIDxjb2RlPi8vL2JhcjwvY29kZT4gKHdpdGggYSBibGFuayBhdXRob3JpdHkpLiAgSW1hZ2luZQotICogcmVzb2x2aW5nIHRoZW0gYWdhaW5zdCBhIGJhc2Ugd2l0aCBhbiBhdXRob3JpdHksIHN1Y2ggYXMKLSAqIDxjb2RlPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9jb2RlPi4gIFRoZSBmb3JtZXIgY2FzZSB3aWxsIHlpZWxkCi0gKiA8Y29kZT5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2JhcjwvY29kZT4sIGFzIHRoZSBiYXNlIGF1dGhvcml0eSB3aWxsIGJlCi0gKiBwcmVzZXJ2ZWQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBlbXB0eSBhdXRob3JpdHkgd2lsbCBvdmVycmlkZSB0aGUKLSAqIGJhc2UgYXV0aG9yaXR5LCByZXN1bHRpbmcgaW4gPGNvZGU+aHR0cDovLy9iYXI8L2NvZGU+IQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVVJJCi17Ci0gIC8vIENvbW1vbiB0byBhbGwgVVJJIHR5cGVzLgotICBwcml2YXRlIGZpbmFsIGludCBoYXNoQ29kZTsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhpZXJhcmNoaWNhbDsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NoZW1lOyAgLy8gbnVsbCAtPiByZWxhdGl2ZSBVUkkgcmVmZXJlbmNlCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGF1dGhvcml0eTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnJhZ21lbnQ7Ci0gIHByaXZhdGUgVVJJIGNhY2hlZFRyaW1GcmFnbWVudDsKLSAgcHJpdmF0ZSBTdHJpbmcgY2FjaGVkVG9TdHJpbmc7Ci0gIC8vcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlyaTsKLSAgLy9wcml2YXRlIFVSSSBjYWNoZWRBU0NJSVVSSTsKLQotICAvLyBBcHBsaWNhYmxlIG9ubHkgdG8gYSBoaWVyYXJjaGljYWwgVVJJLgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXZpY2U7Ci0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhYnNvbHV0ZVBhdGg7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nW10gc2VnbWVudHM7IC8vIGVtcHR5IGxhc3Qgc2VnbWVudCAtPiB0cmFpbGluZyBzZXBhcmF0b3IKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcXVlcnk7Ci0KLSAgLy8gQSBjYWNoZSBvZiBVUklzLCBrZXllZCBieSB0aGUgc3RyaW5ncyBmcm9tIHdoaWNoIHRoZXkgd2VyZSBjcmVhdGVkLgotICAvLyBUaGUgZnJhZ21lbnQgb2YgYW55IFVSSSBpcyByZW1vdmVkIGJlZm9yZSBjYWNoaW5nIGl0IGhlcmUsIHRvIG1pbmltaXplCi0gIC8vIHRoZSBzaXplIG9mIHRoZSBjYWNoZSBpbiB0aGUgdXN1YWwgY2FzZSB3aGVyZSBtb3N0IFVSSXMgb25seSBkaWZmZXIgYnkKLSAgLy8gdGhlIGZyYWdtZW50LgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgdXJpQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0KLSAgLy8gVGhlIGxvd2VyLWNhc2VkIHNjaGVtZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgYXJjaGl2ZSBVUklzLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgYXJjaGl2ZVNjaGVtZXM7Ci0KLSAgLy8gSWRlbnRpZmllcyBhIGZpbGUtdHlwZSBhYnNvbHV0ZSBVUkkuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfRklMRSA9ICJmaWxlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9KQVIgPSAiamFyIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9aSVAgPSAiemlwIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9BUkNISVZFID0gImFyY2hpdmUiOwotCi0gIC8vIFNwZWNpYWwgc2VnbWVudCB2YWx1ZXMgaW50ZXJwcmV0ZWQgYXQgcmVzb2x2ZSBhbmQgcmVzb2x2ZSB0aW1lLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VHTUVOVF9FTVBUWSA9ICIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VHTUVOVF9TRUxGID0gIi4iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VHTUVOVF9QQVJFTlQgPSAiLi4iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOT19TRUdNRU5UUyA9IG5ldyBTdHJpbmdbMF07Ci0KLSAgLy8gU2VwYXJhdG9ycyBmb3IgcGFyc2luZyBhIFVSSSBzdHJpbmcuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0NIRU1FX1NFUEFSQVRPUiA9ICc6JzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWV9TRVBBUkFUT1IgPSAiLy8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIERFVklDRV9JREVOVElGSUVSID0gJzonOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNFR01FTlRfU0VQQVJBVE9SID0gJy8nOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVRVJZX1NFUEFSQVRPUiA9ICc/JzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGUkFHTUVOVF9TRVBBUkFUT1IgPSAnIyc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVVNFUl9JTkZPX1NFUEFSQVRPUiA9ICdAJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBQT1JUX1NFUEFSQVRPUiA9ICc6JzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSUxFX0VYVEVOU0lPTl9TRVBBUkFUT1IgPSAnLic7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQVJDSElWRV9JREVOVElGSUVSID0gJyEnOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJDSElWRV9TRVBBUkFUT1IgPSAiIS8iOwotCi0gIC8vIENoYXJhY3RlcnMgdG8gdXNlIGluIGVzY2FwaW5nLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEVTQ0FQRSA9ICclJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWF9ESUdJVFMgPSB7Ci0gICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnIH07Ci0KLSAgLy8gU29tZSBjaGFyYWN0ZXIgY2xhc3NlcywgYXMgZGVmaW5lZCBpbiBSRkMgMjM5NidzIEJORiBmb3IgVVJJLgotICAvLyBUaGVzZSBhcmUgMTI4LWJpdCBiaXRtYXNrcywgc3RvcmVkIGFzIHR3byBsb25ncywgd2hlcmUgdGhlIE50aCBiaXQgaXMgc2V0Ci0gIC8vIGlmZiB0aGUgQVNDSUkgY2hhcmFjdGVyIHdpdGggdmFsdWUgTiBpcyBpbmNsdWRlZCBpbiB0aGUgc2V0LiAgVGhlc2UgYXJlCi0gIC8vIGNyZWF0ZWQgd2l0aCB0aGUgaGlnaEJpdG1hc2soKSBhbmQgbG93Qml0bWFzaygpIG1ldGhvZHMgZGVmaW5lZCBiZWxvdywKLSAgLy8gYW5kIGEgY2hhcmFjdGVyIGlzIHRlc3RlZCBhZ2FpbnN0IHRoZW0gdXNpbmcgbWF0Y2hlcygpLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMUEhBX0hJID0gaGlnaEJpdG1hc2soJ2EnLCAneicpIHwgaGlnaEJpdG1hc2soJ0EnLCAnWicpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMUEhBX0xPID0gbG93Qml0bWFzaygnYScsICd6JykgIHwgbG93Qml0bWFzaygnQScsICdaJyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRElHSVRfSEkgPSBoaWdoQml0bWFzaygnMCcsICc5Jyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRElHSVRfTE8gPSBsb3dCaXRtYXNrKCcwJywgJzknKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBTFBIQU5VTV9ISSA9IEFMUEhBX0hJIHwgRElHSVRfSEk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQUxQSEFOVU1fTE8gPSBBTFBIQV9MTyB8IERJR0lUX0xPOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEhFWF9ISSA9IERJR0lUX0hJIHwgaGlnaEJpdG1hc2soJ0EnLCAnRicpIHwgaGlnaEJpdG1hc2soJ2EnLCAnZicpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEhFWF9MTyA9IERJR0lUX0xPIHwgbG93Qml0bWFzaygnQScsICdGJykgIHwgbG93Qml0bWFzaygnYScsICdmJyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVU5SRVNFUlZFRF9ISSA9IEFMUEhBTlVNX0hJIHwgaGlnaEJpdG1hc2soIi1fLiF+KicoKSIpOyAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVTlJFU0VSVkVEX0xPID0gQUxQSEFOVU1fTE8gfCBsb3dCaXRtYXNrKCItXy4hfionKCkiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRVNFUlZFRF9ISSA9IGhpZ2hCaXRtYXNrKCI7Lz86QCY9KyQsIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVTRVJWRURfTE8gPSBsb3dCaXRtYXNrKCI7Lz86QCY9KyQsIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVJJQ19ISSA9IFJFU0VSVkVEX0hJIHwgVU5SRVNFUlZFRF9ISTsgIC8vIHwgdWNzY2hhciB8IGVzY2FwZWQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUklDX0xPID0gUkVTRVJWRURfTE8gfCBVTlJFU0VSVkVEX0xPOwotCi0gIC8vIEFkZGl0aW9uYWwgdXNlZnVsIGNoYXJhY3RlciBjbGFzc2VzLCBpbmNsdWRpbmcgY2hhcmFjdGVycyB2YWxpZCBpbiBjZXJ0YWluCi0gIC8vIFVSSSBjb21wb25lbnRzIGFuZCBzZXBhcmF0b3JzIHVzZWQgaW4gcGFyc2luZyB0aGVtIG91dCBvZiBhIHN0cmluZy4gCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0VHTUVOVF9DSEFSX0hJID0gVU5SRVNFUlZFRF9ISSB8IGhpZ2hCaXRtYXNrKCI7OkAmPSskLCIpOyAgLy8gfCB1Y3NjaGFyIHwgZXNjYXBlZAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFR01FTlRfQ0hBUl9MTyA9IFVOUkVTRVJWRURfTE8gfCBsb3dCaXRtYXNrKCI7OkAmPSskLCIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBBVEhfQ0hBUl9ISSA9IFNFR01FTlRfQ0hBUl9ISSB8IGhpZ2hCaXRtYXNrKCcvJyk7ICAvLyB8IHVjc2NoYXIgfCBlc2NhcGVkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEFUSF9DSEFSX0xPID0gU0VHTUVOVF9DSEFSX0xPIHwgbG93Qml0bWFzaygnLycpOwotLy8gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0NIRU1FX0NIQVJfSEkgPSBBTFBIQU5VTV9ISSB8IGhpZ2hCaXRtYXNrKCIrLS4iKTsKLS8vICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNDSEVNRV9DSEFSX0xPID0gQUxQSEFOVU1fTE8gfCBsb3dCaXRtYXNrKCIrLS4iKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQUpPUl9TRVBBUkFUT1JfSEkgPSBoaWdoQml0bWFzaygiOi8/IyIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BSk9SX1NFUEFSQVRPUl9MTyA9IGxvd0JpdG1hc2soIjovPyMiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRUdNRU5UX0VORF9ISSA9IGhpZ2hCaXRtYXNrKCIvPyMiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRUdNRU5UX0VORF9MTyA9IGxvd0JpdG1hc2soIi8/IyIpOwotCi0gIC8vIFN0YXRpYyBpbml0aWFsaXplciBmb3IgYXJjaGl2ZVNjaGVtZXMuCi0gIHN0YXRpYwotICB7Ci0gICAgU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgc2V0LmFkZChTQ0hFTUVfSkFSKTsKLSAgICBzZXQuYWRkKFNDSEVNRV9aSVApOwotICAgIHNldC5hZGQoU0NIRU1FX0FSQ0hJVkUpOwotICAgIAotICAgIAotICAgIGFyY2hpdmVTY2hlbWVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHNldCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBsb3dlciBoYWxmIGJpdG1hc2sgZm9yIHRoZSBnaXZlbiBBU0NJSSBjaGFyYWN0ZXIuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgbG93Qml0bWFzayhjaGFyIGMpCi0gIHsKLSAgICByZXR1cm4gYyA8IDY0ID8gMUwgPDwgYyA6IDBMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdXBwZXIgaGFsZiBiaXRtYXNrIGZvciB0aGUgZ2l2ZW4gQUNTSUkgY2hhcmFjdGVyLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGhpZ2hCaXRtYXNrKGNoYXIgYykKLSAgewotICAgIHJldHVybiBjID49IDY0ICYmIGMgPCAxMjggPyAxTCA8PCAoYyAtIDY0KSA6IDBMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbG93ZXIgaGFsZiBiaXRtYXNrIGZvciBhbGwgQVNDSUkgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSB0d28KLSAgLy8gZ2l2ZW4gY2hhcmFjdGVycywgaW5jbHVzaXZlLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGxvd0JpdG1hc2soY2hhciBmcm9tLCBjaGFyIHRvKQotICB7Ci0gICAgbG9uZyByZXN1bHQgPSAwTDsKLSAgICBpZiAoZnJvbSA8IDY0ICYmIGZyb20gPD0gdG8pCi0gICAgewotICAgICAgdG8gPSB0byA8IDY0ID8gdG8gOiA2MzsKLSAgICAgIGZvciAoY2hhciBjID0gZnJvbTsgYyA8PSB0bzsgYysrKQotICAgICAgewotICAgICAgICByZXN1bHQgfD0gKDFMIDw8IGMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdXBwZXIgaGFsZiBiaXRtYXNrIGZvciBhbGwgQXNDSUkgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSB0d28KLSAgLy8gZ2l2ZW4gY2hhcmFjdGVycywgaW5jbHVzaXZlLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGhpZ2hCaXRtYXNrKGNoYXIgZnJvbSwgY2hhciB0bykKLSAgewotICAgIHJldHVybiB0byA8IDY0ID8gMCA6IGxvd0JpdG1hc2soKGNoYXIpKGZyb20gPCA2NCA/IDAgOiBmcm9tIC0gNjQpLCAoY2hhcikodG8gLSA2NCkpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbG93ZXIgaGFsZiBiaXRtYXNrIGZvciBhbGwgdGhlIEFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuCi0gIC8vIHN0cmluZy4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBsb3dCaXRtYXNrKFN0cmluZyBjaGFycykKLSAgewotICAgIGxvbmcgcmVzdWx0ID0gMEw7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IGNoYXJzLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gY2hhcnMuY2hhckF0KGkpOwotICAgICAgaWYgKGMgPCA2NCkgcmVzdWx0IHw9ICgxTCA8PCBjKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHVwcGVyIGhhbGYgYml0bWFzayBmb3IgYWxsIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbgotICAvLyBzdHJpbmcuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgaGlnaEJpdG1hc2soU3RyaW5nIGNoYXJzKQotICB7Ci0gICAgbG9uZyByZXN1bHQgPSAwTDsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gY2hhcnMubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSBjaGFycy5jaGFyQXQoaSk7Ci0gICAgICBpZiAoYyA+PSA2NCAmJiBjIDwgMTI4KSByZXN1bHQgfD0gKDFMIDw8IChjIC0gNjQpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGluIHRoZSBzZXQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbgotICAvLyBiaXRtYXNrLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoY2hhciBjLCBsb25nIGhpZ2hCaXRtYXNrLCBsb25nIGxvd0JpdG1hc2spCi0gIHsKLSAgICBpZiAoYyA+PSAxMjgpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gYyA8IDY0ID8KLSAgICAgICgoMUwgPDwgYykgJiBsb3dCaXRtYXNrKSAhPSAwIDoKLSAgICAgICgoMUwgPDwgKGMgLSA2NCkpICYgaGlnaEJpdG1hc2spICE9IDA7Ci0gIH0KLQotICAvLyBEZWJ1Z2dpbmcgbWV0aG9kOiBjb252ZXJ0cyB0aGUgZ2l2ZW4gbG9uZyB0byBhIHN0cmluZyBvZiBiaW5hcnkgZGlnaXRzLgotLyoKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvQml0cyhsb25nIGwpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICB7Ci0gICAgICBib29sZWFuIGIgPSAobCAmIDFMKSAhPSAwOwotICAgICAgcmVzdWx0Lmluc2VydCgwLCBiID8gJzEnIDogJzAnKTsKLSAgICAgIGwgPj49IDE7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotKi8KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGZvciBhIGdlbmVyaWMsIG5vbi1oaWVyYXJjaGljYWwgVVJJLiAgVGhlcmUgaXMgbm8KLSAgICogY29uY2VwdCBvZiBhIHJlbGF0aXZlIG5vbi1oaWVyYXJjaGljYWwgVVJJOyBzdWNoIGFuIG9iamVjdCBjYW5ub3QgYmUKLSAgICogY3JlYXRlZC4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMKLSAgICogbnVsbCwgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcyBhbiA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZQotICAgKiBVUkk8L2E+IHNjaGVtZSwgb3IgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiwgPGNvZGU+b3BhcXVlUGFydDwvY29kZT4sIG9yCi0gICAqIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUKLSAgICogdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkT3BhcXVlUGFydCB2YWxpZE9wYXF1ZVBhcnR9LCBvciB7QGxpbmsKLSAgICogI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIHJlc3BlY3RpdmVseS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUdlbmVyaWNVUkkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIG9wYXF1ZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKHNjaGVtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbGF0aXZlIG5vbi1oaWVyYXJjaGljYWwgVVJJIik7Ci0gICAgfQotCi0gICAgaWYgKGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vbi1oaWVyYXJjaGljYWwgYXJjaGl2ZSBVUkkiKTsKLSAgICB9Ci0KLSAgICB2YWxpZGF0ZVVSSShmYWxzZSwgc2NoZW1lLCBvcGFxdWVQYXJ0LCBudWxsLCBmYWxzZSwgTk9fU0VHTUVOVFMsIG51bGwsIGZyYWdtZW50KTsKLSAgICByZXR1cm4gbmV3IFVSSShmYWxzZSwgc2NoZW1lLCBvcGFxdWVQYXJ0LCBudWxsLCBmYWxzZSwgTk9fU0VHTUVOVFMsIG51bGwsIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZm9yIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIG5vIHBhdGguICBUaGUKLSAgICogVVJJIHdpbGwgYmUgcmVsYXRpdmUgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcyBub24tbnVsbCwgYW5kIGFic29sdXRlCi0gICAqIG90aGVyd2lzZS4gIEFuIGFic29sdXRlIFVSSSB3aXRoIG5vIHBhdGggcmVxdWlyZXMgYSBub24tbnVsbAotICAgKiA8Y29kZT5hdXRob3JpdHk8L2NvZGU+IGFuZC9vciA8Y29kZT5kZXZpY2U8L2NvZGU+LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcwotICAgKiBub24tbnVsbCB3aGlsZSA8Y29kZT5hdXRob3JpdHk8L2NvZGU+IGFuZCA8Y29kZT5kZXZpY2U8L2NvZGU+IGFyZSBudWxsLAotICAgKiBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlCi0gICAqIFVSSTwvYT4gc2NoZW1lLCBvciBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+LCA8Y29kZT5hdXRob3JpdHk8L2NvZGU+LAotICAgKiA8Y29kZT5kZXZpY2U8L2NvZGU+LCA8Y29kZT5xdWVyeTwvY29kZT4sIG9yIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QKLSAgICogdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUgdmFsaWRTaGVtZX0sIHtAbGluawotICAgKiAjdmFsaWRBdXRob3JpdHkgdmFsaWRBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwKLSAgICoge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sCi0gICAqIHJlc3BlY3RpdmVseS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUhpZXJhcmNoaWNhbFVSSShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRldmljZSwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJhYnNvbHV0ZSBoaWVyYXJjaGljYWwgVVJJIHdpdGhvdXQgYXV0aG9yaXR5LCBkZXZpY2UsIHBhdGgiKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJjaGl2ZSBVUkkgd2l0aCBubyBwYXRoIik7Ci0gICAgfQotCi0gICAgdmFsaWRhdGVVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgZmFsc2UsIE5PX1NFR01FTlRTLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGZhbHNlLCBOT19TRUdNRU5UUywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZm9yIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFic29sdXRlIHBhdGguCi0gICAqIFRoZSBVUkkgd2lsbCBiZSByZWxhdGl2ZSBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzIG5vbi1udWxsLCBhbmQKLSAgICogYWJzb2x1dGUgb3RoZXJ3aXNlLiAKLSAgICoKLSAgICogQHBhcmFtIHNlZ21lbnRzIGFuIGFycmF5IG9mIG5vbi1udWxsIHN0cmluZ3MsIGVhY2ggcmVwcmVzZW50aW5nIG9uZQotICAgKiBzZWdtZW50IG9mIHRoZSBwYXRoLiAgQXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQgaXMgYXV0b21hdGljYWxseQotICAgKiBwcmVjZWVkZWQgYnkgYSA8Y29kZT4vPC9jb2RlPiBzZXBhcmF0b3IuICBJZiBkZXNpcmVkLCBhIHRyYWlsaW5nCi0gICAqIHNlcGFyYXRvciBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHktc3RyaW5nIHNlZ21lbnQgYXMgdGhlIGxhc3QKLSAgICogZWxlbWVudCBvZiB0aGUgYXJyYXkuIAotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcwotICAgKiBhbiA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUkk8L2E+IHNjaGVtZSBhbmQgCi0gICAqIDxjb2RlPmRldmljZTwvY29kZT4gaXMgbm9uLW51bGwsIG9yIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4sCi0gICAqIDxjb2RlPmF1dGhvcml0eTwvY29kZT4sIDxjb2RlPmRldmljZTwvY29kZT4sIDxjb2RlPnNlZ21lbnRzPC9jb2RlPiwKLSAgICogPGNvZGU+cXVlcnk8L2NvZGU+LCBvciA8Y29kZT5mcmFnbWVudDwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0bwotICAgKiB7QGxpbmsgI3ZhbGlkU2NoZW1lIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0KLSAgICogb3Ige0BsaW5rICN2YWxpZEFyY2hpdmVBdXRob3JpdHkgdmFsaWRBcmNoaXZlQXV0aG9yaXR5fSwge0BsaW5rCi0gICAqICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rCi0gICAqICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIGFzCi0gICAqIGFwcHJvcHJpYXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZyBzY2hlbWUsIFN0cmluZyBhdXRob3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlLCBTdHJpbmdbXSBzZWdtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSwgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpICYmIGRldmljZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFyY2hpdmUgVVJJIHdpdGggZGV2aWNlIik7Ci0gICAgfQotCi0gICAgc2VnbWVudHMgPSBmaXgoc2VnbWVudHMpOwotICAgIHZhbGlkYXRlVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIHRydWUsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIHRydWUsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBmb3IgYSByZWxhdGl2ZSBoaWVyYXJjaGljYWwgVVJJIHdpdGggcmVsYXRpdmUKLSAgICogcGF0aC4KLSAgICoKLSAgICogQHBhcmFtIHNlZ21lbnRzIGFuIGFycmF5IG9mIG5vbi1udWxsIHN0cmluZ3MsIGVhY2ggcmVwcmVzZW50aW5nIG9uZQotICAgKiBzZWdtZW50IG9mIHRoZSBwYXRoLiAgQSB0cmFpbGluZyBzZXBhcmF0b3IgaXMgcmVwcmVzZW50ZWQgYnkgYW4KLSAgICogZW1wdHktc3RyaW5nIHNlZ21lbnQgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zZWdtZW50czwvY29kZT4sCi0gICAqIDxjb2RlPnF1ZXJ5PC9jb2RlPiwgb3IgPGNvZGU+ZnJhZ21lbnQ8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gCi0gICAqIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvcgotICAgKiB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIHJlc3BlY3RpdmVseS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUhpZXJhcmNoaWNhbFVSSShTdHJpbmdbXSBzZWdtZW50cywgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgc2VnbWVudHMgPSBmaXgoc2VnbWVudHMpOwotICAgIHZhbGlkYXRlVVJJKHRydWUsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvLyBDb252ZXJ0cyBudWxsIHRvIGxlbmd0aC16ZXJvIGFycmF5LCBhbmQgY2xvbmVzIGFycmF5IHRvIGVuc3VyZQotICAvLyBpbW11dGFiaWxpdHkuCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZpeChTdHJpbmdbXSBzZWdtZW50cykKLSAgewotICAgIHJldHVybiBzZWdtZW50cyA9PSBudWxsID8gTk9fU0VHTUVOVFMgOiAoU3RyaW5nW10pc2VnbWVudHMuY2xvbmUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEgVVJJIHN0cmluZywgd2l0aCAKLSAgICogPGEgaHJlZj0iI2RldmljZV9leHBsYW5hdGlvbiI+ZXhwbGljaXQgZGV2aWNlIHN1cHBvcnQ8L2E+IGFuZCBoYW5kbGluZwotICAgKiBmb3IgPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJczwvYT4gZW5hYmxlZC4gVGhlCi0gICAqIHNwZWNpZmllZCBzdHJpbmcgaXMgcGFyc2VkIGFzIGRlc2NyaWJlZCBpbiA8YQotICAgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDIDIzOTY8L2E+LCBhbmQgYW4KLSAgICogYXBwcm9wcmlhdGUgPGNvZGU+VVJJPC9jb2RlPiBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4gIE5vdGUgdGhhdAotICAgKiB2YWxpZGl0eSB0ZXN0aW5nIGlzIG5vdCBhcyBzdHJpY3QgYXMgaW4gdGhlIFJGQzsgZXNzZW50aWFsbHksIG9ubHkKLSAgICogc2VwYXJhdG9yIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQuICBTbywgZm9yIGV4YW1wbGUsIG5vbi1MYXRpbgotICAgKiBhbHBoYWJldCBjaGFyYWN0ZXJzIGFwcGVhcmluZyBpbiB0aGUgc2NoZW1lIHdvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFuCi0gICAqIGVycm9yLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNvbXBvbmVudCBwYXJzZWQKLSAgICogZnJvbSA8Y29kZT51cmk8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNjaGVtZQotICAgKiB2YWxpZFNjaGVtZX0sIHtAbGluayAjdmFsaWRPcGFxdWVQYXJ0IHZhbGlkT3BhcXVlUGFydH0sIHtAbGluawotICAgKiAjdmFsaWRBdXRob3JpdHkgdmFsaWRBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkQXJjaGl2ZUF1dGhvcml0eQotICAgKiB2YWxpZEFyY2hpdmVBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwge0BsaW5rCi0gICAqICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluawotICAgKiAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgYXMgYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiBjcmVhdGVVUklXaXRoQ2FjaGUodXJpKTsgCi0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIHRoYXQgZW5jb2RlcyBhbmQgcGFyc2VzIHRoZSBnaXZlbiBVUkkgc3RyaW5nLgotICAgKiBBcHByb3ByaWF0ZSBlbmNvZGluZyBpcyBwZXJmb3JtZWQgZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBVUkkuCi0gICAqIElmIG1vcmUgdGhhbiBvbmUgPGNvZGU+IzwvY29kZT4gaXMgaW4gdGhlIHN0cmluZywgdGhlIGxhc3Qgb25lIGlzCi0gICAqIGFzc3VtZWQgdG8gYmUgdGhlIGZyYWdtZW50J3Mgc2VwYXJhdG9yLCBhbmQgYW55IG90aGVycyBhcmUgZW5jb2RlZC4KLSAgICogIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIDxjb2RlPnVyaTwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2NoZW1lCi0gICAqIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZE9wYXF1ZVBhcnQgdmFsaWRPcGFxdWVQYXJ0fSwge0BsaW5rCi0gICAqICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluayAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5Ci0gICAqIHZhbGlkQXJjaGl2ZUF1dGhvcml0eX0sIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCB7QGxpbmsKLSAgICogI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rCi0gICAqICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCBhcyBhcHByb3ByaWF0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlVVJJV2l0aENhY2hlKGVuY29kZVVSSSh1cmksIGlnbm9yZUVzY2FwZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgYmFzZWQgb24gcGFyc2luZyBhIFVSSSBzdHJpbmcsIHdpdGggCi0gICAqIDxhIGhyZWY9IiNkZXZpY2VfZXhwbGFuYXRpb24iPmV4cGxpY2l0IGRldmljZSBzdXBwb3J0PC9hPiBlbmFibGVkLiAgCi0gICAqIE5vdGUgdGhhdCB2YWxpZGl0eSB0ZXN0aW5nIGlzIG5vdCBhIHN0cmljdCBhcyBpbiB0aGUgUkZDOyBlc3NlbnRpYWxseSwKLSAgICogb25seSBzZXBhcmF0b3IgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZC4gIFNvLCBmb3IgZXhhbXBsZSwgbm9uLUxhdGluCi0gICAqIGFscGhhYmV0IGNoYXJhY3RlcnMgYXBwZWFyaW5nIGluIHRoZSBzY2hlbWUgd291bGQgbm90IGJlIGNvbnNpZGVyZWQgYW4KLSAgICogZXJyb3IuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIDxjb2RlPnVyaTwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2NoZW1lCi0gICAqIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZE9wYXF1ZVBhcnQgdmFsaWRPcGFxdWVQYXJ0fSwge0BsaW5rCi0gICAqICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluayAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5Ci0gICAqIHZhbGlkQXJjaGl2ZUF1dGhvcml0eX0sIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCB7QGxpbmsKLSAgICogI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rCi0gICAqICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCBhcyBhcHByb3ByaWF0ZS4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY3JlYXRlVVJJIGNyZWF0ZVVSSX0sIHdoaWNoIG5vdyBoYXMgZXhwbGljaXQKLSAgICogZGV2aWNlIHN1cHBvcnQgZW5hYmxlZC4gVGhlIHR3byBtZXRob2RzIG5vdyBvcGVyYXRlIGlkZW50aWNhbGx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlRGV2aWNlVVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlVVJJV2l0aENhY2hlKHVyaSk7Ci0gIH0KLQotICAvLyBVc2VzIGEgY2FjaGUgdG8gc3BlZWQgdXAgY3JlYXRpb24gb2YgYSBVUkkgZnJvbSBhIHN0cmluZy4gIFRoZSBjYWNoZQotICAvLyBpcyBjb25zdWx0ZWQgdG8gc2VlIGlmIHRoZSBVUkksIGxlc3MgYW55IGZyYWdtZW50LCBoYXMgYWxyZWFkeSBiZWVuCi0gIC8vIGNyZWF0ZWQuICBJZiBuZWVkZWQsIHRoZSBmcmFnbWVudCBpcyByZS1hcHBlbmRlZCB0byB0aGUgY2FjaGVkIFVSSSwKLSAgLy8gd2hpY2ggaXMgY29uc2lkZXJhYmx5IG1vcmUgZWZmaWNpZW50IHRoYW4gY3JlYXRpbmcgdGhlIHdob2xlIFVSSSBmcm9tCi0gIC8vIHNjcmF0Y2guICBJZiB0aGUgVVJJIHdhc24ndCBmb3VuZCBpbiB0aGUgY2FjaGUsIGl0IGlzIGNyZWF0ZWQgdXNpbmcKLSAgLy8gcGFyc2VJbnRvVVJJKCkgYW5kIHRoZW4gY2FjaGVkLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSB1c2VkCi0gIC8vIGJ5IHN0cmluZy1wYXJzaW5nIGZhY3RvcnkgbWV0aG9kcywgaW5zdGVhZCBvZiBwYXJzZUludG9VUkkoKSBkaXJlY3RseS4KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdhcyBpbmNsdWRlZCBpbiB0aGUgcHVibGljIEFQSSBieSBtaXN0YWtlLgotICAgKiAKLSAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgI2NyZWF0ZVVSSSBjcmVhdGVVUkl9IGluc3RlYWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUklXaXRoQ2FjaGUoU3RyaW5nIHVyaSkKLSAgewotICAgIGludCBpID0gdXJpLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SKTsKLSAgICBTdHJpbmcgYmFzZSA9IGkgPT0gLTEgPyB1cmkgOiB1cmkuc3Vic3RyaW5nKDAsIGkpOwotICAgIFN0cmluZyBmcmFnbWVudCA9IGkgPT0gLTEgPyBudWxsIDogdXJpLnN1YnN0cmluZyhpICsgMSk7Ci0KLSAgICBVUkkgcmVzdWx0ID0gKFVSSSl1cmlDYWNoZS5nZXQoYmFzZSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gcGFyc2VJbnRvVVJJKGJhc2UpOwotICAgICAgdXJpQ2FjaGUucHV0KGJhc2UsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgaWYgKGZyYWdtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gcmVzdWx0LmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFN0cmluZy1wYXJzaW5nIGltcGxlbWVudGF0aW9uLgotICBwcml2YXRlIHN0YXRpYyBVUkkgcGFyc2VJbnRvVVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIGhpZXJhcmNoaWNhbCA9IHRydWU7Ci0gICAgU3RyaW5nIHNjaGVtZSA9IG51bGw7Ci0gICAgU3RyaW5nIGF1dGhvcml0eSA9IG51bGw7Ci0gICAgU3RyaW5nIGRldmljZSA9IG51bGw7Ci0gICAgYm9vbGVhbiBhYnNvbHV0ZVBhdGggPSBmYWxzZTsKLSAgICBTdHJpbmdbXSBzZWdtZW50cyA9IE5PX1NFR01FTlRTOwotICAgIFN0cmluZyBxdWVyeSA9IG51bGw7Ci0gICAgU3RyaW5nIGZyYWdtZW50ID0gbnVsbDsKLQotICAgIGludCBpID0gMDsKLSAgICBpbnQgaiA9IGZpbmQodXJpLCBpLCBNQUpPUl9TRVBBUkFUT1JfSEksIE1BSk9SX1NFUEFSQVRPUl9MTyk7Ci0KLSAgICBpZiAoaiA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGopID09IFNDSEVNRV9TRVBBUkFUT1IpCi0gICAgewotICAgICAgc2NoZW1lID0gdXJpLnN1YnN0cmluZyhpLCBqKTsKLSAgICAgIGkgPSBqICsgMTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGFyY2hpdmVTY2hlbWUgPSBpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKTsKLSAgICBpZiAoYXJjaGl2ZVNjaGVtZSkKLSAgICB7Ci0gICAgICBqID0gdXJpLmxhc3RJbmRleE9mKEFSQ0hJVkVfU0VQQVJBVE9SKTsKLSAgICAgIGlmIChqID09IC0xKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBhcmNoaXZlIHNlcGFyYXRvciIpOwotICAgICAgfQotICAgICAgaGllcmFyY2hpY2FsID0gdHJ1ZTsKLSAgICAgIGF1dGhvcml0eSA9IHVyaS5zdWJzdHJpbmcoaSwgKytqKTsKLSAgICAgIGkgPSBqOwotICAgIH0KLSAgICBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aChBVVRIT1JJVFlfU0VQQVJBVE9SLCBpKSkKLSAgICB7Ci0gICAgICBpICs9IEFVVEhPUklUWV9TRVBBUkFUT1IubGVuZ3RoKCk7Ci0gICAgICBqID0gZmluZCh1cmksIGksIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0gICAgICBhdXRob3JpdHkgPSB1cmkuc3Vic3RyaW5nKGksIGopOwotICAgICAgaSA9IGo7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNjaGVtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgKGkgPT0gdXJpLmxlbmd0aCgpIHx8IHVyaS5jaGFyQXQoaSkgIT0gU0VHTUVOVF9TRVBBUkFUT1IpKQotICAgIHsKLSAgICAgIGhpZXJhcmNoaWNhbCA9IGZhbHNlOwotICAgICAgaiA9IHVyaS5pbmRleE9mKEZSQUdNRU5UX1NFUEFSQVRPUiwgaSk7Ci0gICAgICBpZiAoaiA9PSAtMSkgaiA9IHVyaS5sZW5ndGgoKTsKLSAgICAgIGF1dGhvcml0eSA9IHVyaS5zdWJzdHJpbmcoaSwgaik7Ci0gICAgICBpID0gajsKLSAgICB9Ci0KLSAgICBpZiAoIWFyY2hpdmVTY2hlbWUgJiYgaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpID09IFNFR01FTlRfU0VQQVJBVE9SKQotICAgIHsKLSAgICAgIGogPSBmaW5kKHVyaSwgaSArIDEsIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0gICAgICBTdHJpbmcgcyA9IHVyaS5zdWJzdHJpbmcoaSArIDEsIGopOwotICAgICAgCi0gICAgICBpZiAocy5sZW5ndGgoKSA+IDAgJiYgcy5jaGFyQXQocy5sZW5ndGgoKSAtIDEpID09IERFVklDRV9JREVOVElGSUVSKQotICAgICAgewotICAgICAgICBkZXZpY2UgPSBzOwotICAgICAgICBpID0gajsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpID09IFNFR01FTlRfU0VQQVJBVE9SKQotICAgIHsKLSAgICAgIGkrKzsKLSAgICAgIGFic29sdXRlUGF0aCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHNlZ21lbnRzUmVtYWluKHVyaSwgaSkpCi0gICAgewotICAgICAgTGlzdCBzZWdtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgd2hpbGUgKHNlZ21lbnRzUmVtYWluKHVyaSwgaSkpCi0gICAgICB7Ci0gICAgICAgIGogPSBmaW5kKHVyaSwgaSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLSAgICAgICAgc2VnbWVudExpc3QuYWRkKHVyaS5zdWJzdHJpbmcoaSwgaikpOwotICAgICAgICBpID0gajsKLQotICAgICAgICBpZiAoaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpID09IFNFR01FTlRfU0VQQVJBVE9SKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFzZWdtZW50c1JlbWFpbih1cmksICsraSkpIHNlZ21lbnRMaXN0LmFkZChTRUdNRU5UX0VNUFRZKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2VnbWVudHMgPSBuZXcgU3RyaW5nW3NlZ21lbnRMaXN0LnNpemUoKV07Ci0gICAgICBzZWdtZW50TGlzdC50b0FycmF5KHNlZ21lbnRzKTsKLSAgICB9Ci0KLSAgICBpZiAoaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpID09IFFVRVJZX1NFUEFSQVRPUikKLSAgICB7Ci0gICAgICBqID0gdXJpLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SLCArK2kpOwotICAgICAgaWYgKGogPT0gLTEpIGogPSB1cmkubGVuZ3RoKCk7Ci0gICAgICBxdWVyeSA9IHVyaS5zdWJzdHJpbmcoaSwgaik7Ci0gICAgICBpID0gajsKLSAgICB9Ci0KLSAgICBpZiAoaSA8IHVyaS5sZW5ndGgoKSkgLy8gJiYgdXJpLmNoYXJBdChpKSA9PSBGUkFHTUVOVF9TRVBBUkFUT1IgKGltcGxpZWQpCi0gICAgewotICAgICAgZnJhZ21lbnQgPSB1cmkuc3Vic3RyaW5nKCsraSk7Ci0gICAgfQotCi0gICAgdmFsaWRhdGVVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBzdHJpbmcgY29udGFpbnMgYW55IG1vcmUgc2VnbWVudHMgYWZ0ZXIgdGhlIG9uZSB0aGF0Ci0gIC8vIHN0YXJ0cyBhdCBwb3NpdGlvbiBpLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlZ21lbnRzUmVtYWluKFN0cmluZyB1cmksIGludCBpKQotICB7Ci0gICAgcmV0dXJuIGkgPCB1cmkubGVuZ3RoKCkgJiYgdXJpLmNoYXJBdChpKSAhPSBRVUVSWV9TRVBBUkFUT1IgJiYKLSAgICAgIHVyaS5jaGFyQXQoaSkgIT0gRlJBR01FTlRfU0VQQVJBVE9SOwotICB9Ci0KLSAgLy8gRmluZHMgdGhlIG5leHQgb2NjdXJhbmNlIG9mIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc2V0IHJlcHJlc2VudGVkCi0gIC8vIGJ5IHRoZSBnaXZlbiBiaXRtYXNrIGluIHRoZSBnaXZlbiBzdHJpbmcsIGJlZ2lubmluZyBhdCBpbmRleCBpLiBUaGUgaW5kZXgKLSAgLy8gb2YgdGhlIGZpcnN0IGZvdW5kIGNoYXJhY3Rlciwgb3Igcy5sZW5ndGgoKSBpZiB0aGVyZSBpcyBub25lLCBpcwotICAvLyByZXR1cm5lZC4gIEJlZm9yZSBzZWFyY2hpbmcsIGkgaXMgbGltaXRlZCB0byB0aGUgcmFuZ2UgWzAsIHMubGVuZ3RoKCldLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZChTdHJpbmcgcywgaW50IGksIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaykKLSAgewotICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOwotICAgIGlmIChpID49IGxlbikgcmV0dXJuIGxlbjsKLQotICAgIGZvciAoaSA9IGkgPiAwID8gaSA6IDA7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAobWF0Y2hlcyhzLmNoYXJBdChpKSwgaGlnaEJpdG1hc2ssIGxvd0JpdG1hc2spKSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGJhc2VkIG9uIHBhcnNpbmcgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBwYXRoCi0gICAqIHN0cmluZy4gIFRoZSA8Y29kZT5wYXRoTmFtZTwvY29kZT4gaXMgY29udmVydGVkIGludG8gYW4gYXBwcm9wcmlhdGUKLSAgICogZm9ybSwgYXMgZm9sbG93czogcGxhdGZvcm0gc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3JzIGFyZSBjb252ZXJ0ZWQgdG8KLSAgICogPGNvZGU+Lzxjb2RlPjsgdGhlIHBhdGggaXMgZW5jb2RlZDsgYW5kIGEgImZpbGUiIHNjaGVtZSBhbmQsIGlmIG1pc3NpbmcsCi0gICAqIGEgbGVhZGluZyA8Y29kZT4vPC9jb2RlPiwgYXJlIGFkZGVkIHRvIGFuIGFic29sdXRlIHBhdGguICBUaGUgcmVzdWx0Ci0gICAqIGlzIHRoZW4gcGFyc2VkIHVzaW5nIHtAbGluayAjY3JlYXRlVVJJKFN0cmluZykgY3JlYXRlVVJJfS4KLSAgICoKLSAgICogPHA+VGhlIGVuY29kaW5nIHN0ZXAgZXNjYXBlcyBhbGwgc3BhY2VzLCA8Y29kZT4jPC9jb2RlPiBjaGFyYWN0ZXJzLCBhbmQKLSAgICogb3RoZXIgY2hhcmFjdGVycyBkaXNhbGxvd2VkIGluIFVSSXMsIGFzIHdlbGwgYXMgPGNvZGU+PzwvY29kZT4sIHdoaWNoCi0gICAqIHdvdWxkIGRlbGltaXQgYSBwYXRoIGZyb20gYSBxdWVyeS4gIERlY29kaW5nIGlzIGF1dG9tYXRpY2FsbHkgcGVyZm9ybWVkCi0gICAqIGJ5IHtAbGluayAjdG9GaWxlU3RyaW5nIHRvRmlsZVN0cmluZ30sIGFuZCBjYW4gYmUgYXBwbGllZCB0byB0aGUgdmFsdWVzCi0gICAqIHJldHVybmVkIGJ5IG90aGVyIGFjY2Vzc29ycyBieSB2aWEgdGhlIHN0YXRpYyB7QGxpbmsgI2RlY29kZShTdHJpbmcpCi0gICAqIGRlY29kZX0gbWV0aG9kLgotICAgKgotICAgKiA8cD5BIHJlbGF0aXZlIHBhdGggd2l0aCBhIHNwZWNpZmllZCBkZXZpY2UgKHNvbWV0aGluZyBsaWtlCi0gICAqIDxjb2RlPkM6bXlmaWxlLnR4dDwvY29kZT4pIGNhbm5vdCBiZSBleHByZXNzZWQgYXMgYSB2YWxpZCBVUkkuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+cGF0aE5hbWU8L2NvZGU+Ci0gICAqIHNwZWNpZmllcyBhIGRldmljZSBhbmQgYSByZWxhdGl2ZSBwYXRoLCBvciBpZiBhbnkgY29tcG9uZW50IG9mIHRoZSBwYXRoCi0gICAqIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluawotICAgKiAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCBvciB7QGxpbmsgI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sCi0gICAqIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlRmlsZVVSSShTdHJpbmcgcGF0aE5hbWUpCi0gIHsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoTmFtZSk7Ci0gICAgU3RyaW5nIHVyaSA9IEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycgPyBwYXRoTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgU0VHTUVOVF9TRVBBUkFUT1IpIDogcGF0aE5hbWU7Ci0gICAgdXJpID0gZW5jb2RlKHVyaSwgUEFUSF9DSEFSX0hJLCBQQVRIX0NIQVJfTE8sIGZhbHNlKTsKLSAgICBpZiAoZmlsZS5pc0Fic29sdXRlKCkpCi0gICAgewotICAgICAgVVJJIHJlc3VsdCA9IGNyZWF0ZVVSSSgodXJpLmNoYXJBdCgwKSA9PSBTRUdNRU5UX1NFUEFSQVRPUiA/ICJmaWxlOiIgOiAiZmlsZTovIikgKyB1cmkpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFVSSSByZXN1bHQgPSBjcmVhdGVVUkkodXJpKTsKLSAgICAgIGlmIChyZXN1bHQuc2NoZW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCByZWxhdGl2ZSBwYXRoTmFtZTogIiArIHBhdGhOYW1lKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEgcGxhdGZvcm0tcmVsYXRpdmUgcGF0aCBzdHJpbmcuCi0gICAqCi0gICAqIDxwPlRoZSA8Y29kZT5wYXRoTmFtZTwvY29kZT4gbXVzdCBiZSBvZiB0aGUgZm9ybToKLSAgICogPHByZT4KLSAgICogICAvcHJvamVjdC1uYW1lL3BhdGg8L3ByZT4KLSAgICoKLSAgICogPHA+UGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3JzIHdpbGwgYmUgY29udmVydGVydGVkIHRvIHNsYXNoZXMuCi0gICAqIElmIG5vdCBpbmNsdWRlZCwgdGhlIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3Igd2lsbCBiZSBhZGRlZC4gIFRoZQotICAgKiByZXN1bHQgd2lsbCBiZSBvZiB0aGlzIGZvcm0sIHdoaWNoIGlzIHBhcnNlZCB1c2luZyB7QGxpbmsgI2NyZWF0ZVVSSQotICAgKiBjcmVhdGVVUkl9OgotICAgKiA8cHJlPgotICAgKiAgIHBsYXRmb3JtOi9yZXNvdXJjZS9wcm9qZWN0LW5hbWUvcGF0aDwvcHJlPgotICAgKgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gdGhlIHBhdGggaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwKLSAgICoge0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yCi0gICAqIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fS4KLSAgICoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0jcmVzb2x2ZQotICAgKiBAc2VlICNjcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKFN0cmluZywgYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoU3RyaW5nIHBhdGhOYW1lKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocGF0aE5hbWUsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgYmFzZWQgb24gcGFyc2luZyBhIHBsYXRmb3JtLXJlbGF0aXZlIHBhdGggc3RyaW5nLAotICAgKiB3aXRoIGFuIG9wdGlvbiB0byBlbmNvZGUgdGhlIGNyZWF0ZWQgVVJJLgotICAgKgotICAgKiA8cD5UaGUgPGNvZGU+cGF0aE5hbWU8L2NvZGU+IG11c3QgYmUgb2YgdGhlIGZvcm06Ci0gICAqIDxwcmU+Ci0gICAqICAgL3Byb2plY3QtbmFtZS9wYXRoPC9wcmU+Ci0gICAqCi0gICAqIDxwPlBsYXRmb3JtLXNwZWNpZmljIHBhdGggc2VwYXJhdG9ycyB3aWxsIGJlIGNvbnZlcnRlcnRlZCB0byBzbGFzaGVzLgotICAgKiBJZiBub3QgaW5jbHVkZWQsIHRoZSBsZWFkaW5nIHBhdGggc2VwYXJhdG9yIHdpbGwgYmUgYWRkZWQuICBUaGUKLSAgICogcmVzdWx0IHdpbGwgYmUgb2YgdGhpcyBmb3JtLCB3aGljaCBpcyBwYXJzZWQgdXNpbmcge0BsaW5rICNjcmVhdGVVUkkKLSAgICogY3JlYXRlVVJJfToKLSAgICogPHByZT4KLSAgICogICBwbGF0Zm9ybTovcmVzb3VyY2UvcHJvamVjdC1uYW1lL3BhdGg8L3ByZT4KLSAgICoKLSAgICogPHA+VGhpcyBzY2hlbWUgc3VwcG9ydHMgcmVsb2NhdGFibGUgcHJvamVjdHMgaW4gRWNsaXBzZSBhbmQgaW4KLSAgICogc3RhbmQtYWxvbmUgLgotICAgKgotICAgKiA8cD5EZXBlbmRpbmcgb24gdGhlIDxjb2RlPmVuY29kZTwvY29kZT4gYXJndW1lbnQsIHRoZSBwYXRoIG1heSBiZQotICAgKiBhdXRvbWF0aWNhbGx5IGVuY29kZWQgdG8gZXNjYXBlIGFsbCBzcGFjZXMsIDxjb2RlPiM8L2NvZGU+IGNoYXJhY3RlcnMsCi0gICAqIGFuZCBvdGhlciBjaGFyYWN0ZXJzIGRpc2FsbG93ZWQgaW4gVVJJcywgYXMgd2VsbCBhcyA8Y29kZT4/PC9jb2RlPiwKLSAgICogd2hpY2ggd291bGQgZGVsaW1pdCBhIHBhdGggZnJvbSBhIHF1ZXJ5LiAgRGVjb2RpbmcgY2FuIGJlIHBlcmZvcm1lZCB3aXRoCi0gICAqIHRoZSBzdGF0aWMge0BsaW5rICNkZWNvZGUoU3RyaW5nKSBkZWNvZGV9IG1ldGhvZC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIHRoZSBwYXRoIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sCi0gICAqIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvcgotICAgKiB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0uCi0gICAqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtI3Jlc29sdmUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoU3RyaW5nIHBhdGhOYW1lLCBib29sZWFuIGVuY29kZSkKLSAgewotICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgewotICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgIH0KLQotICAgIGlmIChlbmNvZGUpCi0gICAgewotICAgICAgcGF0aE5hbWUgPSBlbmNvZGUocGF0aE5hbWUsIFBBVEhfQ0hBUl9ISSwgUEFUSF9DSEFSX0xPLCBmYWxzZSk7Ci0gICAgfQotICAgIFVSSSByZXN1bHQgPSBjcmVhdGVVUkkoKHBhdGhOYW1lLmNoYXJBdCgwKSA9PSBTRUdNRU5UX1NFUEFSQVRPUiA/ICJwbGF0Zm9ybTovcmVzb3VyY2UiIDogInBsYXRmb3JtOi9yZXNvdXJjZS8iKSArIHBhdGhOYW1lKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yIGZvciB1c2Ugb2Ygc3RhdGljIGZhY3RvcnkgbWV0aG9kcy4KLSAgcHJpdmF0ZSBVUkkoYm9vbGVhbiBoaWVyYXJjaGljYWwsIFN0cmluZyBzY2hlbWUsIFN0cmluZyBhdXRob3JpdHksCi0gICAgICAgICAgICAgIFN0cmluZyBkZXZpY2UsIGJvb2xlYW4gYWJzb2x1dGVQYXRoLCBTdHJpbmdbXSBzZWdtZW50cywKLSAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpbnQgaGFzaENvZGUgPSAwOwotICAgIC8vYm9vbGVhbiBpcmkgPSBmYWxzZTsKLQotICAgIGlmIChoaWVyYXJjaGljYWwpCi0gICAgewotICAgICAgKytoYXNoQ29kZTsKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSArPSAyOwotICAgIH0KLSAgICBpZiAoc2NoZW1lICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gc2NoZW1lLnRvTG93ZXJDYXNlKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgaWYgKGF1dGhvcml0eSAhPSBudWxsKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IGF1dGhvcml0eS5oYXNoQ29kZSgpOwotICAgICAgLy9pcmkgPSBpcmkgfHwgY29udGFpbnNOb25BU0NJSShhdXRob3JpdHkpOwotICAgIH0KLSAgICBpZiAoZGV2aWNlICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gZGV2aWNlLmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKGRldmljZSk7Ci0gICAgfQotICAgIGlmIChxdWVyeSAhPSBudWxsKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IHF1ZXJ5Lmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKHF1ZXJ5KTsKLSAgICB9Ci0gICAgaWYgKGZyYWdtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gZnJhZ21lbnQuaGFzaENvZGUoKTsKLSAgICAgIC8vaXJpID0gaXJpIHx8IGNvbnRhaW5zTm9uQVNDSUkoZnJhZ21lbnQpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBzZWdtZW50c1tpXS5oYXNoQ29kZSgpOwotICAgICAgLy9pcmkgPSBpcmkgfHwgY29udGFpbnNOb25BU0NJSShzZWdtZW50c1tpXSk7Ci0gICAgfQotCi0gICAgdGhpcy5oYXNoQ29kZSA9IGhhc2hDb2RlOwotICAgIC8vdGhpcy5pcmkgPSBpcmk7Ci0gICAgdGhpcy5oaWVyYXJjaGljYWwgPSBoaWVyYXJjaGljYWw7Ci0gICAgdGhpcy5zY2hlbWUgPSBzY2hlbWUgPT0gbnVsbCA/IG51bGwgOiBzY2hlbWUuaW50ZXJuKCk7Ci0gICAgdGhpcy5hdXRob3JpdHkgPSBhdXRob3JpdHk7Ci0gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7Ci0gICAgdGhpcy5hYnNvbHV0ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0gICAgdGhpcy5zZWdtZW50cyA9IHNlZ21lbnRzOwotICAgIHRoaXMucXVlcnkgPSBxdWVyeTsKLSAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7Ci0gIH0KLSAgCi0gIC8vIFZhbGlkYXRlcyBhbGwgb2YgdGhlIFVSSSBjb21wb25lbnRzLiAgRmFjdG9yeSBtZXRob2RzIHNob3VsZCBjYWxsIHRoaXMKLSAgLy8gYmVmb3JlIHVzaW5nIHRoZSBjb25zdHJ1Y3RvciwgdGhvdWdoIHRoZXkgbXVzdCBlbnN1cmUgdGhhdCB0aGUKLSAgLy8gaW50ZXItY29tcG9uZW50IHJlcXVpcmVtZW50cyBkZXNjcmliZWQgaW4gdGhlaXIgb3duIEphdmFkb2NzIGFyZSBhbGwKLSAgLy8gc2F0aXNmaWVkLCB0aGVtc2VsdmVzLiAgSWYgYSBuZXcgVVJJIGlzIGJlaW5nIGNvbnN0cnVjdGVkIG91dCBvZgotICAvLyBhbiBleGlzdGluZyBVUkksIHRoaXMgbmVlZCBub3QgYmUgY2FsbGVkLiAgSW5zdGVhZCwganVzdCB0aGUgbmV3Ci0gIC8vIGNvbXBvbmVudHMgbWF5IGJlIHZhbGlkYXRlZCBpbmRpdmlkdWFsbHkuCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVVUkkoYm9vbGVhbiBoaWVyYXJjaGljYWwsIFN0cmluZyBzY2hlbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5LCBTdHJpbmcgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhYnNvbHV0ZVBhdGgsIFN0cmluZ1tdIHNlZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoIXZhbGlkU2NoZW1lKHNjaGVtZSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzY2hlbWU6ICIgKyBzY2hlbWUpOwotICAgIH0KLSAgICBpZiAoIWhpZXJhcmNoaWNhbCAmJiAhdmFsaWRPcGFxdWVQYXJ0KGF1dGhvcml0eSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBvcGFxdWVQYXJ0OiAiICsgYXV0aG9yaXR5KTsKLSAgICB9Ci0gICAgaWYgKGhpZXJhcmNoaWNhbCAmJiAhaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkgJiYgIXZhbGlkQXV0aG9yaXR5KGF1dGhvcml0eSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBhdXRob3JpdHk6ICIgKyBhdXRob3JpdHkpOwotICAgIH0KLSAgICBpZiAoaGllcmFyY2hpY2FsICYmIGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpICYmICF2YWxpZEFyY2hpdmVBdXRob3JpdHkoYXV0aG9yaXR5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGF1dGhvcml0eTogIiArIGF1dGhvcml0eSk7Ci0gICAgfQotICAgIGlmICghdmFsaWREZXZpY2UoZGV2aWNlKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGRldmljZTogIiArIGRldmljZSk7Ci0gICAgfQotICAgIGlmICghdmFsaWRTZWdtZW50cyhzZWdtZW50cykpCi0gICAgewotICAgICAgU3RyaW5nIHMgPSBzZWdtZW50cyA9PSBudWxsID8gImludmFsaWQgc2VnbWVudHM6ICIgKyBzZWdtZW50cyA6Ci0gICAgICAgICJpbnZhbGlkIHNlZ21lbnQ6ICIgKyBmaXJzdEludmFsaWRTZWdtZW50KHNlZ21lbnRzKTsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocyk7Ci0gICAgfQotICAgIGlmICghdmFsaWRRdWVyeShxdWVyeSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBxdWVyeTogIiArIHF1ZXJ5KTsKLSAgICB9Ci0gICAgaWYgKCF2YWxpZEZyYWdtZW50KGZyYWdtZW50KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGZyYWdtZW50OiAiICsgZnJhZ21lbnQpOwotICAgIH0KLSAgfQotCi0gIC8vIEFsdGVybmF0ZSwgc3RyaWN0ZXIgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBtZXRob2RzCi0gIC8vIGFyZSBwcm92aWRlZCwgY29tbWVudGVkIG91dCwgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UuLi4KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgc2NoZW1lIGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBzY2hlbWUgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZQotICAgKiBmb2xsb3dpbmc6IDxjb2RlPjogLyA/ICM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRTY2hlbWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIWNvbnRhaW5zKHZhbHVlLCBNQUpPUl9TRVBBUkFUT1JfSEksIE1BSk9SX1NFUEFSQVRPUl9MTyk7ICAKLQotICAvLyA8cD5BIHZhbGlkIHNjaGVtZSBtYXkgYmUgbnVsbCwgb3IgY29uc2lzdCBvZiBhIHNpbmdsZSBsZXR0ZXIgZm9sbG93ZWQKLSAgLy8gYnkgYW55IG51bWJlciBvZiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgotICAvLyA8Y29kZT4rIC0gLjwvY29kZT4KLQotICAgIC8vaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0cnVlOwotICAgIC8vcmV0dXJuIHZhbHVlLmxlbmd0aCgpICE9IDAgJiYKLSAgICAvLyAgbWF0Y2hlcyh2YWx1ZS5jaGFyQXQoMCksIEFMUEhBX0hJLCBBTFBIQV9MTykgJiYKLSAgICAvLyAgdmFsaWRhdGUodmFsdWUsIFNDSEVNRV9DSEFSX0hJLCBTQ0hFTUVfQ0hBUl9MTywgZmFsc2UsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBvcGFxdWUgcGFydCBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgb3BhcXVlIHBhcnQgbXVzdCBiZSBub24tbnVsbCwgbm9uLWVtcHR5LCBhbmQgbm90IGNvbnRhaW4gdGhlCi0gICAqIDxjb2RlPiM8L2NvZGU+IGNoYXJhY3Rlci4gIEluIGFkZGl0aW9uLCBpdHMgZmlyc3QgY2hhcmFjdGVyIG11c3Qgbm90IGJlCi0gICAqIDxjb2RlPi88L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRPcGFxdWVQYXJ0KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SKSA9PSAtMSAmJgotICAgIHZhbHVlLmxlbmd0aCgpID4gMCAmJiB2YWx1ZS5jaGFyQXQoMCkgIT0gU0VHTUVOVF9TRVBBUkFUT1I7Ci0KLSAgLy8gPHA+QSB2YWxpZCBvcGFxdWUgcGFydCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub24tZW1wdHkuIEl0IG1heSBjb250YWluCi0gIC8vIGFueSBhbGxvd2VkIFVSSSBjaGFyYWN0ZXJzLCBidXQgaXRzIGZpcnN0IGNoYXJhY3RlciBtYXkgbm90IGJlCi0gIC8vIDxjb2RlPi88L2NvZGU+IAotCi0gICAgLy9yZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSAhPSAwICYmCi0gICAgLy8gIHZhbHVlLmNoYXJBdCgwKSAhPSBTRUdNRU5UX1NFUEFSQVRPUiAmJgotICAgIC8vICB2YWxpZGF0ZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBhdXRob3JpdHkgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgY2hhcmFjdGVycyBleGNlcHQgZm9yCi0gICAqIHRoZSBmb2xsb3dpbmc6IDxjb2RlPi8gPyAjPC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkQXV0aG9yaXR5KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8ICFjb250YWlucyh2YWx1ZSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLQotICAvLyBBIHZhbGlkIGF1dGhvcml0eSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBhbGxvd2VkIFVSSSBjaGFyYWN0ZXJzIGV4Y2VwdAotICAvLyBmb3IgdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/PC9jb2RlPgotCi0gICAgLy9yZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWxpZGF0ZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgb2YgYW4gPGEKLSAgICogaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPjsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+VG8gYmUgdmFsaWQsIHRoZSBhdXRob3JpdHksIGl0c2VsZiwgbXVzdCBiZSBhIFVSSSB3aXRoIG5vIGZyYWdtZW50LAotICAgKiBmb2xsb3dlZCBieSB0aGUgY2hhcmFjdGVyIDxjb2RlPiE8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkQXJjaGl2ZUF1dGhvcml0eShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDAgJiYKLSAgICAgICAgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCgpIC0gMSkgPT0gQVJDSElWRV9JREVOVElGSUVSKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBVUkkgYXJjaGl2ZVVSSSA9IGNyZWF0ZVVSSSh2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgIHJldHVybiAhYXJjaGl2ZVVSSS5oYXNGcmFnbWVudCgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBkZXZpY2UgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIGRldmljZSBtYXkgYmUgbnVsbCBvciBub24tZW1wdHksIGNvbnRhaW5pbmcgYW55IGNoYXJhY3RlcnMKLSAgICogZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nOiA8Y29kZT4vID8gIzwvY29kZT4gIEluIGFkZGl0aW9uLCBpdHMgbGFzdAotICAgKiBjaGFyYWN0ZXIgbXVzdCBiZSA8Y29kZT46PC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRGV2aWNlKFN0cmluZyB2YWx1ZSkKLSAgeyAgICAKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgaW50IGxlbiA9IHZhbHVlLmxlbmd0aCgpOwotICAgIHJldHVybiBsZW4gPiAwICYmIHZhbHVlLmNoYXJBdChsZW4gLSAxKSA9PSBERVZJQ0VfSURFTlRJRklFUiAmJgotICAgICAgIWNvbnRhaW5zKHZhbHVlLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotCi0gIC8vIDxwPkEgdmFsaWQgZGV2aWNlIG1heSBiZSBudWxsIG9yIG5vbi1lbXB0eSwgY29udGFpbmluZyBhbnkgYWxsb3dlZCBVUkkKLSAgLy8gY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmc6IDxjb2RlPi8gPzwvY29kZT4gIEluIGFkZGl0aW9uLCBpdHMKLSAgLy8gbGFzdCBjaGFyYWN0ZXIgbXVzdCBiZSA8Y29kZT46PC9jb2RlPgotCi0gICAgLy9pZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgLy9pbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgLy9yZXR1cm4gbGVuID4gMCAmJiB2YWxpZGF0ZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIHRydWUsIHRydWUpICYmCi0gICAgLy8gIHZhbHVlLmNoYXJBdChsZW4gLSAxKSA9PSBERVZJQ0VfSURFTlRJRklFUjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIGEgdmFsaWQgcGF0aCBzZWdtZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIHBhdGggc2VnbWVudCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub3QgY29udGFpbiBhbnkgb2YgdGhlCi0gICAqIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiA8Y29kZT4vID8gIzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFNlZ21lbnQoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgIWNvbnRhaW5zKHZhbHVlLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotCi0gIC8vIDxwPkEgdmFsaWQgcGF0aCBzZWdtZW50IG11c3QgYmUgbm9uLW51bGwgYW5kIG1heSBjb250YWluIGFueSBhbGxvd2VkIFVSSQotICAvLyBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/PC9jb2RlPiAKLQotICAgIC8vcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdmFsaWRhdGUodmFsdWUsIFNFR01FTlRfQ0hBUl9ISSwgU0VHTUVOVF9DSEFSX0xPLCB0cnVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIGEgdmFsaWQgcGF0aCBzZWdtZW50IGFycmF5IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIHBhdGggc2VnbWVudCBhcnJheSBtdXN0IGJlIG5vbi1udWxsIGFuZCBjb250YWluIG9ubHkgcGF0aAotICAgKiBzZWdlbWVudHMgdGhhdCBhcmUgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTZWdtZW50IHZhbGlkU2VnbWVudH0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRTZWdtZW50cyhTdHJpbmdbXSB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmICghdmFsaWRTZWdtZW50KHZhbHVlW2ldKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFJldHVybnMgbnVsbCBpZiB0aGUgc3BlY2ljaWVkIHZhbHVlIGlzIG51bGwgb3Igd291bGQgYmUgYSB2YWxpZCBwYXRoCi0gIC8vIHNlZ21lbnQgYXJyYXkgb2YgYSBVUkk7IG90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpbnZhbGlkCi0gIC8vIHNlZ21lbnQuIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmlyc3RJbnZhbGlkU2VnbWVudChTdHJpbmdbXSB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKCF2YWxpZFNlZ21lbnQodmFsdWVbaV0pKSByZXR1cm4gdmFsdWVbaV07Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIHF1ZXJ5IGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBxdWVyeSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IKLSAgICogPGNvZGU+IzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFF1ZXJ5KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SKSA9PSAtMTsKLQotICAvLyA8cD5BIHZhbGlkIHF1ZXJ5IG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGFsbG93ZWQgVVJJIGNoYXJhY3RlcnMuCi0KLSAgICAvL3JldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbGlkYXRlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCB0cnVlLCB0cnVlKTsKLX0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgZnJhZ21lbnQgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIGZyYWdtZW50IGlzIHRha2VuIHRvIGJlIHVuY29uZGl0aW9uYWxseSB2YWxpZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZEZyYWdtZW50KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB0cnVlOwotCi0gIC8vIDxwPkEgdmFsaWQgZnJhZ21lbnQgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgYWxsb3dlZCBVUkkgY2hhcmFjdGVycy4KLQotICAgIC8vcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsaWRhdGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLy8gU2VhcmNoZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgZm9yIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBzZXQgcmVwcmVzbnRlZAotICAvLyBieSB0aGUgMTI4LWJpdCBiaXRtYXNrLiAgUmV0dXJucyB0cnVlIGlmIGFueSBvY2N1ciwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBzLCBsb25nIGhpZ2hCaXRtYXNrLCBsb25nIGxvd0JpdG1hc2spCi0gIHsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gcy5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtYXRjaGVzKHMuY2hhckF0KGkpLCBoaWdoQml0bWFzaywgbG93Qml0bWFzaykpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUZXN0cyB0aGUgbm9uLW51bGwgc3RyaW5nIHZhbHVlIHRvIHNlZSBpZiBpdCBjb250YWlucyBvbmx5IEFTQ0lJCi0gIC8vIGNoYXJhY3RlcnMgaW4gdGhlIHNldCByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIDEyOC1iaXQgYml0bWFzaywKLSAgLy8gYXMgd2VsbCBhcywgb3B0aW9uYWxseSwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgMHhBMCBhbmQgYWJvdmUsIGFuZCwKLSAgLy8gYWxzbyBvcHRpb25hbGx5LCBlc2NhcGUgc2VxdWVuY2VzIG9mICUgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMuCi0gIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIHRoZSBuZXcsIHN0cmljdCBVUkkgdmFsaWRhdGlvbiB0aGF0IGlzIG5vdAotICAvLyBub3QgY3VycmVudGx5IGluIHBsYWNlLgotLyoKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgdmFsdWUsIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93Tm9uQVNDSUksIGJvb2xlYW4gYWxsb3dFc2NhcGVkKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgeyAKLSAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKLQotICAgICAgaWYgKG1hdGNoZXMoYywgaGlnaEJpdG1hc2ssIGxvd0JpdG1hc2spKSBjb250aW51ZTsKLSAgICAgIGlmIChhbGxvd05vbkFTQ0lJICYmIGMgPj0gMTYwKSBjb250aW51ZTsKLSAgICAgIGlmIChhbGxvd0VzY2FwZWQgJiYgaXNFc2NhcGVkKHZhbHVlLCBpKSkKLSAgICAgIHsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSovCi0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHJlbGF0aXZlIFVSSSwgb3IKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGFuIGFic29sdXRlIFVSSS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtZSA9PSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhIGEgaGllcmFyY2hpY2FsIFVSSSwgb3IKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG9mIHRoZSBnZW5lcmljIGZvcm0uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gaGllcmFyY2hpY2FsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNpY2FsIFVSSSB3aXRoIGFuIGF1dGhvcml0eQotICAgKiBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQXV0aG9yaXR5KCkKLSAgewotICAgIHJldHVybiBoaWVyYXJjaGljYWwgJiYgYXV0aG9yaXR5ICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgbm9uLWhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbgotICAgKiBvcGFxdWUgcGFydCBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNPcGFxdWVQYXJ0KCkKLSAgewotICAgIC8vIG5vdGU6IGhpZXJhcmNoaWNhbCAtPiBhdXRob3JpdHkgIT0gbnVsbAotICAgIHJldHVybiAhaGllcmFyY2hpY2FsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIGRldmljZQotICAgKiBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNEZXZpY2UoKQotICB7Ci0gICAgLy8gbm90ZTogZGV2aWNlICE9IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgcmV0dXJuIGRldmljZSAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbgotICAgKiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUGF0aCgpCi0gIHsKLSAgICAvLyBub3RlOiAoYWJzb2x1dGVQYXRoIHx8IGF1dGhvcml0eSA9PSBudWxsKSAtPiBoaWVyYXJjaGljYWwKLSAgICAvLyAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCkgLT4gc2NoZW1lID09IG51bGwKLSAgICByZXR1cm4gYWJzb2x1dGVQYXRoIHx8IChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuCi0gICAqIGFic29sdXRlIHBhdGgsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub24taGllcmFyY2hpY2FsLCBoYXMgbm8KLSAgICogcGF0aCwgb3IgaGFzIGEgcmVsYXRpdmUgcGF0aC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Fic29sdXRlUGF0aCgpCi0gIHsKLSAgICAvLyBub3RlOiBhYnNvbHV0ZVBhdGggLT4gaGllcmFyY2hpY2FsCi0gICAgcmV0dXJuIGFic29sdXRlUGF0aDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSByZWxhdGl2ZQotICAgKiBwYXRoLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgbm9uLWhpZXJhcmNoaWNhbCwgaGFzIG5vIHBhdGgsIG9yCi0gICAqIGhhcyBhbiBhYnNvbHV0ZSBwYXRoLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVsYXRpdmVQYXRoKCkKLSAgewotICAgIC8vIG5vdGU6IGF1dGhvcml0eSA9PSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBlbXB0eQotICAgKiByZWxhdGl2ZSBwYXRoOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiAgCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCA8Y29kZT4haGFzRW1wdHkoKTwvY29kZT4gZG9lcyA8ZW0+bm90PC9lbT4gaW1wbHkgdGhhdCB0aGlzCi0gICAqIFVSSSBoYXMgYW55IHBhdGggc2VnbWVudHM7IGhvd2V2ZXIsIDxjb2RlPmhhc1JlbGF0aXZlUGF0aCAmJgotICAgKiAhaGFzRW1wdHlQYXRoKCk8L2NvZGU+IGRvZXMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFbXB0eVBhdGgoKQotICB7Ci0gICAgLy8gbm90ZTogYXV0aG9yaXR5ID09IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgLy8gKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGgpIC0+IHNjaGVtZSA9PSBudWxsCi0gICAgcmV0dXJuIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGggJiYKLSAgICAgIHNlZ21lbnRzLmxlbmd0aCA9PSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHF1ZXJ5Ci0gICAqIGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1F1ZXJ5KCkKLSAgewotICAgIC8vIG5vdGU6IHF1ZXJ5ICE9IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgcmV0dXJuIHF1ZXJ5ICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIFVSSSBoYXMgYSBmcmFnbWVudCBjb21wb25lbnQ7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNGcmFnbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZnJhZ21lbnQgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZTsgdGhhdAotICAgKiBpcywgaWYgaXQgaXMgYSByZWxhdGl2ZSBoaWVyYXJjaGljYWwgVVJJIHdpdGggbm8gYXV0aG9yaXR5LCBkZXZpY2Ugb3IKLSAgICogcXVlcnkgY29tcG9uZW50cywgYW5kIG5vIHBhdGggc2VnbWVudHM7IDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZAotICAgKiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnREb2N1bWVudFJlZmVyZW5jZSgpCi0gIHsKLSAgICAvLyBub3RlOiBhdXRob3JpdHkgPT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICAvLyAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCkgLT4gc2NoZW1lID09IG51bGwKLSAgICByZXR1cm4gYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCAmJgotICAgICAgc2VnbWVudHMubGVuZ3RoID09IDAgJiYgcXVlcnkgPT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSB7QGxpbmsKLSAgICogI2lzQ3VycmVudERvY3VtZW50UmVmZXJlbmNlKCkgY3VycmVudCBkb2N1bWVudCByZWZlcmVuY2V9IHdpdGggbm8KLSAgICogZnJhZ21lbnQgY29tcG9uZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiBAc2VlICNpc0N1cnJlbnREb2N1bWVudFJlZmVyZW5jZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLSAgewotICAgIC8vIG5vdGU6IGF1dGhvcml0eSA9PSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoICYmCi0gICAgICBzZWdtZW50cy5sZW5ndGggPT0gMCAmJiBxdWVyeSA9PSBudWxsICYmIGZyYWdtZW50ID09IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB0aGF0IG1heSByZWZlcgotICAgKiBkaXJlY3RseSB0byBhIGxvY2FsbHkgYWNjZXNzaWJsZSBmaWxlLiAgVGhpcyBpcyBjb25zaWRlcmVkIHRvIGJlIHRoZQotICAgKiBjYXNlIGZvciBhIGZpbGUtc2NoZW1lIGFic29sdXRlIFVSSSwgb3IgZm9yIGEgcmVsYXRpdmUgVVJJIHdpdGggbm8gcXVlcnk7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGlzSGllcmFyY2hpY2FsKCkgJiYKLSAgICAgICgoaXNSZWxhdGl2ZSgpICYmICFoYXNRdWVyeSgpKSB8fCBTQ0hFTUVfRklMRS5lcXVhbHNJZ25vcmVDYXNlKHNjaGVtZSkpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gYXJjaGl2ZSBVUkkuICBJZiBzbywgd2Ugc2hvdWxkIGV4cGVjdCB0aGF0Ci0gIC8vIGl0IGlzIGFsc28gaGllcmFyY2hpY2FsLCB3aXRoIGFuIGF1dGhvcml0eSAoY29uc2lzdGluZyBvZiBhbiBhYnNvbHV0ZQotICAvLyBVUkkgZm9sbG93ZWQgYnkgIiEiKSwgbm8gZGV2aWNlLCBhbmQgYW4gYWJzb2x1dGUgcGF0aC4KLSAgcHJpdmF0ZSBib29sZWFuIGlzQXJjaGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgc2NoZW1lIG9mIGFuIDxhCi0gICAqIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSTwvYT47IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcmNoaXZlU2NoZW1lKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGFyY2hpdmVTY2hlbWVzLmNvbnRhaW5zKHZhbHVlLnRvTG93ZXJDYXNlKCkpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlLgotICAgKi8KLSAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gIHsKLSAgICByZXR1cm4gaGFzaENvZGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGFuIGluc3RhbmNlIG9mCi0gICAqIDxjb2RlPlVSSTwvY29kZT4gZXF1YWwgdG8gdGhpcyBvbmU7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkVxdWFsaXR5IGlzIGRldGVybWluZWQgc3RyaWN0bHkgYnkgY29tcGFyaW5nIGNvbXBvbmVudHMsIG5vdCBieQotICAgKiBhdHRlbXB0aW5nIHRvIGludGVycHJldCB3aGF0IHJlc291cmNlIGlzIGJlaW5nIGlkZW50aWZpZWQuICBUaGUKLSAgICogY29tcGFyaXNvbiBvZiBzY2hlbWVzIGlzIGNhc2UtaW5zZW5zaXRpdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgewotICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0gICAgaWYgKCEob2JqIGluc3RhbmNlb2YgVVJJKSkgcmV0dXJuIGZhbHNlOwotICAgIFVSSSB1cmkgPSAoVVJJKSBvYmo7Ci0KLSAgICByZXR1cm4gaGFzaENvZGUgPT0gdXJpLmhhc2hDb2RlKCkgJiYKLSAgICAgIGhpZXJhcmNoaWNhbCA9PSB1cmkuaXNIaWVyYXJjaGljYWwoKSAmJgotICAgICAgYWJzb2x1dGVQYXRoID09IHVyaS5oYXNBYnNvbHV0ZVBhdGgoKSAmJgotICAgICAgZXF1YWxzKHNjaGVtZSwgdXJpLnNjaGVtZSgpLCB0cnVlKSAmJgotICAgICAgZXF1YWxzKGF1dGhvcml0eSwgaGllcmFyY2hpY2FsID8gdXJpLmF1dGhvcml0eSgpIDogdXJpLm9wYXF1ZVBhcnQoKSkgJiYKLSAgICAgIGVxdWFscyhkZXZpY2UsIHVyaS5kZXZpY2UoKSkgJiYKLSAgICAgIGVxdWFscyhxdWVyeSwgdXJpLnF1ZXJ5KCkpICYmIAotICAgICAgZXF1YWxzKGZyYWdtZW50LCB1cmkuZnJhZ21lbnQoKSkgJiYKLSAgICAgIHNlZ21lbnRzRXF1YWwodXJpKTsKLSAgfQotCi0gIC8vIFRlc3RzIHdoZXRoZXIgdGhpcyBVUkkncyBwYXRoIHNlZ21lbnQgYXJyYXkgaXMgZXF1YWwgdG8gdGhhdCBvZiB0aGUKLSAgLy8gZ2l2ZW4gdXJpLgotICBwcml2YXRlIGJvb2xlYW4gc2VnbWVudHNFcXVhbChVUkkgdXJpKQotICB7Ci0gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCAhPSB1cmkuc2VnbWVudENvdW50KCkpIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKCFzZWdtZW50c1tpXS5lcXVhbHModXJpLnNlZ21lbnQoaSkpKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0b2xlcmF0aW5nIG51bGxzOyBudWxsIGlzIGNvbnNpZGVyZWQKLSAgLy8gdG8gYmUgYSB2YWxpZCB2YWx1ZSB0aGF0IGlzIG9ubHkgZXF1YWwgdG8gaXRzZWxmLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgewotICAgIHJldHVybiBvMSA9PSBudWxsID8gbzIgPT0gbnVsbCA6IG8xLmVxdWFscyhvMik7Ci0gIH0KLQotICAvLyBUZXN0cyB0d28gc3RyaW5ncyBmb3IgZXF1YWxpdHksIHRvbGVyYXRpbmcgbnVsbHMgYW5kIG9wdGlvbmFsbHkKLSAgLy8gaWdub3JpbmcgY2FzZS4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIHMxLCBTdHJpbmcgczIsIGJvb2xlYW4gaWdub3JlQ2FzZSkKLSAgewotICAgIHJldHVybiBzMSA9PSBudWxsID8gczIgPT0gbnVsbCA6Ci0gICAgICBpZ25vcmVDYXNlID8gczEuZXF1YWxzSWdub3JlQ2FzZShzMikgOiBzMS5lcXVhbHMoczIpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYW4gYWJzb2x1dGUgVVJJLCByZXR1cm5zIHRoZSBzY2hlbWUgY29tcG9uZW50OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBub24taGllcmFyY2hpY2FsIFVSSSwgcmV0dXJucyB0aGUgb3BhcXVlIHBhcnQgY29tcG9uZW50OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIG9wYXF1ZVBhcnQoKQotICB7Ci0gICAgcmV0dXJuIGlzSGllcmFyY2hpY2FsKCkgPyBudWxsIDogYXV0aG9yaXR5OwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgcmV0dXJucyBpdDsKLSAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBhdXRob3JpdHkoKQotICB7Ci0gICAgcmV0dXJuIGlzSGllcmFyY2hpY2FsKCkgPyBhdXRob3JpdHkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5IGNvbXBvbmVudCB0aGF0IGhhcyBhCi0gICAqIHVzZXIgaW5mbyBwb3J0aW9uLCByZXR1cm5zIGl0OyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHVzZXJJbmZvKCkKLSAgeyAKLSAgICBpZiAoIWhhc0F1dGhvcml0eSgpKSByZXR1cm4gbnVsbDsKLSAgIAotICAgIGludCBpID0gYXV0aG9yaXR5LmluZGV4T2YoVVNFUl9JTkZPX1NFUEFSQVRPUik7Ci0gICAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IGF1dGhvcml0eS5zdWJzdHJpbmcoMCwgaSk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkgY29tcG9uZW50IHRoYXQgaGFzIGEKLSAgICogaG9zdCBwb3J0aW9uLCByZXR1cm5zIGl0OyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGhvc3QoKQotICB7Ci0gICAgaWYgKCFoYXNBdXRob3JpdHkoKSkgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgaW50IGkgPSBhdXRob3JpdHkuaW5kZXhPZihVU0VSX0lORk9fU0VQQVJBVE9SKTsKLSAgICBpbnQgaiA9IGF1dGhvcml0eS5pbmRleE9mKFBPUlRfU0VQQVJBVE9SKTsKLSAgICByZXR1cm4gaiA8IDAgPyBhdXRob3JpdHkuc3Vic3RyaW5nKGkgKyAxKSA6IGF1dGhvcml0eS5zdWJzdHJpbmcoaSArIDEsIGopOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5IGNvbXBvbmVudCB0aGF0IGhhcyBhCi0gICAqIHBvcnQgcG9ydGlvbiwgcmV0dXJucyBpdDsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBwb3J0KCkKLSAgewotICAgIGlmICghaGFzQXV0aG9yaXR5KCkpIHJldHVybiBudWxsOwotCi0gICAgaW50IGkgPSBhdXRob3JpdHkuaW5kZXhPZihQT1JUX1NFUEFSQVRPUik7Ci0gICAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IGF1dGhvcml0eS5zdWJzdHJpbmcoaSArIDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBkZXZpY2UgY29tcG9uZW50LCByZXR1cm5zIGl0OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGRldmljZSgpCi0gIHsKLSAgICByZXR1cm4gZGV2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBwYXRoLCByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcKLSAgICogdGhlIHNlZ21lbnRzIG9mIHRoZSBwYXRoOyBhbiBlbXB0eSBhcnJheSBvdGhlcndpc2UuICBUaGUgbGVhZGluZwotICAgKiBzZXBhcmF0b3IgaW4gYW4gYWJzb2x1dGUgcGF0aCBpcyBub3QgcmVwcmVzZW50ZWQgaW4gdGhpcyBhcnJheSwgYnV0IGEKLSAgICogdHJhaWxpbmcgc2VwYXJhdG9yIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5LXN0cmluZyBzZWdtZW50IGFzIHRoZQotICAgKiBmaW5hbCBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIHNlZ21lbnRzKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pc2VnbWVudHMuY2xvbmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgc2VnbWVudHMgYXMgdGhlIGFycmF5Ci0gICAqIHJldHVybmVkIGJ5IHtAbGluayAjc2VnbWVudHMgc2VnbWVudHN9LgotICAgKi8KLSAgcHVibGljIExpc3Qgc2VnbWVudHNMaXN0KCkKLSAgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3Qoc2VnbWVudHMpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNlZ21lbnQgYXJyYXkgdGhhdCB3b3VsZCBiZQotICAgKiByZXR1cm5lZCBieSB7QGxpbmsgI3NlZ21lbnRzIHNlZ21lbnRzfS4KLSAgICovCi0gIHB1YmxpYyBpbnQgc2VnbWVudENvdW50KCkKLSAgewotICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGg7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgZmFzdCwgaW5kZXhlZCBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBzZWdtZW50cyBpbiB0aGUgcGF0aAotICAgKiBzZWdtZW50IGFycmF5LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPmkgPCAwPC9jb2RlPiBvcgotICAgKiA8Y29kZT5pID49IHNlZ21lbnRDb3VudCgpPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc2VnbWVudChpbnQgaSkKLSAgewotICAgIHJldHVybiBzZWdtZW50c1tpXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsYXN0IHNlZ21lbnQgaW4gdGhlIHNlZ21lbnQgYXJyYXksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBsYXN0U2VnbWVudCgpCi0gIHsKLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoOwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuIHNlZ21lbnRzW2xlbiAtIDFdOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBwYXRoLCByZXR1cm5zIGEgc3RyaW5nCi0gICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoOyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuICBUaGUgcGF0aAotICAgKiBjb25zaXN0cyBvZiBhIGxlYWRpbmcgc2VnbWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyIChhIHNsYXNoKSwgaWYgdGhlCi0gICAqIHBhdGggaXMgYWJzb2x1dGUsIGZvbGxvd2VkIGJ5IHRoZSBzbGFzaC1zZXBhcmF0ZWQgcGF0aCBzZWdtZW50cy4gIElmCi0gICAqIHRoaXMgVVJJIGhhcyBhIHNlcGFyYXRlIDxhIGhyZWY9IiNkZXZpY2VfZXhwbGFuYXRpb24iPmRldmljZQotICAgKiBjb21wb25lbnQ8L2E+LCBpdCBpcyA8ZW0+bm90PC9lbT4gaW5jbHVkZWQgaW4gdGhlIHBhdGguCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHBhdGgoKQotICB7Ci0gICAgaWYgKCFoYXNQYXRoKCkpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAoaGFzQWJzb2x1dGVQYXRoKCkpIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpICE9IDApIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgICAgcmVzdWx0LmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcGF0aCwgcmV0dXJucyBhIHN0cmluZwotICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBhdXRob3JpdHkgYW5kIHRoZSAKLSAgICogPGEgaHJlZj0iI2RldmljZV9leHBsYW5hdGlvbiI+ZGV2aWNlIGNvbXBvbmVudDwvYT47IAotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuICAKLSAgICoKLSAgICogPHA+SWYgdGhlcmUgaXMgbm8gYXV0aG9yaXR5LCB0aGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzOgotICAgKiA8cHJlPgotICAgKiAgIGRldmljZS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uPC9wcmU+Ci0gICAqCi0gICAqIDxwPklmIHRoZXJlIGlzIGFuIGF1dGhvcml0eSwgaXQgaXM6Ci0gICAqIDxwcmU+Ci0gICAqICAgLy9hdXRob3JpdHkvZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICoKLSAgICogPHA+Rm9yIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSTwvYT4sIGl0J3MganVzdDoKLSAgICogPHByZT4KLSAgICogICBhdXRob3JpdHkvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLjwvcHJlPgotICAgKi8KLSAgcHVibGljIFN0cmluZyBkZXZpY2VQYXRoKCkKLSAgewotICAgIGlmICghaGFzUGF0aCgpKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBpZiAoaGFzQXV0aG9yaXR5KCkpCi0gICAgewotICAgICAgaWYgKCFpc0FyY2hpdmUoKSkgcmVzdWx0LmFwcGVuZChBVVRIT1JJVFlfU0VQQVJBVE9SKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLQotICAgICAgaWYgKGhhc0RldmljZSgpKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzRGV2aWNlKCkpIHJlc3VsdC5hcHBlbmQoZGV2aWNlKTsKLSAgICBpZiAoaGFzQWJzb2x1dGVQYXRoKCkpIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpICE9IDApIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgICAgcmVzdWx0LmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcXVlcnkgY29tcG9uZW50LCByZXR1cm5zIGl0OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHF1ZXJ5KCkKLSAgewotICAgIHJldHVybiBxdWVyeTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgZnJvbSB0aGlzIFVSSSBhbmQgdGhlIGdpdmVuIHF1ZXJ5LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYKLSAgICogPGNvZGU+cXVlcnk8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIHF1ZXJ5IChwb3J0aW9uKSBhY2NvcmRpbmcKLSAgICogdG8ge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmRRdWVyeShTdHJpbmcgcXVlcnkpCi0gIHsKLSAgICBpZiAoIXZhbGlkUXVlcnkocXVlcnkpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJpbnZhbGlkIHF1ZXJ5IHBvcnRpb246ICIgKyBxdWVyeSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsgCi0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBVUkkgaGFzIGEgbm9uLW51bGwge0BsaW5rICNxdWVyeSBxdWVyeX0sIHJldHVybnMgdGhlIFVSSQotICAgKiBmb3JtZWQgYnkgcmVtb3ZpbmcgaXQ7IHRoaXMgVVJJIHVuY2hhbmdlZCwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFVSSSB0cmltUXVlcnkoKQotICB7Ci0gICAgaWYgKHF1ZXJ5ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIG51bGwsIGZyYWdtZW50KTsgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIGhhcyBhIGZyYWdtZW50IGNvbXBvbmVudCwgcmV0dXJucyBpdDsgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBmcmFnbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZnJhZ21lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBmcm9tIHRoaXMgVVJJIGFuZCB0aGUgZ2l2ZW4gZnJhZ21lbnQuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZgotICAgKiA8Y29kZT5mcmFnbWVudDwvY29kZT4gaXMgbm90IGEgdmFsaWQgZnJhZ21lbnQgKHBvcnRpb24pIGFjY29yZGluZwotICAgKiB0byB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZEZyYWdtZW50KFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGlmICghdmFsaWRGcmFnbWVudChmcmFnbWVudCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImludmFsaWQgZnJhZ21lbnQgcG9ydGlvbjogIiArIGZyYWdtZW50KTsKLSAgICB9Ci0gICAgVVJJIHJlc3VsdCA9IG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOyAKLQotICAgIGlmICghaGFzRnJhZ21lbnQoKSkKLSAgICB7Ci0gICAgICByZXN1bHQuY2FjaGVkVHJpbUZyYWdtZW50ID0gdGhpczsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIFVSSSBoYXMgYSBub24tbnVsbCB7QGxpbmsgI2ZyYWdtZW50IGZyYWdtZW50fSwgcmV0dXJucyB0aGUgVVJJCi0gICAqIGZvcm1lZCBieSByZW1vdmluZyBpdDsgdGhpcyBVUkkgdW5jaGFuZ2VkLCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgVVJJIHRyaW1GcmFnbWVudCgpCi0gIHsKLSAgICBpZiAoZnJhZ21lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2FjaGVkVHJpbUZyYWdtZW50ID09IG51bGwpCi0gICAgewotICAgICAgY2FjaGVkVHJpbUZyYWdtZW50ID0gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIHF1ZXJ5LCBudWxsKTsgCi0gICAgfQotCi0gICAgcmV0dXJuIGNhY2hlZFRyaW1GcmFnbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNvbHZlcyB0aGlzIFVSSSByZWZlcmVuY2UgYWdhaW5zdCBhIDxjb2RlPmJhc2U8L2NvZGU+IGFic29sdXRlCi0gICAqIGhpZXJhcmNoaWNhbCBVUkksIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIGFic29sdXRlIFVSSS4gIElmIGFscmVhZHkKLSAgICogYWJzb2x1dGUsIHRoZSBVUkkgaXRzZWxmIGlzIHJldHVybmVkLiAgVVJJIHJlc29sdXRpb24gaXMgZGVzY3JpYmVkIGluCi0gICAqIGRldGFpbCBpbiBzZWN0aW9uIDUuMiBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDCi0gICAqIDIzOTY8L2E+LCAiUmVzb2x2aW5nIFJlbGF0aXZlIFJlZmVyZW5jZXMgdG8gQWJzb2x1dGUgRm9ybS4iCi0gICAqCi0gICAqIDxwPkR1cmluZyByZXNvbHV0aW9uLCBlbXB0eSBzZWdtZW50cywgc2VsZiByZWZlcmVuY2VzICgiLiIpLCBhbmQgcGFyZW50Ci0gICAqIHJlZmVyZW5jZXMgKCIuLiIpIGFyZSBpbnRlcnByZXRlZCwgc28gdGhhdCB0aGV5IGNhbiBiZSByZW1vdmVkIGZyb20gdGhlCi0gICAqIHBhdGguICBTdGVwIDYoZykgZ2l2ZXMgYSBjaG9pY2Ugb2YgaG93IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBwYXJlbnQKLSAgICogcmVmZXJlbmNlcyBwb2ludCB0byBhIHBhdGggYWJvdmUgdGhlIHJvb3Q6IHRoZSBvZmZlbmRpbmcgc2VnbWVudHMgY2FuCi0gICAqIGJlIHByZXNlcnZlZCBvciBkaXNjYXJkZWQuICBUaGlzIG1ldGhvZCBwcmVzZXJ2ZXMgdGhlbS4gIFRvIGhhdmUgdGhlbQotICAgKiBkaXNjYXJkZWQsIHBsZWFzZSB1c2UgdGhlIHR3by1wYXJhbWV0ZXIgZm9ybSBvZiB7QGxpbmsKLSAgICogI3Jlc29sdmUoVVJJLCBib29sZWFuKSByZXNvbHZlfS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzCi0gICAqIG5vbi1oaWVyYXJjaGljYWwgb3IgaXMgcmVsYXRpdmUuCi0gICAqLwotICBwdWJsaWMgVVJJIHJlc29sdmUoVVJJIGJhc2UpCi0gIHsKLSAgICByZXR1cm4gcmVzb2x2ZShiYXNlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNvbHZlcyB0aGlzIFVSSSByZWZlcmVuY2UgYWdhaW5zdCBhIDxjb2RlPmJhc2U8L2NvZGU+IGFic29sdXRlCi0gICAqIGhpZXJhcmNoaWNhbCBVUkksIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIGFic29sdXRlIFVSSS4gIElmIGFscmVhZHkKLSAgICogYWJzb2x1dGUsIHRoZSBVUkkgaXRzZWxmIGlzIHJldHVybmVkLiAgVVJJIHJlc29sdXRpb24gaXMgZGVzY3JpYmVkIGluCi0gICAqIGRldGFpbCBpbiBzZWN0aW9uIDUuMiBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDCi0gICAqIDIzOTY8L2E+LCAiUmVzb2x2aW5nIFJlbGF0aXZlIFJlZmVyZW5jZXMgdG8gQWJzb2x1dGUgRm9ybS4iCi0gICAqCi0gICAqIDxwPkR1cmluZyByZXN1bHRpb24sIGVtcHR5IHNlZ21lbnRzLCBzZWxmIHJlZmVyZW5jZXMgKCIuIiksIGFuZCBwYXJlbnQKLSAgICogcmVmZXJlbmNlcyAoIi4uIikgYXJlIGludGVycHJldGVkLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAgICogcGF0aC4gIFN0ZXAgNihnKSBnaXZlcyBhIGNob2ljZSBvZiBob3cgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHBhcmVudAotICAgKiByZWZlcmVuY2VzIHBvaW50IHRvIGEgcGF0aCBhYm92ZSB0aGUgcm9vdDogdGhlIG9mZmVuZGluZyBzZWdtZW50cyBjYW4KLSAgICogYmUgcHJlc2VydmVkIG9yIGRpc2NhcmRlZC4gIFRoaXMgbWV0aG9kIGNhbiBkbyBlaXRoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBwcmVzZXJ2ZVJvb3RQYXJlbnRzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNlZ21lbnRzIHJlZmVyaW5nIHRvIHRoZQotICAgKiBwYXJlbnQgb2YgdGhlIHJvb3QgcGF0aCBhcmUgdG8gYmUgcHJlc2VydmVkOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleQotICAgKiBhcmUgdG8gYmUgZGlzY2FyZGVkLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBvciBpcyByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgcmVzb2x2ZShVUkkgYmFzZSwgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKCFiYXNlLmlzSGllcmFyY2hpY2FsKCkgfHwgYmFzZS5pc1JlbGF0aXZlKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgInJlc29sdmUgYWdhaW5zdCBub24taGllcmFyY2hpY2FsIG9yIHJlbGF0aXZlIGJhc2UiKTsKLSAgICB9Ci0KLSAgICAvLyBhbiBhYnNvbHV0ZSBVUkkgbmVlZHMgbm8gcmVzb2x2aW5nCi0gICAgaWYgKCFpc1JlbGF0aXZlKCkpIHJldHVybiB0aGlzOwotCi0gICAgLy8gbm90ZTogaXNSZWxhdGl2ZSgpIC0+IGhpZXJhcmNoaWNhbAotCi0gICAgU3RyaW5nIG5ld0F1dGhvcml0eSA9IGF1dGhvcml0eTsKLSAgICBTdHJpbmcgbmV3RGV2aWNlID0gZGV2aWNlOwotICAgIGJvb2xlYW4gbmV3QWJzb2x1dGVQYXRoID0gYWJzb2x1dGVQYXRoOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gc2VnbWVudHM7Ci0gICAgU3RyaW5nIG5ld1F1ZXJ5ID0gcXVlcnk7Ci0gICAgLy8gbm90ZTogaXQncyBva2F5IGZvciB0d28gVVJJcyB0byBzaGFyZSBhIHNlZ21lbnRzIGFycmF5LCBzaW5jZQotICAgIC8vIG5laXRoZXIgd2lsbCBldmVyIG1vZGlmeSBpdAotICAgIAotICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBubyBhdXRob3JpdHk6IHVzZSBiYXNlJ3MKLSAgICAgIG5ld0F1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5KCk7Ci0KLSAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gbm8gZGV2aWNlOiB1c2UgYmFzZSdzCi0gICAgICAgIG5ld0RldmljZSA9IGJhc2UuZGV2aWNlKCk7Ci0KLSAgICAgICAgaWYgKGhhc0VtcHR5UGF0aCgpICYmIHF1ZXJ5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZTogdXNlIGJhc2UgcGF0aCBhbmQgcXVlcnkKLSAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGggPSBiYXNlLmhhc0Fic29sdXRlUGF0aCgpOwotICAgICAgICAgIG5ld1NlZ21lbnRzID0gYmFzZS5zZWdtZW50cygpOwotICAgICAgICAgIG5ld1F1ZXJ5ID0gYmFzZS5xdWVyeSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGhhc1JlbGF0aXZlUGF0aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gcmVsYXRpdmUgcGF0aDogbWVyZ2Ugd2l0aCBiYXNlIGFuZCBrZWVwIHF1ZXJ5IChub3RlOiBpZiB0aGUKLSAgICAgICAgICAvLyBiYXNlIGhhcyBubyBwYXRoIGFuZCB0aGlzIGEgbm9uLWVtcHR5IHJlbGF0aXZlIHBhdGgsIHRoZXJlIGlzCi0gICAgICAgICAgLy8gYW4gaW1wbGllZCByb290IGluIHRoZSByZXN1bHRpbmcgcGF0aCkgCi0gICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gYmFzZS5oYXNBYnNvbHV0ZVBhdGgoKSB8fCAhaGFzRW1wdHlQYXRoKCk7Ci0gICAgICAgICAgbmV3U2VnbWVudHMgPSBuZXdBYnNvbHV0ZVBhdGggPyBtZXJnZVBhdGgoYmFzZSwgcHJlc2VydmVSb290UGFyZW50cykKLSAgICAgICAgICAgIDogTk9fU0VHTUVOVFM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBhYnNvbHV0ZSBwYXRoOiBrZWVwIGl0IGFuZCBxdWVyeQotICAgICAgfQotICAgICAgLy8gZWxzZSBrZWVwIGRldmljZSwgcGF0aCwgYW5kIHF1ZXJ5Ci0gICAgfQotICAgIC8vIGVsc2Uga2VlcCBhdXRob3JpdHksIGRldmljZSwgcGF0aCwgYW5kIHF1ZXJ5Ci0gICAgCi0gICAgLy8gYWx3YXlzIGtlZXAgZnJhZ21lbnQsIGV2ZW4gaWYgbnVsbCwgYW5kIHVzZSBzY2hlbWUgZnJvbSBiYXNlOwotICAgIC8vIG5vIHZhbGlkYXRpb24gbmVlZGVkIHNpbmNlIGFsbCBjb21wb25lbnRzIGFyZSBmcm9tIGV4aXN0aW5nIFVSSXMKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBiYXNlLnNjaGVtZSgpLCBuZXdBdXRob3JpdHksIG5ld0RldmljZSwKLSAgICAgICAgICAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGgsIG5ld1NlZ21lbnRzLCBuZXdRdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLy8gTWVyZ2VzIHRoaXMgVVJJJ3MgcmVsYXRpdmUgcGF0aCB3aXRoIHRoZSBiYXNlIG5vbi1yZWxhdGl2ZSBwYXRoLiAgSWYKLSAgLy8gYmFzZSBoYXMgbm8gcGF0aCwgdHJlYXQgaXQgYXMgdGhlIHJvb3QgYWJzb2x1dGUgcGF0aCwgdW5sZXNzIHRoaXMgaGFzCi0gIC8vIG5vIHBhdGggZWl0aGVyLgotICBwcml2YXRlIFN0cmluZ1tdIG1lcmdlUGF0aChVUkkgYmFzZSwgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKGJhc2UuaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVyZ2UgYWdhaW5zdCByZWxhdGl2ZSBwYXRoIik7Ci0gICAgfQotICAgIGlmICghaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWVyZ2Ugbm9uLXJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0KLSAgICBpbnQgYmFzZVNlZ21lbnRDb3VudCA9IGJhc2Uuc2VnbWVudENvdW50KCk7Ci0gICAgaW50IHNlZ21lbnRDb3VudCA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBTdHJpbmdbXSBzdGFjayA9IG5ldyBTdHJpbmdbYmFzZVNlZ21lbnRDb3VudCArIHNlZ21lbnRDb3VudF07Ci0gICAgaW50IHNwID0gMDsKLQotICAgIC8vIHVzZSBhIHN0YWNrIHRvIGFjY3VtdWxhdGUgc2VnbWVudHMgb2YgYmFzZSwgZXhjZXB0IGZvciB0aGUgbGFzdAotICAgIC8vIChpLmUuIHNraXAgdHJhaWxpbmcgc2VwYXJhdG9yIGFuZCBhbnl0aGluZyBmb2xsb3dpbmcgaXQpLCBhbmQgb2YKLSAgICAvLyByZWxhdGl2ZSBwYXRoCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlU2VnbWVudENvdW50IC0gMTsgaSsrKQotICAgIHsKLSAgICAgIHNwID0gYWNjdW11bGF0ZShzdGFjaywgc3AsIGJhc2Uuc2VnbWVudChpKSwgcHJlc2VydmVSb290UGFyZW50cyk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50Q291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcCA9IGFjY3VtdWxhdGUoc3RhY2ssIHNwLCBzZWdtZW50c1tpXSwgcHJlc2VydmVSb290UGFyZW50cyk7Ci0gICAgfQotCi0gICAgLy8gaWYgdGhlIHJlbGF0aXZlIHBhdGggaXMgZW1wdHkgb3IgZW5kcyBpbiBhbiBlbXB0eSBzZWdtZW50LCBhIHBhcmVudCAKLSAgICAvLyByZWZlcmVuY2UsIG9yIGEgc2VsZiByZWZlcmVuZmNlLCBhZGQgYSB0cmFpbGluZyBzZXBhcmF0b3IgdG8gYQotICAgIC8vIG5vbi1lbXB0eSBwYXRoCi0gICAgaWYgKHNwID4gMCAmJiAgKHNlZ21lbnRDb3VudCA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIFNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSB8fAotICAgICAgICAgICAgICAgICAgICBTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pIHx8Ci0gICAgICAgICAgICAgICAgICAgIFNFR01FTlRfU0VMRi5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pKSkKLSAgICB7Ci0gICAgICBzdGFja1tzcCsrXSA9IFNFR01FTlRfRU1QVFk7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIGEgY29ycmVjdGx5IHNpemVkIHJlc3VsdAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbc3BdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc3RhY2ssIDAsIHJlc3VsdCwgMCwgc3ApOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBBZGRzIGEgc2VnbWVudCB0byBhIHN0YWNrLCBza2lwcGluZyBlbXB0eSBzZWdtZW50cyBhbmQgc2VsZiByZWZlcmVuY2VzLAotICAvLyBhbmQgaW50ZXJwcmV0aW5nIHBhcmVudCByZWZlcmVuY2VzLgotICBwcml2YXRlIHN0YXRpYyBpbnQgYWNjdW11bGF0ZShTdHJpbmdbXSBzdGFjaywgaW50IHNwLCBTdHJpbmcgc2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKFNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50KSkKLSAgICB7Ci0gICAgICBpZiAoc3AgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gc3BlY2lhbCBjYXJlIG11c3QgYmUgdGFrZW4gZm9yIGEgcm9vdCdzIHBhcmVudCByZWZlcmVuY2U6IGl0IGlzCi0gICAgICAgIC8vIGVpdGhlciBpZ25vcmVkIG9yIHRoZSBzeW1ib2xpYyByZWZlcmVuY2UgaXRzZWxmIGlzIHB1c2hlZAotICAgICAgICBpZiAocHJlc2VydmVSb290UGFyZW50cykgc3RhY2tbc3ArK10gPSBzZWdtZW50OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyB1bmxlc3Mgd2UncmUgYWxyZWFkeSBhY2N1bXVsYXRpbmcgcm9vdCBwYXJlbnQgcmVmZXJlbmNlcywKLSAgICAgICAgLy8gcGFyZW50IHJlZmVyZW5jZXMgc2ltcGx5IHBvcCB0aGUgbGFzdCBzZWdtZW50IGRlc2NlbmRlZAotICAgICAgICBpZiAoU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHN0YWNrW3NwIC0gMV0pKSBzdGFja1tzcCsrXSA9IHNlZ21lbnQ7Ci0gICAgICAgIGVsc2Ugc3AtLTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIVNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnQpICYmICFTRUdNRU5UX1NFTEYuZXF1YWxzKHNlZ21lbnQpKQotICAgIHsKLSAgICAgIC8vIHNraXAgZW1wdHkgc2VnbWVudHMgYW5kIHNlbGYgcmVmZXJlbmNlczsgcHVzaCBldmVyeXRoaW5nIGVsc2UKLSAgICAgIHN0YWNrW3NwKytdID0gc2VnbWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIHNwOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBzaG9ydGVzdCByZWxhdGl2ZSBvciwgaWYgbmVjZXNzYXJ5LCB0aGUgYWJzb2x1dGUgVVJJIHRoYXQsCi0gICAqIHdoZW4gcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZ2l2ZW4gPGNvZGU+YmFzZTwvY29kZT4gYWJzb2x1dGUgaGllcmFyY2hpY2FsCi0gICAqIFVSSSB1c2luZyB7QGxpbmsgI3Jlc29sdmUoVVJJKSByZXNvbHZlfSwgd2lsbCB5aWVsZCB0aGlzIGFic29sdXRlIFVSSS4gIAotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBvciBpcyByZWxhdGl2ZS4KLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPnRoaXM8L2NvZGU+IGlzCi0gICAqIHJlbGF0aXZlLgotICAgKi8KLSAgcHVibGljIFVSSSBkZXJlc29sdmUoVVJJIGJhc2UpCi0gIHsKLSAgICByZXR1cm4gZGVyZXNvbHZlKGJhc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyBhbiBhYnNvbHV0ZSBVUkkgdGhhdCwgd2hlbiByZXNvbHZlZCBhZ2FpbnN0IHRoZSBnaXZlbgotICAgKiA8Y29kZT5iYXNlPC9jb2RlPiBhYnNvbHV0ZSBoaWVyYXJjaGljYWwgVVJJIHVzaW5nIHtAbGluawotICAgKiAjcmVzb2x2ZShVUkksIGJvb2xlYW4pIHJlc29sdmV9LCB3aWxsIHlpZWxkIHRoaXMgYWJzb2x1dGUgVVJJLgotICAgKgotICAgKiBAcGFyYW0gcHJlc2VydmVSb290UGFyZW50cyB0aGUgYm9vbGVhbiBhcmd1bWVudCB0byA8Y29kZT5yZXNvbHZlKFVSSSwKLSAgICogYm9vbGVhbik8L2NvZGU+IGZvciB3aGljaCB0aGUgcmV0dXJuZWQgVVJJIHNob3VsZCByZXNvbHZlIHRvIHRoaXMgVVJJLgotICAgKiBAcGFyYW0gYW55UmVsUGF0aCBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHJldHVybmVkIFVSSSdzIHBhdGggKGlmCi0gICAqIGFueSkgd2lsbCBiZSByZWxhdGl2ZSwgaWYgcG9zc2libGUuICBJZiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBmb3JtIG9mCi0gICAqIHRoZSByZXN1bHQncyBwYXRoIHdpbGwgZGVwZW5kIHVwb24gdGhlIG5leHQgcGFyYW1ldGVyLgotICAgKiBAcGFyYW0gc2hvcnRlclJlbFBhdGggaWYgPGNvZGU+YW55UmVsUGF0aDwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIGFuZCB0aGlzIHBhcmFtZXRlciBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHJldHVybmVkIFVSSSdzIHBhdGggKGlmCi0gICAqIGFueSkgd2lsbCBiZSByZWxhdGl2ZSwgaWYgb25lIGNhbiBiZSBmb3VuZCB0aGF0IGlzIG5vIGxvbmdlciAoYnkgbnVtYmVyCi0gICAqIG9mIHNlZ21lbnRzKSB0aGFuIHRoZSBhYnNvbHV0ZSBwYXRoLiAgSWYgYm90aCA8Y29kZT5hbnlSZWxQYXRoPC9jb2RlPgotICAgKiBhbmQgdGhpcyBwYXJhbWV0ZXIgYXJlIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgd2lsbCBiZSBhYnNvbHV0ZS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzCi0gICAqIG5vbi1oaWVyYXJjaGljYWwgb3IgaXMgcmVsYXRpdmUuCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT50aGlzPC9jb2RlPiBpcwotICAgKiByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgZGVyZXNvbHZlKFVSSSBiYXNlLCBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYW55UmVsUGF0aCwgYm9vbGVhbiBzaG9ydGVyUmVsUGF0aCkKLSAgewotICAgIGlmICghYmFzZS5pc0hpZXJhcmNoaWNhbCgpIHx8IGJhc2UuaXNSZWxhdGl2ZSgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJkZXJlc29sdmUgYWdhaW5zdCBub24taGllcmFyY2hpY2FsIG9yIHJlbGF0aXZlIGJhc2UiKTsKLSAgICB9Ci0gICAgaWYgKGlzUmVsYXRpdmUoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkZXJlc29sdmUgcmVsYXRpdmUgVVJJIik7Ci0gICAgfQotCi0gICAgLy8gbm90ZTogdGhlc2UgYXNzZXJ0aW9ucyBpbXBseSB0aGF0IG5laXRoZXIgdGhpcyBub3IgdGhlIGJhc2UgVVJJIGhhcyBhCi0gICAgLy8gcmVsYXRpdmUgcGF0aDsgdGh1cywgYm90aCBoYXZlIGVpdGhlciBhbiBhYnNvbHV0ZSBwYXRoIG9yIG5vIHBhdGgKLSAgICAKLSAgICAvLyBkaWZmZXJlbnQgc2NoZW1lOiBuZWVkIGNvbXBsZXRlLCBhYnNvbHV0ZSBVUkkKLSAgICBpZiAoIXNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKGJhc2Uuc2NoZW1lKCkpKSByZXR1cm4gdGhpczsKLQotICAgIC8vIHNpbmNlIGJhc2UgbXVzdCBiZSBoaWVyYXJjaGljYWwsIGFuZCBzaW5jZSBhIG5vbi1oaWVyYXJjaGljYWwgVVJJCi0gICAgLy8gbXVzdCBoYXZlIGJvdGggc2NoZW1lIGFuZCBvcGFxdWUgcGFydCwgdGhlIGNvbXBsZXRlIGFic29sdXRlIFVSSSBpcwotICAgIC8vIG5lZWRlZCB0byByZXNvbHZlIHRvIGEgbm9uLWhpZXJhcmNoaWNhbCBVUkkKLSAgICBpZiAoIWlzSGllcmFyY2hpY2FsKCkpIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nIG5ld0F1dGhvcml0eSA9IGF1dGhvcml0eTsKLSAgICBTdHJpbmcgbmV3RGV2aWNlID0gZGV2aWNlOwotICAgIGJvb2xlYW4gbmV3QWJzb2x1dGVQYXRoID0gYWJzb2x1dGVQYXRoOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gc2VnbWVudHM7Ci0gICAgU3RyaW5nIG5ld1F1ZXJ5ID0gcXVlcnk7Ci0KLSAgICBpZiAoZXF1YWxzKGF1dGhvcml0eSwgYmFzZS5hdXRob3JpdHkoKSkgJiYKLSAgICAgICAgKGhhc0RldmljZSgpIHx8IGhhc1BhdGgoKSB8fCAoIWJhc2UuaGFzRGV2aWNlKCkgJiYgIWJhc2UuaGFzUGF0aCgpKSkpCi0gICAgewotICAgICAgLy8gbWF0Y2hpbmcgYXV0aG9yaXRpZXMgYW5kIG5vIGRldmljZSBvciBwYXRoIHJlbW92YWwKLSAgICAgIG5ld0F1dGhvcml0eSA9IG51bGw7Ci0KLSAgICAgIGlmIChlcXVhbHMoZGV2aWNlLCBiYXNlLmRldmljZSgpKSAmJiAoaGFzUGF0aCgpIHx8ICFiYXNlLmhhc1BhdGgoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIG1hdGNoaW5nIGRldmljZXMgYW5kIG5vIHBhdGggcmVtb3ZhbAotICAgICAgICBuZXdEZXZpY2UgPSBudWxsOwotCi0gICAgICAgIC8vIGV4Y2VwdGlvbiBpZiAoIWhhc1BhdGgoKSAmJiBiYXNlLmhhc1BhdGgoKSkKLQotICAgICAgICBpZiAoIWFueVJlbFBhdGggJiYgIXNob3J0ZXJSZWxQYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdXNlciByZWplY3RzIGEgcmVsYXRpdmUgcGF0aDoga2VlcCBhYnNvbHV0ZSBvciBubyBwYXRoCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaGFzUGF0aCgpID09IGJhc2UuaGFzUGF0aCgpICYmIHNlZ21lbnRzRXF1YWwoYmFzZSkgJiYKLSAgICAgICAgICAgICAgICAgZXF1YWxzKHF1ZXJ5LCBiYXNlLnF1ZXJ5KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY3VycmVudCBkb2N1bWVudCByZWZlcmVuY2U6IGtlZXAgbm8gcGF0aCBvciBxdWVyeQotICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCA9IGZhbHNlOwotICAgICAgICAgIG5ld1NlZ21lbnRzID0gTk9fU0VHTUVOVFM7Ci0gICAgICAgICAgbmV3UXVlcnkgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFoYXNQYXRoKCkgJiYgIWJhc2UuaGFzUGF0aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gbm8gcGF0aHM6IGtlZXAgcXVlcnkgb25seQotICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCA9IGZhbHNlOwotICAgICAgICAgIG5ld1NlZ21lbnRzID0gTk9fU0VHTUVOVFM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZXhjZXB0aW9uIGlmICghaGFzQWJzb2x1dGVQYXRoKCkpCi0gICAgICAgIGVsc2UgaWYgKGhhc0NvbGxhcHNhYmxlU2VnbWVudHMocHJlc2VydmVSb290UGFyZW50cykpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBwYXRoIGZvcm0gZGVtYW5kcyBhbiBhYnNvbHV0ZSBwYXRoOiBrZWVwIGl0IGFuZCBxdWVyeQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIGtlZXAgcXVlcnkgYW5kIHNlbGVjdCByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIGJhc2VkIG9uIGxlbmd0aAotICAgICAgICAgIFN0cmluZ1tdIHJlbCA9IGZpbmRSZWxhdGl2ZVBhdGgoYmFzZSwgcHJlc2VydmVSb290UGFyZW50cyk7Ci0gICAgICAgICAgaWYgKGFueVJlbFBhdGggfHwgc2VnbWVudHMubGVuZ3RoID4gcmVsLmxlbmd0aCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyB1c2VyIGRlbWFuZHMgYSByZWxhdGl2ZSBwYXRoIG9yIHRoZSBhYnNvbHV0ZSBwYXRoIGlzIGxvbmdlcgotICAgICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gZmFsc2U7Ci0gICAgICAgICAgICBuZXdTZWdtZW50cyA9IHJlbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZWxzZSBrZWVwIHNob3J0ZXIgYWJzb2x1dGUgcGF0aAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBlbHNlIGtlZXAgZGV2aWNlLCBwYXRoLCBhbmQgcXVlcnkKLSAgICB9Ci0gICAgLy8gZWxzZSBrZWVwIGF1dGhvcml0eSwgZGV2aWNlLCBwYXRoLCBhbmQgcXVlcnkKLQotICAgIC8vIGFsd2F5cyBpbmNsdWRlIGZyYWdtZW50LCBldmVuIGlmIG51bGw7Ci0gICAgLy8gbm8gdmFsaWRhdGlvbiBuZWVkZWQgc2luY2UgYWxsIGNvbXBvbmVudHMgYXJlIGZyb20gZXhpc3RpbmcgVVJJcwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIG51bGwsIG5ld0F1dGhvcml0eSwgbmV3RGV2aWNlLCBuZXdBYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIG5ld1F1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5vbi1yZWxhdGl2ZSBwYXRoIGluY2x1ZGVzIHNlZ21lbnRzIHRoYXQgd291bGQgYmUKLSAgLy8gY29sbGFwc2VkIHdoZW4gcmVzb2x2aW5nOyBmYWxzZSBvdGhlcndpc2UuICBJZiBwcmVzZXJ2ZVJvb3RQYXJlbnRzIGlzCi0gIC8vIHRydWUsIGNvbGxhcHNhYmxlIHNlZ21lbnRzIGluY2x1ZGUgYW55IGVtcHR5IHNlZ21lbnRzLCBleGNlcHQgZm9yIHRoZQotICAvLyBsYXN0IHNlZ21lbnQsIGFzIHdlbGwgYXMgYW5kIHBhcmVudCBhbmQgc2VsZiByZWZlcmVuY2VzLiAgSWYKLSAgLy8gcHJlc2VydmVSb290c1BhcmVudHMgaXMgZmFsc2UsIHBhcmVudCByZWZlcmVuY2VzIGFyZSBub3QgY29sbGFwc2FibGUgaWYKLSAgLy8gdGhleSBhcmUgdGhlIGZpcnN0IHNlZ21lbnQgb3IgcHJlY2VlZGVkIG9ubHkgYnkgb3RoZXIgcGFyZW50Ci0gIC8vIHJlZmVyZW5jZXMuCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNDb2xsYXBzYWJsZVNlZ21lbnRzKGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmIChoYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0ZXN0IGNvbGxhcHNhYmlsaXR5IG9mIHJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHNlZ21lbnQgPSBzZWdtZW50c1tpXTsKLSAgICAgIGlmICgoaSA8IGxlbiAtIDEgJiYgU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudCkpIHx8Ci0gICAgICAgICAgU0VHTUVOVF9TRUxGLmVxdWFscyhzZWdtZW50KSB8fAotICAgICAgICAgIFNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50KSAmJiAoCi0gICAgICAgICAgICAhcHJlc2VydmVSb290UGFyZW50cyB8fCAoCi0gICAgICAgICAgICAgIGkgIT0gMCAmJiAhU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnRzW2kgLSAxXSkpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHNob3J0ZXN0IHJlbGF0aXZlIHBhdGggYmV0d2VlbiB0aGUgdGhlIG5vbi1yZWxhdGl2ZSBwYXRoIG9mCi0gIC8vIHRoZSBnaXZlbiBiYXNlIGFuZCB0aGlzIGFic29sdXRlIHBhdGguICBJZiB0aGUgYmFzZSBoYXMgbm8gcGF0aCwgaXQgaXMKLSAgLy8gdHJlYXRlZCBhcyB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLgotICBwcml2YXRlIFN0cmluZ1tdIGZpbmRSZWxhdGl2ZVBhdGgoVVJJIGJhc2UsIGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmIChiYXNlLmhhc1JlbGF0aXZlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJmaW5kIHJlbGF0aXZlIHBhdGggYWdhaW5zdCBiYXNlIHdpdGggcmVsYXRpdmUgcGF0aCIpOwotICAgIH0KLSAgICBpZiAoIWhhc0Fic29sdXRlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJmaW5kIHJlbGF0aXZlIHBhdGggb2Ygbm9uLWFic29sdXRlIHBhdGgiKTsKLSAgICB9Ci0KLSAgICAvLyB0cmVhdCBhbiBlbXB0eSBiYXNlIHBhdGggYXMgdGhlIHJvb3QgYWJzb2x1dGUgcGF0aAotICAgIFN0cmluZ1tdIHN0YXJ0UGF0aCA9IGJhc2UuY29sbGFwc2VTZWdtZW50cyhwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICBTdHJpbmdbXSBlbmRQYXRoID0gc2VnbWVudHM7Ci0KLSAgICAvLyBkcm9wIGxhc3Qgc2VnbWVudCBmcm9tIGJhc2UsIGFzIGluIHJlc29sdmluZwotICAgIGludCBzdGFydENvdW50ID0gc3RhcnRQYXRoLmxlbmd0aCA+IDAgPyBzdGFydFBhdGgubGVuZ3RoIC0gMSA6IDA7Ci0gICAgaW50IGVuZENvdW50ID0gZW5kUGF0aC5sZW5ndGg7Ci0KLSAgICAvLyBpbmRleCBvZiBmaXJzdCBzZWdtZW50IHRoYXQgaXMgZGlmZmVyZW50IGJldHdlZW4gZW5kUGF0aCBhbmQgc3RhcnRQYXRoCi0gICAgaW50IGRpZmYgPSAwOwotCi0gICAgLy8gaWYgZW5kUGF0aCBpcyBzaG9ydGVyIHRoYW4gc3RhcnRQYXRoLCB0aGUgbGFzdCBzZWdtZW50IG9mIGVuZFBhdGggbWF5Ci0gICAgLy8gbm90IGJlIGNvbXBhcmVkOiBiZWNhdXNlIHN0YXJ0UGF0aCBoYXMgYmVlbiBjb2xsYXBzZWQgYW5kIGhhZCBpdHMKLSAgICAvLyBsYXN0IHNlZ21lbnQgcmVtb3ZlZCwgYWxsIHByZWNlZWRpbmcgc2VnbWVudHMgY2FuIGJlIGNvbnNpZGVyZWQgbm9uLQotICAgIC8vIGVtcHR5IGFuZCBmb2xsb3dlZCBieSBhIHNlcGFyYXRvciwgd2hpbGUgdGhlIGxhc3Qgc2VnbWVudCBvZiBlbmRQYXRoCi0gICAgLy8gd2lsbCBlaXRoZXIgYmUgbm9uLWVtcHR5IGFuZCBub3QgZm9sbG93ZWQgYnkgYSBzZXBhcmF0b3IsIG9yIGp1c3QgZW1wdHkKLSAgICBmb3IgKGludCBjb3VudCA9IHN0YXJ0Q291bnQgPCBlbmRDb3VudCA/IHN0YXJ0Q291bnQgOiBlbmRDb3VudCAtIDE7Ci0gICAgICAgICBkaWZmIDwgY291bnQgJiYgc3RhcnRQYXRoW2RpZmZdLmVxdWFscyhlbmRQYXRoW2RpZmZdKTsgZGlmZisrKTsKLQotICAgIGludCB1cENvdW50ID0gc3RhcnRDb3VudCAtIGRpZmY7Ci0gICAgaW50IGRvd25Db3VudCA9IGVuZENvdW50IC0gZGlmZjsKLQotICAgIC8vIGEgc2luZ2xlIHNlcGFyYXRvciwgcG9zc2libHkgcHJlY2VlZGVkIGJ5IHNvbWUgcGFyZW50IHJlZmVyZW5jZQotICAgIC8vIHNlZ21lbnRzLCBpcyByZWR1bmRhbnQKLSAgICBpZiAoZG93bkNvdW50ID09IDEgJiYgU0VHTUVOVF9FTVBUWS5lcXVhbHMoZW5kUGF0aFtlbmRDb3VudCAtIDFdKSkKLSAgICB7Ci0gICAgICBkb3duQ291bnQgPSAwOwotICAgIH0KLQotICAgIC8vIGFuIGVtcHR5IHBhdGggbmVlZHMgdG8gYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgIi4iIGlmIHRoZXJlIGlzIG5vCi0gICAgLy8gcXVlcnksIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gYSBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZQotICAgIGlmICh1cENvdW50ICsgZG93bkNvdW50ID09IDApCi0gICAgewotICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpIHJldHVybiBuZXcgU3RyaW5nW10geyBTRUdNRU5UX1NFTEYgfTsKLSAgICAgIHJldHVybiBOT19TRUdNRU5UUzsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gYSBjb3JyZWN0bHkgc2l6ZWQgcmVzdWx0Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t1cENvdW50ICsgZG93bkNvdW50XTsKLSAgICBBcnJheXMuZmlsbChyZXN1bHQsIDAsIHVwQ291bnQsIFNFR01FTlRfUEFSRU5UKTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGVuZFBhdGgsIGRpZmYsIHJlc3VsdCwgdXBDb3VudCwgZG93bkNvdW50KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gQ29sbGFwc2VzIG5vbi1lbmRpbmcgZW1wdHkgc2VnbWVudHMsIHBhcmVudCByZWZlcmVuY2VzLCBhbmQgc2VsZgotICAvLyByZWZlcmVuY2VzIGluIGEgbm9uLXJlbGF0aXZlIHBhdGgsIHJldHVybmluZyB0aGUgc2FtZSBwYXRoIHRoYXQgd291bGQKLSAgLy8gYmUgcHJvZHVjZWQgZnJvbSB0aGUgYmFzZSBoaWVyYXJjaGljYWwgVVJJIGFzIHBhcnQgb2YgYSByZXNvbHZlLgotICBTdHJpbmdbXSBjb2xsYXBzZVNlZ21lbnRzKGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmIChoYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb2xsYXBzZSByZWxhdGl2ZSBwYXRoIik7Ci0gICAgfQotCi0gICAgaWYgKCFoYXNDb2xsYXBzYWJsZVNlZ21lbnRzKHByZXNlcnZlUm9vdFBhcmVudHMpKSByZXR1cm4gc2VnbWVudHMoKTsKLQotICAgIC8vIHVzZSBhIHN0YWNrIHRvIGFjY3VtdWxhdGUgc2VnbWVudHMKLSAgICBpbnQgc2VnbWVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotICAgIFN0cmluZ1tdIHN0YWNrID0gbmV3IFN0cmluZ1tzZWdtZW50Q291bnRdOwotICAgIGludCBzcCA9IDA7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRDb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHNwID0gYWNjdW11bGF0ZShzdGFjaywgc3AsIHNlZ21lbnRzW2ldLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgcGF0aCBpcyBub24tZW1wdHkgYW5kIG9yaWdpbmFsbHkgZW5kZWQgaW4gYW4gZW1wdHkgc2VnbWVudCwgYQotICAgIC8vIHBhcmVudCByZWZlcmVuY2UsIG9yIGEgc2VsZiByZWZlcmVuY2UsIGFkZCBhIHRyYWlsaW5nIHNlcGFyYXRvcgotICAgIGlmIChzcCA+IDAgJiYgKFNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSB8fAotICAgICAgICAgICAgICAgICAgIFNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkgfHwKLSAgICAgICAgICAgICAgICAgICBTRUdNRU5UX1NFTEYuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIHN0YWNrW3NwKytdID0gU0VHTUVOVF9FTVBUWTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gYSBjb3JyZWN0bHkgc2l6ZWQgcmVzdWx0Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzcF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzdGFjaywgMCwgcmVzdWx0LCAwLCBzcCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVUkkuICBGb3IgYSBnZW5lcmljLAotICAgKiBub24taGllcmFyY2hpY2FsIFVSSSwgdGhpcyBsb29rcyBsaWtlOgotICAgKiA8cHJlPgotICAgKiAgIHNjaGVtZTpvcGFxdWVQYXJ0I2ZyYWdtZW50PC9wcmU+Ci0gICAqIAotICAgKiA8cD5Gb3IgYSBoaWVyYXJjaGljYWwgVVJJLCBpdCBsb29rcyBsaWtlOgotICAgKiA8cHJlPgotICAgKiAgIHNjaGVtZTovL2F1dGhvcml0eS9kZXZpY2UvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLj9xdWVyeSNmcmFnbWVudDwvcHJlPgotICAgKgotICAgKiA8cD5Gb3IgYW4gPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPiwgaXQncyBqdXN0OgotICAgKiA8cHJlPgotICAgKiAgIHNjaGVtZTphdXRob3JpdHkvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLj9xdWVyeSNmcmFnbWVudDwvcHJlPgotICAgKiA8cD5PZiBjb3Vyc2UsIGFic2VudCBjb21wb25lbnRzIGFuZCB0aGVpciBzZXBhcmF0b3JzIHdpbGwgYmUgb21pdHRlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGNhY2hlZFRvU3RyaW5nID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGlmICghaXNSZWxhdGl2ZSgpKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKHNjaGVtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoU0NIRU1FX1NFUEFSQVRPUik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0hpZXJhcmNoaWNhbCgpKQotICAgICAgewotICAgICAgICBpZiAoaGFzQXV0aG9yaXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzQXJjaGl2ZSgpKSByZXN1bHQuYXBwZW5kKEFVVEhPUklUWV9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNEZXZpY2UoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgoKSkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkgIT0gMCkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzUXVlcnkoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoUVVFUllfU0VQQVJBVE9SKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKHF1ZXJ5KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKGF1dGhvcml0eSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChoYXNGcmFnbWVudCgpKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKEZSQUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZnJhZ21lbnQpOwotICAgICAgfQotICAgICAgY2FjaGVkVG9TdHJpbmcgPSByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNhY2hlZFRvU3RyaW5nOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSSSBmb3IgZGVidWdnaW5nLCBleHBsaWNpdGx5Ci0gIC8vIHNob3dpbmcgZWFjaCBvZiB0aGUgY29tcG9uZW50cy4KLSAgU3RyaW5nIHRvU3RyaW5nKGJvb2xlYW4gaW5jbHVkZVNpbXBsZUZvcm0pCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChpbmNsdWRlU2ltcGxlRm9ybSkgcmVzdWx0LmFwcGVuZCh0b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiBoaWVyYXJjaGljYWw6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoaGllcmFyY2hpY2FsKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgICBzY2hlbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc2NoZW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICBhdXRob3JpdHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgICBkZXZpY2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZGV2aWNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiBhYnNvbHV0ZVBhdGg6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoYWJzb2x1dGVQYXRoKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgc2VnbWVudHM6ICIpOwotICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT0gMCkgcmVzdWx0LmFwcGVuZCgiPGVtcHR5PiIpOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSA+IDApIHJlc3VsdC5hcHBlbmQoIlxuICAgICAgICAgICAgICAgIik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gICAgICAgIHF1ZXJ5OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHF1ZXJ5KTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgZnJhZ21lbnQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZnJhZ21lbnQpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIFVSSSBtYXkgcmVmZXIgZGlyZWN0bHkgdG8gYSBsb2NhbGx5IGFjY2Vzc2libGUgZmlsZSwgYXMKLSAgICogZGV0ZXJtaW5lZCBieSB7QGxpbmsgI2lzRmlsZSBpc0ZpbGV9LCB7QGxpbmsgZGVjb2RlIGRlY29kZXN9IGFuZCBmb3JtYXRzICAKLSAgICogdGhlIFVSSSBhcyBhIHBhdGhuYW1lIHRvIHRoYXQgZmlsZTsgcmV0dXJucyBudWxsIG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+SWYgdGhlcmUgaXMgbm8gYXV0aG9yaXR5LCB0aGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzOgotICAgKiA8cHJlPgotICAgKiAgIGRldmljZS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uPC9wcmU+Ci0gICAqCi0gICAqIDxwPklmIHRoZXJlIGlzIGFuIGF1dGhvcml0eSwgaXQgaXM6Ci0gICAqIDxwcmU+Ci0gICAqICAgLy9hdXRob3JpdHkvZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICogCi0gICAqIDxwPkhvd2V2ZXIsIHRoZSBjaGFyYWN0ZXIgdXNlZCBhcyBhIHNlcGFyYXRvciBpcyBzeXN0ZW0tZGVwZW5kYW50IGFuZAotICAgKiBvYnRhaW5lZCBmcm9tIHtAbGluayBqYXZhLmlvLkZpbGUjc2VwYXJhdG9yQ2hhcn0uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvRmlsZVN0cmluZygpCi0gIHsKLSAgICBpZiAoIWlzRmlsZSgpKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgY2hhciBzZXBhcmF0b3IgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0KLSAgICBpZiAoaGFzQXV0aG9yaXR5KCkpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotCi0gICAgICBpZiAoaGFzRGV2aWNlKCkpIHJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzRGV2aWNlKCkpIHJlc3VsdC5hcHBlbmQoZGV2aWNlKTsKLSAgICBpZiAoaGFzQWJzb2x1dGVQYXRoKCkpIHJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKSByZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGVjb2RlKHJlc3VsdC50b1N0cmluZygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgb24gdG8gdGhlIGVuZAotICAgKiBvZiB0aGUgcGF0aCBvZiB0aGlzIFVSSSwgaWYgaGllcmFyY2hpY2FsOyB0aGlzIFVSSSB1bmNoYW5nZWQsCi0gICAqIG90aGVyd2lzZS4gIElmIHRoaXMgVVJJIGhhcyBhbiBhdXRob3JpdHkgYW5kL29yIGRldmljZSwgYnV0IG5vIHBhdGgsCi0gICAqIHRoZSBzZWdtZW50IGJlY29tZXMgdGhlIGZpcnN0IHVuZGVyIHRoZSByb290IGluIGFuIGFic29sdXRlIHBhdGguCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zZWdtZW50PC9jb2RlPgotICAgKiBpcyBub3QgYSB2YWxpZCBzZWdtZW50IGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2VnbWVudH0uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZFNlZ21lbnQoU3RyaW5nIHNlZ21lbnQpCi0gIHsKLSAgICBpZiAoIXZhbGlkU2VnbWVudChzZWdtZW50KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHNlZ21lbnQ6ICIgKyBzZWdtZW50KTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzSGllcmFyY2hpY2FsKCkpIHJldHVybiB0aGlzOwotCi0gICAgLy8gYWJzb2x1dGUgcGF0aCBvciBubyBwYXRoIC0+IGFic29sdXRlIHBhdGgKLSAgICBib29sZWFuIG5ld0Fic29sdXRlUGF0aCA9ICFoYXNSZWxhdGl2ZVBhdGgoKTsKLQotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbiArIDFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4pOwotICAgIG5ld1NlZ21lbnRzW2xlbl0gPSBzZWdtZW50OwotCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgbmV3QWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgc2VnbWVudHMgb24gdG8gdGhlCi0gICAqIGVuZCBvZiB0aGUgcGF0aCBvZiB0aGlzIFVSSSwgaWYgaGllcmFyY2hpY2FsOyB0aGlzIFVSSSB1bmNoYW5nZWQsCi0gICAqIG90aGVyd2lzZS4gIElmIHRoaXMgVVJJIGhhcyBhbiBhdXRob3JpdHkgYW5kL29yIGRldmljZSwgYnV0IG5vIHBhdGgsCi0gICAqIHRoZSBzZWdtZW50cyBhcmUgbWFkZSB0byBmb3JtIGFuIGFic29sdXRlIHBhdGguCi0gICAqCi0gICAqIEBwYXJhbSBzZWdtZW50cyBhbiBhcnJheSBvZiBub24tbnVsbCBzdHJpbmdzLCBlYWNoIHJlcHJlc2VudGluZyBvbmUKLSAgICogc2VnbWVudCBvZiB0aGUgcGF0aC4gIElmIGRlc2lyZWQsIGEgdHJhaWxpbmcgc2VwYXJhdG9yIHNob3VsZCBiZQotICAgKiByZXByZXNlbnRlZCBieSBhbiBlbXB0eS1zdHJpbmcgc2VnbWVudCBhcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQotICAgKiBhcnJheS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNlZ21lbnRzPC9jb2RlPgotICAgKiBpcyBub3QgYSB2YWxpZCBzZWdtZW50IGFycmF5IGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2VnbWVudHN9LgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmRTZWdtZW50cyhTdHJpbmdbXSBzZWdtZW50cykKLSAgewotICAgIGlmICghdmFsaWRTZWdtZW50cyhzZWdtZW50cykpCi0gICAgewotICAgICAgU3RyaW5nIHMgPSBzZWdtZW50cyA9PSBudWxsID8gImludmFsaWQgc2VnbWVudHM6ICIgKyBzZWdtZW50cyA6Ci0gICAgICAgICJpbnZhbGlkIHNlZ21lbnQ6ICIgKyBmaXJzdEludmFsaWRTZWdtZW50KHNlZ21lbnRzKTsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocyk7Ci0gICAgfQotCi0gICAgaWYgKCFpc0hpZXJhcmNoaWNhbCgpKSByZXR1cm4gdGhpczsKLQotICAgIC8vIGFic29sdXRlIHBhdGggb3Igbm8gcGF0aCAtPiBhYnNvbHV0ZSBwYXRoCi0gICAgYm9vbGVhbiBuZXdBYnNvbHV0ZVBhdGggPSAhaGFzUmVsYXRpdmVQYXRoKCk7IAotCi0gICAgaW50IGxlbiA9IHRoaXMuc2VnbWVudHMubGVuZ3RoOwotICAgIGludCBzZWdtZW50c0NvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW4gKyBzZWdtZW50c0NvdW50XTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4pOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCBsZW4sIHNlZ21lbnRzQ291bnQpOwotICAgIAotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIG5ld0Fic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IHRyaW1taW5nIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlZ21lbnRzCi0gICAqIChpbmNsdWRpbmcgZW1wdHkgc2VnbWVudHMsIHN1Y2ggYXMgb25lIHJlcHJlc2VudGluZyBhIHRyYWlsaW5nCi0gICAqIHNlcGFyYXRvcikgZnJvbSB0aGUgZW5kIG9mIHRoZSBwYXRoIG9mIHRoaXMgVVJJLCBpZiBoaWVyYXJjaGljYWw7Ci0gICAqIG90aGVyd2lzZSwgdGhpcyBVUkkgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotICAgKgotICAgKiA8cD5Ob3RlIHRoYXQgaWYgYWxsIHNlZ21lbnRzIGFyZSB0cmltbWVkIGZyb20gYW4gYWJzb2x1dGUgcGF0aCwgdGhlCi0gICAqIHJvb3QgYWJzb2x1dGUgcGF0aCByZW1haW5zLgotICAgKiAKLSAgICogQHBhcmFtIGkgdGhlIG51bWJlciBvZiBzZWdtZW50cyB0byBiZSB0cmltbWVkIGluIHRoZSByZXR1cm5lZCBVUkkuICBJZgotICAgKiBsZXNzIHRoYW4gMSwgdGhpcyBVUkkgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkOyBpZiBlcXVhbCB0byBvciBncmVhdGVyCi0gICAqIHRoYW4gdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiB0aGlzIFVSSSdzIHBhdGgsIGFsbCBzZWdtZW50cyBhcmUKLSAgICogdHJpbW1lZC4gIAotICAgKi8KLSAgcHVibGljIFVSSSB0cmltU2VnbWVudHMoaW50IGkpCi0gIHsKLSAgICBpZiAoIWlzSGllcmFyY2hpY2FsKCkgfHwgaSA8IDEpIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBOT19TRUdNRU5UUzsKLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoIC0gaTsKLSAgICBpZiAobGVuID4gMCkKLSAgICB7Ci0gICAgICBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbbGVuXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4pOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB0aGF0IGhhcyBhIHBhdGgKLSAgICogdGhhdCBlbmRzIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3I7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdHJhaWxpbmcgc2VwYXJhdG9yIGlzIHJlcHJlc2VudGVkIGFzIGFuIGVtcHR5IHNlZ21lbnQgYXMgdGhlCi0gICAqIGxhc3Qgc2VnbWVudCBpbiB0aGUgcGF0aDsgbm90ZSB0aGF0IHRoaXMgZGVmaW5pdGlvbiBkb2VzIDxlbT5ub3Q8L2VtPgotICAgKiBpbmNsdWRlIHRoZSBsb25lIHNlcGFyYXRvciBpbiB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkKLSAgewotICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggPiAwICYmIAotICAgICAgU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0pOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdob3NlIHBhdGggaW5jbHVkZXMgYSBmaWxlIGV4dGVuc2lvbiwKLSAgICogdGhhdCBmaWxlIGV4dGVuc2lvbiBpcyByZXR1cm5lZDsgbnVsbCBvdGhlcndpc2UuICBXZSBkZWZpbmUgYSBmaWxlCi0gICAqIGV4dGVuc2lvbiBhcyBhbnkgc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFzdCBwZXJpb2QgKCIuIikgaW4gdGhlIGZpbmFsCi0gICAqIHBhdGggc2VnbWVudC4gIElmIHRoZXJlIGlzIG5vIHBhdGgsIHRoZSBwYXRoIGVuZHMgaW4gYSB0cmFpbGluZwotICAgKiBzZXBhcmF0b3IsIG9yIHRoZSBmaW5hbCBzZWdtZW50IGNvbnRhaW5zIG5vIHBlcmlvZCwgdGhlbiB3ZSBjb25zaWRlcgotICAgKiB0aGVyZSB0byBiZSBubyBmaWxlIGV4dGVuc2lvbi4gIElmIHRoZSBmaW5hbCBzZWdtZW50IGVuZHMgaW4gYSBwZXJpb2QsCi0gICAqIHRoZW4gdGhlIGZpbGUgZXh0ZW5zaW9uIGlzIGFuIGVtcHR5IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZmlsZUV4dGVuc2lvbigpCi0gIHsKLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoOwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmcgbGFzdFNlZ21lbnQgPSBzZWdtZW50c1tsZW4gLSAxXTsKLSAgICBpbnQgaSA9IGxhc3RTZWdtZW50Lmxhc3RJbmRleE9mKEZJTEVfRVhURU5TSU9OX1NFUEFSQVRPUik7Ci0gICAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IGxhc3RTZWdtZW50LnN1YnN0cmluZyhpICsgMSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSBhcHBlbmRpbmcgYSBwZXJpb2QgKCIuIikgZm9sbG93ZWQgYnkgdGhlCi0gICAqIHNwZWNpZmllZCBmaWxlIGV4dGVuc2lvbiB0byB0aGUgbGFzdCBwYXRoIHNlZ21lbnQgb2YgdGhpcyBVUkksIGlmIGl0IGlzCi0gICAqIGhpZXJhcmNoaWNhbCB3aXRoIGEgbm9uLWVtcHR5IHBhdGggZW5kaW5nIGluIGEgbm9uLWVtcHR5IHNlZ21lbnQ7Ci0gICAqIG90aGVyd2lzZSwgdGhpcyBVUkkgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCi0gICAqIDxwPlRoZSBleHRlbnNpb24gaXMgYXBwZW5kZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzZWdtZW50IGFscmVhZHkKLSAgICogY29udGFpbnMgYW4gZXh0ZW5zaW9uLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYKLSAgICogPGNvZGU+ZmlsZUV4dGVuc2lvbjwvY29kZT4gaXMgbm90IGEgdmFsaWQgc2VnbWVudCAocG9ydGlvbikgYWNjb3JkaW5nCi0gICAqIHRvIHtAbGluayAjdmFsaWRTZWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kRmlsZUV4dGVuc2lvbihTdHJpbmcgZmlsZUV4dGVuc2lvbikKLSAgewotICAgIGlmICghdmFsaWRTZWdtZW50KGZpbGVFeHRlbnNpb24pKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJpbnZhbGlkIHNlZ21lbnQgcG9ydGlvbjogIiArIGZpbGVFeHRlbnNpb24pOwotICAgIH0KLQotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gdGhpczsKLQotICAgIFN0cmluZyBsYXN0U2VnbWVudCA9IHNlZ21lbnRzW2xlbiAtIDFdOwotICAgIGlmIChTRUdNRU5UX0VNUFRZLmVxdWFscyhsYXN0U2VnbWVudCkpIHJldHVybiB0aGlzOwotICAgIFN0cmluZ0J1ZmZlciBuZXdMYXN0U2VnbWVudCA9IG5ldyBTdHJpbmdCdWZmZXIobGFzdFNlZ21lbnQpOwotICAgIG5ld0xhc3RTZWdtZW50LmFwcGVuZChGSUxFX0VYVEVOU0lPTl9TRVBBUkFUT1IpOwotICAgIG5ld0xhc3RTZWdtZW50LmFwcGVuZChmaWxlRXh0ZW5zaW9uKTsKLQotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW5dOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4gLSAxKTsKLSAgICBuZXdTZWdtZW50c1tsZW4gLSAxXSA9IG5ld0xhc3RTZWdtZW50LnRvU3RyaW5nKCk7Ci0gICAgCi0gICAgLy8gbm90ZTogc2VnbWVudHMubGVuZ3RoID4gMCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7IAotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIGhhcyBhIG5vbi1udWxsIHtAbGluayAjZmlsZUV4dGVuc2lvbiBmaWxlRXh0ZW5zaW9ufSwKLSAgICogcmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSByZW1vdmluZyBpdDsgdGhpcyBVUkkgdW5jaGFuZ2VkLCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgVVJJIHRyaW1GaWxlRXh0ZW5zaW9uKCkKLSAgewotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gdGhpczsKLQotICAgIFN0cmluZyBsYXN0U2VnbWVudCA9IHNlZ21lbnRzW2xlbiAtIDFdOwotICAgIGludCBpID0gbGFzdFNlZ21lbnQubGFzdEluZGV4T2YoRklMRV9FWFRFTlNJT05fU0VQQVJBVE9SKTsKLSAgICBpZiAoaSA8IDApIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nIG5ld0xhc3RTZWdtZW50ID0gbGFzdFNlZ21lbnQuc3Vic3RyaW5nKDAsIGkpOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW5dOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4gLSAxKTsKLSAgICBuZXdTZWdtZW50c1tsZW4gLSAxXSA9IG5ld0xhc3RTZWdtZW50OwotCi0gICAgLy8gbm90ZTogc2VnbWVudHMubGVuZ3RoID4gMCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7IAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgdGhhdCBlbmRzIGluIGEKLSAgICogc2xhc2g7IHRoYXQgaXMsIGl0IGhhcyBhIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yIG9yIGlzIHRoZSByb290Ci0gICAqIGFic29sdXRlIHBhdGgsIGFuZCBoYXMgbm8gcXVlcnkgYW5kIG5vIGZyYWdtZW50OyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogaXMgcmV0dXJuZWQgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVmaXgoKQotICB7Ci0gICAgcmV0dXJuIGhpZXJhcmNoaWNhbCAmJiBxdWVyeSA9PSBudWxsICYmIGZyYWdtZW50ID09IG51bGwgJiYKLSAgICAgIChoYXNUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSB8fCAoYWJzb2x1dGVQYXRoICYmIHNlZ21lbnRzLmxlbmd0aCA9PSAwKSk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgcmVmZXJlbmNlIGFuZCA8Y29kZT5vbGRQcmVmaXg8L2NvZGU+IGlzIGEKLSAgICogcHJlZml4IG9mIGl0LCB0aGlzIHJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgcmVwbGFjaW5nIGl0IGJ5Ci0gICAqIDxjb2RlPm5ld1ByZWZpeDwvY29kZT47IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+SW4gb3JkZXIgdG8gYmUgYSBwcmVmaXgsIHRoZSA8Y29kZT5vbGRQcmVmaXg8L2NvZGU+J3MKLSAgICoge0BsaW5rICNpc1ByZWZpeCBpc1ByZWZpeH0gbXVzdCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4sIGFuZCBpdCBtdXN0Ci0gICAqIG1hdGNoIHRoaXMgVVJJJ3Mgc2NoZW1lLCBhdXRob3JpdHksIGFuZCBkZXZpY2UuICBBbHNvLCB0aGUgcGF0aHMgbXVzdAotICAgKiBtYXRjaCwgdXAgdG8gcHJlZml4J3MgZW5kLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyCi0gICAqIDxjb2RlPm9sZFByZWZpeDwvY29kZT4gb3IgPGNvZGU+bmV3UHJlZml4PC9jb2RlPiBpcyBub3QgYSBwcmVmaXggVVJJCi0gICAqIGFjY29yZGluZyB0byB7QGxpbmsgI2lzUHJlZml4fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgcmVwbGFjZVByZWZpeChVUkkgb2xkUHJlZml4LCBVUkkgbmV3UHJlZml4KQotICB7Ci0gICAgaWYgKCFvbGRQcmVmaXguaXNQcmVmaXgoKSB8fCAhbmV3UHJlZml4LmlzUHJlZml4KCkpCi0gICAgewotICAgICAgU3RyaW5nIHdoaWNoID0gb2xkUHJlZml4LmlzUHJlZml4KCkgPyAibmV3IiA6ICJvbGQiOwotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLXByZWZpeCAiICsgd2hpY2ggKyAiIHZhbHVlIik7Ci0gICAgfQotCi0gICAgLy8gR2V0IHdoYXQncyBsZWZ0IG9mIHRoZSBzZWdtZW50cyBhZnRlciB0cmltbWluZyB0aGUgcHJlZml4LgotICAgIFN0cmluZ1tdIHRhaWxTZWdtZW50cyA9IGdldFRhaWxTZWdtZW50cyhvbGRQcmVmaXgpOwotICAgIGlmICh0YWlsU2VnbWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICAvLyBJZiB0aGUgbmV3IHByZWZpeCBoYXMgc2VnbWVudHMsIGl0IGlzIG5vdCB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLAotICAgIC8vIGFuZCB3ZSBuZWVkIHRvIGRyb3AgdGhlIHRyYWlsaW5nIGVtcHR5IHNlZ21lbnQgYW5kIGFwcGVuZCB0aGUgdGFpbAotICAgIC8vIHNlZ21lbnRzLgotICAgIFN0cmluZ1tdIG1lcmdlZFNlZ21lbnRzID0gdGFpbFNlZ21lbnRzOwotICAgIGlmIChuZXdQcmVmaXguc2VnbWVudENvdW50KCkgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgc2VnbWVudHNUb0tlZXAgPSBuZXdQcmVmaXguc2VnbWVudENvdW50KCkgLSAxOwotICAgICAgbWVyZ2VkU2VnbWVudHMgPSBuZXcgU3RyaW5nW3NlZ21lbnRzVG9LZWVwICsgdGFpbFNlZ21lbnRzLmxlbmd0aF07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KG5ld1ByZWZpeC5zZWdtZW50cygpLCAwLCBtZXJnZWRTZWdtZW50cywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudHNUb0tlZXApOwotCi0gICAgICBpZiAodGFpbFNlZ21lbnRzLmxlbmd0aCAhPSAwKQotICAgICAgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRhaWxTZWdtZW50cywgMCwgbWVyZ2VkU2VnbWVudHMsIHNlZ21lbnRzVG9LZWVwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxTZWdtZW50cy5sZW5ndGgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIG5vIHZhbGlkYXRpb24gbmVlZGVkIHNpbmNlIGFsbCBjb21wb25lbnRzIGFyZSBmcm9tIGV4aXN0aW5nIFVSSXMKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBuZXdQcmVmaXguc2NoZW1lKCksIG5ld1ByZWZpeC5hdXRob3JpdHkoKSwKLSAgICAgICAgICAgICAgICAgICBuZXdQcmVmaXguZGV2aWNlKCksIG5ld1ByZWZpeC5oYXNBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICBtZXJnZWRTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHJlZmVyZW5jZSBhbmQgcHJlZml4IGlzIGEgcHJlZml4IG9mIGl0LAotICAvLyByZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSBwYXRoIHJlbWFpbmluZyBhZnRlciB0aGF0IHByZWZpeCBoYXMgYmVlbgotICAvLyB0cmltbWVkOyBudWxsIG90aGVyd2lzZS4KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRUYWlsU2VnbWVudHMoVVJJIHByZWZpeCkKLSAgewotICAgIGlmICghcHJlZml4LmlzUHJlZml4KCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLXByZWZpeCB0cmltIik7Ci0gICAgfQotCi0gICAgLy8gRG9uJ3QgZXZlbiBjb25zaWRlciBpdCB1bmxlc3MgdGhpcyBpcyBoaWVyYXJjaGljYWwgYW5kIGhhcyBzY2hlbWUsCi0gICAgLy8gYXV0aG9yaXR5LCBkZXZpY2UgYW5kIHBhdGggYWJzb2x1dGVuZXNzIGVxdWFsIHRvIHRob3NlIG9mIHRoZSBwcmVmaXguCi0gICAgaWYgKCFoaWVyYXJjaGljYWwgfHwKLSAgICAgICAgIWVxdWFscyhzY2hlbWUsIHByZWZpeC5zY2hlbWUoKSwgdHJ1ZSkgfHwKLSAgICAgICAgIWVxdWFscyhhdXRob3JpdHksIHByZWZpeC5hdXRob3JpdHkoKSkgfHwKLSAgICAgICAgIWVxdWFscyhkZXZpY2UsIHByZWZpeC5kZXZpY2UoKSkgfHwKLSAgICAgICAgYWJzb2x1dGVQYXRoICE9IHByZWZpeC5oYXNBYnNvbHV0ZVBhdGgoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgcHJlZml4IGhhcyBubyBzZWdtZW50cywgdGhlbiBpdCBpcyB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLCBhbmQKLSAgICAvLyB3ZSBrbm93IHRoaXMgaXMgYW4gYWJzb2x1dGUgcGF0aCwgdG9vLgotICAgIGlmIChwcmVmaXguc2VnbWVudENvdW50KCkgPT0gMCkgcmV0dXJuIHNlZ21lbnRzOwotCi0gICAgLy8gVGhpcyBtdXN0IGhhdmUgbm8gZmV3ZXIgc2VnbWVudHMgdGhhbiB0aGUgcHJlZml4LiAgU2luY2UgdGhlIHByZWZpeAotICAgIC8vIGlzIG5vdCB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLCBpdHMgbGFzdCBzZWdtZW50IGlzIGVtcHR5OyBhbGwgb3RoZXJzCi0gICAgLy8gbXVzdCBtYXRjaC4KLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IHNlZ21lbnRzVG9Db21wYXJlID0gcHJlZml4LnNlZ21lbnRDb3VudCgpIC0gMTsKLSAgICBpZiAoc2VnbWVudHMubGVuZ3RoIDw9IHNlZ21lbnRzVG9Db21wYXJlKSByZXR1cm4gbnVsbDsKLQotICAgIGZvciAoOyBpIDwgc2VnbWVudHNUb0NvbXBhcmU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXNlZ21lbnRzW2ldLmVxdWFscyhwcmVmaXguc2VnbWVudChpKSkpIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIFRoZSBwcmVmaXggcmVhbGx5IGlzIGEgcHJlZml4IG9mIHRoaXMuICBJZiB0aGlzIGhhcyBqdXN0IG9uZSBtb3JlLAotICAgIC8vIGVtcHR5IHNlZ21lbnQsIHRoZSBwYXRocyBhcmUgdGhlIHNhbWUuCi0gICAgaWYgKGkgPT0gc2VnbWVudHMubGVuZ3RoIC0gMSAmJiBTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50c1tpXSkpCi0gICAgewotICAgICAgcmV0dXJuIE5PX1NFR01FTlRTOwotICAgIH0KLSAgICAKLSAgICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIG5lZWRzIG9ubHkgdGhlIHJlbWFpbmluZyBzZWdtZW50cy4KLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbc2VnbWVudHMubGVuZ3RoIC0gaV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgaSwgbmV3U2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLmxlbmd0aCk7Ci0gICAgcmV0dXJuIG5ld1NlZ21lbnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIG9wYXF1ZSBwYXJ0IHZhbHVlLCBhcyBkZWZpbmVkCi0gICAqIGJ5IHRoZSBSRkMuICBBbGwgZXhjbHVkZWQgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZSBhbmQgPGNvZGU+IzwvY29kZT4sCi0gICAqIGFyZSBlc2NhcGVkLCBhcyBpcyA8Y29kZT4vPC9jb2RlPiBpZiBpdCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgKiAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlT3BhcXVlUGFydChTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBlbmNvZGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpOwotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoKCkgPiAwICYmIHJlc3VsdC5jaGFyQXQoMCkgPT0gU0VHTUVOVF9TRVBBUkFUT1IgPwotICAgICAgIiUyRiIgKyByZXN1bHQuc3Vic3RyaW5nKDEpIDoKLSAgICAgIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIGEgc3RyaW5nIHNvIGFzIHRvIHByb2R1Y2UgYSB2YWxpZCBhdXRob3JpdHksIGFzIGRlZmluZWQgYnkgdGhlCi0gICAqIFJGQy4gIEFsbCBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwKLSAgICogYXJlIGVzY2FwZWQsIGFzIGFyZSA8Y29kZT4vPC9jb2RlPiBhbmQgPGNvZGU+PzwvY29kZT4KLSAgICogCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUF1dGhvcml0eShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBlbmNvZGUodmFsdWUsIFNFR01FTlRfQ0hBUl9ISSwgU0VHTUVOVF9DSEFSX0xPLCBpZ25vcmVFc2NhcGVkKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIGEgc3RyaW5nIHNvIGFzIHRvIHByb2R1Y2UgYSB2YWxpZCBzZWdtZW50LCBhcyBkZWZpbmVkIGJ5IHRoZQotICAgKiBSRkMuICBBbGwgZXhjbHVkZWQgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZSBhbmQgPGNvZGU+IzwvY29kZT4sCi0gICAqIGFyZSBlc2NhcGVkLCBhcyBhcmUgPGNvZGU+LzwvY29kZT4gYW5kIDxjb2RlPj88L2NvZGU+Ci0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVTZWdtZW50KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgcmV0dXJuIGVuY29kZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIGlnbm9yZUVzY2FwZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIHF1ZXJ5LCBhcyBkZWZpbmVkIGJ5IHRoZSBSRkMuCi0gICAqIE9ubHkgZXhjbHVkZWQgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZSBhbmQgPGNvZGU+IzwvY29kZT4sIGFyZSBlc2NhcGVkLgotICAgKiAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlUXVlcnkoU3RyaW5nIHZhbHVlLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICByZXR1cm4gZW5jb2RlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIGEgc3RyaW5nIHNvIGFzIHRvIHByb2R1Y2UgYSB2YWxpZCBmcmFnbWVudCwgYXMgZGVmaW5lZCBieSB0aGUKLSAgICogUkZDLiAgT25seSBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwgYXJlCi0gICAqIGVzY2FwZWQuCi0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVGcmFnbWVudChTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBlbmNvZGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpOwotICB9Ci0KLSAgLy8gRW5jb2RlcyBhIGNvbXBsZXRlIFVSSSwgb3B0aW9uYWxseSBsZWF2aW5nICUgY2hhcmFjdGVycyB1bmVzY2FwZWQgd2hlbgotICAvLyBiZWdpbm5pbmcgYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlLiAgV2UgYXNzdW1lIHRoYXQgdGhlCi0gIC8vIGxhc3QgIyBiZWdpbnMgdGhlIGZyYWdtZW50LgotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgaW50IGkgPSB1cmkuaW5kZXhPZihTQ0hFTUVfU0VQQVJBVE9SKTsKLSAgICBpZiAoaSAhPSAtMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLnN1YnN0cmluZygwLCBpKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2NoZW1lKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoU0NIRU1FX1NFUEFSQVRPUik7Ci0gICAgfQotICAgIAotICAgIGludCBqID0gdXJpLmxhc3RJbmRleE9mKEZSQUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgaWYgKGogIT0gLTEpCi0gICAgewotICAgICAgU3RyaW5nIHNzcGFydCA9IHVyaS5zdWJzdHJpbmcoKytpLCBqKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RlKHNzcGFydCwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCkpOwotICAgICAgcmVzdWx0LmFwcGVuZChGUkFHTUVOVF9TRVBBUkFUT1IpOwotCi0gICAgICBTdHJpbmcgZnJhZ21lbnQgPSB1cmkuc3Vic3RyaW5nKCsraik7Ci0gICAgICByZXN1bHQuYXBwZW5kKGVuY29kZShmcmFnbWVudCwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHNzcGFydCA9IHVyaS5zdWJzdHJpbmcoKytpKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RlKHNzcGFydCwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBFbmNvZGVzIHRoZSBnaXZlbiBzdHJpbmcsIHJlcGxhY2luZyBlYWNoIEFTQ0lJIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBpbgotICAvLyB0aGUgc2V0IHNwZWNpZmllZCBieSB0aGUgMTI4LWJpdCBiaXRtYXNrIGFuZCBlYWNoIG5vbi1BU0NJSSBjaGFyYWN0ZXIKLSAgLy8gYmVsb3cgMHhBMCBieSBhbiBlc2NhcGUgc2VxdWVuY2Ugb2YgJSBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cy4gIElmCi0gIC8vICUgaXMgbm90IGluIHRoZSBzZXQgYnV0IGlnbm9yZUVzY2FwZWQgaXMgdHJ1ZSwgdGhlbiAlIHdpbGwgbm90IGJlIGVuY29kZWQKLSAgLy8gaWZmIGl0IGFscmVhZHkgYmVnaW5zIGEgdmFsaWQgZXNjYXBlIHNlcXVlbmNlLgotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSwgbG9uZyBoaWdoQml0bWFzaywgbG9uZyBsb3dCaXRtYXNrLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbnVsbDsKLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKLQotICAgICAgaWYgKCFtYXRjaGVzKGMsIGhpZ2hCaXRtYXNrLCBsb3dCaXRtYXNrKSAmJiBjIDwgMTYwICYmCi0gICAgICAgICAgKCFpZ25vcmVFc2NhcGVkIHx8ICFpc0VzY2FwZWQodmFsdWUsIGkpKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICB9Ci0gICAgICAgIGFwcGVuZEVzY2FwZWQocmVzdWx0LCAoYnl0ZSljKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKGMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyB2YWx1ZSA6IHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8gVGVzdHMgd2hldGhlciBhbiBlc2NhcGUgb2NjdXJzIGluIHRoZSBnaXZlbiBzdHJpbmcsIHN0YXJ0aW5nIGF0IGluZGV4IGkuCi0gIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZSBpcyBhICUgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFc2NhcGVkKFN0cmluZyBzLCBpbnQgaSkKLSAgewotICAgIHJldHVybiBzLmNoYXJBdChpKSA9PSBFU0NBUEUgJiYgcy5sZW5ndGgoKSA+IGkgKyAyICYmCi0gICAgICBtYXRjaGVzKHMuY2hhckF0KGkgKyAxKSwgSEVYX0hJLCBIRVhfTE8pICYmCi0gICAgICBtYXRjaGVzKHMuY2hhckF0KGkgKyAyKSwgSEVYX0hJLCBIRVhfTE8pOwotICB9Ci0KLSAgLy8gQ29tcHV0ZXMgYSB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlIGZvciB0aGUgYnl0ZSwgYXBwZW5kaW5nCi0gIC8vIGl0IHRvIHRoZSBTdHJpbmdCdWZmZXIuICBPbmx5IGNoYXJhY3RlcnMgdXAgdG8gMHhGRiBzaG91bGQgYmUgZXNjYXBlZDsKLSAgLy8gYWxsIGJ1dCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSB3aWxsIGJlIGlnbm9yZWQuCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kRXNjYXBlZChTdHJpbmdCdWZmZXIgcmVzdWx0LCBieXRlIGIpCi0gIHsKLSAgICByZXN1bHQuYXBwZW5kKEVTQ0FQRSk7Ci0KLSAgICAvLyBUaGUgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHdpZGVuZWQgaW50byBhbiBpbnQsIHdpdGggc2lnbiBleHRlbnNpb24sCi0gICAgLy8gZm9yIHNoaWZ0aW5nLiAgVGhpcyBjYW4gaW50cm9kdWNlIDEncyB0byB0aGUgbGVmdCBvZiB0aGUgYnl0ZSwgd2hpY2gKLSAgICAvLyBtdXN0IGJlIGNsZWFyZWQgYnkgbWFza2luZyBiZWZvcmUgbG9va2luZyB1cCB0aGUgaGV4IGRpZ2l0LgotICAgIC8vCi0gICAgcmVzdWx0LmFwcGVuZChIRVhfRElHSVRTWyhiID4+IDQpICYgMHgwRl0pOwotICAgIHJlc3VsdC5hcHBlbmQoSEVYX0RJR0lUU1tiICYgMHgwRl0pOwotICB9Ci0KLSAgLyoqCi0gICAqIERlY29kZXMgdGhlIGdpdmVuIHN0cmluZywgcmVwbGFjaW5nIGVhY2ggdGhyZWUtZGlnaXQgZXNjYXBlIHNlcXVlbmNlIGJ5Ci0gICAqIHRoZSBjaGFyYWN0ZXIgdGhhdCBpdCByZXByZXNlbnRzLiAgSW5jb21wbGV0ZSBlc2NhcGUgc2VxdWVuY2VzIGFyZQotICAgKiBpZ25vcmVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBudWxsOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGlzRXNjYXBlZCh2YWx1ZSwgaSkpIAotICAgICAgewotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLnN1YnN0cmluZygwLCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCh1bmVzY2FwZSh2YWx1ZS5jaGFyQXQoaSArIDEpLCB2YWx1ZS5jaGFyQXQoaSArIDIpKSk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlLmNoYXJBdChpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IHZhbHVlIDogcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgZW5jb2RlZCBieSAlIGZvbGxvd2VkIGJ5IHRoZSB0d28gZ2l2ZW4gaGV4IGRpZ2l0cywKLSAgLy8gd2hpY2ggaXMgYWx3YXlzIDB4RkYgb3IgbGVzcywgc28gY2FuIHNhZmVseSBiZSBjYXN0ZWQgdG8gYSBieXRlLiAgSWYKLSAgLy8gZWl0aGVyIGNoYXJhY3RlciBpcyBub3QgYSBoZXggZGlnaXQsIGEgYm9ndXMgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgdW5lc2NhcGUoY2hhciBoaWdoSGV4RGlnaXQsIGNoYXIgbG93SGV4RGlnaXQpCi0gIHsKLSAgICByZXR1cm4gKGNoYXIpKCh2YWx1ZU9mKGhpZ2hIZXhEaWdpdCkgPDwgNCkgfCB2YWx1ZU9mKGxvd0hleERpZ2l0KSk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBpbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGhleCBkaWdpdC4KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHZhbHVlT2YoY2hhciBoZXhEaWdpdCkKLSAgewotICAgIGlmIChoZXhEaWdpdCA+PSAnQScgJiYgaGV4RGlnaXQgPD0gJ0YnKQotICAgIHsKLSAgICAgIHJldHVybiBoZXhEaWdpdCAtICdBJyArIDEwOwotICAgIH0KLSAgICBpZiAoaGV4RGlnaXQgPj0gJ2EnICYmIGhleERpZ2l0IDw9ICdmJykKLSAgICB7Ci0gICAgICByZXR1cm4gaGV4RGlnaXQgLSAnYScgKyAxMDsKLSAgICB9Ci0gICAgaWYgKGhleERpZ2l0ID49ICcwJyAmJiBoZXhEaWdpdCA8PSAnOScpCi0gICAgewotICAgICAgcmV0dXJuIGhleERpZ2l0IC0gJzAnOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgdGFrZXMgdHdvIFVSSXMsIHRoZSBmaXJzdCBvbmUgcmVsYXRpdmUsIHRoZSBzZWNvbmQgYWJzb2x1dGUuIEl0Ci0gICAqIHRyaWVzIHRvIHJlc29sdmUgdGhlIGZpcnN0IFVSSSAobWFraW5nIGl0IGFic29sdXRlKSBieSB1c2luZyB0aGUgc2Vjb25kIG9uZS4KLSAgICogSWYgdGhlIFVSSSBjYW5ub3QgYmUgcmVzb2x2ZWQsIHRoZSByZWxhdGl2ZSBvbmUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSByZWxhdGl2ZVVSSQotICAgKiBAcGFyYW0gYWJzb2x1dGVVUkkKLSAgICogQHJldHVybiByZWxhdGl2ZVVSSSByZXNvbHZlZCAoYWJzb2x1dGUpIG9yIHJlbGF0aXZlVVJJIHVubW9kaWZpZWQgaWYgaXQgY2Fubm90Ci0gICAqIGJlIHJlc29sdmVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVJlbGF0aXZlVVJJKFN0cmluZyByZWxhdGl2ZVVSSSwgU3RyaW5nIGFic29sdXRlVVJJKSB7Ci0KLQkgIFN0cmluZyByZXN1bHQgPSByZWxhdGl2ZVVSSTsKLQotCSAgdHJ5IHsKLSAgICAgIAlVUkkgcmVsYXRpdmUgPSBVUkkuY3JlYXRlVVJJKHJlbGF0aXZlVVJJKTsKLSAgICAgICAJVVJJIGFic29sdXRlID0gVVJJLmNyZWF0ZVVSSShhYnNvbHV0ZVVSSSk7Ci0gICAgICAgCVVSSSByZXNvbHZlZFJlbGF0aXZlID0gcmVsYXRpdmUucmVzb2x2ZShhYnNvbHV0ZSk7Ci0gICAgICAgCXJlc3VsdCA9IHJlc29sdmVkUmVsYXRpdmUudG9TdHJpbmcoKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgCi0gIC8qCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBVUkkgY29udGFpbnMgbm9uLUFTQ0lJIGNoYXJhY3RlcnM7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIFRoaXMgdW51c2VkIGNvZGUgaXMgaW5jbHVkZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UuLi4gCi0gICAqLwotLyoKLSAgcHVibGljIGJvb2xlYW4gaXNJUkkoKQotICB7Ci0gICAgcmV0dXJuIGlyaTsgCi0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBjb250YWlucyBhbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnM7Ci0gIC8vIGZhbHNlIG90aGVyd2lzZS4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc05vbkFTQ0lJKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaSkgPiAxMjcpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSovCi0KLSAgLyoKLSAgICogSWYgdGhpcyBpcyBhbiB7QGxpbmsgI2lzSVJJIElSSX0sIGNvbnZlcnRzIGl0IHRvIGEgc3RyaWN0IEFTQ0lJIFVSSSwKLSAgICogdXNpbmcgdGhlIHByb2NlZHVyZSBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjEgb2YgdGhlCi0gICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0ludGVybmF0aW9uYWwvaXJpLWVkaXQvZHJhZnQtZHVlcnN0LWlyaS0wOS50eHQiPklSSQotICAgKiBEcmFmdCBSRkM8L2E+LiAgT3RoZXJ3aXNlLCB0aGlzIFVSSSwgaXRzZWxmLCBpcyByZXR1cm5lZC4KLSAgICoKLSAgICogVGhpcyB1bnVzZWQgY29kZSBpcyBpbmNsdWRlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZS4uLgotICAgKi8KLS8qCi0gIHB1YmxpYyBVUkkgdG9BU0NJSVVSSSgpCi0gIHsKLSAgICBpZiAoIWlyaSkgcmV0dXJuIHRoaXM7Ci0KLSAgICBpZiAoY2FjaGVkQVNDSUlVUkkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZUF1dGhvcml0eSA9IGVuY29kZUFzQVNDSUkoYXV0aG9yaXR5KTsKLSAgICAgIFN0cmluZyBlRGV2aWNlID0gZW5jb2RlQXNBU0NJSShkZXZpY2UpOwotICAgICAgU3RyaW5nIGVRdWVyeSA9IGVuY29kZUFzQVNDSUkocXVlcnkpOwotICAgICAgU3RyaW5nIGVGcmFnbWVudCA9IGVuY29kZUFzQVNDSUkoZnJhZ21lbnQpOwotICAgICAgU3RyaW5nW10gZVNlZ21lbnRzID0gbmV3IFN0cmluZ1tzZWdtZW50cy5sZW5ndGhdOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgZVNlZ21lbnRzW2ldID0gZW5jb2RlQXNBU0NJSShzZWdtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRBU0NJSVVSSSA9IG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGVBdXRob3JpdHksIGVEZXZpY2UsIGFic29sdXRlUGF0aCwgZVNlZ21lbnRzLCBlUXVlcnksIGVGcmFnbWVudCk7IAotCi0gICAgfQotICAgIHJldHVybiBjYWNoZWRBU0NJSVVSSTsKLSAgfQotCi0gIC8vIFJldHVybnMgYSBzdHJpY3QgQVNDSUkgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHZhbHVlLiAgRWFjaCBub24tQVNDSUkKLSAgLy8gY2hhcmFjdGVyIGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyBVVEYtOCBlbmNvZGluZywgd2hpY2ggYXJlIHRoZW4KLSAgLy8gcmVwcmVzbnRlZCB1c2luZyAlIGVzY2FwaW5nLgotICBwcml2YXRlIFN0cmluZyBlbmNvZGVBc0FTQ0lJKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBudWxsOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOwotCi0gICAgICBpZiAoYyA+PSAxMjgpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSAobmV3IFN0cmluZyhuZXcgY2hhcltdIHsgYyB9KSkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDAsIGVuY0xlbiA9IGVuY29kZWQubGVuZ3RoOyBqIDwgZW5jTGVuOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgYXBwZW5kRXNjYXBlZChyZXN1bHQsIGVuY29kZWRbal0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKGMpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IHZhbHVlIDogcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsaWQsIGNvbnNlY3V0aXZlLCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlCi0gIC8vIHNlcXVlbmNlcyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLCBzdGFydGluZyBhdCBpbmRleCBpLgotICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRFc2NhcGVkKFN0cmluZyBzLCBpbnQgaSkKLSAgewotICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgZm9yIChpbnQgbGVuID0gcy5sZW5ndGgoKTsgaSA8IGxlbjsgaSArPSAzKQotICAgIHsKLSAgICAgIGlmIChpc0VzY2FwZWQocywgaSkpIHJlc3VsdCsrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0qLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDdmYTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQSBVUkkgcmVzb2x2ZXIgZXh0ZW5zaW9uIGRlc2NyaXB0b3IgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dAotICogYW4gZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4gVGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBhbGxvd3MgZm9yIHRoZQotICogZXh0ZW5zaW9uIHJlc29sdmVyIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgY2FsbGVkIGF0IHRoZSBjb3JyZWN0IHRpbWVzLgotICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yCi17Ci0JcHJvdGVjdGVkIFVSSVJlc29sdmVyRXh0ZW5zaW9uIHJlc29sdmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBmaWxlVHlwZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotCi0JcHVibGljIExpc3QgcHJvamVjdE5hdHVyZUlkczsKLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VUeXBlOwotCi0JcHJvdGVjdGVkIGludCBzdGFnZSA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUE9TVE5PUk1BTElaQVRJT047Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW9yaXR5ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5QUklPUklUWV9NRURJVU07Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBsdWdpbklkOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyIGNsYXNzIG5hbWUuCi0JICogQHBhcmFtIHBsdWdpbklkIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgY2xhc3MuCi0JICogQHBhcmFtIHByb2plY3ROYXR1cmVJZHMgVGhlIHByb2plY3QgbmF0dXJlIElEcyBmb3Igd2hpY2ggdGhlIHJlc29sdmVyIHNob3VsZCBydW4uCi0JICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgdHlwZSBvZiByZXNvdXJjZSBmb3Igd2hpY2ggdGhlIHJlc29sdmVyIHNob3VsZCBydW4uCi0JICogQHBhcmFtIHN0YWdlIFRoZSBzdGFnZSBvZiB0aGUgcmVzb2x2ZXIuIEVpdGhlciBwcmVub3JtYWxpemF0aW9uIG9yIHBvc3Rub3JtYWxpemF0aW9uLgotCSAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcmVzb2x2ZXIncyBwcmlvcml0eS4gaGlnaCwgbWVkaXVtLCBvciBsb3cuCi0JICovCi0JcHVibGljIFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvcihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGx1Z2luSWQsCi0JCQlMaXN0IHByb2plY3ROYXR1cmVJZHMsIFN0cmluZyByZXNvdXJjZVR5cGUsIGludCBzdGFnZSwgU3RyaW5nIHByaW9yaXR5KQotCXsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJdGhpcy5wcm9qZWN0TmF0dXJlSWRzID0gcHJvamVjdE5hdHVyZUlkczsKLQkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7Ci0JCXRoaXMuc3RhZ2UgPSBzdGFnZTsKLQkJdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotCSAqLwotCXB1YmxpYyBVUklSZXNvbHZlckV4dGVuc2lvbiBnZXRSZXNvbHZlcigpCi0JewotCi0JCWlmIChyZXNvbHZlciA9PSBudWxsICYmIGNsYXNzTmFtZSAhPSBudWxsICYmICFlcnJvcikKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJLy8gQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8KLQkJCQkvLyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlDbGFzcyB0aGVDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQlyZXNvbHZlciA9IChVUklSZXNvbHZlckV4dGVuc2lvbikgdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCWVycm9yID0gdHJ1ZTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSByZXNvbHZlciBzaG91bGQgcnVuIGluIHRoZSBjdXJyZW50IHNjZW5hcmlvIGdpdmVuCi0JICogdGhlIHByb2plY3QgbmF0dXJlIElELCByZXNvdXJjZSB0eXBlLCBhbmQgc3RhZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3ROYXR1cmVJZCBUaGUgcHJvamVjdCBuYXR1cmUgSUQgdG8gY2hlY2sgYWdhaW5zdC4KLQkgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSByZXNvdXJjZSB0eXBlIHRvIGNoZWNrIGFnYWluc3QuCi0JICogQHBhcmFtIHN0YWdlIFRoZSBzdGFnZSB0byBjaGVjayBhZ2FpbnN0LgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVzb2x2ZXIgc2hvdWxkIHJ1biwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHByb2plY3ROYXR1cmVJZCwgU3RyaW5nIHJlc291cmNlVHlwZSwgaW50IHN0YWdlKQotCXsKLQkJaWYgKHByb2plY3ROYXR1cmVJZHMuY29udGFpbnMocHJvamVjdE5hdHVyZUlkKSkKLQkJewotCQkJcmV0dXJuIG1hdGNoZXModGhpcy5yZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZSkgJiYgdGhpcy5zdGFnZSA9PSBzdGFnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBzdHJpbmcgYSBtYXRjaGVzIHN0cmluZyBiLgotCSAqIFRPRE86IFdoeSBpcyB0aGlzIHJlcXVpcmVkIGluc3RlYWQgb2YganVzdCB1c2luZyBTdHJpbmcuZXF1YWxzPwotCSAqIAotCSAqIEBwYXJhbSBhIFN0cmluZyBmb3IgY29tcGFyaXNvbi4KLQkgKiBAcGFyYW0gYiBTdHJpbmcgZm9yIGNvbXBhcmlzb24uCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmdzIG1hdGNoLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGEsIFN0cmluZyBiKQotCXsKLQkJcmV0dXJuIChhICE9IG51bGwpID8gYS5lcXVhbHMoYikgOiBhID09IGI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDMwNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBVUkkgcmVzb2x2ZXIgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0Ci0gKiBhbGwgb2YgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeQotewotCXByb3RlY3RlZCBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFHRV9QUkVOT1JNQUxJWkFUSU9OID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUdFX1BPU1ROT1JNQUxJWkFUSU9OID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUdFX1BIWVNJQ0FMID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX0xPVyA9ICJsb3ciOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfTUVESVVNID0gIm1lZGl1bSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9ISUdIID0gImhpZ2giOwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlVMTF9QUk9KRUNUX05BVFVSRV9JRCA9ICIiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IGluc3RhbmNlOwotCi0JcHJpdmF0ZSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5KCkKLQl7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSBnZXRJbnRhbmNlKCkKLQl7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YW5jZSA9IG5ldyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQluZXcgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihpbnN0YW5jZSkucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBleHRlbnNpb24gcmVzb2x2ZXIgdG8gdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgY2xhc3MuCi0JICogQHBhcmFtIHBsdWdpbklkIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgY2xhc3MuCi0JICogQHBhcmFtIHByb2plY3ROYXR1cmVJZHMgQSBsaXN0IG9mIHByb2plY3QgbmF0dXJlcyBJRHMgZm9yIHdoaWNoIHRoZSByZXNvbHZlciBzaG91bGQgcnVuLgotCSAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHR5cGUgb2YgcmVzb3VyZSBmb3Igd2hpY2ggYW4gZXh0ZW5zaW9uIHJlc291cmNlIHNob3VsZCBydW4uCi0JICogQHBhcmFtIHN0YWdlIFRoZSBzdGFnZSB0byBydW4uIEVpdGhlciBwcmVub3JtYWxpemF0aW9uIG9yIHBvc3Rub3JtYWxpemF0aW9uLgotCSAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIHJlc29sdmVyLiBWYWxpZCB2YWx1ZXMgYXJlIGhpZ2gsIG1lZGl1bSwgYW5kIGxvdy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHBsdWdpbklkLCBMaXN0IHByb2plY3ROYXR1cmVJZHMsCi0JCQlTdHJpbmcgcmVzb3VyY2VUeXBlLCBpbnQgc3RhZ2UsIFN0cmluZyBwcmlvcml0eSkKLQl7Ci0JCWlmIChwcm9qZWN0TmF0dXJlSWRzID09IG51bGwpCi0JCQlwcm9qZWN0TmF0dXJlSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJvamVjdE5hdHVyZUlkcy5pc0VtcHR5KCkpCi0JCXsKLQkJCXByb2plY3ROYXR1cmVJZHMuYWRkKE5VTExfUFJPSkVDVF9OQVRVUkVfSUQpOwotCQl9Ci0JCVVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvciBpbmZvID0gbmV3IFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvcigKLQkJCQljbGFzc05hbWUsIHBsdWdpbklkLCBwcm9qZWN0TmF0dXJlSWRzLCByZXNvdXJjZVR5cGUsIHN0YWdlLCBwcmlvcml0eSk7Ci0KLQkJSXRlcmF0b3IgaWRzSXRlciA9IHByb2plY3ROYXR1cmVJZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlkc0l0ZXIuaGFzTmV4dCgpKQotCQl7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaWRzSXRlci5uZXh0KCk7Ci0KLQkJCUhhc2hNYXAgcHJpb3JpdHlNYXAgPSAoSGFzaE1hcCkgbWFwLmdldChrZXkpOwotCQkJaWYgKHByaW9yaXR5TWFwID09IG51bGwpCi0JCQl7Ci0JCQkJcHJpb3JpdHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCW1hcC5wdXQoa2V5LCBwcmlvcml0eU1hcCk7Ci0JCQkJcHJpb3JpdHlNYXAucHV0KFBSSU9SSVRZX0hJR0gsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCQkJcHJpb3JpdHlNYXAucHV0KFBSSU9SSVRZX01FRElVTSwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCQlwcmlvcml0eU1hcC5wdXQoUFJJT1JJVFlfTE9XLCBuZXcgQXJyYXlMaXN0KCkpOwotCQkJfQotCQkJTGlzdCBsaXN0ID0gKExpc3QpIHByaW9yaXR5TWFwLmdldChwcmlvcml0eSk7Ci0JCQlsaXN0LmFkZChpbmZvKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yIG9iamVjdHMgdGhhdCBhcHBseSB0byB0aGlzCi0JICogcHJvamVjdC4gVGhlIGxpc3QgaXMgaW4gdGhlIHByaW9yaXR5IG9yZGVyIGhpZ2gsIG1lZGl1bSwgbG93LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IGZvciB3aGljaCB5b3UgYXJlIHJlcXVlc3RpbmcgcmVzb2x2ZXJzLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvciBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbkRlc2NyaXB0b3JzKElQcm9qZWN0IHByb2plY3QpCi0JewotCSAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBMaXN0IGxvd1ByaW9yaXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIExpc3QgbWVkaXVtUHJpb3JpdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgTGlzdCBoaWdoUHJpb3JpdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAKLQkgIGZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JICB7Ci0JICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICBpZiAoa2V5ID09IE5VTExfUFJPSkVDVF9OQVRVUkVfSUQgfHwgcHJvamVjdCA9PSBudWxsIHx8IHByb2plY3QuaGFzTmF0dXJlKGtleSkpCi0JICAgICAgewotCSAgICAgICAgaGlnaFByaW9yaXR5TGlzdC5hZGRBbGwoKExpc3QpICgoSGFzaE1hcCkgbWFwLmdldChrZXkpKS5nZXQoUFJJT1JJVFlfSElHSCkpOwotCSAgICAgICAgbWVkaXVtUHJpb3JpdHlMaXN0LmFkZEFsbCgoTGlzdCkgKChIYXNoTWFwKSBtYXAuZ2V0KGtleSkpLmdldChQUklPUklUWV9NRURJVU0pKTsKLQkgICAgICAgIGxvd1ByaW9yaXR5TGlzdC5hZGRBbGwoKExpc3QpICgoSGFzaE1hcCkgbWFwLmdldChrZXkpKS5nZXQoUFJJT1JJVFlfTE9XKSk7Ci0JICAgICAgfQotCSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JICAgIHsKLQkgICAgfQotCSAgfQotCSAgcmVzdWx0LmFkZEFsbChoaWdoUHJpb3JpdHlMaXN0KTsKLQkgIHJlc3VsdC5hZGRBbGwobWVkaXVtUHJpb3JpdHlMaXN0KTsKLQkgIHJlc3VsdC5hZGRBbGwobG93UHJpb3JpdHlMaXN0KTsKLQkgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBVUklSZXNvbHZlciBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIHN0YWdlLgotCSAqIFRPRE86IFRoaXMgc2VlbXMgbGlrZSBhbiBvZGQgbWV0aG9kIHRvIGhvdXNlIGhlcmUuIEl0IG1heSBuZWVkIHRvIGJlIG1vdmVkCi0JICogICAgICAgb3IgcmVtb3ZlZCBpZiB0aGUgc3RhZ2UgYXR0cmlidXRlIGRpc3NhcGVhcnMuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVySW5mb0xpc3QgQSBsaXN0IG9mIHJlc29sdmVycyB0byBwcnVuZS4KLQkgKiBAcGFyYW0gc3RhZ2UgVGhlIHN0YWdlIHJlcXVlc3RlZC4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBVUklSZXNvbHZlciBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIHN0YWdlLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1hdGNoaW5nVVJJUmVzb2x2ZXJzKExpc3QgcmVzb2x2ZXJJbmZvTGlzdCwgaW50IHN0YWdlKQotCXsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHJlc29sdmVySW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IgaW5mbyA9IChVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IpIGkKLQkJCQkJLm5leHQoKTsKLQkJCWlmIChpbmZvLnN0YWdlID09IHN0YWdlKQotCQkJewotCQkJCU9iamVjdCByZXNvbHZlciA9IGluZm8uZ2V0UmVzb2x2ZXIoKTsKLQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXJlc3VsdC5hZGQocmVzb2x2ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTczZjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIFVSSSByZXNvbHZlciBleHRlbnNpb24gcG9pbnQgYW5kIHJlZ2lzdGVycyBleHRlbnNpb24KLSAqIHJlc29sdmVycyB3aXRoIHRoZSBVUkkgcmVzb2x2ZXIgcmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyCi17Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAicmVzb2x2ZXJFeHRlbnNpb25zIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gInJlc29sdmVyRXh0ZW5zaW9uIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BST0pFQ1RfTkFUVVJFX0lEID0gInByb2plY3ROYXR1cmUiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFU09VUkNFX1RZUEUgPSAicmVzb3VyY2VUeXBlIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU1RBR0UgPSAic3RhZ2UiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX1NUQUdFX1BSRSA9ICJwcmVub3JtYWxpemF0aW9uIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTF9TVEFHRV9QT1NUID0gInBvc3Rub3JtYWxpemF0aW9uIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTF9TVEFHRV9QSFlTSUNBTCA9ICJwaHlzaWNhbCI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVkFMVUUgPSAidmFsdWUiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BSSU9SSVRZID0gInByaW9yaXR5IjsKLQotCXByb3RlY3RlZCBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JcHVibGljIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkKLQl7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotCXsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoVVJJUmVzb2x2ZXJQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpCi0JCXsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotCSAqIAotCSAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb250ZW50bW9kZWwudXRpbF9pbXBsZW1lbnRhdGlvbiI+Ci0JICogPHV0aWxfaW1wbGVtZW50YXRpb24gY2xhc3MgPQotCSAqIG9yZy5lY2xpcHNlLndzdC5iYXNldXRpbC5DTVV0aWxJbXBsZW1lbnRhdGlvbkltcGwgLz4gPC9leHRlbnNpb24+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkKLQkJewotCQkJLy8gU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQkJLy8gU3RyaW5nIHByb2plY3ROYXR1cmVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUk9KRUNUX05BVFVSRV9JRCk7Ci0JCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1JFU09VUkNFX1RZUEUpOwotCQkJU3RyaW5nIHN0YWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NUQUdFKTsKLQkJCVN0cmluZyBwcmlvcml0eSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUklPUklUWSk7Ci0JCQlpZiAocHJpb3JpdHkgPT0gbnVsbCB8fCBwcmlvcml0eS5lcXVhbHMoIiIpKQotCQkJewotCQkJCXByaW9yaXR5ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5QUklPUklUWV9NRURJVU07Ci0JCQl9Ci0JCQlMaXN0IHByb2plY3ROYXR1cmVJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBpZHMgPSBlbGVtZW50LmdldENoaWxkcmVuKEVMRU1fUFJPSkVDVF9OQVRVUkVfSUQpOwotCQkJaW50IG51bWlkcyA9IGlkcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWlkczsgaSsrKQotCQkJewotCQkJCVN0cmluZyB0ZW1waWQgPSBpZHNbaV0uZ2V0QXR0cmlidXRlKEFUVF9WQUxVRSk7Ci0KLQkJCQlpZiAodGVtcGlkICE9IG51bGwpCi0JCQkJewotCQkJCQlwcm9qZWN0TmF0dXJlSWRzLmFkZCh0ZW1waWQpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCi0JCQkJCWludCBzdGFnZWludCA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUE9TVE5PUk1BTElaQVRJT047Ci0JCQkJCWlmIChzdGFnZS5lcXVhbHNJZ25vcmVDYXNlKFZBTF9TVEFHRV9QUkUpKQotCQkJCQl7Ci0JCQkJCQlzdGFnZWludCA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUFJFTk9STUFMSVpBVElPTjsKLQkJCQkJfSBlbHNlIGlmIChzdGFnZS5lcXVhbHNJZ25vcmVDYXNlKFZBTF9TVEFHRV9QSFlTSUNBTCkpCi0JCQkJCXsKLQkJCQkJCXN0YWdlaW50ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QSFlTSUNBTDsKLQkJCQkJfQotCQkJCQlyZWdpc3RyeS5wdXQoY2xhc3NOYW1lLCBwbHVnaW5JZCwgcHJvamVjdE5hdHVyZUlkcywgcmVzb3VyY2VUeXBlLAotCQkJCQkJCXN0YWdlaW50LCBwcmlvcml0eSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQkvLyBUT0RPOiBMb2cgZXhjZXB0aW9uIGFzIHRoaXMgd2lsbCBjYXVzZSBhbiBleHRlbnNpb24gcmVzb2x2ZXIKLQkJCQkJLy8gICAgICAgZnJvbSBsb2FkaW5nLgotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMGE0Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogQSBVUklSZXNvbHZlciBpcyB1c2VkIHRvIHJlc29sdmUgVVJJIHJlZmVyZW5jZXMgdG8gcmVzb3VyY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSSVJlc29sdmVyIHsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSB1cmkgCi0JICogQHBhcmFtIHB1YmxpY0lkIC0gYW4gb3B0aW9uYWwgcHVibGljIGlkZW50aWZpZXIgKGkuZS4gbmFtZXNwYWNlIG5hbWUpLCBvciBudWxsIGlmIG5vbmUKLQkgKiBAcGFyYW0gc3lzdGVtSWQgLSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkksIG9yIG51bGwgaWYgbm9uZSAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIFVSSSByZXByZXNlbnRpb24gdGhlICdsb2dpY2FsJyBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBiYXNlTG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHVyaSAKLSAgICAgKiBAcGFyYW0gcHVibGljSWQgLSBhbiBvcHRpb25hbCBwdWJsaWMgaWRlbnRpZmllciAoaS5lLiBuYW1lc3BhY2UgbmFtZSksIG9yIG51bGwgaWYgbm9uZQotICAgICAqIEBwYXJhbSBzeXN0ZW1JZCAtIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSSSwgb3IgbnVsbCBpZiBub25lIAotICAgICAqIEByZXR1cm4gYW4gYWJzb2x1dGUgVVJJIHJlcHJlc2VudGlvbiB0aGUgJ3BoeXNpY2FsJyBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVQaHlzaWNhbExvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIGxvZ2ljYWxMb2NhdGlvbik7ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkNjFlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSAqIEFuIGV4dGVuc2lvbiB0byBhdWdtZW50IHRoZSBiZWhhdmlvdXIgb2YgYSBVUklSZXNvbHZlci4gIEV4dGVuc2lvbnMgYXJlIHByb2plY3QgYXdhcmUKLSAqIHNvIHRoYXQgdGhleSBjYW4gYXBwbHkgc3BlY2lhbGl6ZWQgcHJvamVjdCBzcGVjaWZpYyByZXNvbHZpbmcgcnVsZXMuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSSVJlc29sdmVyRXh0ZW5zaW9uIHsKLQkvKioKLQkgKiBAcGFyYW0gZmlsZSB0aGUgaW4td29ya3NwYWNlIGJhc2UgcmVzb3VyY2UsIGlmIG9uZSBleGlzdHMKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSB1cmkKLQkgKiBAcGFyYW0gcHVibGljSWQgLSBhbiBvcHRpb25hbCBwdWJsaWMgaWRlbnRpZmllciAoaS5lLiBuYW1lc3BhY2UgbmFtZSksIG9yIG51bGwgaWYgbm9uZQotCSAqIEBwYXJhbSBzeXN0ZW1JZCAtIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSSSwgb3IgbnVsbCBpZiBub25lIAotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgVVJJIG9yIG51bGwgaWYgdGhpcyBleHRlbnNpb24gY2FuIG5vdCByZXNvbHZlIHRoaXMgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKElGaWxlIGZpbGUsIFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlclBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjM2ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLkV4dGVuc2libGVVUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFVSSVJlc29sdmVyUGx1Z2luIGluc3RhbmNlOwkKLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSB4bWxSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5OwotCi0JcHVibGljIHN0YXRpYyBVUklSZXNvbHZlclBsdWdpbiBnZXRJbnN0YW5jZSgpCi0JewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCXB1YmxpYyBVUklSZXNvbHZlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0JCi0JCi0JCQkJCQotCXB1YmxpYyBzdGF0aWMgVVJJUmVzb2x2ZXIgY3JlYXRlUmVzb2x2ZXIoKQotCXsKLQkJcmV0dXJuIGNyZWF0ZVJlc29sdmVyKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSVJlc29sdmVyIGNyZWF0ZVJlc29sdmVyKE1hcCBwcm9wZXJ0aWVzKQotCXsKLQkJLy8gVE9ETy4uLiB1dGlsaXplIHByb3BlcnRpZXMKLQkJcmV0dXJuIG5ldyBFeHRlbnNpYmxlVVJJUmVzb2x2ZXIoKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJRW5jb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJRW5jb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmM3YzllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUVuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkJpdFNldDsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgamF2YS5sYW5nLlVSTEVuY29kZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklFbmNvZGVyIAotewotICBzdGF0aWMgQml0U2V0IGRvbnROZWVkRW5jb2Rpbmc7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgY2FzZURpZmYgPSAoJ2EnIC0gJ0EnKTsKLSAgc3RhdGljIFN0cmluZyBkZmx0RW5jTmFtZSA9IG51bGw7Ci0gIAotCi0gIHN0YXRpYyAKLSAgeyAgICAgICAgICAgIAotCSAgZG9udE5lZWRFbmNvZGluZyA9IG5ldyBCaXRTZXQoMjU2KTsKLQkgIGludCBpOwotCSAgZm9yIChpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKSAKLSAgICB7Ci0JICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KGkpOwotCSAgfQotCSAgZm9yIChpID0gJ0EnOyBpIDw9ICdaJzsgaSsrKSAKLSAgICB7Ci0JICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KGkpOwotCSAgfQotCSAgZm9yIChpID0gJzAnOyBpIDw9ICc5JzsgaSsrKSAKLSAgICB7Ci0JICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KGkpOwotCSAgfQotCi0JICAvL2RvbnROZWVkRW5jb2Rpbmcuc2V0KCcgJyk7IC8vIGNzLi4gcmVtb3ZlZCBzbyB0aGF0IHNwYWNlIGNoYXJhY3RlciB3aWxsIGJlIHJlcGxhY2VkIGJ5ICUyMAotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJy0nKTsKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCdfJyk7Ci0JICBkb250TmVlZEVuY29kaW5nLnNldCgnLicpOwotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJyonKTsKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCc6Jyk7ICAgLy8gY3MuLiBhZGRlZCAKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCcvJyk7ICAgLy8gY3MuLiBhZGRlZCBzbyB0aGF0IHNsYXNoZXMgZG9uJ3QgZ2V0IGVuY29kZWQgYXMgJTJGCi0KLSAgCS8vIGRmbHRFbmNOYW1lID0gKFN0cmluZylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgR2V0UHJvcGVydHlBY3Rpb24oImZpbGUuZW5jb2RpbmciKSk7Ci0gIAkvLyBBcyBkaXNjdXNzZWQgd2l0aCBTYW5keSwgd2Ugc2hvdWxkIGVuY29kZSBVUklzIHdpdGggVVRGOAotICAgZGZsdEVuY05hbWUgPSAiVVRGOCI7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImRmbHRFbmNOYW1lICIgKyBkZmx0RW5jTmFtZSk7Ci0gICB9Ci0KLSAgLyoqCi0gICAqIFlvdSBjYW4ndCBjYWxsIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByaXZhdGUgVVJJRW5jb2RlcigpIHsgfQotCi0gIC8qKgotICAgKiBUcmFuc2xhdGVzIGEgc3RyaW5nIGludG8gPGNvZGU+eC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPgotICAgKiBmb3JtYXQuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBlbmNvZGluZwotICAgKiBhcyB0aGUgZW5jb2Rpbmcgc2NoZW1lIHRvIG9idGFpbiB0aGUgYnl0ZXMgZm9yIHVuc2FmZSBjaGFyYWN0ZXJzLgotICAgKgotICAgKiBAcGFyYW0gICBzICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSB0cmFuc2xhdGVkLgotICAgKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIHN0cmluZyBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtJ3MKLSAgICogICAgICAgICAgICAgZGVmYXVsdCBlbmNvZGluZy4gSW5zdGVhZCwgdXNlIHRoZSBlbmNvZGUoU3RyaW5nLFN0cmluZykKLSAgICogICAgICAgICAgICAgbWV0aG9kIHRvIHNwZWNpZnkgdGhlIGVuY29kaW5nLgotICAgKiBAcmV0dXJuICB0aGUgdHJhbnNsYXRlZCA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSAKLSAgewotCSAgU3RyaW5nIHN0ciA9IG51bGw7Ci0JICB0cnkgCi0gICAgewotCSAgICBzdHIgPSBlbmNvZGUocywgZGZsdEVuY05hbWUpOwotCSAgfSAKLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSAKLSAgICB7Ci0JICAgIC8vIFRoZSBzeXN0ZW0gc2hvdWxkIGFsd2F5cyBoYXZlIHRoZSBwbGF0Zm9ybSBkZWZhdWx0Ci0JICB9Ci0JICByZXR1cm4gc3RyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zbGF0ZXMgYSBzdHJpbmcgaW50byA8Y29kZT5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L2NvZGU+Ci0gICAqIGZvcm1hdCB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nIHNjaGVtZS4gVGhpcyBtZXRob2QgdXNlcyB0aGUKLSAgICogc3VwcGxpZWQgZW5jb2Rpbmcgc2NoZW1lIHRvIG9idGFpbiB0aGUgYnl0ZXMgZm9yIHVuc2FmZQotICAgKiBjaGFyYWN0ZXJzLgotICAgKiA8cD4KLSAgICogPGVtPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIDxhIGhyZWY9Ci0gICAqICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAvYXBwZW5kaXgvbm90ZXMuaHRtbCNub24tYXNjaWktY2hhcnMiPgotICAgKiBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIFJlY29tbWVuZGF0aW9uPC9hPiBzdGF0ZXMgdGhhdAotICAgKiBVVEYtOCBzaG91bGQgYmUgdXNlZC4gTm90IGRvaW5nIHNvIG1heSBpbnRyb2R1Y2UKLSAgICogaW5jb21wYXRpYmlsaXRlcy48L2VtPgotICAgKgotICAgKiBAcGFyYW0gICBzICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSB0cmFuc2xhdGVkLgotICAgKiBAcGFyYW0gICBlbmMgICBUaGUgbmFtZSBvZiBhIHN1cHBvcnRlZCAKLSAgICogICAgPGEgaHJlZj0iLi4vbGFuZy9wYWNrYWdlLXN1bW1hcnkuaHRtbCNjaGFyZW5jIj5jaGFyYWN0ZXIKLSAgICogICAgZW5jb2Rpbmc8L2E+LgotICAgKiBAcmV0dXJuICB0aGUgdHJhbnNsYXRlZCA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgKiBAZXhjZXB0aW9uICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAqICAgICAgICAgICAgIElmIHRoZSBuYW1lZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkCi0gICAqIEBzZWUgamF2YS5uZXQuVVJMRGVjb2RlciNkZWNvZGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcywgU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gCi0gIHsKLQkgIGJvb2xlYW4gbmVlZFRvQ2hhbmdlID0gZmFsc2U7Ci0JICBib29sZWFuIHdyb3RlVW5lbmNvZGVkQ2hhciA9IGZhbHNlOyAKLQkgIGludCBtYXhCeXRlc1BlckNoYXIgPSAxMDsgLy8gcmF0aGVyIGFyYml0cmFyeSBsaW1pdCwgYnV0IHNhZmUgZm9yIG5vdwotICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCSAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0obWF4Qnl0ZXNQZXJDaGFyKTsKLQkgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1ZiwgZW5jKSk7Ci0KLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSAKLSAgICB7Ci0JICAgIGludCBjID0gcy5jaGFyQXQoaSk7Ci0JICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFeGFtaW5pbmcgY2hhcmFjdGVyOiAiICsgYyk7Ci0JICAgIGlmIChkb250TmVlZEVuY29kaW5nLmdldChjKSkKLSAgICAgIHsKLQkJICAgLy9pZiAoYyA9PSAnICcpCi0gICAgICAgLy97Ci0JCSAgIC8vICBjID0gJysnOwotCQkgICAvLyAgbmVlZFRvQ2hhbmdlID0gdHJ1ZTsKLQkJICAgLy99Ci0JCSAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJTdG9yaW5nOiAiICsgYyk7Ci0JCSAgIG91dC5hcHBlbmQoKGNoYXIpYyk7Ci0JCSAgIHdyb3RlVW5lbmNvZGVkQ2hhciA9IHRydWU7Ci0JICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkJICAgIC8vIGNvbnZlcnQgdG8gZXh0ZXJuYWwgZW5jb2RpbmcgYmVmb3JlIGhleCBjb252ZXJzaW9uCi0JCSAgICB0cnkKLSAgICAgICAgewotCQkgICAgICBpZiAod3JvdGVVbmVuY29kZWRDaGFyKSAKLSAgICAgICAgICB7IC8vIEZpeCBmb3IgNDQwNzYxMAotCQkgICAgCSAgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmLCBlbmMpKTsKLQkJCSAgICAgIHdyb3RlVW5lbmNvZGVkQ2hhciA9IGZhbHNlOwotCQkgICAgICB9Ci0JCSAgICAgIHdyaXRlci53cml0ZShjKTsKLQkJICAgICAgICAKLQkJICAgICAgLy8gSWYgdGhpcyBjaGFyYWN0ZXIgcmVwcmVzZW50cyB0aGUgc3RhcnQgb2YgYSBVbmljb2RlCi0JCSAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyLCB0aGVuIHBhc3MgaW4gdHdvIGNoYXJhY3RlcnMuIEl0J3Mgbm90Ci0JCSAgICAgIC8vIGNsZWFyIHdoYXQgc2hvdWxkIGJlIGRvbmUgaWYgYSBieXRlcyByZXNlcnZlZCBpbiB0aGUgCi0JCSAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlycyByYW5nZSBvY2N1cnMgb3V0c2lkZSBvZiBhIGxlZ2FsCi0JCSAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyLiBGb3Igbm93LCBqdXN0IHRyZWF0IGl0IGFzIGlmIGl0IHdlcmUgCi0JCSAgICAgIC8vIGFueSBvdGhlciBjaGFyYWN0ZXIuCi0JCSAgICAgIC8vIAotCQkgICAgICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERCRkYpIAotICAgICAgICAgIHsKLQkJCSAgICAgIC8vICBTeXN0ZW0ub3V0LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyhjKSArICIgaXMgaGlnaCBzdXJyb2dhdGUiKTsJCQkgICAgICAKLQkJCSAgICAgIGlmICggKGkrMSkgPCBzLmxlbmd0aCgpKSAKLSAgICAgICAgICAgIHsKLQkJCSAgICAgICAgaW50IGQgPSBzLmNoYXJBdChpKzEpOwotCQkJICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0RXhhbWluaW5nICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGQpKTsJCQkgICAgICAKLQkJCSAgICAgICAgaWYgKGQgPj0gMHhEQzAwICYmIGQgPD0gMHhERkZGKSAKLSAgICAgICAgICAgICAgewotCQkJCSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGQpICsgIiBpcyBsb3cgc3Vycm9nYXRlIik7CQkJCQotCQkJCSAgICAgICAgd3JpdGVyLndyaXRlKGQpOwotCQkJCSAgICAgICAgaSsrOwotCQkJICAgICAgICB9Ci0JCQkgICAgICB9Ci0JCSAgICAgIH0KLQkJICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0JCSAgICB9IAotICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKSAKLSAgICAgICAgewotCQkgICAgICBidWYucmVzZXQoKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgICBieXRlW10gYmEgPSBidWYudG9CeXRlQXJyYXkoKTsKLQotCQkgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiYS5sZW5ndGg7IGorKykgCi0gICAgICAgIHsKLQkJICAgICAgb3V0LmFwcGVuZCgnJScpOwotCQkgICAgICBjaGFyIGNoID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChiYVtqXSA+PiA0KSAmIDB4RiwgMTYpOwotCQkgICAgICAvLyBjb252ZXJ0aW5nIHRvIHVzZSB1cHBlcmNhc2UgbGV0dGVyIGFzIHBhcnQgb2YKLQkJICAgICAgLy8gdGhlIGhleCB2YWx1ZSBpZiBjaCBpcyBhIGxldHRlci4KLQkJICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjaCkpIAotICAgICAgICAgIHsKLQkJCSAgICAgIGNoIC09IGNhc2VEaWZmOwotCQkgICAgICB9Ci0JCSAgICAgIG91dC5hcHBlbmQoY2gpOwotCQkgICAgICBjaCA9IENoYXJhY3Rlci5mb3JEaWdpdChiYVtqXSAmIDB4RiwgMTYpOwotCQkgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGNoKSkgCi0gICAgICAgICAgewotCQkJICAgICAgY2ggLT0gY2FzZURpZmY7Ci0JCSAgICAgIH0KLQkJICAgICAgb3V0LmFwcGVuZChjaCk7Ci0JCSAgICB9Ci0JCSAgICBidWYucmVzZXQoKTsKLQkJICAgIG5lZWRUb0NoYW5nZSA9IHRydWU7Ci0JICAgIH0KLQkgIH0KLQkgIHJldHVybiAobmVlZFRvQ2hhbmdlPyBvdXQudG9TdHJpbmcoKSA6IHMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDY3NDA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAyMDA3MTIwNSAgIDIxMTI2MiBlcmljZHBAY2EuaWJtLmNvbSAtIEVyaWMgUGV0ZXJzLCBDb3B5V1NETFRyZWVDb21tYW5kIGZhaWxzIHRvIGNvcHkgP3dzZGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLXB1YmxpYyBjbGFzcyBVUklIZWxwZXIKLXsgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wgPSAicGxhdGZvcm06L3Jlc291cmNlLyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX1BBVFRFUk4gPSAiOiI7IAotICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuc3VyZVVSSVByb3RvY29sRm9ybWF0KFN0cmluZyB1cmkpIHsKLQkgIFN0cmluZyBwcm90b2NvbCA9IGdldFByb3RvY29sKHVyaSk7Ci0JICBpZiAocHJvdG9jb2wgIT0gbnVsbCkgewotCQkgIGlmIChwcm90b2NvbC5lcXVhbHMoRklMRV9QUk9UT0NPTCkpIHsKLQkJCSAgcmV0dXJuIGVuc3VyZUZpbGVVUklQcm90b2NvbEZvcm1hdCh1cmkpOwotCQkgIH0KLQkgIH0KLQkgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIGZpbGUgVVJJIGluIFN0cmluZyBmb3JtYXQgYW5kIGVuc3VyZXMgdGhlIHByb3RvY29sIGlzIGZvbGxvd2VkIGJ5IHRocmVlIHNsYXNoZXMuCi0gICAqIEZvciBleGFtcGxlLCBmaWxlcyAiZmlsZTpEOi9YWFgiLCAiZmlsZTovRDovWFhYIiBhbmQgImZpbGU6Ly9EOi9YWFgiIGFyZSBjb3JyZWN0ZWQgdG86Ci0gICAqICJmaWxlOi8vL0Q6L1hYWCIuCi0gICAqIElmIHRoZSBpbnB1dCBpcyBub3QgYSBmaWxlIFVSSSAoZG9lcyBub3Qgc3RhcnQgd2l0aCAiZmlsZToiKSwgdGhlIFN0cmluZyBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5zdXJlRmlsZVVSSVByb3RvY29sRm9ybWF0KFN0cmluZyB1cmkpIHsKLSAgICAgIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKSAmJiAhdXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCArICIvLy8iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgCWlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MICsgIi8vIikpIHsKLSAgICAgIAkJdXJpID0gRklMRV9QUk9UT0NPTCArICIvIiArIHVyaS5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAl9IGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wgKyAiLyIpKSB7Ci0gICAgICAJCXVyaSA9IEZJTEVfUFJPVE9DT0wgKyAiLy8iICsgdXJpLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgCX0gZWxzZSB7Ci0gICAgICAJCXVyaSA9IEZJTEVfUFJPVE9DT0wgKyAiLy8vIiArIHVyaS5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgIHJldHVybiB1cmk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCh1cmkpOwotICAgICAgU3RyaW5nIGZpbGUgPSB1cmk7Ci0gICAgICAgICAgIAotICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7ICAgCi0gICAgICAgICAgLy8gCi0gICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsgCi0gICAgICAgICAgLy8gd2UgdXNlIGEgJ1BhdGgnIG9uIHRoZSAnZmlsZScgcGFydCBvZiB0aGUgdXJsIGluIG9yZGVyIHRvIG5vcm1hbGl6ZSB0aGUgJy4nIGFuZCAnLi4nIHNlZ21lbnRzCi0gICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVybC5nZXRGaWxlKCkpOyAKLSAgICAgICAgICBVUkwgdXJsMiA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgdXJpID0gdXJsMi50b1N0cmluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsgIAotICAgICAgICB9Ci0gICAgICB9ICAgCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgCi0gICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlKTsKLSAgICAgICAgdXJpID0gcGF0aC50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLQotICAvKioKLSAgICogYSAnbnVsbCcgcm9vdExvY2F0aW9uIGFyZ3VtZW50IHdpbGwgY2F1c2VzIHVyaSB0aGF0IGJlZ2lucyB3aXRoIGEgJy8nIHRvIGJlIHRyZWF0ZWQgYXMgYSB3b3Jrc3BhY2UgcmVsYXRpdmUgcmVzb3VyY2UKLSAgICogKGkuZS4gdGhlIHN0cmluZyAicGxhdGZvcm06L3Jlc291cmNlIiBpcyBwcmVwZW5kZWQgYW5kIHRoZSB1cmkgaXMgcmVzb2x2ZWQgdmlhIHRoZSBQbGF0Zm9ybSBvYmplY3QpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHVyaSwgU3RyaW5nIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyByb290TG9jYXRpb24pCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7IAotICAgICAgLy8gaXMgdGhlIHVyaSBhIHVybAotICAgICAgaWYgKGhhc1Byb3RvY29sKHVyaSkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChpc1BsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gcmVzb2x2ZVBsYXRmb3JtVXJsKHVyaSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gdXJpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAKLSAgICAgIC8vIGlzIHVyaSBhYnNvbHV0ZQotICAgICAgLy8KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHVyaS5pbmRleE9mKCI6IikgIT0gLTEgfHwgdXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXN1bHQgPSB1cmk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgCi0gICAgICAvLyBpZiB1cmkgaXMgcmVsYXRpdmUgdG8gdGhlIHJlc291cmNlTG9jYXRpb24KLSAgICAgIC8vCi0gICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgcmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgaWYgKHJlc291cmNlTG9jYXRpb24uZW5kc1dpdGgoIi8iKSkKLSAgICAgICAgewotCQkJICAgIHJlc3VsdCA9IHJlc291cmNlTG9jYXRpb24gKyB1cmk7Ci0gICAgICAgIH0KLQkJICAgIGVsc2UKLSAgICAgICAgewotCQkJICAgIHJlc3VsdCA9IHJlc291cmNlTG9jYXRpb24gKyAiLy4uLyIgKyB1cmk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB1cmk7Ci0gICAgICB9Ci0gIAotICAgICAgcmVzdWx0ID0gbm9ybWFsaXplKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm5vcm1hbGl6ZSgiICsgdXJpICsgIiwgIiArIHJlc291cmNlTG9jYXRpb24gKyAiLCAiICsgcm9vdExvY2F0aW9uICsgIikgPSAiICsgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVUkwoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB1cmkuaW5kZXhPZigiOi8iKSA+IDI7IC8vIHRlc3QgdGhhdCB0aGUgaW5kZXggaXMgPiAyIHNvIHRoYXQgQzovIGlzIG5vdCBjb25zaWRlcmVkIGEgcHJvdG9jb2wKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFzdFNlZ21lbnQoU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSB1cmk7Ci0gICAgaW50IGluZGV4ID0gTWF0aC5tYXgodXJpLmxhc3RJbmRleE9mKCIvIiksIHVyaS5sYXN0SW5kZXhPZigiXFwiKSk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGRvdEluZGV4ID0gZ2V0RXh0ZW5zaW9uRG90SW5kZXgodXJpKTsKLSAgICAgICAgICAgICAgIAotICAgIGlmIChkb3RJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB1cmkuc3Vic3RyaW5nKGRvdEluZGV4ICsgMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRmlsZUV4dGVuc2lvbihTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGRvdEluZGV4ID0gZ2V0RXh0ZW5zaW9uRG90SW5kZXgodXJpKTsKLQotICAgIGlmIChkb3RJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB1cmkuc3Vic3RyaW5nKDAsIGRvdEluZGV4KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0gICAgICAgICAgICAgCi0KLSAgLy8gaGVyZSB3ZSB1c2UgdGhlIFBsYXRmb3JtIHRvIHJlc29sdmUgYSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCB0byBhbiBhY3R1YWwgdXJsCi0gIC8vCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlc29sdmVQbGF0Zm9ybVVybChTdHJpbmcgdXJsc3BlYykKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHVybHNwZWMgPSB1cmxzcGVjLnJlcGxhY2UoJ1xcJywgJy8nKTsgCi0gICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmxzcGVjKTsKLSAgICAgIFVSTCByZXNvbHZlZFVSTCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLSAgICAgIHJlc3VsdCA9IHJlc29sdmVkVVJMLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBzdGF0aWMgaW50IGdldEV4dGVuc2lvbkRvdEluZGV4KFN0cmluZyB1cmkpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgaW50IGRvdEluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgaW50IHNsYXNoSW5kZXggPSBNYXRoLm1heCh1cmkubGFzdEluZGV4T2YoIi8iKSwgdXJpLmxhc3RJbmRleE9mKCJcXCIpKTsKLQotICAgIGlmIChkb3RJbmRleCAhPSAtMSAmJiBkb3RJbmRleCA+IHNsYXNoSW5kZXgpCi0gICAgewotICAgICAgcmVzdWx0ID0gZG90SW5kZXg7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAKLSAgICBpZiAodXJpICE9IG51bGwgJiYgdXJpLnN0YXJ0c1dpdGgoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wpKQotICAgIHsKLSAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wubGVuZ3RoKCkpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHVyaTsKLSAgfSAgICAgICAgICAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlcGVuZFBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAKLSAgICBpZiAodXJpICE9IG51bGwgJiYgIXVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkKLSAgICB7Ci0gICAgICB1cmkgPSBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCArIHVyaTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiB1cmk7Ci0gIH0gCi0gIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXBlbmRGaWxlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgaWYgKHVyaSAhPSBudWxsICYmICF1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKSkKLSAgICB7Ci0gICAgICB1cmkgPSBGSUxFX1BST1RPQ09MICsgdXJpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHVyaTsKLSAgfSAKLSAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7ICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoUFJPVE9DT0xfUEFUVEVSTik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0IHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYSBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnNvbHV0ZShTdHJpbmcgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihQUk9UT0NPTF9QQVRURVJOKTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSB8fCB1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRJbXBsaWVkRmlsZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgIAotICAgIGlmICghaGFzUHJvdG9jb2wodXJpKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgcHJlZml4ID0gRklMRV9QUk9UT0NPTDsKLSAgICAgIHByZWZpeCArPSB1cmkuc3RhcnRzV2l0aCgiLyIpID8gIi8vIiA6ICIvLy8iOwotICAgICAgdXJpID0gcHJlZml4ICsgdXJpOwotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0gICAgICAgICAgICAgCi0gIC8vIHRvZG8uLi4gbmVlZCB0byByZXZpc2l0IHRoaXMgYmVmb3JlIHdlIHB1YmxpY2l6ZSBpdAotICAvLyAKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7ICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoUFJPVE9DT0xfUEFUVEVSTik7Ci0gICAgICBpZiAoaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0IHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYSBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4ICsgUFJPVE9DT0xfUEFUVEVSTi5sZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0gCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSB1cmk7ICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoUFJPVE9DT0xfUEFUVEVSTik7Ci0gICAgICBpZiAoaW5kZXggPiAyKQotICAgICAgewotICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKGluZGV4ICsgUFJPVE9DT0xfUEFUVEVSTi5sZW5ndGgoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1Byb3RvY29sRmlsZU9yTnVsbChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHByb3RvY29sID0gZ2V0UHJvdG9jb2wodXJpKTsgICAKLSAgICByZXR1cm4gcHJvdG9jb2wgPT0gbnVsbCB8fCBwcm90b2NvbC5lcXVhbHMoRklMRV9QUk9UT0NPTCk7Ci0gIH0gIAotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3RvY29sRmlsZShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICByZXR1cm4gdXJpICE9IG51bGwgJiYgdXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCk7Ci0gIH0gIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nUHJvdG9jb2woU3RyaW5nIHVyaTEsIFN0cmluZyB1cmkyKQotICB7IAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7ICAKLQotICAgIFN0cmluZyBwcm90b2NvbDEgPSBnZXRQcm90b2NvbCh1cmkxKTsKLSAgICBTdHJpbmcgcHJvdG9jb2wyID0gZ2V0UHJvdG9jb2wodXJpMik7Ci0KLSAgICBpZiAoaXNQcm90b2NvbEZpbGVPck51bGwocHJvdG9jb2wxKSAmJiBpc1Byb3RvY29sRmlsZU9yTnVsbChwcm90b2NvbDIpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0gCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHByb3RvY29sMSAhPSBudWxsICYmIHByb3RvY29sMiAhPSBudWxsICYmIHByb3RvY29sMS5lcXVhbHMocHJvdG9jb2wyKTsKLSAgICB9ICAgICAgICAgICAgIAotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiB3YXJuaW5nLi4uIHRoaXMgbWV0aG9kIG5vdCBmdWxseSB0ZXN0ZWQgeWV0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IHVyaTsgIAotICAgIGlmIChpc01hdGNoaW5nUHJvdG9jb2wodXJpLCByZXNvdXJjZUxvY2F0aW9uKSkgCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0UmVsYXRpdmVVUkkobmV3IFBhdGgocmVtb3ZlUHJvdG9jb2wodXJpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGF0aChyZW1vdmVQcm90b2NvbChyZXNvdXJjZUxvY2F0aW9uKSkpOwotICAgIH0gICAgICAgICAgICAKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogd2FybmluZy4uLiB0aGlzIG1ldGhvZCBub3QgZnVsbHkgdGVzdGVkIHlldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVVUkkoSVBhdGggdXJpLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKQotICB7ICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IG5NYXRjaGluZ1NlZ21lbnRzID0gMDsgICAgICAgCi0gICAgcmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb24ucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotICAgIHdoaWxlICh0cnVlKQotICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgYSA9IHVyaS5zZWdtZW50KG5NYXRjaGluZ1NlZ21lbnRzKTsgCi0gICAgICBTdHJpbmcgYiA9IHJlc291cmNlTG9jYXRpb24uc2VnbWVudChuTWF0Y2hpbmdTZWdtZW50cyk7IAotICAgICAgaWYgKGEgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgYS5lcXVhbHMoYikpCi0gICAgICB7Ci0gICAgICAgIG5NYXRjaGluZ1NlZ21lbnRzKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgIAotCi0gICAgaWYgKG5NYXRjaGluZ1NlZ21lbnRzID09IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gdXJpLnRvT1NTdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAgCi0gICAgICByZXN1bHQgPSAiIjsgICAKLSAgICAgIGJvb2xlYW4gaXNGaXJzdCA9IHRydWU7Ci0gICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IHJlc291cmNlTG9jYXRpb24uc2VnbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSBuTWF0Y2hpbmdTZWdtZW50czsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCArPSBpc0ZpcnN0ID8gIi4uIiA6ICIvLi4iOyAgICAgCi0gICAgICAgIGlmIChpc0ZpcnN0KQotICAgICAgICB7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIC8vIAotICAgICAgc2VnbWVudHMgPSB1cmkuc2VnbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSBuTWF0Y2hpbmdTZWdtZW50czsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ICs9IGlzRmlyc3QgPyBzZWdtZW50c1tpXSA6ICgiLyIgKyBzZWdtZW50c1tpXSk7ICAgICAKLSAgICAgICAgaWYgKGlzRmlyc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gCi0gICAgICB9Ci0gICAgfSAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtVVJJKElSZXNvdXJjZSByZXNvdXJjZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgZnVsbFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgaWYgKGZ1bGxQYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICB7Ci0gICAgICBmdWxsUGF0aCA9IGZ1bGxQYXRoLnN1YnN0cmluZygxKTsKLSAgICB9Ci0gICAgcmV0dXJuIFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MICsgZnVsbFBhdGg7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kcyBpcyB1c2VkIGFzIGEgcXVpY2sgdGVzdCB0byBzZWUgaWYgYSB1cmkgY2FuIGJlIHJlc29sdmVkIHRvIGFuIGV4aXN0aW5nIHJlc291cmNlLiAgIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGFibGVVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiB0ZXN0UmVtb3RlVVJJKQotICB7ICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgeyAgIAotICAgICAgdHJ5Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB1cmkgPSBub3JtYWxpemUodXJpLCBudWxsLCBudWxsKTsKLSAgICAgICAgaWYgKGlzUHJvdG9jb2xGaWxlT3JOdWxsKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICB1cmkgPSByZW1vdmVQcm90b2NvbCh1cmkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSS5kZWNvZGUodXJpKSk7Ci0gICAgICAgICAgcmVzdWx0ID0gZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBOb3RlIC0gSWYgd2UgYXJlIGhlcmUsIHVyaSBoYXMgYmVlbiBmYWlsZWQgdG8gcmVzb2x2ZQotICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBQbGF0Zm9ybS4gU2VlIG5vcm1hbGl6ZSgpIHRvIGZpbmQgd2h5LgotICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlc3RSZW1vdGVVUkkpCi0gICAgICAgIHsKLSAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgIC8vIHRoZSB1cmkgaXMgcmVhZGFibGUgaWYgd2UgcmVhY2ggaGVyZS4KLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vIHVyaSBpcyBudWxsCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotCi0gIC8qKgotICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgdXJpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFVSSShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIHRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgewotICAgICAgbmV3IFVSSSh1cmkpOwotICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiByZXR1cm5zIGFuIGFjY2VwdGFibGUgVVJJIGZvciBhIGZpbGUgcGF0aAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJJRm9yRmlsZVBhdGgoU3RyaW5nIGZpbGVQYXRoKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGFkZEltcGxpZWRGaWxlUHJvdG9jb2woZmlsZVBhdGgpOwotICAgIGlmICghaXNWYWxpZFVSSShyZXN1bHQpKQotICAgIHsKLSAgICAJdHJ5Ci0gICAgCXsKLSAgICAgICAgcmVzdWx0ID0gVVJJRW5jb2Rlci5lbmNvZGUocmVzdWx0LCAiVVRGOCIpOwotICAgIAl9Ci0gICAgCWNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLSAgICAJewotICAgIAkJLy8gRG8gbm90aGluZyBhcyBsb25nIGFzIFVURjggaXMgdXNlZC4gVGhpcyBpcyBzdXBwb3J0ZWQuCi0gICAgCX0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxNTMwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWNhY2hlLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxODhmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDFhMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1dlZCBNYXIgMTUgMTc6Mjc6MzMgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjAyNGIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTWFyIDE1IDE3OjI3OjMzIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMTVjZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlX1BMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVfUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NDNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gZXhzZC8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvZXhzZC9jYWNoZXJlc291cmNlLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9leHNkL2NhY2hlcmVzb3VyY2UuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwZGQxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9leHNkL2NhY2hlcmVzb3VyY2UuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSIgaWQ9ImNhY2hlcmVzb3VyY2UiIG5hbWU9IkNhY2hlIFJlc291cmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIERlcHJlY2F0ZWQuIE5vIGxvbmdlciB1c2VkIGluIFdUUCwgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gCi0KLVRoZSBjYWNoZSByZXNvdXJjZSBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gc3BlY2lmeSByZXNvdXJjZXMgdGhhdCBtYXkgYmUgY2FjaGVkIHRoYXQgcmVxdWlyZSBsaWNlbnNlcyB0byBiZSBhY2NlcHRlZCBwcmlvciB0byBjYWNoaW5nLgotCi1EZXByZWNhdGVkLiBObyBsb25nZXIgdXNlZCBpbiBXVFAsIGFuZCB3aWxsIGJlIHJlbW92ZWQuIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYWNoZXJlc291cmNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYWNoZXJlc291cmNlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGNhY2hlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpY2Vuc2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxpY2Vuc2Ugb2YgdGhlIHJlc291cmNlIHRvIGNhY2hlLiBUaGUgbGljZW5zZSBpcyBzcGVjaWZpZWQgYXMgYSBVUkwgdGhhdCByZXNvbHZlcyB0byBhIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbGljZW5zZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGNhY2hlIHJlc291cmNlIGNvbnRyaWJ1dGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuY2FjaGVyZXNvdXJjZSZxdW90OyZndDsKLSAgICAgICZsdDtjYWNoZXJlc291cmNlCi0gICAgICAgICAgICBsaWNlbnNlPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZS5odG1sJnF1b3Q7Ci0gICAgICAgICAgICB1cmw9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZyZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmNzJiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotX1BMVUdJTl9QUk9WSURFUiAgICAgICAgICAgICAgICAgICAgICAgPSBFY2xpcHNlLm9yZwotX1BMVUdJTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDYWNoZSBVUkkgUmVzb2x2ZXIgUGx1Zy1pbgotCi1jYWNoZVJlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICA9IENhY2hlIFJlc291cmNlCi1fVUlfQ0FDSEVfUFJFRkVSRU5DRV9QQUdFX1RJVExFICAgICAgICA9IENhY2hlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWNhZWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlY2FjaGVSZXNvdXJjZSIgaWQ9ImNhY2hlcmVzb3VyY2UiIHNjaGVtYT0iZXhzZC9jYWNoZXJlc291cmNlLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJV9VSV9DQUNIRV9QUkVGRVJFTkNFX1BBR0VfVElUTEUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLkNhY2hlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLkNhY2hlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkubmV0Lk5ldFByZWZlcmVuY2VzIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KLSAgICAgIDwvaW5pdGlhbGl6ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgICAgPHJlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT0icGh5c2ljYWwiCi0gICAgICAgICAgICBwcmlvcml0eT0ibG93IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uIj4KLSAgICAgIDwvcmVzb2x2ZXJFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTlmNDIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogVGhlIGNhY2hlIGhvbGRzIHJlZmVyZW5jZXMgdG8gcmVtb3RlIHJlc291cmNlcy4gVGhlIGNhY2hlIGNhbiBzdG9yZSByZXNvdXJjZXMsCi0gKiByZXRyaWV2ZSByZXNvdXJjZXMsIGFuZCBkZWxldGUgcmVzb3VyY2VzLgotICoKLSAqLwotcHVibGljIGNsYXNzIENhY2hlIAotewotICAvKioKLSAgICogU3RyaW5nIGluc3RhbmNlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPSAidXJpIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OID0ibG9jYXRpb24iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUlkgPSAiZW50cnkiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEUgPSAiY2FjaGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9NT0RJRklFRCA9ICJsYXN0TW9kaWZpZWQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQSVJBVElPTl9USU1FID0gImV4cGlyYXRpb25UaW1lIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfRklMRSA9ICJjYWNoZS54bWwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfRVhURU5TSU9OID0gIi5jYWNoZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9QUkVGSVggPSAid3RwY2FjaGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1VGRklYID0gbnVsbDsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIGEgY2FjaGUgZW50cnkgaXMgMSBkYXkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVQgPSA4NjQwMDAwMDsKLQkKLSAgLyoqCi0gICAqIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGNhY2hlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgQ2FjaGUgY2FjaGVJbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogVGhlIGNhY2hlIGlzIHN0b3JlZCBpbiBhIGhhc2h0YWJsZS4KLSAgICovCi0gIHByaXZhdGUgSGFzaHRhYmxlIGNhY2hlOwotICAKLSAgLyoqCi0gICAqIEEgc2V0IG9mIHVuY2FjaGVkIHJlc291cmNlcy4gVGhlIGNhY2hlIHdhcyBub3QgYWJsZSB0byBjYWNoZSByZXNvdXJjZXMKLSAgICogaW4gdGhpcyBsaXN0LiBUaGlzIGxpc3QgYWxsb3dzIHF1aWNrbHkgc2tpcHBpbmcgb3ZlciB0aGVzZSByZXNvdXJjZXMgaW4KLSAgICogZnV0dXJlIHJlcXVlc3RzLiAKLSAgICovCi0gIHByaXZhdGUgU2V0IHVuY2FjaGVkOwotICAKLSAgLyoqCi0gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2FjaGUKLSAgICovCi0gIHByaXZhdGUgRmlsZSBjYWNoZUxvY2F0aW9uID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIENhY2hlKElQYXRoIGNhY2hlTG9jYXRpb24pCi0gIHsKLQkgIHRoaXMuY2FjaGVMb2NhdGlvbiA9IGNhY2hlTG9jYXRpb24udG9GaWxlKCk7Ly9QbGF0Zm9ybS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKSkudG9GaWxlKCk7Ci0gICAgY2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdW5jYWNoZWQgPSBuZXcgSGFzaFNldCgpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGNhY2hlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBjYWNoZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ2FjaGUgZ2V0SW5zdGFuY2UoKQotICB7Ci0vLwkgIGlmKGNhY2hlSW5zdGFuY2UgPT0gbnVsbCkKLS8vCSAgewotLy8JCSAgY2FjaGVJbnN0YW5jZSA9IG5ldyBDYWNoZShjYWNoZUxvY2F0aW9uKTsKLS8vCQkgIGNhY2hlSW5zdGFuY2Uub3BlbihjYWNoZUxvY2F0aW9uKTsKLS8vCSAgfQotCSAgcmV0dXJuIGNhY2hlSW5zdGFuY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxvY2FsIHJlc291cmNlIGZvciB0aGUgc3BlY2lmaWVkIHVyaS4gSWYgdGhlcmUgaXMgbm8gcmVzb3VyY2UKLSAgICogdGhlIGNhY2hlIHdpbGwgYXR0ZW1wdCB0byBkb3dubG9hZCBhbmQgY2FjaGUgdGhlIHJlc291cmNlIGJlZm9yZSByZXR1cm5pbmcuCi0gICAqIElmIGEgcmVtb3RlIHJlc291cmNlIGNhbm5vdCBiZSBjYWNoZWQgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBmb3Igd2hpY2ggYSByZXNvdXJjZSBpcyByZXF1ZXN0ZWQuCi0gICAqIEByZXR1cm4gVGhlIGxvY2FsIHJlc291cmNlIGZvciB0aGUgc3BlY2lmaWVkIFVSSSBvciBudWxsIGlmIGEgcmVtb3RlIHJlc291cmNlIGNhbm5vdCBiZSBjYWNoZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKFN0cmluZyB1cmkpCi0gIHsKLQkgIGlmKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkgIENhY2hlRW50cnkgcmVzdWx0ID0gKENhY2hlRW50cnkpY2FjaGUuZ2V0KHVyaSk7Ci0JICAKLQkgIC8vIElmIG5vIHJlc3VsdCBpcyBpbiB0aGUgY2FjaGUgYW5kIHRoZSBVUkkgaXMgb2YgYW4gYWxsb3dlZCB0eXBlCi0JICAvLyByZXRyaWV2ZSBpdCBhbmQgc3RvcmUgaXQgaW4gdGhlIGNhY2hlLgotCSAgaWYocmVzdWx0ID09IG51bGwpCi0JICB7Ci0gICAgICAKLSAgICAgICAgaWYoIXVuY2FjaGVkLmNvbnRhaW5zKHVyaSkpCi0JICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBjYWNoZVJlc291cmNlKHVyaSk7IAotICAgICAgICB9Ci0JICB9Ci0JICAvLyBSZXRyZWl2ZSBhIGZyZXNoIGNvcHkgb2YgdGhlIHJlc3VsdCBpZiBpdCBoYXMgdGltZWQgb3V0LgotCSAgZWxzZSBpZihyZXN1bHQuaGFzRXhwaXJlZCgpKQotCSAgewotCQlyZXN1bHQgPSByZWZyZXNoQ2FjaGVFbnRyeShyZXN1bHQpOwotCSAgfQotCSAgaWYocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmdldExvY2FsRmlsZSgpID09IG51bGwpCi0JICB7Ci0JCXJldHVybiBudWxsOwotCSAgfQotCSAgcmV0dXJuIEZJTEVfUFJPVE9DT0wgKyBjYWNoZUxvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyByZXN1bHQuZ2V0TG9jYWxGaWxlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgdW5jYWNoZWQgcmVzb3VyY2VzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiB1bmNhY2hlZCByZXNvdXJjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VW5jYWNoZWRVUklzKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pdW5jYWNoZWQudG9BcnJheShuZXcgU3RyaW5nW3VuY2FjaGVkLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogQ2xlYXIgdGhlIGxpc3Qgb2YgdW5jYWNoZWQgcmVzb3VyY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY2xlYXJVbmNhY2hlZFVSSXMoKQotICB7Ci0gICAgdW5jYWNoZWQuY2xlYXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhbiB1bmNhY2hlZCByZXNvdXJjZSB0byB0aGUgbGlzdCBhbmQgc3RhcnQgdGhlIAotICAgKiB1bmNhY2hlZCBqb2IgaWYgbm90IGFscmVhZHkgc3RhcnRlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFVuY2FjaGVkVVJJKFN0cmluZyB1cmkpCi0gIHsKLQlDYWNoZUpvYi5zdGFydEpvYigpOwotICAgIHVuY2FjaGVkLmFkZCh1cmkpOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FjaGUgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4gVGhpcyBtZXRob2QgY3JlYXRlcyBhIGxvY2FsIHZlcnNpb24gb2YgdGhlCi0gICAqIHJlbW90ZSByZXNvdXJjZSBhbmQgYWRkcyB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHRoZSBjYWNoZS4gSWYgdGhlIHJlc291cmNlCi0gICAqIGNhbm5vdCBiZSBhY2Nlc3NlZCBpdCBpcyBub3QgYWRkZWQgYW5kIG51bGwgaXMgcmV0dXJuZWQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSByZW1vdGUgVVJJIHRvIGNhY2hlLgotICAgKiBAcmV0dXJuIEEgbmV3IENhY2hlRW50cnkgcmVwcmVzZW50aW5nIHRoZSBjYWNoZWQgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgcmVtb3RlCi0gICAqICAgICAgICAgcmVzb3VyY2UgY291bGQgbm90IGJlIHJldHJpZXZlZC4KLSAgICovCi0gIHByb3RlY3RlZCBDYWNoZUVudHJ5IGNhY2hlUmVzb3VyY2UoU3RyaW5nIHVyaSkKLSAgewotCSAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gbnVsbDsKLQkgIFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotCSAgdHJ5Ci0JICB7Ci0JCSAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLQkJICBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCSAgY29ubi5jb25uZWN0KCk7Ci0JCSAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgcmVzb3VyY2UgY2FuIGJlIGNhY2hlZC4KLQkJICBpZihjb25uLmdldFVzZUNhY2hlcygpKQotCQkgIHsKLQkJICAgIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOy8vdXJsLm9wZW5TdHJlYW0oKTsKLQkJICAKLQkJICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOwotCQkJU3RyaW5nIGZpbGVOYW1lID0gcmFuZC5uZXh0SW50KCkgKyBDQUNIRV9FWFRFTlNJT047Ci0JCSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjYWNoZUxvY2F0aW9uLCBmaWxlTmFtZSk7Ci0JCSAgICAvLyBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgZmlsZSBuYW1lLgotCQkgICAgd2hpbGUoIWZpbGUuY3JlYXRlTmV3RmlsZSgpKQotCQkgICAgewotCQkJICBmaWxlTmFtZSA9IHJhbmQubmV4dEludCgpICsgQ0FDSEVfRVhURU5TSU9OOwotCQkJICBmaWxlID0gbmV3IEZpbGUoY2FjaGVMb2NhdGlvbixmaWxlTmFtZSk7Ci0JCSAgICB9Ci0JCSAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTAyNF07Ci0JCSAgICBpbnQgYnl0ZWxlbmd0aDsKLQkJICAgIHdoaWxlKChieXRlbGVuZ3RoID0gaXMucmVhZChieXRlcykpICE9IC0xKQotCQkgICAgewotCQkJICBvcy53cml0ZShieXRlcywgMCwgYnl0ZWxlbmd0aCk7Ci0JCSAgICB9Ci0JCQlsb25nIGxhc3RNb2RpZmllZCA9IGNvbm4uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCSAgICBsb25nIGV4cGlyYXRpb24gPSBjb25uLmdldEV4cGlyYXRpb24oKTsKLQkJCWlmKGV4cGlyYXRpb24gPT0gMCkKLQkJCXsKLQkJCSAgZXhwaXJhdGlvbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsKLQkJCX0KLQkJICAgIGNhY2hlRW50cnkgPSBuZXcgQ2FjaGVFbnRyeSh1cmksIGZpbGVOYW1lLCBsYXN0TW9kaWZpZWQsIGV4cGlyYXRpb24pOwotCQkgICAgY2FjaGUucHV0KHVyaSxjYWNoZUVudHJ5KTsKLQkJICB9Ci0KLQkgIH0KLQkgIGNhdGNoKEV4Y2VwdGlvbiB0KQotCSAgewotCQkgIC8vIFB1dCB0aGUgZW50cnkgaW4gdGhlIHVuY2FjaGVkIGxpc3Qgc28gdGhlIHJlc29sdXRpb24gd29yayB3aWxsIG5vdCBiZSBwZXJmb3JtZWQgYWdhaW4uCi0gICAgICAvLyBUT0RPOiBBZGQgaW4gYSB0aW1lb3V0IGZvciB0aGUgbm9uLWxvY2F0ZWQgdXJpcy4KLSAgICAgIGFkZFVuY2FjaGVkVVJJKHVyaSk7Ci0JICB9Ci0JICBmaW5hbGx5Ci0JICB7Ci0JCSAgaWYoaXMgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIHRyeQotCQkJICB7Ci0JCQkgICAgaXMuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjbG9zZWQuCi0JCQkgIH0KLQkJICB9Ci0JCSAgaWYob3MgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIHRyeQotCQkJICB7Ci0JCQkgICAgb3MuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkJLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjbG9zZWQuIAotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuIGNhY2hlRW50cnk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWZyZXNoIHRoZSBjYWNoZSBlbnRyeSBpZiBuZWNlc3NhcnkuIFRoZSBjYWNoZSBlbnRyeSB3aWxsIGJlIHJlZnJlc2hlZAotICAgKiBpZiB0aGUgcmVtb3RlIHJlc291cmNlIGlzIGFjY2Vzc2libGUgYW5kIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgdGhlCi0gICAqIHJlbW90ZSByZXNvdXJjZSBpcyBncmVhdGVyIHRoYW4gdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgY2FjaGVkCi0gICAqIHJlc291cmNlLgotICAgKiAKLSAgICogQHBhcmFtIGNhY2hlRW50cnkgVGhlIGNhY2hlIGVudHJ5IHRvIHJlZnJlc2guCi0gICAqIEByZXR1cm4gVGhlIHJlZnJlc2hlZCBjYWNoZSBlbnRyeS4KLSAgICovCi0gIHByb3RlY3RlZCBDYWNoZUVudHJ5IHJlZnJlc2hDYWNoZUVudHJ5KENhY2hlRW50cnkgY2FjaGVFbnRyeSkKLSAgewotCSAgVVJMQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKLQkgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0JICB0cnkKLQkgIHsKLQkJICBVUkwgdXJsID0gbmV3IFVSTChjYWNoZUVudHJ5LmdldFVSSSgpKTsKLQkJICBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCSAgY29ubi5jb25uZWN0KCk7Ci0JCSAgCi0JCSAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjb25uLmdldExhc3RNb2RpZmllZCgpOwotCSAgICAgIGlmKGxhc3RNb2RpZmllZCA+IGNhY2hlRW50cnkuZ2V0TGFzdE1vZGlmaWVkKCkpCi0JCSAgewotCQkJbG9uZyBleHBpcmF0aW9uID0gY29ubi5nZXRFeHBpcmF0aW9uKCk7Ci0JCSAgICBpZihleHBpcmF0aW9uID09IDApCi0JCQl7Ci0JCQkgIGV4cGlyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVQ7Ci0JCQl9Ci0JCQkKLQkJICAgIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCi0JCQlTdHJpbmcgbG9jYWxGaWxlID0gY2FjaGVFbnRyeS5nZXRMb2NhbEZpbGUoKTsKLSAgCi0JCSAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShDQUNIRV9QUkVGSVgsIENBQ0hFX1NVRkZJWCk7Ci0JCQl0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLQotCQkgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0JCSAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJICAgIGludCBieXRlbGVuZ3RoOwotCQkgICAgd2hpbGUoKGJ5dGVsZW5ndGggPSBpcy5yZWFkKGJ5dGVzKSkgIT0gLTEpCi0JCSAgICB7Ci0JCQkgIG9zLndyaXRlKGJ5dGVzLCAwLCBieXRlbGVuZ3RoKTsKLQkJICAgIH0KLQkJCWlzLmNsb3NlKCk7Ci0JCQlvcy5jbG9zZSgpOwotCQkJZGVsZXRlRmlsZShjYWNoZUVudHJ5LmdldFVSSSgpKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGNhY2hlTG9jYXRpb24sIGxvY2FsRmlsZSk7Ci0JCQl0ZW1wRmlsZS5yZW5hbWVUbyhmKTsKLQkJCWNhY2hlRW50cnkuc2V0RXhwaXJhdGlvbihleHBpcmF0aW9uKTsKLQkJCWNhY2hlRW50cnkuc2V0TGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7Ci0JCSAgfQotCQkgIC8vIFRoZSBjYWNoZSBlbnRyeSBoYXNuJ3QgY2hhbmdlZC4gSnVzdCB1cGRhdGUgdGhlIGV4cGlyYXRpb24gdGltZS4KLQkgICAgICBlbHNlCi0JCSAgewotCQkJbG9uZyBleHBpcmF0aW9uID0gY29ubi5nZXRFeHBpcmF0aW9uKCk7Ci0JCQlpZihleHBpcmF0aW9uID09IDApCi0JCQl7Ci0JCQkgIGV4cGlyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVQ7Ci0JCQl9Ci0JCQljYWNoZUVudHJ5LnNldEV4cGlyYXRpb24oZXhwaXJhdGlvbik7Ci0JCSAgfQotCi0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gZSkKLQkgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcuCi0JICB9Ci0JICBmaW5hbGx5Ci0JICB7Ci0JCSAgaWYoaXMgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIHRyeQotCQkJICB7Ci0JCQkgICAgaXMuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjbG9zZWQuCi0JCQkgIH0KLQkJICB9Ci0JCSAgaWYob3MgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIHRyeQotCQkJICB7Ci0JCQkgICAgb3MuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkJLy8gRG8gbm90aGluZyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBjbG9zZWQuIAotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuIGNhY2hlRW50cnk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIGNhY2hlZCBVUklzLgotICAgKiAKLSAgICogQHJldHVybiBBbiBhcnJheSBvZiB0aGUgY2FjaGVkIFVSSXMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2FjaGVkVVJJcygpCi0gIHsKLQlTZXQga2V5c2V0ID0gY2FjaGUua2V5U2V0KCk7Ci0JcmV0dXJuIChTdHJpbmdbXSlrZXlzZXQudG9BcnJheShuZXcgU3RyaW5nW2tleXNldC5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENsb3NlIHRoZSBjYWNoZS4gQ2xvc2luZyB0aGUgY2FjaGUgaW52b2x2ZXMgc2VyaWFsaXppbmcgdGhlIGRhdGEgdG8gYW4gWE1MIGZpbGUKLSAgICogaW4gdGhlIHBsdWdpbiBzdGF0ZSBsb2NhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNsb3NlKCkKLSAgewotCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgdHJ5IHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBjYWNoZWRvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLQkJRWxlbWVudCByb290ZWxlbSA9IGNhY2hlZG9jLmNyZWF0ZUVsZW1lbnQoQ0FDSEUpOwotCQljYWNoZWRvYy5hcHBlbmRDaGlsZChyb290ZWxlbSk7Ci0JCQotCSAgRW51bWVyYXRpb24gdXJpcyA9IGNhY2hlLmtleXMoKTsKLQkgIHdoaWxlKHVyaXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JICB7Ci0JCSAgU3RyaW5nIGtleSA9IChTdHJpbmcpdXJpcy5uZXh0RWxlbWVudCgpOwotCQkgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IChDYWNoZUVudHJ5KWNhY2hlLmdldChrZXkpOwotCQkgIGlmKGNhY2hlRW50cnkgIT0gbnVsbCkKLQkJICB7Ci0JCQkgIEVsZW1lbnQgZW50cnkgPSBjYWNoZWRvYy5jcmVhdGVFbGVtZW50KEVOVFJZKTsKLQkJCSAgZW50cnkuc2V0QXR0cmlidXRlKFVSSSwga2V5KTsKLQkJCSAgZW50cnkuc2V0QXR0cmlidXRlKExPQ0FUSU9OLCBjYWNoZUVudHJ5LmdldExvY2FsRmlsZSgpKTsKLQkJCSAgZW50cnkuc2V0QXR0cmlidXRlKEVYUElSQVRJT05fVElNRSwgU3RyaW5nLnZhbHVlT2YoY2FjaGVFbnRyeS5nZXRFeHBpcmF0aW9uVGltZSgpKSk7Ci0JCQkgIGVudHJ5LnNldEF0dHJpYnV0ZShMQVNUX01PRElGSUVELCBTdHJpbmcudmFsdWVPZihjYWNoZUVudHJ5LmdldExhc3RNb2RpZmllZCgpKSk7Ci0JCQkgIHJvb3RlbGVtLmFwcGVuZENoaWxkKGVudHJ5KTsKLQkJICB9Ci0JICB9Ci0JICAKLQkgIC8vIFdyaXRlIHRoZSBjYWNoZSBlbnRyeS4KLQkgIFRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSAgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIFNvdXJjZSBpbnB1dCA9IG5ldyBET01Tb3VyY2UoY2FjaGVkb2MpOwotCSAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IFBsYXRmb3JtLmdldFN0YXRlTG9jYXRpb24oQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKTsKLSAgICAgIFJlc3VsdCBvdXRwdXQgPSBuZXcgU3RyZWFtUmVzdWx0KHN0YXRlTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIENBQ0hFX0ZJTEUpOwotICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGlucHV0LCBvdXRwdXQpOwotCi0gICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpCi0JICB7Ci0JCSAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gc3RvcmUgaW50ZXJuZXQgY2FjaGUuIik7Ci0JICB9Ci0JICBjYWNoZUluc3RhbmNlID0gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIE9wZW4gdGhlIGNhY2hlLiBPcGVuaW5nIHRoZSBjYWNoZSBpbnZvbHZlcyBwYXJzaW5nIHRoZSBjYWNoZSBYTUwgZmlsZSBpbgotICAgKiB0aGUgcGx1Z2luIHN0YXRlIGxvY2F0aW9uIGlmIGl0IGNhbiBiZSByZWFkLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIG9wZW4oSVBhdGggY2FjaGVMb2NhdGlvbikKLSAgewotICAgIGNhY2hlSW5zdGFuY2UgPSBuZXcgQ2FjaGUoY2FjaGVMb2NhdGlvbik7Ci0JICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICB0cnkgewotCQkgIAotCQlJUGF0aCBzdGF0ZUxvY2F0aW9uID0gY2FjaGVMb2NhdGlvbjsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBjYWNoZWRvYyA9IGJ1aWxkZXIucGFyc2Uoc3RhdGVMb2NhdGlvbi50b1N0cmluZygpICsgIi8iICsgQ0FDSEVfRklMRSk7Ci0JCUVsZW1lbnQgcm9vdGVsZW0gPSBjYWNoZWRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJTm9kZUxpc3QgZW50cmllcyA9IHJvb3RlbGVtLmdldENoaWxkTm9kZXMoKTsKLQkJaW50IG51bUVudHJpZXMgPSBlbnRyaWVzLmdldExlbmd0aCgpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSsrKQotCQl7Ci0JCQlOb2RlIGVudHJ5ID0gZW50cmllcy5pdGVtKGkpOwotCQkJaWYoZW50cnkgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJewotCQkJCUVsZW1lbnQgZSA9IChFbGVtZW50KWVudHJ5OwotCQkJCWlmKGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoRU5UUlkpKQotCQkJCXsKLQkJCQkJU3RyaW5nIHVyaSA9IGUuZ2V0QXR0cmlidXRlKFVSSSk7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGUuZ2V0QXR0cmlidXRlKExPQ0FUSU9OKTsKLQkJCQkJU3RyaW5nIGxtID0gZS5nZXRBdHRyaWJ1dGUoTEFTVF9NT0RJRklFRCk7Ci0JCQkJCVN0cmluZyBldCA9IGUuZ2V0QXR0cmlidXRlKEVYUElSQVRJT05fVElNRSk7Ci0JCQkJCWxvbmcgbGFzdE1vZGlmaWVkID0gLTE7Ci0JCQkJCWxvbmcgZXhwaXJhdGlvblRpbWUgPSAtMTsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCWxhc3RNb2RpZmllZCA9IExvbmcucGFyc2VMb25nKGxtKTsKLQkJCQkJfQotCQkJCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotCQkJCQl7Ci0JCQkJCX0KLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCWV4cGlyYXRpb25UaW1lID0gTG9uZy5wYXJzZUxvbmcoZXQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0JCQkJCXsKLQkJCQkJfQotCQkJCQlpZih1cmkgIT0gbnVsbCAmJiBsb2NhdGlvbiAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCSAgY2FjaGVJbnN0YW5jZS5jYWNoZS5wdXQodXJpLCBuZXcgQ2FjaGVFbnRyeSh1cmksIGxvY2F0aW9uLCBsYXN0TW9kaWZpZWQsIGV4cGlyYXRpb25UaW1lKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAgIH0KLQkgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotCSAgewotCQkvLyBJZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uIHRoZXJlIGlzIG5vdGhpbmcgdG8gbG9hZC4gRG8gbm90aGluZy4KLQkgIH0KLQkgIGNhdGNoKEV4Y2VwdGlvbiBlKQotCSAgewotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGxvYWQgY2FjaGUuIik7Ci0JICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDbGVhciBhbGwgb2YgdGhlIGVudHJpZXMgZnJvbSB0aGUgY2FjaGUuIFRoaXMgbWV0aG9kIGFsc28gZGVsZXRlcyB0aGUgY2FjaGUgZmlsZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLQlFbnVtZXJhdGlvbiBrZXlzID0gY2FjaGUua2V5cygpOwotCXdoaWxlKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JewotCSAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotCSAgCi0JICBkZWxldGVGaWxlKGtleSk7Ci0JfQotCWNhY2hlLmNsZWFyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIGNhY2hlIGVudHJ5IHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgZW50cnkgdG8gcmVtb3ZlIGZyb20gdGhlIGNhdGFsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkZWxldGVFbnRyeShTdHJpbmcgdXJpKQotICB7Ci0JICBpZih1cmkgPT0gbnVsbCkgcmV0dXJuOwotCSAgCi0JICBkZWxldGVGaWxlKHVyaSk7Ci0JICBjYWNoZS5yZW1vdmUodXJpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIERlbGV0ZSB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIFVSSS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byBkZWxldGUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVGaWxlKFN0cmluZyB1cmkpCi0gIHsKLQkgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IChDYWNoZUVudHJ5KWNhY2hlLmdldCh1cmkpOwotCSAgaWYoY2FjaGVFbnRyeSAhPSBudWxsKQotCSAgewotCQlTdHJpbmcgbG9jYXRpb24gPSBjYWNoZUxvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBjYWNoZUVudHJ5LmdldExvY2FsRmlsZSgpOwotCSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbik7Ci0JICAgIGlmKCFmaWxlLmRlbGV0ZSgpKQotCSAgICB7Ci0JICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgIiArIGxvY2F0aW9uICsgIiBmcm9tIGNhY2hlLiIpOwotCSAgICB9IAotCSAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3ZWMwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi0vKioKLSAqIEEgY2FjaGUgZW50cnkgY29udGFpbnMgYSBVUkksIGEgbG9jYWwgZmlsZSwgYW5kIGEgdGltZW91dC4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlRW50cnkgCi17Ci0gIHByaXZhdGUgU3RyaW5nIHVyaTsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxGaWxlOwotICBwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkOwotICBwcml2YXRlIGxvbmcgZXhwaXJhdGlvblRpbWU7Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGNhY2hlIGVudHJ5LgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgcmVtb3RlIFVSSSBvZiB0aGUgY2FjaGUgZW50cnkuCi0gICAqIEBwYXJhbSBsb2NhbEZpbGUgVGhlIGxvY2FsIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2FjaGVkIGVudHJ5LgotICAgKiBAcGFyYW0gbGFzdE1vZGlmaWUgVGhlIHRpbWUgdGhpcyByZXNvdXJjZSB3YXMgbGFzdCBtb2RpZmllZC4KLSAgICogQHBhcmFtIGV4cGlyYXRpb25UaW1lIFRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgdGhpcyBjYWNoZSBlbnRyeSB3aWxsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBleHBpcmUuCi0gICAqLwotICBwdWJsaWMgQ2FjaGVFbnRyeShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxGaWxlLCBsb25nIGxhc3RNb2RpZmllZCwgbG9uZyBleHBpcmF0aW9uVGltZSkKLSAgewotCXRoaXMudXJpID0gdXJpOwotCXRoaXMubG9jYWxGaWxlID0gbG9jYWxGaWxlOwotCXRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotCXRoaXMuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZSBjYWNoZSBlbnRyeSBpcyBleHBpcmVkIGlmIGl0cyBleHBpcmF0aW9uIHRpbWUgaXMgbGVzcyB0aGVuIHRoZQotICAgKiBjdXJyZW50IHN5c3RlbSB0aW1lIGFuZCBub3QgZXF1YWwgdG8gLTEuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjYWNoZWQgZW50cnkgaGFzIGV4cGlyZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0V4cGlyZWQoKQotICB7Ci0JIGlmKGV4cGlyYXRpb25UaW1lICE9IC0xICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpID4gZXhwaXJhdGlvblRpbWUpCi0JIHsKLQkgICByZXR1cm4gdHJ1ZTsKLQkgfQotCSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwgZXhwaXJlLgotICAgKiAKLSAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwgZXhwaXJlLgotICAgKiAgICAgICAgICAgICAgICAtMSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGVudHJ5IHdpbGwgbm90IGV4cGlyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4cGlyYXRpb24obG9uZyBleHBpcmF0aW9uVGltZSkKLSAgewotCXRoaXMuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgdGltZSBhdCB3aGljaCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwgZXhwaXJlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdGltZSBhdCB3aGljaCB0aGlzIGNhY2hlIGVudHJ5IHdpbGwgZXhwaXJlLgotICAgKi8KLSAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvblRpbWUoKQotICB7Ci0JcmV0dXJuIGV4cGlyYXRpb25UaW1lOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSByZW1vdGUgVVJJIGZvciB0aGlzIGNhY2hlIGVudHJ5LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgcmVtb3RlIFVSSSBmb3IgdGhpcyBjYWNoZSBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotCXJldHVybiB1cmk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvY2FsIGZpbGUgZm9yIHRoaXMgY2FjaGUgZW50cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsb2NhbCBmaWxlIGZvciB0aGlzIGNhY2hlIGVudHJ5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhbEZpbGUoKQotICB7Ci0JcmV0dXJuIGxvY2FsRmlsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGFzdCB0aW1lIHRoaXMgY2FjaGUgZW50cnkgd2FzIG1vZGlmaWVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGFzdCB0aW1lIHRoaXMgY2FjaGUgZW50cnkgd2FzIG1vZGlmaWVkLgotICAgKi8KLSAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkKLSAgewotCXJldHVybiBsYXN0TW9kaWZpZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIGxhc3QgdGltZSB0aGlzIGNhY2hlIGVudHJ5IHdhcyBtb2RpZmllZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIGxhc3RNb2RpZmllZCkKLSAgewotCXRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YzM5NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotCi0vKioKLSAqIEEgY2FjaGUgam9iIHJ1bnMgb25jZSBhbiBob3VyIHRvIGNhY2hlIGFueSBwcmVzcGVjaWZpZWQgcmVzb3VyY2VzIHdoaWNoCi0gKiBzaG91bGQgYmUgY2FjaGVkIGFuZCBhbnkgcmVzb3VyY2VzIGZvciB3aGljaCBhbiBhdHRlbXB0IHdhcyBwcmV2aW91c2x5IAotICogbWFkZSB0byBjYWNoZSB0aGVtIGJ1dCB0aGV5IHdlcmUgdW5hYmxlIHRvIGJlIGNhY2hlZC4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlSm9iIGV4dGVuZHMgSm9iCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0NIRURVTEVfVElNRSA9IDM2MDAwMDA7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgQ2FjaGVKb2Igam9iID0gbnVsbDsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIENhY2hlSm9iKCkKLSAgewotICAgIHN1cGVyKENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX01PTklUT1JfTkFNRSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgKi8KLSAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotCWJvb2xlYW4gYWxsU3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgQ2FjaGUgY2FjaGUgPSBDYWNoZS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZ1tdIHVuY2FjaGVkVVJJcyA9IGNhY2hlLmdldFVuY2FjaGVkVVJJcygpOwotICAgIGludCBudW1VbmNhY2hlZFVSSXMgPSB1bmNhY2hlZFVSSXMubGVuZ3RoOwotCi0gICAgY2FjaGUuY2xlYXJVbmNhY2hlZFVSSXMoKTsKLSAgICBtb25pdG9yLmJlZ2luVGFzayhDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9NT05JVE9SX05BTUUsIG51bVVuY2FjaGVkVVJJcyk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVVuY2FjaGVkVVJJczsgaSsrKQotICAgICAgewotICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IoaW50IGogPSBpOyBqIDwgbnVtVW5jYWNoZWRVUklzOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgY2FjaGUuYWRkVW5jYWNoZWRVUkkodW5jYWNoZWRVUklzW2pdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB1cmkgPSB1bmNhY2hlZFVSSXNbaV07Ci0gICAgICAgIG1vbml0b3Iuc2V0VGFza05hbWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfTU9OSVRPUl9DQUNISU5HLCBuZXcgT2JqZWN0W117dXJpfSkpOwotICAgICAgIAotICAgICAgICBTdHJpbmcgY2FjaGVkVVJJID0gY2FjaGUuZ2V0UmVzb3VyY2UodXJpKTsKLSAgICAgICAgaWYoY2FjaGVkVVJJID09IG51bGwpCi0gICAgCXsKLSAgICAJICBhbGxTdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAgCX0KLSAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICB9Ci0gICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0gCi0gICAgZmluYWxseQotICAgIHsKLSAgICAgIC8vIElmIGFsbCB0aGUgdW5jYWNoZWQgVVJJcyBjb3VsZCBub3QgYmUgY2FjaGVkIAotICAgICAgLy8gc2NoZWR1bGUgdGhlIG5leHQgdGltZSB0aGUgam9iIHNob3VsZCBydW4uCi0gICAgICBpZighYWxsU3VjY2Vzc2Z1bCkKLSAgICAgIHsKLSAgICAJICBzdGFydEpvYihTQ0hFRFVMRV9USU1FKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogU3RhcnQgdGhlIGNhY2hlIGpvYi4gVGhlIGNhY2hlIGpvYiBjYWNoZXMgcmVzb3VyY2VzIHRoYXQgd2VyZSBub3QgYWJsZSB0byBiZSBwcmV2aW91c2x5Ci0gICAqIGRvd25sb2FkZWQuIE9ubHkgb25lIGpvYiBpcyBydW4gYXQgYSB0aW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHN0YXJ0Sm9iKCkgCi0gIHsKLQlpZihqb2IgPT0gbnVsbCkKLQl7Ci0JICBzdGFydEpvYigwKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTdGFydCBhIG5ldyBjYWNoZSBqb2Igd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGF5LgotICAgKiAKLSAgICogQHBhcmFtIGRlbGF5Ci0gICAqIAkJVGhlIHN0YXJ0IGRlbGF5IGZvciB0aGUgY2FjaGUgam9iLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzdGFydEpvYihsb25nIGRlbGF5KQotICB7Ci0Jam9iID0gbmV3IENhY2hlSm9iKCk7Ci0Jam9iLnNldFByaW9yaXR5KENhY2hlSm9iLkRFQ09SQVRFKTsKLQlqb2Iuc2NoZWR1bGUoZGVsYXkpOyAvLyBzdGFydCBhcyBzb29uIGFzIHBvc3NpYmxlCi0gIH0KLQotICAvKioKLSAgICogU3RvcCB0aGUgY3VycmVudCBjYWNoZSBqb2IuIFRoZSBjYWNoZSBqb2IgY2FjaGVzIHJlc291cmNlcyB0aGF0IHdlcmUgbm90IGFibGUgdG8gYmUgcHJldmlvdXNseQotICAgKiBkb3dubG9hZGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHN0b3BKb2IoKSAKLSAgewotCWlmIChqb2IgIT0gbnVsbCkgCi0JewotCSAgam9iLmNhbmNlbCgpOwotCX0KLQlqb2IgPSBudWxsOwotICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZlZTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSB0aGUgY2FjaGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9DTEVBUl9DQUNIRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQlVUVE9OX0RFTEVURV9FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9DQUNIRV9FTlRSSUVTX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUkVGX0NBQ0hFX0NBQ0hFX09QVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9DQUNIRV9BQk9VVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9QUk9NUFRfRk9SX0RJU0FHUkVFRF9MSUNFTlNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfTU9OSVRPUl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9NT05JVE9SX0NBQ0hJTkc7Ci0KLQkvLyBDYWNoZSBsaWNlbnNlIGRpYWxvZwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0lOVEVSTkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0JST1dTRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19BR1JFRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19ESVNBR1JFRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTE9BRElOR19MSUNFTlNFOwotCi0JLy8gQ2FjaGUgbG9nZ2luZyBtZXNzYWdlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9MT0dfSU5GT19XVFBfTk9fVVNFUl9JTlRFUkFDVElPTjsKLQotCS8vIFdUUCB0ZXN0IG5vIHVzZXIgaW50ZXJhY3Rpb24gc3lzdGVtIHByb3BlcnR5Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQX05PX1VTRVJfSU5URVJBQ1RJT05fU1lTVEVNX1BST1A7ICAgCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ2FjaGVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoZU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0ZjBlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gCi17Ci0gIC8qKgotICAgKiBUaGUgSUQgb2YgdGhpcyBwbHVnaW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlIjsKLQotICAvKioKLSAgICogVGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIENhY2hlUGx1Z2luIHBsdWdpbjsKLQotICAvKioKLSAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIENhY2hlUGx1Z2luKCkgCi0gIHsKLQlzdXBlcigpOwotCXBsdWdpbiA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0Jc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JQ2FjaGUub3BlbihQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKGdldEJ1bmRsZSgpKSk7Ci0JaWYgKGdldFBsdWdpblByZWZlcmVuY2VzKCkuY29udGFpbnMoUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVEKSkgCi0JewotCSAgc2V0Q2FjaGVFbmFibGVkKGdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQpKTsKLQl9IAotCWVsc2UgCi0JewotCSAgLy8gVGhlIGNhY2hlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0JICBzZXRDYWNoZUVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkvLyBSZXN0b3JlIGxpY2Vuc2UgcHJlZmVyZW5jZXMKLQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JTGljZW5zZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTGljZW5zZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JU3RyaW5nW10gbGljZW5zZXMgPSByZWdpc3RyeS5nZXRMaWNlbnNlcygpOwotCWludCBudW1MaWNlbnNlcyA9IGxpY2Vuc2VzLmxlbmd0aDsKLQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtTGljZW5zZXM7IGkrKykKLQl7Ci0JICBpbnQgc3RhdGUgPSBwcmVmcy5nZXRJbnQobGljZW5zZXNbaV0pOwotCSAgaWYoc3RhdGUgPT0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfQUdSRUUuaW50VmFsdWUoKSkKLQkgIHsKLQkJcmVnaXN0cnkuYWdyZWVMaWNlbnNlKGxpY2Vuc2VzW2ldKTsKLQkgIH0KLQkgIGVsc2UgaWYoc3RhdGUgPT0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfRElTQUdSRUUuaW50VmFsdWUoKSkKLQkgIHsKLQkJcmVnaXN0cnkuZGlzYWdyZWVMaWNlbnNlKGxpY2Vuc2VzW2ldKTsKLQkgIH0KLQl9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotCS8vIFNhdmUgdGhlIGxpY2Vuc2Ugc3RhdGUgaW5mb3JtYXRpb24uCi0JUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCUxpY2Vuc2VSZWdpc3RyeSByZWdpc3RyeSA9IExpY2Vuc2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCVN0cmluZ1tdIGxpY2Vuc2VzID0gcmVnaXN0cnkuZ2V0TGljZW5zZXMoKTsKLQlpbnQgbnVtTGljZW5zZXMgPSBsaWNlbnNlcy5sZW5ndGg7Ci0JZm9yKGludCBpID0gMDsgaSA8IG51bUxpY2Vuc2VzOyBpKyspCi0JewotCSAgSW50ZWdlciBzdGF0ZSA9IHJlZ2lzdHJ5LmdldExpY2Vuc2VTdGF0ZShsaWNlbnNlc1tpXSk7Ci0gICAgICAvLyBGb3Igc3RhdGVzIHRoYXQgaGF2ZSBiZWVuIGRpc2FncmVlZCB0byB0aGlzIHNlc3Npb24gc3RvcmUKLQkgIC8vIHRoZW0gYXMgZGlzYWdyZWUuCi0JICBpZihzdGF0ZSA9PSBMaWNlbnNlUmVnaXN0cnkuTElDRU5TRV9ESVNBR1JFRV9USElTX1NFU1NJT04pCi0JICB7Ci0JCXN0YXRlID0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfRElTQUdSRUU7Ci0JICB9Ci0JICBwcmVmcy5zZXRWYWx1ZShsaWNlbnNlc1tpXSwgc3RhdGUuaW50VmFsdWUoKSk7Ci0JfQotCQotCUNhY2hlLmdldEluc3RhbmNlKCkuY2xvc2UoKTsKLQlDYWNoZUpvYi5zdG9wSm9iKCk7Ci0Jc3VwZXIuc3RvcChjb250ZXh0KTsKLQlwbHVnaW4gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ2FjaGVQbHVnaW4gZ2V0RGVmYXVsdCgpIAotICB7Ci0JcmV0dXJuIHBsdWdpbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBvciBub3QgdGhlIGNhY2hlIGlzIGVuYWJsZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZW5hYmxlZCBJZiB0cnVlIHRoZSBjYWNoZSBpcyBlbmFibGVkLCBpZiBmYWxzZSBpdCBpcyBub3QgZW5hYmxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENhY2hlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIAotICB7Ci0JZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQsIGVuYWJsZWQpOwotCUNhY2hlSm9iLnN0b3BKb2IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhY2hlIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2FjaGUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDYWNoZUVuYWJsZWQoKSAKLSAgewotCWlmIChnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmNvbnRhaW5zKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCkpCi0JICByZXR1cm4gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCk7Ci0JcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBvciBub3QgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIGZvciBsaWNlbnNlcyB0byB3aGljaCB0aGV5IAotICAgKiBoYXZlIHByZXZpb3VzbHkgZGlzYWdyZWVkLgotICAgKiAKLSAgICogQHBhcmFtIHByb21wdCBJZiB0cnVlIHRoZSB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQsIGlmIGZhbHNlIHRoZSB1c2VyIHNob3VsZCBub3QgYmUgcHJvbXB0ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9tcHREaXNhZ3JlZWRMaWNlbnNlcyhib29sZWFuIHByb21wdCkgCi0gIHsKLQlnZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUywgcHJvbXB0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCBmb3IgbGljZW5zZXMgdG8gd2hpY2ggdGhleQotICAgKiBoYXZlIHByZXZpb3VzbHkgZGlzYWdyZWVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRQcm9tcHQoKSAKLSAgewotCWlmIChnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmNvbnRhaW5zKFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUykpCi0JICByZXR1cm4gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUyk7Ci0JcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjODgxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ2FjaGUgcHJlZmVyZW5jZSBwYWdlIHN0cmluZ3MuCi1fVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfVElUTEUgICAgICAgICAgICAgPSBSZW1vdmUgQWxsPwotX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX01FU1NBR0UgICAgICAgICAgID0gUmVtb3ZlIGFsbCBjYWNoZSBlbnRyaWVzPwotX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19USVRMRSAgICAgID0gUmVtb3ZlIEVudHJpZXM/Ci1fVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX01FU1NBR0UgICAgPSBSZW1vdmUgYWxsIHNlbGVjdGVkIGNhY2hlIGVudHJpZXM/Ci1fVUlfQlVUVE9OX0NMRUFSX0NBQ0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSZW1vdmUgJkFsbAotX1VJX0JVVFRPTl9ERUxFVEVfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgID0gJlJlbW92ZQotX1VJX1BSRUZfQ0FDSEVfRU5UUklFU19USVRMRSAgICAgICAgICAgICAgICAgICAgID0gJkNhY2hlIGVudHJpZXM6Ci1fVUlfUFJFRl9DQUNIRV9DQUNIRV9PUFRJT04gICAgICAgICAgICAgICAgICAgICAgPSAmRGlzYWJsZSBjYWNoaW5nCi1fVUlfUFJFRl9DQUNIRV9BQk9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBNYW5hZ2UgdGhlIGNhY2hlIG9mIHJlbW90ZSByZXNvdXJjZXMsIHN1Y2ggYXMgdGhvc2UgZG93bmxvYWRlZCBmcm9tIHRoZSBpbnRlcm5ldC4KLV9VSV9QUkVGX1BST01QVF9GT1JfRElTQUdSRUVEX0xJQ0VOU0VTICAgICAgICAgICA9ICZQcm9tcHQgbWUgZm9yIGFncmVlbWVudCBmb3IgbGljZW5zZXMgZm9yIHdob3NlIHRlcm1zIEkgaGF2ZSBhbHJlYWR5IGRpc2FncmVlZAotCi0jIENhY2hlIG1vbml0b3Igc3RyaW5ncy4KLV9VSV9DQUNIRV9NT05JVE9SX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENhY2hpbmcgUmVtb3RlIFJlc291cmNlcwotX1VJX0NBQ0hFX01PTklUT1JfQ0FDSElORyAgICAgICAgICAgICAgICAgICAgICAgID0gQ2FjaGluZyB7MH0KLQotIyBDYWNoZSBsaWNlbnNlIGRpYWxvZwotX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDEgICAgICAgICAgICAgID0gQSByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgdG8gY2FjaGUgdGhlIHJlc291cmNlOgotX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDIgICAgICAgICAgICAgID0gSW4gb3JkZXIgdG8gY2FjaGUgdGhlIHJlc291cmNlIHlvdSBtdXN0IGFncmVlIHRvIHRoZSBsaWNlbnNlIGJlbG93OgotX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fSU5URVJOQUwgID0gSW4gb3JkZXIgdG8gY2FjaGUgdGhlIHJlc291cmNlIHlvdSBtdXN0IGFncmVlIHRvIHRoZSBsaWNlbnNlIHdoaWNoIGhhcyBiZWVuIG9wZW5lZCBpbiB5b3VyIGJyb3dzZXIuCi1fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19CUk9XU0VSICAgPSBUaGUgbGljZW5zZSBjYW5ub3QgYmUgZGlzcGxheWVkIGluIHRoaXMgZGlhbG9nLiBJbiBvcmRlciB0byBjYWNoZSB0aGUgcmVzb3VyY2UgeW91IG11c3QgYWdyZWUgdG8gdGhlIGxpY2Vuc2UgbG9jYXRlZCBhdCB7MH0uCi1fVUlfQ0FDSEVfRElBTE9HX0FHUkVFX0JVVFRPTiAgICAgICAgICAgICAgICAgICAgPSBJIEFncmVlCi1fVUlfQ0FDSEVfRElBTE9HX0RJU0FHUkVFX0JVVFRPTiAgICAgICAgICAgICAgICAgPSBJIERpc2FncmVlCi1fVUlfQ0FDSEVfRElBTE9HX1RJVExFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMaWNlbnNlIEFncmVlbWVudAotX1VJX0xPQURJTkdfTElDRU5TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTG9hZGluZyBsaWNlbnNlCi0KLSMgQ2FjaGUgbG9nZ2luZyBtZXNzYWdlcwotX0xPR19JTkZPX1dUUF9OT19VU0VSX0lOVEVSQUNUSU9OICAgICAgICAgICAgICAgID0gezB9IGlzIHNldC4gTGljZW5zZXMgZGlhbG9ncyB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQuCi0KLSMgV1RQIHRlc3Qgbm8gdXNlciBpbnRlcmFjdGlvbiBzeXN0ZW0gcHJvcGVydHkKLSMgVGhpcyBwcm9wZXJ0eSBpcyBjaGVja2VkIGJ5IHRoZSBjYWNoZS4gVGhpcyBzdGluZyBpcyBub3Qgc2hvd24gdG8gdGhlIHVzZXIuCi1XVFBfTk9fVVNFUl9JTlRFUkFDVElPTl9TWVNURU1fUFJPUCAgICAgICAgICAgICAgPSB3dHAuYXV0b3Rlc3Qubm9uaW50ZXJhY3RpdmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjUxOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotLyoqCi0gKiBBIGNhY2hlIFVSSSByZXNvbHZlci4gVGhpcyByZXNvbHZlciB3aWxsIGNhY2hlIHJlbW90ZSByZXNvdXJjZXMgYW5kIHJldHVybgotICogdGhlIGxvY2FsIGNvcHkgaWYgdGhleSBjYW4gYmUgY2FjaGVkLiBJZiBhIHJlc291cmNlIGNhbm5vdCBiZSBjYWNoZWQgdGhlCi0gKiByZXNvdXJjZSByZXR1cm5zIG51bGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgVVJJUmVzb2x2ZXJFeHRlbnNpb24gCi17Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uI3Jlc29sdmUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKElGaWxlIGZpbGUsIFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCXsgCi0gICAgICBpZihDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNDYWNoZUVuYWJsZWQoKSkKLSAgICAgIHsKLQkJICBTdHJpbmcgcmVzb3VyY2UgPSBudWxsOwotCQkgIGlmKHN5c3RlbUlkICE9IG51bGwpCi0JCSAgewotCQkgICAgcmVzb3VyY2UgPSBVUklIZWxwZXIubm9ybWFsaXplKHN5c3RlbUlkLCBiYXNlTG9jYXRpb24sIG51bGwpOwotCQkgIH0gCi0JCSAgCi0JCSAgaWYocmVzb3VyY2UgIT0gbnVsbCAmJiAocmVzb3VyY2Uuc3RhcnRzV2l0aCgiaHR0cDoiKSB8fCByZXNvdXJjZS5zdGFydHNXaXRoKCJmdHA6IikpKQotCQkgIHsKLQkJICAgIC8vIEhhbmRsZSByZXNvdXJjZXMgcHJlc3BlY2lmaWVkIHRvIGNhY2hlLgotCQkgICAgVG9DYWNoZVJlc291cmNlIHRvQ2FjaGVSZXNvdXJjZSA9IFRvQ2FjaGVSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlVG9DYWNoZShyZXNvdXJjZSk7Ci0JCSAgICBpZih0b0NhY2hlUmVzb3VyY2UgPT0gbnVsbCB8fCBMaWNlbnNlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5oYXNMaWNlbnNlQmVlbkFjY2VwdGVkKHJlc291cmNlLCB0b0NhY2hlUmVzb3VyY2UuZ2V0TGljZW5zZSgpKSkKLQkJICAgIHsgCQotCQkgICAgICByZXR1cm4gQ2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCSAgICB9Ci0JCSAgfQotICAgICAgfQotCSAgcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWJjM2MxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgZGlhbG9nIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBhY2NlcHQgYSBsaWNlbnNlIGFncmVlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nIGV4dGVuZHMgSWNvbkFuZE1lc3NhZ2VEaWFsb2cgCi17Ci0gIC8qKgotICAgKiBIb2xkcyBhbGwgdGhlIGRpYWxvZ3MgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBrZXllZCBieSB0aGUgbGljZW5zZSBVUkwuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgZGlhbG9nc0luVXNlID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgLyoqCi0gICAqIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdXJsOwotCi0gIC8qKgotICAgKiBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbGljZW5zZVVSTDsKLSAgCi0gIC8qKgotICAgKiBUaGUgYWdyZWUgYnV0dG9uIGZvciB0aGUgZGlhbG9nLgotICAgKi8KLSAgcHJpdmF0ZSBCdXR0b24gYWdyZWVCdXR0b24gPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgZGlhbG9nLgotICAgKiBAcGFyYW0gdXJsIFRoZSBsaWNlbnNlIFVSTC4KLSAgICovCi0gIHByb3RlY3RlZCBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlVVJMKSAKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0JdGhpcy51cmwgPSB1cmw7Ci0JdGhpcy5saWNlbnNlVVJMID0gbGljZW5zZVVSTDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSAKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19USVRMRSk7Ci0gICAgc2hlbGwuc2V0SW1hZ2UobnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0JQ29tcG9zaXRlIGJ1dHRvbkJhciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMDsKLQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQlidXR0b25CYXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCWJ1dHRvbkJhci5zZXRMYXlvdXREYXRhKGdkKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGFncmVlIGJ1dHRvbi4KLQlhZ3JlZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihidXR0b25CYXIsIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLk9LLCAKLQkJCUNhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19BR1JFRV9CVVRUT04sIGZhbHNlKTsKLQlhZ3JlZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGRpc2FncmVlIGJ1dHRvbi4KLQljcmVhdGVCdXR0b24oYnV0dG9uQmFyLCBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5DQU5DRUwsIAotCQkJQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0RJU0FHUkVFX0JVVFRPTiwgZmFsc2UpOwotCQotCXJldHVybiBidXR0b25CYXI7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCk7Ci0JZ2Qud2lkdGhIaW50ID0gNTAwOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCS8vIERpc3BsYXkgYSBzdGF0ZW1lbnQgYWJvdXQgdGhlIGxpY2Vuc2UuCi0JTGFiZWwgbGljZW5zZVRleHQxID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxpY2Vuc2VUZXh0MS5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDEpOwotCUxhYmVsIHVybFRleHQgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKTsKLQl1cmxUZXh0LnNldExheW91dERhdGEoZ2QpOwotCXVybFRleHQuc2V0VGV4dCh1cmwpOwotCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsgLy8gU3BhY2luZyBsYWJlbC4KLQlMYWJlbCBsaWNlbnNlVGV4dDIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKTsKLQlsaWNlbnNlVGV4dDIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JLy8gRGlzcGxheSB0aGUgbGljZW5zZSBpbiBhIGJyb3dzZXIuCi0JdHJ5Ci0JewotCSAgZmluYWwgQ29tcG9zaXRlIGxpY2Vuc2VUZXh0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkgIGZpbmFsIFN0YWNrTGF5b3V0IHN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JICBsaWNlbnNlVGV4dENvbXBvc2l0ZS5zZXRMYXlvdXQoc3RhY2tMYXlvdXQpOwotCSAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkgIGdkLmhlaWdodEhpbnQgPSA0MDA7Ci0JICBsaWNlbnNlVGV4dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkgIC8vIENyZWF0ZSB0aGUgbG9hZGluZyBwcm9ncmVzcyBtb25pdG9yIGNvbXBvc2l0ZSBhbmQgcGFydC4KLQkgIENvbXBvc2l0ZSBtb25pdG9yQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShsaWNlbnNlVGV4dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCSAgbW9uaXRvckNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JICBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCSAgZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkgIG1vbml0b3JDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICBmaW5hbCBQcm9ncmVzc01vbml0b3JQYXJ0IG1vbml0b3IgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yUGFydChtb25pdG9yQ29tcG9zaXRlLCBuZXcgR3JpZExheW91dCgpKTsKLQkgIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlKTsKLQkgIG1vbml0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICBtb25pdG9yLmJlZ2luVGFzayhDYWNoZU1lc3NhZ2VzLl9VSV9MT0FESU5HX0xJQ0VOU0UsIDEwMCk7Ci0JICBzdGFja0xheW91dC50b3BDb250cm9sID0gbW9uaXRvckNvbXBvc2l0ZTsKLQkgIC8vIENyZWF0ZSB0aGUgYnJvd3Nlci4KLQkgIGZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKGxpY2Vuc2VUZXh0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkgIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JICAvL2dkLmhlaWdodEhpbnQgPSA0MDA7Ci0JICAKLQkgIC8vIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIGxpY2Vuc2UgVVJMIGlzIHNldCBldmVuIGlmIHdlIHJlYWQgCi0JICAvLyB0aGUgY29udGVudHMgb2YgdGhlIGxpY2Vuc2UgZmlsZSBvdXJzZWx2ZXMgKHNlZSBiZWxvdykgYXMKLQkgIC8vIG90aGVyd2lzZSB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB3aWxsIG5vdCBiZSBjYWxsZWQgb24gY2VydGFpbgotCSAgLy8gbGludXggc3lzdGVtcyB3aXRoIGNlcnRhaW4gYnJvd3NlcnMuCi0JICBicm93c2VyLnNldFVybChsaWNlbnNlVVJMKTsKLQkgIAotCSAgLy8gVGhlIGJyb3dzZXIgd2lkZ2V0IGhhcyBwcm9ibGVtcyBsb2FkaW5nIGZpbGVzIHN0b3JlZCBpbiBqYXJzCi0JICAvLyBzbyB3ZSByZWFkIGZyb20gdGhlIGphciBhbmQgc2V0IHRoZSBicm93c2VyIHRleHQgb3Vyc2VsdmVzLgotCSAgLy8gU2VlIGJ1ZyAxNTQ3MjEuCi0JICBpZihsaWNlbnNlVVJMLnN0YXJ0c1dpdGgoImphcjoiKSkKLQkgIHsKLQkJICBJbnB1dFN0cmVhbSBsaWNlbnNlU3RyZWFtID0gbnVsbDsKLQkJICBJbnB1dFN0cmVhbVJlYWRlciBpc3JlYWRlciA9IG51bGw7Ci0JCSAgQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG51bGw7Ci0JCSAgdHJ5Ci0JCSAgewotCQkgIFVSTCBicm93c2VyVVJMID0gbmV3IFVSTChsaWNlbnNlVVJMKTsKLQkJICBsaWNlbnNlU3RyZWFtID0gYnJvd3NlclVSTC5vcGVuU3RyZWFtKCk7Ci0JCSAgaXNyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobGljZW5zZVN0cmVhbSk7Ci0JCSAgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3JlYWRlcik7Ci0JCSAgU3RyaW5nIHN0cjsKLQkJICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCSAgd2hpbGUoKHN0ciA9IGJyZWFkZXIucmVhZExpbmUoKSkhPW51bGwpewotCQkgICAgICBzYi5hcHBlbmQoc3RyKTsKLQkJICB9Ci0JCSAgYnJvd3Nlci5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOwotCQkgIH0KLQkJICBmaW5hbGx5Ci0JCSAgewotCQkJICBpZihsaWNlbnNlU3RyZWFtICE9IG51bGwpCi0JCQkgIHsKLQkJCQkgIGxpY2Vuc2VTdHJlYW0uY2xvc2UoKTsKLQkJCSAgfQotCQkJICBpZihpc3JlYWRlciAhPSBudWxsKQotCQkJICB7Ci0JCQkJICBpc3JlYWRlci5jbG9zZSgpOwotCQkJICB9Ci0JCQkgIGlmKGJyZWFkZXIgIT0gbnVsbCkKLQkJCSAgewotCQkJCSAgYnJlYWRlci5jbG9zZSgpOwotCQkJICB9Ci0JCSAgfQotCSAgfQotCSAgCi0JICBicm93c2VyLnNldExheW91dERhdGEoZ2QpOwotCSAgYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCl7Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIjY2hhbmdlZChvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0V2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSAKLQkJewotCQkgIGlmIChldmVudC50b3RhbCAhPSAwKQotCQkgIHsKLQkJICAgIG1vbml0b3IuaW50ZXJuYWxXb3JrZWQoZXZlbnQuY3VycmVudCAqIDEwMCAvIGV2ZW50LnRvdGFsKTsKLQkJICB9Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lciNjb21wbGV0ZWQob3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSAKLQkJewotCQkgIG1vbml0b3IuZG9uZSgpOwotCQkJCi0JCSAgc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGJyb3dzZXI7Ci0JCSAgYWdyZWVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJICBsaWNlbnNlVGV4dENvbXBvc2l0ZS5sYXlvdXQoKTsKLQkJfQotCSAgfSk7Ci0JICAKLQkgIGxpY2Vuc2VUZXh0Mi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDIpOwotCX0KLQljYXRjaChFeGNlcHRpb24gZSkKLQl7Ci0JICAvLyBUaGUgYnJvd3NlciB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGl0LiAKLQkgIC8vIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBleHRlcm5hbCBicm93c2VyLgotCSAgdHJ5Ci0JICB7Ci0JICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpLmdldEV4dGVybmFsQnJvd3NlcigpLm9wZW5VUkwobmV3IFVSTChsaWNlbnNlVVJMKSk7Ci0JICAgIGxpY2Vuc2VUZXh0Mi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fSU5URVJOQUwpOwotCSAgfQotCSAgY2F0Y2goRXhjZXB0aW9uIGV4KQotCSAgewotCQkvLyBJbiB0aGlzIGNhc2UgdGhlIGxpY2Vuc2UgY2Fubm90IGJlIGRpc3BsYXkuIEluZm9ybSB0aGUgdXNlciBvZiB0aGlzIGFuZCBnaXZlIHRoZW0gdGhlIGxpY2Vuc2UgbG9jYXRpb24uCi0JCWxpY2Vuc2VUZXh0Mi5zZXRUZXh0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fQlJPV1NFUiwgbmV3IE9iamVjdFtde2xpY2Vuc2VVUkx9KSk7Ci0JICB9Ci0JfQotCi0JY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0JCQotCXJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nI2dldEltYWdlKCkKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIAotICB7Ci0JcmV0dXJuIGdldEluZm9JbWFnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb21wdCB0aGUgdXNlciB0byBhY2NlcHQgdGhlIHNwZWNpZmllZCBsaWNlbnNlLiBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZQotICAgKiBkaWFsb2cgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGlzIGRpYWxvZy4KLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggdGhlIGxpY2Vuc2UgbXVzdCBiZSBhY2NlcHRlZC4KLSAgICogQHBhcmFtIGxpY2Vuc2VVUkwgVGhlIGxpY2Vuc2UgVVJMLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxpY2Vuc2UgaXMgYWNjZXB0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRGb3JMaWNlbnNlKFNoZWxsIHBhcmVudCwgU3RyaW5nIHVybCwgU3RyaW5nIGxpY2Vuc2VVUkwpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JYm9vbGVhbiBhZ3JlZWRUb0xpY2Vuc2UgPSBmYWxzZTsKLQlib29sZWFuIG5ld0RpYWxvZyA9IHRydWU7Ci0JTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cgZGlhbG9nID0gbnVsbDsKLQkvLyBJZiB0aGUgZGlhbG9nIGlzIGFscmVhZHkgZGlzcGxheWVkIGZvciB0aGlzIGxpY2Vuc2UgdXNlIGl0IGluc3RlYWQgb2YgCi0JLy8gZGlzcGxheWluZyBhbm90aGVyIGRpYWxvZy4KLQlpZihkaWFsb2dzSW5Vc2UuY29udGFpbnNLZXkobGljZW5zZVVSTCkpCi0JewotCSAgbmV3RGlhbG9nID0gZmFsc2U7Ci0JICBkaWFsb2cgPSAoTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cpZGlhbG9nc0luVXNlLmdldChsaWNlbnNlVVJMKTsKLQl9Ci0JZWxzZQotCXsKLQkgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQotCSAgdHJ5Ci0JICB7Ci0JICAgIFVSTCB1cmxPYmogPSBuZXcgVVJMKGxpY2Vuc2VVUkwpOwotCSAgICBpcyA9IHVybE9iai5vcGVuU3RyZWFtKCk7Ci0KLQkgICAgZGlhbG9nID0gbmV3IExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nKHBhcmVudCwgdXJsLCBsaWNlbnNlVVJMKTsKLQkgICAgZGlhbG9nc0luVXNlLnB1dChsaWNlbnNlVVJMLCBkaWFsb2cpOwotCSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gZSkKLQkgIHsKLQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGUgbGljZW5zZSBjYW5ub3QgYmUgb3BlbmVkLiIpOwotCSAgfQotCSAgZmluYWxseQotCSAgewotCQlpZihpcyAhPSBudWxsKQotCQl7Ci0JCSAgdHJ5Ci0JCSAgewotCQkJaXMuY2xvc2UoKTsKLQkJICB9Ci0JCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJICB7Ci0JCSAgICAvLyBEbyBub3RoaW5nLgotCQkgIH0KLQkJfQotCSAgfQotCX0KLQlpZihkaWFsb2cgIT0gbnVsbCkKLQl7Ci0JICBkaWFsb2cub3BlbigpOwotCSAgCi0JICBpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5PSykgCi0JICB7Ci0JCWFncmVlZFRvTGljZW5zZSA9IHRydWU7Ci0gICAgICB9Ci0JCQotCSAgaWYobmV3RGlhbG9nKQotCSAgewotICAgICAgIGRpYWxvZ3NJblVzZS5yZW1vdmUobGljZW5zZVVSTCk7Ci0JICB9Ci0JfQotCSAKLQlyZXR1cm4gYWdyZWVkVG9MaWNlbnNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNsb3NlKCkgCi0gIHsKLQlpZihhZ3JlZUJ1dHRvbiAhPSBudWxsKQotCXsKLQkgIGFncmVlQnV0dG9uLmRpc3Bvc2UoKTsKLQkgIGFncmVlQnV0dG9uID0gbnVsbDsKLQl9Ci0JcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYjI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGUgbGljZW5zZSByZWdpc3RyeSBob2xkcyBhbGwgb2YgdGhlIHJlZ2lzdGVyZWQgbGljZW5zZXMgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXkKLSAqIGhhdmUgYmVlbiBhY2NlcHRlZC4KLSAqLwotcHVibGljIGNsYXNzIExpY2Vuc2VSZWdpc3RyeSAKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBJbnRlZ2VyIExJQ0VOU0VfVU5TUEVDSUZJRUQgPSBuZXcgSW50ZWdlcigwKTsgLy8gVGhpcyBuZWVkcyB0byBiZSAwIGZvciB0aGUgcGx1Z2luIHByZWZzLgotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9BR1JFRSA9IG5ldyBJbnRlZ2VyKDEpOwotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9ESVNBR1JFRSA9IG5ldyBJbnRlZ2VyKDIpOwotICAvLyBTaWduaWZpZXMgYSBsaWNlbnNlIHRoYXQgaGFzIGJlZW4gZGlzYWdyZWVkIHRvIHRoaXMgc2Vzc2lvbi4KLSAgcHJvdGVjdGVkIHN0YXRpYyBJbnRlZ2VyIExJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OID0gbmV3IEludGVnZXIoMyk7Ci0gIAotICAvKioKLSAgICogVGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGxpY2Vuc2UgcmVnaXN0cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIExpY2Vuc2VSZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBkbyBub3QgcHJvbXB0IGZsYWcgd2lsbCBwcmV2ZW50IHVzZXIgcHJvbXB0aW5nLiBVc2VkIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBET19OT1RfUFJPTVBUID0gZmFsc2U7Ci0gIAotICAvKioKLSAgICogVGhlIGxpY2Vuc2VzIGhhc2h0YWJsZSBjb250YWlucyBsaWNlbnNlcyBhbmQgd2hldGhlciBvciBub3QgdGhleSd2ZSBiZWVuIGFjY2VwdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBsaWNlbnNlczsKLSAgCi0gIHByb3RlY3RlZCBMaWNlbnNlUmVnaXN0cnkoKQotICB7Ci0JbGljZW5zZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCi0JLy8gSWYgdGhlIHd0cCBxdWlldCBzeXN0ZW0gcHJvcGVydHkgaXMgc2V0IHRoZSBET19OT1RfUFJPTVBUIGZsYWcgaXMgc2V0IHRvIHRydWUuCi0JLy8gVGhpcyBpcyB1c2VkIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KLQlpZihTeXN0ZW0uZ2V0UHJvcGVydHkoQ2FjaGVNZXNzYWdlcy5XVFBfTk9fVVNFUl9JTlRFUkFDVElPTl9TWVNURU1fUFJPUCwgImZhbHNlIikuZXF1YWxzKCJ0cnVlIikpCi0JewotCSAgQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQ2FjaGVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChDYWNoZU1lc3NhZ2VzLl9MT0dfSU5GT19XVFBfTk9fVVNFUl9JTlRFUkFDVElPTiwgbmV3IE9iamVjdFtde0NhY2hlTWVzc2FnZXMuV1RQX05PX1VTRVJfSU5URVJBQ1RJT05fU1lTVEVNX1BST1B9KSwgbnVsbCkpOwotCSAgRE9fTk9UX1BST01QVCA9IHRydWU7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxpY2Vuc2UgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxpY2Vuc2UgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpY2Vuc2VSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLQlpZihpbnN0YW5jZSA9PSBudWxsKQotCXsKLQkgIGluc3RhbmNlID0gbmV3IExpY2Vuc2VSZWdpc3RyeSgpOwotCX0KLQlyZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgdGhlIHNwZWNpZmllZCBsaWNlbnNlIHRvIHRoZSBsaWNlbnNlIHJlZ2lzdHJ5LiBBIGxpY2Vuc2UgY2FuIG9ubHkgYmUgYWRkZWQgdG8gdGhlCi0gICAqIHJlZ2lzdHJ5IG9uY2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYWRkIHRvIHRoZSByZWdpc3RyeS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExpY2Vuc2UoU3RyaW5nIHVybCkKLSAgewotCWlmKHVybCAhPSBudWxsICYmICFsaWNlbnNlcy5jb250YWluc0tleSh1cmwpKQotCXsKLQkgIGxpY2Vuc2VzLnB1dCh1cmwsIExJQ0VOU0VfVU5TUEVDSUZJRUQpOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIEFncmVlIHRvIHRoZSBzcGVjaWZpZWQgbGljZW5zZS4gVGhlIGxpY2Vuc2UgaXMgYWdyZWVkIHRvIG9ubHkgaWYgaXQgaGFzIGFscmVhZHkKLSAgICogYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHRvIGFjY2VwdC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFncmVlTGljZW5zZShTdHJpbmcgdXJsKQotICB7Ci0JaWYobGljZW5zZXMuY29udGFpbnNLZXkodXJsKSkKLQl7Ci0JICBsaWNlbnNlcy5wdXQodXJsLCBMSUNFTlNFX0FHUkVFKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEaXNhZ3JlZSB0byB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UuIFRoZSBsaWNlbnNlIGlzIGRpc2FncmVlZCB0byBvbmx5IGlmIGl0IGhhcyBhbHJlYWR5Ci0gICAqIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBhY2NlcHQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkaXNhZ3JlZUxpY2Vuc2UoU3RyaW5nIHVybCkKLSAgewotCWlmKGxpY2Vuc2VzLmNvbnRhaW5zS2V5KHVybCkpCi0JewotCSAgbGljZW5zZXMucHV0KHVybCwgTElDRU5TRV9ESVNBR1JFRSk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogRGlzYWdyZWUgdG8gdGhlIHNwZWNpZmllZCBsaWNlbnNlIGZvciB0aGlzIHNlc3Npb24uIFRoZSBsaWNlbnNlIGlzIGRpc2FncmVlZCB0byBvbmx5IGlmIGl0IGhhcyBhbHJlYWR5Ci0gICAqIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeS4gCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYWNjZXB0LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGRpc2FncmVlTGljZW5zZVRoaXNTZXNzaW9uKFN0cmluZyB1cmwpCi0gIHsKLQlpZihsaWNlbnNlcy5jb250YWluc0tleSh1cmwpKQotCXsKLQkgIGxpY2Vuc2VzLnB1dCh1cmwsIExJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIGxpY2Vuc2UgaGFzIGJlZW4gYWNjZXB0ZWQuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGxpY2Vuc2UKLSAgICogaGFzIGJlZW4gYWNjZXB0ZWQgb3IgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVnaXN0cnkgYW5kIGZhbHNlIGlmIGl0IGhhcyBub3QgYmVlbiBhY2NlcHRlZC4gCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCB3ZSBhcmUgY2hlY2tpbmcgdGhlIGxpY2Vuc2UuCi0gICAqIEBwYXJhbSBsaWNlbnNlVVJMIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQgaGFzIGJlZW4gYWNjZXB0ZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGljZW5zZSBoYXMgYmVlbiBhY2NlcHRlZCBvciBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzTGljZW5zZUJlZW5BY2NlcHRlZChTdHJpbmcgdXJsLCBTdHJpbmcgbGljZW5zZVVSTCkKLSAgewotCWlmKERPX05PVF9QUk9NUFQpCi0JewotCSAgcmV0dXJuIHRydWU7Ci0JfQotCQotCWlmKGxpY2Vuc2VzLmNvbnRhaW5zS2V5KGxpY2Vuc2VVUkwpKQotCXsKLQkgIEludGVnZXIgYWdyZWVkID0gKEludGVnZXIpbGljZW5zZXMuZ2V0KGxpY2Vuc2VVUkwpOwotCSAgaWYoYWdyZWVkID09IExJQ0VOU0VfQUdSRUUpCi0JICB7Ci0JCXJldHVybiB0cnVlOwotCSAgfQotCSAgZWxzZSBpZihhZ3JlZWQgPT0gTElDRU5TRV9ESVNBR1JFRSkKLQkgIHsKLQkJaWYoIUNhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zaG91bGRQcm9tcHQoKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWxpY2Vuc2VzLnB1dChsaWNlbnNlVVJMLCBMSUNFTlNFX0RJU0FHUkVFX1RISVNfU0VTU0lPTik7Ci0JICB9Ci0JICAvLyBUaGUgbGljZW5zZSBoYXMgYWxyZWFkeSBiZWVuIGRpc2FncmVlZCB0byB0aGlzIHNlc3Npb24uIERvIG5vdCBwcm9tcHQuCi0JICBlbHNlIGlmKGFncmVlZCA9PSBMSUNFTlNFX0RJU0FHUkVFX1RISVNfU0VTU0lPTikKLQkgIHsKLQkJcmV0dXJuIGZhbHNlOwotCSAgfQotCQkgIAotCSAgCi0JICAvLyBQcm9tcHQgdGhlIHVzZXIgdG8gYWNjZXB0IHRoZSBsaWNlbnNlLgotCSAgaW50IGxpY2Vuc2VBY2NlcHRhbmNlID0gcHJvbXB0VG9BY2NlcHRMaWNlbnNlKHVybCwgbGljZW5zZVVSTCk7Ci0JICBpZihsaWNlbnNlQWNjZXB0YW5jZSA9PSBBY2NlcHRlZC5BQ0NFUFRFRCkKLQkgIHsKLQkJYWdyZWVMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCQlyZXR1cm4gdHJ1ZTsKLQkgIH0KLQkgIGVsc2UgaWYobGljZW5zZUFjY2VwdGFuY2UgPT0gQWNjZXB0ZWQuTk9UX0FDQ0VQVEVEKQotCSAgewotCSAgICBkaXNhZ3JlZUxpY2Vuc2VUaGlzU2Vzc2lvbihsaWNlbnNlVVJMKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvLyBUaGUgbGljZW5zZSBpcyBub3QgcmVnaXN0cmVkIHdpdGggdGhlIHJlZ2lzdHJ5LgotCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogUHJvbXB0IHRoZSB1c2VyIHRvIGFjY2VwdCB0aGUgbGljZW5zZS4gVGhpcyBtZXRob2QgY3JlYXRlcyBhIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggdGhlIGxpY2Vuc2UgbmVlZHMgdG8gYmUgYWNjZXB0ZWQuCi0gICAqIEBwYXJhbSBsaWNlbnNlVVJMIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYmUgYWNjZXB0ZWQuIAotICAgKiBAcmV0dXJuIDAgaWYgYWNjZXB0ZWQsIDEgaWYgbm90IGFjY2VwdGVkLCAyIGlmIG5vdCBhYmxlIHRvIGFjY2VwdC4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgcHJvbXB0VG9BY2NlcHRMaWNlbnNlKGZpbmFsIFN0cmluZyB1cmwsIGZpbmFsIFN0cmluZyBsaWNlbnNlVVJMKSAKLSAgewotCWZpbmFsIEFjY2VwdGVkIGFjY2VwdGVkID0gbmV3IEFjY2VwdGVkKCk7Ci0JICBEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCSAgaWYoTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cucHJvbXB0Rm9yTGljZW5zZShudWxsLCB1cmwsIGxpY2Vuc2VVUkwpKQotCQkJCSAgewotCQkJCQlhY2NlcHRlZC5hY2NlcHRlZCA9IEFjY2VwdGVkLkFDQ0VQVEVEOwotCQkJCSAgfQotCQkJCSAgZWxzZQotCQkJCSAgewotCQkJCQlhY2NlcHRlZC5hY2NlcHRlZCA9IEFjY2VwdGVkLk5PVF9BQ0NFUFRFRDsKLQkJCQkgIH0KLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCSAgYWNjZXB0ZWQuYWNjZXB0ZWQgPSBBY2NlcHRlZC5OT1RfREVURVJNSU5FRDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCXJldHVybiBhY2NlcHRlZC5hY2NlcHRlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgbGljZW5zZXMgaW4gdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHJldHVybiBBcyBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgbGljZW5zZXMgaW4gdGhlIHJlZ2lzdHJ5LiAKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRMaWNlbnNlcygpCi0gIHsKLQlyZXR1cm4gKFN0cmluZ1tdKWxpY2Vuc2VzLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tsaWNlbnNlcy5rZXlTZXQoKS5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIGxpY2Vuc2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UuCi0gICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBsaWNlbnNlLgotICAgKi8KLSAgcHJvdGVjdGVkIEludGVnZXIgZ2V0TGljZW5zZVN0YXRlKFN0cmluZyB1cmwpCi0gIHsKLQlyZXR1cm4gKEludGVnZXIpbGljZW5zZXMuZ2V0KHVybCk7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQSBjbGFzcyB0byBob2xkIGFjY2VwdGFuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9tcHQgbWV0aG9kLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBBY2NlcHRlZAotICB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVBURUQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9BQ0NFUFRFRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0RFVEVSTUlORUQgPSAyOwotCXB1YmxpYyBpbnQgYWNjZXB0ZWQgPSBOT1RfQUNDRVBURUQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTY1YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoZSBUb0NhY2hlUmVnaXN0cnlSZWFkZXJzIHJlYWRzIEVjbGlwc2UgZXh0ZW5zaW9ucyB3aGljaCBzcGVjaWZ5Ci0gKiByZXNvdXJjZXMgdG8gY2FjaGUuIEFuIGV4dGVuc2lvbiBwb2ludCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuCi0gKiAKLSAqICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuY2FjaGVyZXNvdXJjZSI+Ci0gKiAgICA8Y2FjaGVyZXNvdXJjZSB1cmk9IlVSSV9UT19DQUNIRSIgbGljZW5zZT0iVVJJX09GX0xJQ0VOU0UiLz4KLSAqICA8L2V4dGVuc2lvbj4gCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY2FjaGVyZXNvdXJjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9VUkwgPSAidXJsIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xJQ0VOU0UgPSAibGljZW5zZSI7Ci0gCi0gIHByaXZhdGUgc3RhdGljIFRvQ2FjaGVSZWdpc3RyeVJlYWRlciByZWdpc3RyeVJlYWRlciA9IG51bGw7Ci0gIAotICBwcml2YXRlIEhhc2h0YWJsZSByZXNvdXJjZXNUb0NhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGlzIHJlZ2lzdHJ5IHJlYWRlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGlzIHJlZ2lzdHJ5IHJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKHJlZ2lzdHJ5UmVhZGVyID09IG51bGwpCi0gICAgewotICAgICAgcmVnaXN0cnlSZWFkZXIgPSBuZXcgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyKCk7Ci0gICAgfQotICAgIHJldHVybiByZWdpc3RyeVJlYWRlcjsKLSAgfQotICAvKioKLSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgaGFuZGxlIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHRoYXQgbWF0Y2gKLSAgICogdGhlIHNwZWRpZmllZCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgVG9DYWNoZVJlc291cmNlIHRvQ2FjaGVSZXNvdXJjZSA9IHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgICAgaWYodG9DYWNoZVJlc291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZXNUb0NhY2hlLnB1dCh0b0NhY2hlUmVzb3VyY2UuZ2V0VVJMKCksIHRvQ2FjaGVSZXNvdXJjZSk7Ci0gICAgICAgICAgTGljZW5zZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuYWRkTGljZW5zZSh0b0NhY2hlUmVzb3VyY2UuZ2V0TGljZW5zZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhbmQgZGVhbCB3aXRoIHRoZSBleHRlbnNpb24gcG9pbnRzLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGV4dGVuc2lvbiBwb2ludCBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFRvQ2FjaGVSZXNvdXJjZSByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotCQotICAgIGlmKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFWFRFTlNJT05fUE9JTlRfSUQpKQotICAgIHsKLSAgICAgIFN0cmluZyB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVVJMKTsKLSAgICAgIGlmKHVybCAhPSBudWxsKQotICAgICAgewotICAgIAlTdHJpbmcgbGljZW5zZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MSUNFTlNFKTsKLSAgICAJCi0gICAgCS8vIElmIHRoZSBsaWNlbnNlIGlzIHJlbGF0aXZlIHJlc29sdmUgcmVsYXRpdmUgdG8gdGhlCi0gICAgCS8vIHBsdWctaW4gdGhhdCBkZWNsYXJlcyBpdC4KLSAgICAJdHJ5Ci0gICAgCXsKLSAgICAJICBVUkkgbGljZW5zZVVSSSA9IG5ldyBVUkkobGljZW5zZSk7Ci0gICAgCSAgaWYoIWxpY2Vuc2VVUkkuaXNBYnNvbHV0ZSgpKQotICAgIAkgIHsKLSAgICAJCUJ1bmRsZSBwbHVnaW5CdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0gICAgCQlVUkwgbGljZW5zZVVSTCA9IHBsdWdpbkJ1bmRsZS5nZXRFbnRyeShsaWNlbnNlKTsKLSAgICAJCWlmKGxpY2Vuc2VVUkwgIT0gbnVsbCkKLSAgICAJCXsKLSAgICAJICAgICAgbGljZW5zZSA9IEZpbGVMb2NhdG9yLnJlc29sdmUobGljZW5zZVVSTCkudG9FeHRlcm5hbEZvcm0oKTsgIAotICAgIAkJfQotICAgIAkgIH0KLSAgICAJfQotICAgIAljYXRjaChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICAJewotICAgIAkgIC8vIFVzZSB0aGUgbGljZW5zZSBhcyBzcGVjaWZpZWQuCi0gICAgCX0KLSAgICAJY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAJewotICAgIAkgIC8vIFVzZSB0aGUgbGljZW5zZSBhcyBzcGVjaWZpZWQuCi0gICAgCX0KLSAgICAJcmV0dXJuIG5ldyBUb0NhY2hlUmVzb3VyY2UodXJsLCBsaWNlbnNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgVVJJcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIGNhY2hpbmcuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFVSSXMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGZvciBjYWNoaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFVSSXNUb0NhY2hlKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pcmVzb3VyY2VzVG9DYWNoZS5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbcmVzb3VyY2VzVG9DYWNoZS5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgcmVzb3VyY2UgdG8gY2FjaGUgaWYgb25lIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gY2FjaGUuCi0gICAqIEByZXR1cm4gQSBUb0NhY2hlUmVzb3VyY2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVVJMIG9yIG51bGwgaWYgbm9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gICAqLwotICBwdWJsaWMgVG9DYWNoZVJlc291cmNlIGdldFJlc291cmNlVG9DYWNoZShTdHJpbmcgdXJsKQotICB7Ci0JcmV0dXJuIChUb0NhY2hlUmVzb3VyY2UpcmVzb3VyY2VzVG9DYWNoZS5nZXQodXJsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvVG9DYWNoZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjc3OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi0vKioKLSAqIEEgcmVzb3VyY2UgdGhhdCBpcyBzcGVjaWZpZWQgdG8gYmUgY2FjaGVkLiBUaGUgcmVzb3VyY2UgaGFzIGEgVVJMIGFuZCBhbiBvcHRpb25hbAotICogbGljZW5zZS4KLSAqLwotcHVibGljIGNsYXNzIFRvQ2FjaGVSZXNvdXJjZSAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdXJsOwotICBwcml2YXRlIFN0cmluZyBsaWNlbnNlOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqIEBwYXJhbSBsaWNlbnNlIFRoZSBVUkwgb2YgdGhlIG9wdGlvbmFsIGxpY2Vuc2UgZm9yIHRoaXMgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgVG9DYWNoZVJlc291cmNlKFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlKQotICB7Ci0JdGhpcy51cmwgPSB1cmw7Ci0JdGhpcy5saWNlbnNlID0gbGljZW5zZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkKLSAgewotCXJldHVybiB1cmw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpY2Vuc2UgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaWNlbnNlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY2FjaGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMaWNlbnNlKCkKLSAgewotCXJldHVybiBsaWNlbnNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NhY2hlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ2FjaGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM5NjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ2FjaGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHByZWZlcmVuY2UgcGFnZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZQotICogUHJlZmVyZW5jZXMgZGlhbG9nLiBUaGlzIHBhZ2UgY29udGFpbnMgb3B0aW9ucyBmb3IgdGhlIGNhY2hlLiBUaGUgY2FjaGUgY2FuCi0gKiBiZSBkaXNhYmxlZCwgdGhlIGxpc3Qgb2YgZW50cmllcyBpbiB0aGUgY2FjaGUgY2FuIGJlIHZpZXdlZCwgYW5kIGluZGl2aWR1YWwKLSAqIGVudHJpZXMgb3IgdGhlIGVudGlyZSBjYWNoZSBjYW4gYmUgZGVsZXRlZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2FjaGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLSAgICBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBjbGVhckJ1dHRvbjsKLQotICBwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQotICBwcm90ZWN0ZWQgQnV0dG9uIGVuYWJsZWRCdXR0b247Ci0gIAotICBwcm90ZWN0ZWQgQnV0dG9uIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uOwotCi0gIHByb3RlY3RlZCBMaXN0IGVudHJpZXM7Ci0KLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuZGlzcG9zZSgpOwotICAgIH0KLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgQ2FjaGVQcmVmZXJlbmNlUGFnZSgpCi0gIHsKLSAgICBzZXRQcmVmZXJlbmNlU3RvcmUoQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCi0gICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIAotICAgIExhYmVsIGFib3V0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgYWJvdXRMYWJlbC5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX1BSRUZfQ0FDSEVfQUJPVVQpOwotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgYWJvdXRMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTm9uZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQ3JlYXRlZCB0aGUgZGlzYWJsZSBjYWNoZSBvcHRpb24uCi0gICAgICBlbmFibGVkQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgIGVuYWJsZWRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBlbmFibGVkQnV0dG9uLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfUFJFRl9DQUNIRV9DQUNIRV9PUFRJT04pOwotICAgICAgZW5hYmxlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oIUNhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotICAgICAgICAgIC5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCkpOwotICAgICAgZW5hYmxlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgICAgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVkID0gZW5hYmxlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q2FjaGVFbmFibGVkKCFkaXNhYmxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgfSk7Ci0gICAgICAKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9QUkVGX1BST01QVF9GT1JfRElTQUdSRUVEX0xJQ0VOU0VTKTsKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uLnNldFNlbGVjdGlvbihDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLSAgICAgICAgICAuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMpKTsKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gcHJvbXB0ID0gZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldFByb21wdERpc2FncmVlZExpY2Vuc2VzKHByb21wdCk7Ci0gICAgICAgIH0KLQotICAgICAgfSk7Ci0KLSAgICAgIC8vIENyZWF0ZSB0aGUgZW50aXRpZXMgZ3JvdXAuCi0gICAgICBMYWJlbCBlbnRyaWVzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgICBlbnRyaWVzTGFiZWwuc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9QUkVGX0NBQ0hFX0VOVFJJRVNfVElUTEUpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgZW50cmllc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICBlbnRyaWVzID0gbmV3IExpc3QoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZW50cmllcywKLSAgICAgICAgICBDb250ZXh0SWRzLlBSRUZfRU5UUklFUyk7Ci0gICAgICBTdHJpbmdbXSBjYWNoZUVudHJpZXMgPSBDYWNoZS5nZXRJbnN0YW5jZSgpLmdldENhY2hlZFVSSXMoKTsKLSAgICAgIEFycmF5cy5zb3J0KGNhY2hlRW50cmllcyk7Ci0gICAgICBlbnRyaWVzLnNldEl0ZW1zKGNhY2hlRW50cmllcyk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotICAgICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgICBlbnRyaWVzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgZW50cmllcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgc2V0UHJlZmVyZW5jZVdpZGdldHMoKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgIGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0gICAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgU1dULlRPUCk7Ci0gICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAvLyBDcmVhdGUgdGhlIERlbGV0ZSBidXR0b24KLSAgICAgIGRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICBkZWxldGVCdXR0b24uc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9CVVRUT05fREVMRVRFX0VOVFJZKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKE1lc3NhZ2VEaWFsb2cKLSAgICAgICAgICAgICAgLm9wZW5Db25maXJtKAotICAgICAgICAgICAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgIENhY2hlTWVzc2FnZXMuX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19USVRMRSwKLSAgICAgICAgICAgICAgICAgIENhY2hlTWVzc2FnZXMuX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19NRVNTQUdFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3RlZEVudHJpZXMgPSBlbnRyaWVzLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgaW50IG51bVNlbGVjdGVkRW50cmllcyA9IHNlbGVjdGVkRW50cmllcy5sZW5ndGg7Ci0KLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VsZWN0ZWRFbnRyaWVzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhY2hlLmRlbGV0ZUVudHJ5KHNlbGVjdGVkRW50cmllc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBjYWNoZUVudHJpZXMgPSBjYWNoZS5nZXRDYWNoZWRVUklzKCk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydChjYWNoZUVudHJpZXMpOwotICAgICAgICAgICAgZW50cmllcy5zZXRJdGVtcyhjYWNoZUVudHJpZXMpOwotICAgICAgICAgICAgc2V0UHJlZmVyZW5jZVdpZGdldHMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICAvLyBDcmVhdGUgdGhlIENsZWFyIENhY2hlIGJ1dHRvbgotICAgICAgY2xlYXJCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgY2xlYXJCdXR0b24uc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9CVVRUT05fQ0xFQVJfQ0FDSEUpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgY2xlYXJCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBjbGVhckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLSAgICAgICAgICAgICAgQ2FjaGVNZXNzYWdlcy5fVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfVElUTEUsCi0gICAgICAgICAgICAgIENhY2hlTWVzc2FnZXMuX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX01FU1NBR0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENhY2hlIGNhY2hlID0gQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGNhY2hlLmNsZWFyKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjYWNoZUVudHJpZXMgPSBjYWNoZS5nZXRDYWNoZWRVUklzKCk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydChjYWNoZUVudHJpZXMpOwotICAgICAgICAgICAgZW50cmllcy5zZXRJdGVtcyhjYWNoZUVudHJpZXMpOwotICAgICAgICAgICAgc2V0UHJlZmVyZW5jZVdpZGdldHMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgICAvL1RPRE86IExvZyBlcnJvcgotICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpOwotICAgIGFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHByZWZlcmVuY2UgcGFnZSB3aWRnZXRzLiBUaGVyZSBhcmUgYSBmZXcgcnVsZXMuIDEuIElmIGRpc2FibGVkLCBhbGwKLSAgICogb2YgdGhlIHdpZGdldHMgYXJlIGRpYWJsZWQgZXhjZXB0IGZvciB0aGUgZGlzYWJsZWQgY2hlY2sgYm94LiAyLiBJZgotICAgKiBlbmFibGVkLCBhbGwgd2lkZ2V0cyBhcmUgZW5hYmxlZCBleGNlcHQgYS4gVGhlIGRlbGV0ZSBidXR0b24gaXMgZW5hYmxlZAotICAgKiBvbmx5IGlmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIGluIHRoZSBsaXN0LiBiLiBUaGUgY2xlYXIgYnV0dG9uIGlzIGVuYWJsZWQKLSAgICogb25seSBpZiB0aGVyZSBhcmUgaXRlbXMgaW4gdGhlIGxpc3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpCi0gIHsKLSAgICBpZiAoY29tcG9zaXRlICE9IG51bGwgJiYgY29tcG9zaXRlLmdldEVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBpZiAoZW50cmllcy5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9IAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoZW50cmllcy5nZXRJdGVtQ291bnQoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGNsZWFyQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9IAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjbGVhckJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIENvbnRleHRJZHMuUFJFRik7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OWNhZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVBsdWdpbjsKLQotLyoqCi0gKiBDb25zdGFudCBpZHMgZm9yIGNvbnRleHQgaGVscC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGID0gQ2FjaGVQbHVnaW4uUExVR0lOX0lEICsgIi5jcHIwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOVFJJRVMgPSBDYWNoZVBsdWdpbi5QTFVHSU5fSUQgKyAiLmNwcjAwMDIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWM0YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbnN0YW50IGRlZmluaXRpb25zIGZvciBwbHVnLWluIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlQ29uc3RhbnRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9FTkFCTEVEID0gImNhY2hlRW5hYmxlZCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfRElTQUdSRUVEX0xJQ0VOU0VTID0gInByb21wdERpc2FncmVlZExpY2Vuc2VzIjsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I0YWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVBsdWdpbjsKLQotLyoqCi0gKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIAotewotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgCi0gIHsKLQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgIHN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVELCB0cnVlKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUywgZmFsc2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhY2RkYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2YWxpZGF0ZXVpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2ZjIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5ZjhmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotcnVudGltZQotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDcxZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDZhZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gTWF5IDA4IDA5OjI0OjU2IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMWZlMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jVHVlIEZlYiAxMiAxMjozMDo0NiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz1fCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz1fCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzhkNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jVHVlIEZlYiAxMiAxMjozMDo0NiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCi1vcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkua2V5d29yZHRoaXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTc3M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjIwNC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbi5WYWxpZGF0aW9uVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc3d0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDljY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHZhbGlkYXRldWkvLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgdmYyLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL2ZhaWxfdGJsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ5YjBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9mYWlsX3RibF9kaXNhYmxlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL2ZhaWxfdGJsX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzMzNhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL2ZhaWxfdGJsX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL29rX3RibC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL29rX3RibF9kaXNhYmxlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL29rX3RibF9kaXNhYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODkwMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9va190YmxfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9zZXR0aW5ncy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL3NldHRpbmdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5OWFhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL3NldHRpbmdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3NfZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9zZXR0aW5nc19kaXNhYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTY2ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9zZXR0aW5nc19kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3YTlkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFZlcnNpb24gMS4zCi0jCi1WQkZfVElUTEVfUFJPUEVSVElFUz1WYWxpZGF0aW9uCi1WQkZfVUlfUE9QVVBfUlVOVkFMSURBVElPTj0mVmFsaWRhdGUKLVZCRl9USVRMRV9QUkVGRVJFTkNFPVZhbGlkYXRpb24KLQotQnVuZGxlLU5hbWUuMCA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIFVJCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDUwMmE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFBvcHVwIENvbnRyaWJ1dGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEJ5IHNheWluZyAiYWRhcHRhYmxlPXRydWUiLCB0aGlzIGl0ZW0gd2lsbCBhcHBlYXIgb24gYm90aCBJUHJvamVjdCBhbmQgSUphdmFQcm9qZWN0IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJWYWxpZGF0aW9uTWVudUFjdGlvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVZCRl9VSV9QT1BVUF9SVU5WQUxJREFUSU9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLlZhbGlkYXRpb25NZW51QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IisiCi0gICAgICAgICAgICAgICBpZD0iVmFsaWRhdGlvbkFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gIAotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgIFZhbGlkYXRpb24gcHJlZmVyZW5jZSBwYWdlICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlVkJGX1RJVExFX1BSRUZFUkVOQ0UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9IlZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICBWYWxpZGF0aW9uIHByb3BlcnRpZXMgcGFnZSAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBCeSBzYXlpbmcgImFkYXB0YWJsZT10cnVlIiwgdGhpcyBpdGVtIHdpbGwgYXBwZWFyIG9uIGJvdGggSVByb2plY3QgYW5kIElKYXZhUHJvamVjdCAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlVkJGX1RJVExFX1BST1BFUlRJRVMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuVmFsaWRhdGlvblByb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIGlkPSJWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGVuYWJsZWRXaGVuPgotCSAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdmFsaWRhdGlvbnVpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3Byb3BlcnR5X2ZpbGVzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3ZhbGlkYXRpb251aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGIxMDJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdmFsaWRhdGlvbnVpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVNhdmVGaWxlc0RpYWxvZ19zYXZpbmc9U2F2aW5nIFJlc291cmNlcwotU2F2ZUZpbGVzRGlhbG9nX2Fsd2F5c19zYXZlPSZBbHdheXMgc2F2ZSBhbGwgbW9kaWZpZWQgcmVzb3VyY2VzIGF1dG9tYXRpY2FsbHkgcHJpb3IgdG8gdmFsaWRhdGluZwotU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlcz1TYXZlIEFsbCBNb2RpZmllZCBSZXNvdXJjZXMKLVNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmU9QWxsIG1vZGlmaWVkIHJlc291cmNlcyBtdXN0IGJlIHNhdmVkIGJlZm9yZSB0aGlzIG9wZXJhdGlvbi4KLQotUHJlZlBhZ2VfYWx3YXlzX3NhdmU9JlNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHZhbGlkYXRpbmcKLQotUnVuVmFsaWRhdGlvbkRpYWxvZ1RpdGxlPVJ1bm5pbmcgVmFsaWRhdGlvbgotVW5hYmxlVG9TYXZlPVVuYWJsZSB0byBzZXQgc2F2ZSBhdXRvbWF0aWNhbGx5IHByZWZlcmVuY2UgaW4gc2F2ZSBmaWxlcyBmb3IgdmFsaWRhdGlvbiBkaWFsb2c6Ci1WYWxpZGF0ZT1WYWxpZGF0ZQotCi1WYWxSZXN1bHRzPVZhbGlkYXRpb24gUmVzdWx0cwotCi1WYWxFcnJvcjFSZXNvdXJjZTE9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkLCBvbmUgZXJyb3Igd2FzIGRpc2NvdmVyZWQuIE9uZSByZXNvdXJjZSB3YXMgdmFsaWRhdGVkIGluIHswfS4KLVZhbEVycm9yc1Jlc291cmNlMT1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQsIHswfSBlcnJvcnMgd2VyZSBkaXNjb3ZlcmVkLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MX0uCi1WYWxXYXJuMVJlc291cmNlMT1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCBvbmUgd2FybmluZy4gT25lIHJlc291cmNlIHdhcyB2YWxpZGF0ZWQgaW4gezB9LgotVmFsV2FyblJlc291cmNlMT1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCB7MH0gd2FybmluZ3MuIE9uZSByZXNvdXJjZSB3YXMgdmFsaWRhdGVkIGluIHsxfS4KLVZhbEluZm8xUmVzb3VyY2UxPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIG9uZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuIE9uZSByZXNvdXJjZSB3YXMgdmFsaWRhdGVkIGluIHswfS4KLVZhbEluZm9SZXNvdXJjZTE9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggezB9IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuIE9uZSByZXNvdXJjZSB3YXMgdmFsaWRhdGVkIGluIHsxfS4KLQotVmFsRXJyb3IxUmVzb3VyY2VzPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCwgb25lIGVycm9yIHdhcyBkaXNjb3ZlcmVkLiB7MH0gcmVzb3VyY2VzIHdlcmUgdmFsaWRhdGVkIGluIHsxfS4KLVZhbEVycm9yc1Jlc291cmNlcz1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQsIHswfSBlcnJvcnMgd2VyZSBkaXNjb3ZlcmVkLiB7MX0gcmVzb3VyY2VzIHdlcmUgdmFsaWRhdGVkIGluIHsyfS4KLVZhbFdhcm4xUmVzb3VyY2VzPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIG9uZSB3YXJuaW5nLiB7MH0gcmVzb3VyY2VzIHdlcmUgdmFsaWRhdGVkIGluIHsxfS4KLVZhbFdhcm5SZXNvdXJjZXM9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggezB9IHdhcm5pbmdzLiB7MX0gcmVzb3VyY2VzIHdlcmUgdmFsaWRhdGVkIGluIHsyfS4KLVZhbEluZm8xUmVzb3VyY2VzPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIG9uZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UuIHswfSByZXNvdXJjZXMgd2VyZSB2YWxpZGF0ZWQgaW4gezF9LgotVmFsSW5mb1Jlc291cmNlcz1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCB7MH0gaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4gezF9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7Mn0uCi0KLVZhbFN1Y2Nlc3M9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggbm8gZXJyb3JzIG9yIHdhcm5pbmdzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcm9wZXJ0eV9maWxlcy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcm9wZXJ0eV9maWxlcy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDEzN2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAgICAqIENvZGUgb3JpZW50ZWQgaW5zdHJ1Y3Rpb25zOgotIyAgICAgKgotIyAgICAgKiBJbiB0aGUgc3RyaW5nLCB5b3UgbWF5IHNlZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgc2VxdWVuY2VzOgotIyAgICAgKiBhKSB7bn0gIHdoZXJlIG4gaXMgYSBudW1iZXIuIFRoZXNlIGFyZSByZXBsYWNlYWJsZSBwYXJhbWV0ZXJzLgotIyAgICAgKiBiKSAnJyAgSW4gLnByb3BlcnRpZXMgZmlsZXMsIGluIG9yZGVyIHRvIHNlZSBvbmUgYXBvc3Ryb3BoZSAoJykgaW4gdGhlIGZpbmFsCi0jICAgICAqICAgIHN0cmluZywgc29tZXRpbWVzIHR3byBhcG9zdHJvcGhlcyBtdXN0IGJlIGVudGVyZWQgaW4gdGhlIHN0cmluZy4gSW4gdGhlIHRyYW5zbGF0ZWQKLSMgICAgICogICAgc3RyaW5nLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUge259IGluIHRoZSBzdHJpbmcsIHRoZW4gdG8gc2hvdyBvbmUgYXBvc3Ryb3BoZQotIyAgICAgKiAgICB0byB0aGUgdXNlciwgcHV0IHR3byBhcG9zdHJvcGhlcyBpbiB0aGUgc3RyaW5nLiBJZiB0aGVyZSBhcmUgbm8ge259IGluIHRoZSBzdHJpbmcsCi0jICAgICAqICAgIHRoZW4gcHV0IG9uZSBhcG9zdHJvcGhlLgotIyAgICAgKiAgICBGb3IgZXhhbXBsZSwgc2F5IHRoYXQgeW91IHdhbnQgdGhlIHVzZXIgdG8gcmVhZCAiR2VvcmdlJ3MgZmlsZSIuIAotIyAgICAgKiAgICAgICAgR0VPUkdFPUdlb3JnZSdzIGZpbGUgd2FzIG9uIHRoZSBkZXNrLgotIyAgICAgKiAgICAgICAgR0VPUkdFMj1HZW9yZ2UnJ3MgZmlsZSBhbmQgezB9IHdlcmUgb24gdGhlIGRlc2suCi0jICAgICAqICAgIEdFT1JHRSB1c2VzIG9uZSBhcG9zdHJvcGhlIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHtufSBhbmQgR0VPUkdFMgotIyAgICAgKiAgICB1c2VzIHR3byBhcG9zdHJvcGhlcyBiZWNhdXNlIHRoZXJlIGlzIGEge259LgotIyAgICAgKiBjKSAnJyB0ZXh0ICcnIHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBkb3VibGUKLSMgICAgICogICAgYXBvc3Ryb3BoZXMgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAKLSMgICAgICogZCkgPHRleHQ+IHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBhbmdsZQotIyAgICAgKiAgICBicmFja2V0cyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0jICAgICAqIGUpICJ0ZXh0IiB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIAotIyAgICAgKiAgICBtYXJrcyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0jICAgICAqICAgIAotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyAgICAgKiBPdGhlciBpbnN0cnVjdGlvbnMKLSMgICAgICogYSkgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdGV4dCB0aGF0IGlzIG9uIGEgbGluZSB3aGljaCBiZWdpbnMgd2l0aCBhIGNvbW1lbnQgCi0jICAgICAqICAgIHN5bWJvbCAoIykuCi0jICAgICAqIGIpIERvIG5vdCB0cmFuc2xhdGUgdGhlc2Ugd29yZHM6IAotIyAgICAgKiAgICAgICAgc2NoZW1hLCBFSkIsIFJEQiwgSkFSLCBSTUksIEJNUCwgQ01QLCBPT1NRTAotIyAgICAgKiBjKSBQbGVhc2UgcmV0dXJuIHRoZSAucHJvcGVydGllcyBmaWxlcyB1c2luZyB0aGUgc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotIyAgICAgKiAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHR3byBvZiB0aGUgZmlsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lLgotIyAgICAgKgotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBBbnkgb3RoZXIgY29tbWVudHMgdG8gdGhlIHRyYW5zbGF0b3JzIGFyZSBvbiBsaW5lcyB3aGljaCBzdGFydCBsaWtlIHRoaXM6ICAjIDJUQzoKLSMKLSMgVmVyc2lvbiAxLjEyCi0jCi0jCi0jIElEOgotIyAgICBWQkYgLSBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrCi0jCi0KLSMgCi0jIEJlZ2luIFZhbGlkYXRpb24gQnVpbGRlciBGcmFtZXdvcmsgVUkgU3RyaW5ncwotIwotIyBJRHM6Ci0jICAgIFZCRl9FWEM9RXhjZXB0aW9uIG9yIGVycm9yIHRleHQKLSMgICAgVkJGX1VJPVVJIGxhYmVsCi0jCi1QUkVGX0JVVFRPTl9PVkVSUklERT1BbGxvdyBwcm9qZWN0cyB0byAmb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5ncwotUFJFRl9CVVRUT05fRU5BQkxFQUxMPUUmbmFibGUgQWxsCi1QUkVGX0JVVFRPTl9ESVNBQkxFQUxMPUQmaXNhYmxlIEFsbAotUFJFRl9WQUxMSVNUX1RJVExFPVRoZSBzZWxlY3RlZCAmdmFsaWRhdG9ycyB3aWxsIHJ1biB3aGVuIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkOgotUFJFRl9NTlVfTUFOVUFMPSZNYW51YWwKLVBSRUZfTU5VX0JVSUxEPSZCdWlsZAotUFJFRl9NTlVfU0VUVElOR1M9JlNldHRpbmdzLi4uCi0KLVZCRl9FWENfSU5URVJOQUxfVElUTEU9SW50ZXJuYWwgZXJyb3IKLVZCRl9FWENfSU5URVJOQUxfUEFHRT1BbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkOyBjbGljayBDYW5jZWwgdG8gY2xvc2UgdGhlIHdpemFyZC4KLQotVkJGX0VYQ19JTlZBTElEX1JFR0lTVEVSPVZhbGlkYXRvcnMgY2FuIHJ1biBvbmx5IG9uIG9wZW4gcmVzb3VyY2VzLgotUHJvamVjdE92ZXJyaWRlc05vdEFsbG93ZWQ9VGhlIHdvcmtzcGFjZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIGRvIG5vdCBhbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSB0aGUgd29ya3NwYWNlIHNldHRpbmdzLiBJbiBvcmRlciB0byBhbGxvdyBwcm9qZWN0IHNldHRpbmdzIHlvdSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgd29ya3NwYWNlIHNldHRpbmdzIHRvIGFsbG93IHByb2plY3Qgb3ZlcnJpZGVzLiAgCi0gCi1WQkZfVUlfTk9fVkFMSURBVE9SU19JTlNUQUxMRUQ9Tm8gdmFsaWRhdG9ycyBhcmUgaW5zdGFsbGVkLgotCi1ESVNBQkxFX1ZBTElEQVRJT049UyZ1c3BlbmQgYWxsIHZhbGlkYXRvcnMKLQotRGVsZWdhdGVzRGlhbG9nVGl0bGU9VmFsaWRhdG9yIFByZWZlcmVuY2VzCi1EZWxlZ2F0ZXNDb21ib0xhYmVsPUltcGxlbWVudGF0aW9uOgotQUREX1ZBTElEQVRJT05fQlVJTERFUj1BZGQgVmFsaWRhdGlvbiAmQnVpbGRlciB0byBwcm9qZWN0Ci1Db25maWdXc1NldHRpbmdzPUNvbmZpZ3VyZSBXb3Jrc3BhY2UgU2V0dGluZ3MuLi4KLVZBTElEQVRPUj1WYWxpZGF0b3IKLU1BTlVBTD1NYW51YWwKLUJVSUxEPUJ1aWxkCi1TRVRUSU5HUz1TZXR0aW5ncwotCi1TYXZlRmlsZXNEaWFsb2dfc2F2aW5nPVNhdmluZyBSZXNvdXJjZXMKLVNhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZT0mQWx3YXlzIHNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHZhbGlkYXRpbmcKLVNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM9U2F2ZSBBbGwgTW9kaWZpZWQgUmVzb3VyY2VzCi1TYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlPUFsbCBtb2RpZmllZCByZXNvdXJjZXMgbXVzdCBiZSBzYXZlZCBiZWZvcmUgdGhpcyBvcGVyYXRpb24uCi0KLVByZWZQYWdlX2Fsd2F5c19zYXZlPSZTYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nCi1QcmVmUGFnZUNvbmZpcm1EaWFsb2c9U2hvdyBhICZjb25maXJtYXRpb24gZGlhbG9nIHdoZW4gcGVyZm9ybWluZyBtYW51YWwgdmFsaWRhdGlvbnMKLQotUnVuVmFsaWRhdGlvbkRpYWxvZ1RpdGxlPVJ1bm5pbmcgVmFsaWRhdGlvbgotCi1mZFRpdGxlPVZhbGlkYXRpb24gRmlsdGVycyBmb3IgezB9Ci1mZE5vRmlsdGVycz1UaGUgdmFsaWRhdG9yIGRvZXMgbm90IGhhdmUgY3VycmVudGx5IGhhdmUgYW55IGZpbHRlcnMgaW5zdGFsbGVkLgotRXJyQ29uZmlnPUV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGVycm9yLiBBbiBpbnRlcm5hbCBlcnJvciBoYXMgaGFwcGVuZWQsIHRoZSB2YWxpZGF0b3IgezB9IGhhcyBpbmNvcnJlY3RseSBjb25maWd1cmVkIHRoZSB2YWxpZGF0aW9uIGV4dGVuc2lvbiBwb2ludC4KLQotRmlsdGVySGVscD1GaWx0ZXIgcnVsZXMgYXJlIGdyb3VwZWQgaW50byBncm91cHMuIEluc2lkZSBvZiBhbnkgb25lIGdyb3VwIHRoZSBydWxlcyBhcmUgY29tYmluZWQgYnkgdXNpbmcgdGhlIGxvZ2ljYWwgT1Igb3BlcmF0b3IuIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgZ3JvdXBzIEluY2x1ZGUgYW5kIEV4Y2x1ZGUuIElmIGFueSBvZiB0aGUgcnVsZXMgaW4gdGhlIEV4Y2x1ZGUgZ3JvdXAgbWF0Y2gsIHRoZSByZXNvdXJjZSBpcyBub3QgdmFsaWRhdGVkLiBJZiB0aGVyZSBhcmUgSW5jbHVkZSBncm91cHMsIGF0IGxlYXN0IG9uZSBydWxlIGZyb20gZWFjaCBncm91cCBtdXN0IG1hdGNoIGJlZm9yZSB0aGUgcmVzb3VyY2UgaXMgdmFsaWRhdGVkLgotQnV0dG9uQWRkR3JvdXBJbmNsdWRlPUFkZCAmSW5jbHVkZSBHcm91cC4uLgotQnV0dG9uQWRkR3JvdXBFeGNsdWRlPUFkZCAmRXhjbHVkZSBHcm91cC4uLgotQnV0dG9uQWRkUnVsZT1BZGQgUiZ1bGUuLi4KLUJ1dHRvblJlbW92ZT0mUmVtb3ZlIAotCi1MYWJlbEVuYWJsZVByb2plY3RTcGVjaWZpYz1FbmFibGUgcHImb2plY3Qgc3BlY2lmaWMgc2V0dGluZ3MKLQotTGFiZWxFeHRlbnNpb249RmlsZSAmZXh0ZW5zaW9uCi1MYWJlbEZpbGU9RiZvbGRlciBvciBmaWxlIG5hbWUKLUxhYmVsUHJvamVjdHM9UHJvamVjdCAmbmF0dXJlCi1MYWJlbEZhY2V0cz0mRmFjZXQKLUxhYmVsQ29udGVudFR5cGU9JkNvbnRlbnQgVHlwZQotCi0jIE5vdGUgdG8gdHJhbnNsYXRvcnMsIGtlZXAgdGhlIDxBPiBhbmQgPC9BPiB0YWdzIGV4YWN0bHkgYXMgdGhleSBhcmUKLURvTm90U2hvd1Jlc3VsdHM9RG8gbm90IHNob3cgdGhpcyBkaWFsb2cgaW4gdGhlIGZ1dHVyZS4KLQotRGVzY0V4dGVuc2lvbj1GaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgImh0bWwiIGZvciBIVE1MIGZpbGVzLgotRGVzY0ZpbGU9RWl0aGVyIGEgZm9sZGVyLCBhIHJlbGF0aXZlIGZpbGUsIG9yIGEgZnVsbHkgcXVhbGlmaWVkIGZpbGUgbmFtZS4KLURlc2NQcm9qZWN0cz1BIHByb2plY3QgbmF0dXJlLgotRGVzY0ZhY2V0cz1BIGZhY2V0LgotRGVzY0NvbnRlbnRUeXBlPUEgY29udGVudCB0eXBlLCBmb3IgZXhhbXBsZSB0aGUgWE1MIGNvbnRlbnQgdHlwZS4KLQotRXJyb3JzV2FybmluZ3M9RXJyb3JzL1dhcm5pbmdzCi0KLVZhbGlkYXRpb249VmFsaWRhdGlvbgotVmFsaWRhdGlvblN0YXR1cz1WYWxpZGF0aW9uIFN0YXR1cwotCi1FcnJTdW1tYXJ5PVZhbGlkYXRpb24gcmVzdWx0cy4gRXJyb3JzPXswfSwgV2FybmluZ3M9ezF9LCBJbmZvcm1hdGlvbj17Mn0KLVZhbGlkYXRpb25TdWNjZXNzZnVsPVZhbGlkYXRpb24gd2FzIHN1Y2Nlc3NmdWwKLQotRnJXaXphcmQ9TmV3IEZpbHRlciBSdWxlIFdpemFyZAotRnJTZWxlY3RGaWx0ZXJUeXBlPVNlbGVjdCBGaWx0ZXIgVHlwZQotRnJGaWxlRXh0ZW5zaW9uPUZpbGUgRXh0ZW5zaW9uCi1GckZpbGVFeHRlbnNpb25MYWJlbD1GaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgaHRtbDoKLUZyQ2FzZVNlbnNpdGl2ZT1JcyB0aGUgY29tcGFyaXNvbiBjYXNlICZzZW5zaXRpdmU/Ci1GckV4YWN0TWF0Y2g9Q2hlY2sgdGhpcyBpZiB0aGUgY29udGVudCB0eXBlIG5lZWRzIHRvICZtYXRjaCBleGFjdGx5LiBEbyBub3QgY2hlY2sgaXQsIGlmIHN1YiB0eXBlcyBuZWVkIHRvIG1hdGNoIGFzIHdlbGwuCi1GclNpbXBsZUZpbGVOYW1lPUZvciBmaWxlIGJhc2VkICZjb21wYXJpc29ucywgdXNlIG9ubHkgdGhlIHNpbXBsZSBmaWxlIG5hbWUuCi1GckZvbGRlck9yRmlsZT1Gb2xkZXIgb3IgRmlsZSBOYW1lCi1GckZvbGRlck9yRmlsZUxhYmVsPUZpbGUgb3IgZm9sZGVyOgotRnJCcm93c2VGaWxlPUJyb3dzZSAmRmlsZS4uLgotRnJGaWxlRmlsdGVyPVNlbGVjdCB0aGUgZmlsZSB0aGF0IHdpbGwgc2VydmUgYXMgdGhlIGZpbHRlcgotRnJCcm93c2VGb2xkZXI9QnJvd3NlIEYmb2xkZXIuLi4KLUZyRm9sZGVyRmlsdGVyPVNlbGVjdCB0aGUgZm9sZGVyIHRoYXQgd2lsbCBzZXJ2ZSBhcyB0aGUgZmlsdGVyCi1GclByb2plY3ROYXR1cmU9UHJvamVjdCBOYXR1cmUKLUZyUHJvamVjdE5hdHVyZUxhYmVsPVByb2plY3QgJm5hdHVyZToKLUZyRmFjaXQ9RmFjZXQKLUZyRmFjaXRMYWJlbD0mRmFjZXQgaWQ6Ci1GckNvbnRlbnRUeXBlPUNvbnRlbnQgVHlwZQotRnJDb250ZW50VHlwZUxhYmVsPSZDb250ZW50IFR5cGU6Ci1Gck1zZ1Nldj1TZWxlY3QgdGhlIHNldmVyaXR5IGxldmVsIGZvciB0aGUgZm9sbG93aW5nIHByb2JsZW1zCi0KLVJlYnVpbGRUaXRsZT1WYWxpZGF0aW9uIFNldHRpbmdzIENoYW5nZWQKLVJlYnVpbGRNc2c9VGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLiBBIGZ1bGwgcmVidWlsZCBpcyByZXF1aXJlZCBmb3IgdGhlIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuIERvIHRoZSBmdWxsIGJ1aWxkIG5vdz8KLQotIwotIyBFbmQgVmFsaWRhdGlvbiBCdWlsZGVyIEZyYW1ld29yayBVSSBTdHJpbmdzCi0jCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNlNDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLQotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFdUUFVJUGx1Z2luLlBMVUdJTl9JRDsKLQotCS8vIGNvbnRleHQgaWRzIGZvciB0aGUgVmFsaWRhdGlvbiBQcm9wZXJ0aWVzIFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRSA9IFBSRUZJWCArICIuanZwcDAwMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfRElTQUJMRURfT1ZFUlJJREUgPSBQUkVGSVggKyAiLmp2cHAwMDAxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0RJU0FCTEVEX0JVSUxEX05PVkFMU0VMRUNURUQgPSBQUkVGSVggKyAiLmp2cHAwMDAzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0RJU0FCTEVEX0FVVE9fQVVUT0JVSUxEID0gUFJFRklYICsgIi5qdnBwMDAwNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9BVVRPX05PSU5DVkFMU0VMRUNURUQgPSBQUkVGSVggKyAiLmp2cHAwMDA1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0RJU0FCTEVEX0FVVE9fTk9JTkNWQUxDT05GSUcgPSBQUkVGSVggKyAiLmp2cHAwMDA2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0FVVE9fRU5BQkxFRCA9IFBSRUZJWCArICIuanZwcDAwMjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfT1ZFUlJJREVfRU5BQkxFRCA9IFBSRUZJWCArICIuanZwcDAwMzAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfT1ZFUlJJREVfRU5BQkxFRF9DQU5OT1RfSE9OT1VSX0JPVEggPSBQUkVGSVggKyAiLmp2cHAwMDMxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRURfQ0FOTk9UX0hPTk9VUl9BVVRPID0gUFJFRklYICsgIi5qdnBwMDAzMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9PVkVSUklERV9FTkFCTEVEX0NBTk5PVF9IT05PVVJfTUFOVUFMID0gUFJFRklYICsgIi5qdnBwMDAzMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9SRUJVSUxEX0VOQUJMRUQgPSBQUkVGSVggKyAiLmp2cHAwMDQwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX01BWF9NRVNTQUdFUyA9IFBSRUZJWCArICIuanZwcDAwNTAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRSA9IFBSRUZJWCArICIuanZncDAwMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfT1ZFUlJJREUgPSBQUkVGSVggKyAiLmp2Z3AwMDA1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0RJU0FCTEVfQUxMX0VOQUJMRUQgPSBQUkVGSVggKyAiLmp2Z3AwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX1JFQlVJTERfRElTQUJMRUQgPSBQUkVGSVggKwotCS8vICIuanZncDAwMTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfQVVUT19FTkFCTEVEID0gUFJFRklYICsgIi5qdmdwMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9BVVRPX0RJU0FCTEVEX0FVVE9CVUlMRCA9IFBSRUZJWCArCi0JLy8gIi5qdmdwMDAyMSI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9BVVRPX0RJU0FCTEVEX05PSU5DVkFMU0VMRUNURUQgPSBQUkVGSVgKLQkvLyArICIuanZncDAwMjIiOyAvLyROT04tTkxTLTEkCi0JLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfQVVUT19ESVNBQkxFRF9OT0lOQ1ZBTENPTkZJRyA9IFBSRUZJWCArCi0JLy8gIi5qdmdwMDAyMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9NQVhfTUVTU0FHRVMgPSBQUkVGSVggKyAiLmp2Z3AwMDMwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0RlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0RlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDA5MDBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9EZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5WYWxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIERpYWxvZyB1c2VkIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBhIHZhbGlkYXRvciBkZWxlZ2F0ZSBmcm9tIHRoZSBsaXN0IG9mCi0gKiByZWdpc3RlcmVkIGRlbGVnYXRlcyBmb3IgYSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyBleHRlbmRzIERpYWxvZwotewotICAvKioKLSAgICogVGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgZGVzY3JpcHRvci4KLSAgICovCi0gIHByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgZGVsZWdhdGluZ1ZhbGlkYXRvckRlc2NyaXB0b3I7Ci0KLSAgLyoqCi0gICAqIFRoZSBzZWxlY3RlZCB2YWxpZGF0b3IgZGVsZWdhdGUgSUQuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBkZWxlZ2F0ZUlEOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIHRoZSBkaWFsb2cgb24gdGhlIGdpdmVuIHNoZWxsLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgIHRoZSBkaWFsb2cncyBwYXJlbnQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSB0YXJnZXRJRAotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IncyBpZAotICAgKiAKLSAgICogQHBhcmFtIGRlbGVnYXRlSUQKLSAgICogICAgICAgICAgdGhlIElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsaWRhdG9yIGRlbGVnYXRlLgotICAgKi8KLSAgcHVibGljIERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgZGVsZWdhdGVJRCkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLQotICAgIGRlbGVnYXRpbmdWYWxpZGF0b3JEZXNjcmlwdG9yID0gdm1kOwotICAgIHRoaXMuZGVsZWdhdGVJRCA9IGRlbGVnYXRlSUQ7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRGVsZWdhdGVzRGlhbG9nVGl0bGUpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWREYXRhIGxhYmVsRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgIGxhYmVsRGF0YS53aWR0aEhpbnQgPSAyNTA7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbERhdGEpOwotICAgIGxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCkpOwotICAgIFN0cmluZyBkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSA9IGRlbGVnYXRpbmdWYWxpZGF0b3JEZXNjcmlwdG9yLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0gICAgbGFiZWwuc2V0VGV4dChkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgIEdyaWREYXRhIHNlcGFyYXRvckRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShzZXBhcmF0b3JEYXRhKTsKLQotICAgIENvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgIGdyb3VwLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7Ci0gICAgR3JpZExheW91dCBncm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBncm91cC5zZXRMYXlvdXQoZ3JvdXBMYXlvdXQpOwotCi0gICAgTGFiZWwgY29tYm9MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotICAgIGNvbWJvTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0gICAgY29tYm9MYWJlbC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRGVsZWdhdGVzQ29tYm9MYWJlbCk7Ci0gICAgCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5SRUFEX09OTFkpOwotICAgIEdyaWREYXRhIGNvbWJvR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICBjb21iby5zZXRMYXlvdXREYXRhKGNvbWJvR3JpZERhdGEpOwotCi0gICAgZmluYWwgQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOwotICAgIGNvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRGVsZWdhdGVzQ29udGVudFByb3ZpZGVyKCkpOwotICAgIGNvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlbGVnYXRlc0xhYmVsUHJvdmlkZXIoKSk7Ci0gICAgU3RyaW5nIHRhcmdldElEID0gZGVsZWdhdGluZ1ZhbGlkYXRvckRlc2NyaXB0b3IuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotCi0gICAgY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHNldERlbGVnYXRlSUQoKChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBjb21ib1ZpZXdlci5zZXRJbnB1dCh0YXJnZXRJRCk7Ci0KLSAgICBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3Igc2VsZWN0ZWQgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlc2NyaXB0b3IodGFyZ2V0SUQsIGRlbGVnYXRlSUQpOwotCi0gICAgaWYgKHNlbGVjdGVkICE9IG51bGwpCi0gICAgewotICAgICAgY29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IHNlbGVjdGVkIH0pKTsKLSAgICB9Ci0KLSAgICBMYWJlbCBlbmRTZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgIEdyaWREYXRhIGVuZFNlcGFyYXRvckRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsgCi0gICAgZW5kU2VwYXJhdG9yLnNldExheW91dERhdGEoZW5kU2VwYXJhdG9yRGF0YSk7Ci0gICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotICAgIAotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgY29udGVudHMgZm9yIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3JzIGNvbWJvIGJveC4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgY2xhc3MgRGVsZWdhdGVzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFyZ2V0SUQgPSAoU3RyaW5nKSBpbnB1dEVsZW1lbnQ7Ci0gICAgICBNYXAgZGVsZWdhdGVzQnlJRCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVsZWdhdGVEZXNjcmlwdG9ycyh0YXJnZXRJRCk7Ci0gICAgICAKLSAgICAgIGlmIChkZWxlZ2F0ZXNCeUlEID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBkZWxlZ2F0ZXNCeUlELnZhbHVlcygpLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBsYWJlbHMvaW1hZ2VzIGZvciB0aGUgZGVsZWdhdGUgdmFsaWRhdG9yIGNvbWJvIGJveAotICAgKiAKLSAgICogQGF1dGhvciB2YmFjaXVsCi0gICAqIAotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBEZWxlZ2F0ZXNMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogUHJvdmlkZXMgdGhlIElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsaWRhdG9yIGRlbGVnYXRlIElELgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZWxlZ2F0ZUlEKCkKLSAgewotICAgIHJldHVybiBkZWxlZ2F0ZUlEOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWxpZGF0b3IgZGVsZWdhdGUgSUQuCi0gICAqIAotICAgKiBAcGFyYW0gZGVsZWdhdGVJRAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldERlbGVnYXRlSUQoU3RyaW5nIGRlbGVnYXRlSUQpCi0gIHsKLSAgICB0aGlzLmRlbGVnYXRlSUQgPSBkZWxlZ2F0ZUlEOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvTGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiNmQwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvTGlzdENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKiogCi0gKiBBIHNwZWNpYWxpemVkIGNvbnRlbnQgcHJvdmlkZXIgdG8gc2hvdyBhIGxpc3Qgb2YgZWRpdG9yIHBhcnRzLgotICogVGhpcyBjbGFzcyBoYXMgYmVlbiBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuTGlzdENvbnRlbnRQcm92aWRlcgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIGEgZ2VuZXJpYyBzb2x1dGlvbiBpcyBtYWRlIGF2YWlsYWJsZS4KLSAqLyAKLXB1YmxpYyBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCUxpc3QgZkNvbnRlbnRzOwkKLQotCXB1YmxpYyBMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChmQ29udGVudHMgIT0gbnVsbCAmJiBmQ29udGVudHMgPT0gaW5wdXQpCi0JCQlyZXR1cm4gZkNvbnRlbnRzLnRvQXJyYXkoKTsKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIExpc3QpIAotCQkJZkNvbnRlbnRzPSAoTGlzdCluZXdJbnB1dDsKLQkJZWxzZQotCQkJZkNvbnRlbnRzPSBudWxsOwotCQkvLyB3ZSB1c2UgYSBmaXhlZCBzZXQuCi0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvKSB7Ci0JCXJldHVybiBmQ29udGVudHMgIT0gbnVsbCAmJiAhZkNvbnRlbnRzLmNvbnRhaW5zKG8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9TYXZlRmlsZXNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9TYXZlRmlsZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlYjg3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogLwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKLQotLyoqCi0gKiBBIGdlbmVyaWMgc2F2ZSBmaWxlcyBkaWFsb2cuIFRoZSBidWxrIG9mIHRoZSBjb2RlCi0gKiBmb3IgdGhpcyBkaWFsb2cgd2FzIHRha2VuIGZyb20gdGhlIEpEVCByZWZhY3RvcmluZwotICogc3VwcG9ydCBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTYXZlSGVscGVyLgotICogVGhpcyBjbGFzcyBpcyBhIGdvb2QgY2FuZGlkYXRlIGZvciByZXVzZSBhbW91bmcgY29tcG9uZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFNhdmVGaWxlc0RpYWxvZyBleHRlbmRzIExpc3REaWFsb2cgewotCQotCXB1YmxpYyBTYXZlRmlsZXNEaWFsb2coU2hlbGwgcGFyZW50KQotCXsKLQkgIHN1cGVyKHBhcmVudCk7Ci0JICBzZXRUaXRsZShWYWxpZGF0aW9uVUlNZXNzYWdlcy5TYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzKTsgCi0JICBzZXRBZGRDYW5jZWxCdXR0b24odHJ1ZSk7Ci0JICBzZXRMYWJlbFByb3ZpZGVyKGNyZWF0ZURpYWxvZ0xhYmVsUHJvdmlkZXIoKSk7Ci0JICBzZXRNZXNzYWdlKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmUpOyAKLQkgIHNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBjb250YWluZXIpIAotCXsKLQkJQ29tcG9zaXRlIHJlc3VsdD0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCQlib29sZWFuIGZBbGxvd1NhdmVBbHdheXMgPSB0cnVlOwotCQlpZiAoZkFsbG93U2F2ZUFsd2F5cykgewotCQkJZmluYWwgQnV0dG9uIGNoZWNrPSBuZXcgQnV0dG9uKHJlc3VsdCwgU1dULkNIRUNLKTsKLQkJCWNoZWNrLnNldFRleHQoVmFsaWRhdGlvblVJTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX2Fsd2F5c19zYXZlKTsgCi0JCQkvL2NoZWNrLnNldFNlbGVjdGlvbihSZWZhY3RvcmluZ1NhdmVQcmVmZXJlbmNlcy5nZXRTYXZlQWxsRWRpdG9ycygpKTsKLQkJCWNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkgIHRyeQotCQkJCSAgewotCQkJCSAgICBHbG9iYWxDb25maWd1cmF0aW9uIGNvbmZpZyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQkJICAgIGNvbmZpZy5zZXRTYXZlQXV0b21hdGljYWxseShjaGVjay5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJICAgIGNvbmZpZy5zdG9yZSgpOwotCQkJCSAgfQotCQkJCSAgY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpCi0JCQkJICB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoVmFsaWRhdGlvblVJUGx1Z2luLmdldEJ1bmRsZU5hbWUoKSkubG9nKExldmVsLldBUk5JTkcsIAotCQkJCQkJVmFsaWRhdGlvblVJTWVzc2FnZXMuVW5hYmxlVG9TYXZlICsgZXhjKTsKLQkJCQkgIH0KLQkJCQkgIAotCQkJCX0KLQkJCX0pOwotCQkJYXBwbHlEaWFsb2dGb250KHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBjcmVhdGVEaWFsb2dMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGVJbWFnZSgpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9TYXZlRmlsZXNIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9TYXZlRmlsZXNIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyMzMzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogLwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB0aGUgc2F2ZSBkaXJ0eSBmaWxlcyBkaWFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRmlsZXNIZWxwZXIgewotCi0JLyoqCi0JICogUmV0cmVpdmUgYW4gYXJyYXkgb2YgSUVkaXRvclBhcnRzIHJlcHJlc2VudGluZyBhbGwgdGhlIGRpcnR5Ci0JICogZWRpdG9ycyBvcGVuIGZvciB0aGUgZmlsZXMgcHJvdmlkZWQgaW4gdGhlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGZpbGVzCi0JICogCQkJQSBsaXN0IG9mIElGaWxlcy4KLQkgKiBAcmV0dXJuCi0JICogCQkJQW4gYXJyYXkgb2YgSUVkaXRvclBhcnRzIGNvbnRhaW5pbmcgYWxsIHRoZSBkaXJ0eSBlZGl0b3JzIGZvciB0aGUgZmlsZXMgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydFtdIGdldERpcnR5RWRpdG9ycyhMaXN0IGZpbGVzKSB7Ci0JCVNldDxJRWRpdG9ySW5wdXQ+IGlucHV0cyA9IG5ldyBIYXNoU2V0PElFZGl0b3JJbnB1dD4oKTsKLQkJTGlzdDxJRWRpdG9yUGFydD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8SUVkaXRvclBhcnQ+KCk7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhZ2VzLmxlbmd0aDsgeCsrKSB7Ci0JCQkJSUVkaXRvclBhcnRbXSBlZGl0b3JzID0gcGFnZXNbeF0uZ2V0RGlydHlFZGl0b3JzKCk7Ci0JCQkJZm9yIChpbnQgeiA9IDA7IHogPCBlZGl0b3JzLmxlbmd0aDsgeisrKSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IGVwID0gZWRpdG9yc1t6XTsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZXAuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGVFZGl0b3JJbnB1dCBmaWxlSW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQkJCQlpZiAoZmlsZXMuY29udGFpbnMoZmlsZUlucHV0LmdldEZpbGUoKSkpIHsKLQkJCQkJCQlpZiAoIWlucHV0cy5jb250YWlucyhpbnB1dCkpIHsKLQkJCQkJCQkJaW5wdXRzLmFkZChpbnB1dCk7Ci0JCQkJCQkJCXJlc3VsdC5hZGQoZXApOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IElFZGl0b3JQYXJ0W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDRjODI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1lbnVBY3Rpb24gZGVsZWdhdGU7Ci0KLQlwdWJsaWMgVmFsaWRhdGVBY3Rpb24oKSB7Ci0JCXN1cGVyKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbGlkYXRlKTsKLQkJZGVsZWdhdGUgPSBuZXcgVmFsaWRhdGlvbk1lbnVBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRlbGVnYXRlLnJ1bih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoaXMgYWN0aW9uIGluIHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0byByZWFjdCB0byBzZWxlY3Rpb24gY2hhbmdlczsgaG93ZXZlciwgaWYgdGhlCi0JICogc3VwZXIgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgb3ZlcnJpZGluZyBtZXRob2QgbXVzdCBhbHNvIHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIG5ldyBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgc2VsZWN0aW9uLCBhbmQKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLCBzZWxlY3Rpb24pOwotCi0JCXJldHVybiBpc0VuYWJsZWQoKTsgLy8gIkVuYWJsZWQiIGlzIHNldCBieSB0aGUgZGVsZWdhdGUuCi0JfQotCi0JLyoqCi0JICogSWYgYSBzdWJjbGFzcyBvZiBWYWxpZGF0ZUFjdGlvbiBlbmFibGVzIHRoaXMgbWVudSBhY3Rpb24gb24gYSB0eXBlIHRoYXQgaXMgbm90IGFuIElSZXNvdXJjZSwKLQkgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJUmVzb3VyY2VbXSB0aGF0IHJlcHJlc2VudCB0aGF0IG9iamVjdC4gSWYgbnVsbCBpcyByZXR1cm5lZCwgdGhlCi0JICogb2JqZWN0IHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlIHVzZXIgd2lsbCBub3QgYmUgbm90aWZpZWQgdGhhdCB0aGUgb2JqZWN0IHdhcyBub3QgdmFsaWRhdGVkLgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdXBkYXRlU2VsZWN0aW9uIGFuZCBydW4gYXJlIGNhbGxlZC4gKFRoZSByZXN1bHQgb2YgdGhpcwotCSAqIG1ldGhvZCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCByZXNvdXJjZXMgd2lsbCBiZSB2YWxpZGF0ZWQpCi0JICovCi0JcHJvdGVjdGVkIElSZXNvdXJjZVtdIGdldFJlc291cmNlKE9iamVjdCBzZWxlY3RlZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbkpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25Kb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzN2Y2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbkpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Kb2IgZXh0ZW5kcyBKb2IgewotCi0KLQlwcml2YXRlIE1hcCBwcm9qZWN0czsKLQlwdWJsaWMgVmFsaWRhdGlvbkpvYihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3RzTWFwKE1hcCBwcm9qZWN0cyl7Ci0JCXRoaXMucHJvamVjdHMgPSBwcm9qZWN0czsKLQl9Ci0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCBnZXRQcm9qZWN0cygpIHsKLQkJcmV0dXJuIHByb2plY3RzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uTWVudUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25NZW51QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNmM0MDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25NZW51QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkRpc2FibGVkUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5NYW51YWxWYWxpZGF0aW9uUnVubmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcG9wLXVwIG1lbnUgaXRlbSAiUnVuIFZhbGlkYXRpb24iIFdoZW4gdGhlIGl0ZW0gaXMgc2VsZWN0ZWQsIHRoaXMKLSAqIGFjdGlvbiB0cmlnZ2VycyBhIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QsIHVzaW5nIGFsbCBjb25maWd1cmVkLCBlbmFibGVkIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWVudUFjdGlvbiBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVNlbGVjdGlvbiAJCV9jdXJyZW50U2VsZWN0aW9uOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRGlzcGxheSAJCV9jdXJyZW50RGlzcGxheTsKLQlwcml2YXRlIElSZXNvdXJjZVZpc2l0b3IgX2ZvbGRlclZpc2l0b3I7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VWaXNpdG9yIF9wcm9qZWN0VmlzaXRvcjsKLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IF9zZWxlY3RlZFJlc291cmNlczsKLQotCXB1YmxpYyBWYWxpZGF0aW9uTWVudUFjdGlvbigpIHsKLQkJLy8gY2FjaGUgdGhlIGRpc3BsYXkgYmVmb3JlIHRoaXMgYWN0aW9uIGlzIGZvcmtlZC4gQWZ0ZXIgdGhlIGFjdGlvbiBpcyBmb3JrZWQsCi0JCS8vIERpc3BsYXkuZ2V0Q3VycmVudCgpIHJldHVybnMgbnVsbC4KLQkJX2N1cnJlbnREaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7IAotCQlfc2VsZWN0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+KCk7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiAoX2N1cnJlbnREaXNwbGF5ID09IG51bGwpID8gRGlzcGxheS5nZXRDdXJyZW50KCkgOiBfY3VycmVudERpc3BsYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3aXphcmQncyBzaGVsbC4KLQkgKi8KLQlTaGVsbCBnZXRTaGVsbCgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IChkaXNwbGF5ID09IG51bGwpID8gbnVsbCA6IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJaWYgKHNoZWxsID09IG51bGwgJiYgZGlzcGxheSAhPSBudWxsKSB7Ci0JCQlTaGVsbFtdIHNoZWxscyA9IGRpc3BsYXkuZ2V0U2hlbGxzKCk7Ci0JCQlpZiAoc2hlbGxzLmxlbmd0aCA+IDApCi0JCQkJc2hlbGwgPSBzaGVsbHNbMF07Ci0JCX0KLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG1hcCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuIEVhY2gga2V5IG9mIHRoZSBtYXAgaXMgYW4gSVByb2plY3QsIGFuZCB0aGUgdmFsdWUgaXMgYQotCSAqIFNldCBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzIGluIHRoYXQgcHJvamVjdC4gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkLCBhbmQgbm90aGluZyBlbHNlIGluCi0JICogdGhlIHByb2plY3QgaXMgc2VsZWN0ZWQsIGEgZnVsbCB2YWxpZGF0aW9uIChudWxsIHZhbHVlKSB3aWxsIGJlIGRvbmUgb24gdGhlIHByb2plY3QuIElmIGEKLQkgKiBwcm9qZWN0IGlzIHNlbGVjdGVkLCBhbmQgc29tZSBmaWxlcy9mb2xkZXJzIGluIHRoZSBwcm9qZWN0IGFyZSBhbHNvIHNlbGVjdGVkLCBvbmx5IHRoZQotCSAqIGZpbGVzL2ZvbGRlcnMgd2lsbCBiZSB2YWxpZGF0ZWQuIElmIGEgZm9sZGVyIGlzIHNlbGVjdGVkLCBhbGwgb2YgaXRzIGNvbnRlbnRzIGFyZSBhbHNvCi0JICogdmFsaWRhdGVkLgotCSAqIAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBsb2FkU2VsZWN0ZWQoVmFsaWRhdGVBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIEdSSyBwcmV2aW91c2x5IHRoaXMgZGlkIG5vdCBkbyBhIGNsZWFyLCBidXQgSSBjb3VsZG4ndCB1bmRlcnN0YW5kIHdoeSB0aGF0IHdvdWxkIGJlIHNvIEkgYW0gZm9yY2luZyBhIGNsZWFyCi0JCS8vIEdSSyBJbiBteSB0ZXN0aW5nLCBub3QgZG9pbmcgYSBjbGVhciBjYXVzZWQgZHVwbGljYXRlIHZhbGlkYXRpb25zCi0JCV9zZWxlY3RlZFJlc291cmNlcy5jbGVhcigpOwotCQlpZiAoKF9jdXJyZW50U2VsZWN0aW9uID09IG51bGwpIHx8IF9jdXJyZW50U2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAKLQkJCSEoX2N1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpcmV0dXJuIG51bGw7Ci0JCQotCQlPYmplY3RbXSBlbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIF9jdXJyZW50U2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbClhZGRTZWxlY3RlZChhY3Rpb24sIGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBfc2VsZWN0ZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkKFZhbGlkYXRlQWN0aW9uIGFjdGlvbiwgT2JqZWN0IHNlbGVjdGVkKSB7Ci0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlhZGRWaXNpdG9yKChJUHJvamVjdCkgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCWFkZFNlbGVjdGVkKChJRmlsZSkgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJYWRkVmlzaXRvcigoSUZvbGRlcikgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKGlzVmFsaWRUeXBlKGdldEV4dGVuZGVkVHlwZShzZWxlY3RlZCkpKSB7Ci0JCQlhZGRTZWxlY3RlZChhY3Rpb24sZ2V0RXh0ZW5kZWRUeXBlKHNlbGVjdGVkKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBOb3QgYSB2YWxpZCBpbnB1dCB0eXBlLiBNdXN0IGJlIElQcm9qZWN0LCBJSmF2YVByb2plY3QsIG9yIElSZXNvdXJjZS4KLQkJCS8vIElmIHRoaXMgVmFsaWRhdGlvbk1lbnVBY3Rpb24gaXMgYSBkZWxlZ2F0ZSBvZiBWYWxpZGF0ZUFjdGlvbiwgaXMKLQkJCS8vIHRoZSBpbnB1dCB0eXBlIHJlY29nbml6ZWQgYnkgdGhlIFZhbGlkYXRlQWN0aW9uPwotCQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gYWN0aW9uLmdldFJlc291cmNlKHNlbGVjdGVkKTsKLQkJCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJdmFsaWQgPSB0cnVlOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJYWRkU2VsZWN0ZWQoYWN0aW9uLCByZXNvdXJjZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCF2YWxpZCkgewotCQkJCS8vIFN0b3AgcHJvY2Vzc2luZy4gVGhpcyBhbGxvd3MgdGhlICJSdW4gVmFsaWRhdGlvbiIgbWVudSBpdGVtCi0JCQkJLy8gdG8gZ3JheSBvdXQgb25jZSBhbiBlbGVtZW50IHRoYXQgY2FuIG5vdCBiZSB2YWxpZGF0ZWQgaXMgc2VsZWN0ZWQuCi0JCQkJX3NlbGVjdGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RXh0ZW5kZWRUeXBlKE9iamVjdCBzZWxlY3RlZCkgewotCQlPYmplY3QgcmVzdWx0ID0gVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEV4dGVuZGVkVHlwZShzZWxlY3RlZCk7Ci0JCXJldHVybiByZXN1bHQgPT0gbnVsbCA/IHNlbGVjdGVkIDogcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QgfHwgb2JqZWN0IGluc3RhbmNlb2YgSUZpbGUgfHwgb2JqZWN0IGluc3RhbmNlb2YgSUZvbGRlcjsKLQl9Ci0KLQotCXZvaWQgYWRkU2VsZWN0ZWQoSVJlc291cmNlIHNlbGVjdGVkKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBzZWxlY3RlZC5nZXRQcm9qZWN0KCk7Ci0JCWJvb2xlYW4gYWRkZWQgPSBfc2VsZWN0ZWRSZXNvdXJjZXMuY29udGFpbnNLZXkocHJvamVjdCk7Ci0JCVNldDxJUmVzb3VyY2U+IGNoYW5nZWRSZXMgPSBudWxsOwotCQlpZiAoYWRkZWQpIHsKLQkJCS8vIElmIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGUgZW50aXJlIHByb2plY3QgbmVlZHMgdG8gYmUgdmFsaWRhdGVkIGFueXdheS4KLQkJCWNoYW5nZWRSZXMgPSBfc2VsZWN0ZWRSZXNvdXJjZXMuZ2V0KHByb2plY3QpOwotCQkJaWYgKGNoYW5nZWRSZXMgPT0gbnVsbClyZXR1cm47Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCWNoYW5nZWRSZXMgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7Ci0JCX0KLQkJaWYgKGNoYW5nZWRSZXMuYWRkKHNlbGVjdGVkKSkgewotCQkJX3NlbGVjdGVkUmVzb3VyY2VzLnB1dChwcm9qZWN0LCBjaGFuZ2VkUmVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRWaXNpdG9yKElGb2xkZXIgc2VsZWN0ZWQpIHsKLQkJLy8gYWRkIHRoZSBmb2xkZXIgYW5kIGl0cyBjaGlsZHJlbgotCQl0cnkgewotCQkJc2VsZWN0ZWQuYWNjZXB0KGdldEZvbGRlclZpc2l0b3IoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZVZpc2l0b3IgZ2V0Rm9sZGVyVmlzaXRvcigpIHsKLQkJaWYgKF9mb2xkZXJWaXNpdG9yID09IG51bGwpIHsKLQkJCV9mb2xkZXJWaXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgewotCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWFkZFNlbGVjdGVkKHJlcyk7Ci0JCQkJCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQkJYWRkU2VsZWN0ZWQocmVzKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHJlc291cmNlJ3MgY2hpbGRyZW4KLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBfZm9sZGVyVmlzaXRvcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFZpc2l0b3IoSVByb2plY3Qgc2VsZWN0ZWQpIHsKLQkJLy8gYWRkIHRoZSBmb2xkZXIgYW5kIGl0cyBjaGlsZHJlbgotCQlpZighc2VsZWN0ZWQuaXNBY2Nlc3NpYmxlKCkpcmV0dXJuOwotCQl0cnkgewotCQkJc2VsZWN0ZWQuYWNjZXB0KGdldFByb2plY3RWaXNpdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VWaXNpdG9yIGdldFByb2plY3RWaXNpdG9yKCkgewotCQlpZiAoX3Byb2plY3RWaXNpdG9yID09IG51bGwpIHsKLQkJCV9wcm9qZWN0VmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXMpIHsKLQkJCQkJaWYgKERpc2FibGVkUmVzb3VyY2VNYW5hZ2VyLmdldERlZmF1bHQoKS5pc0Rpc2FibGVkKHJlcykpcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpYWRkU2VsZWN0ZWQocmVzKTsKLQkJCQkJZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcilhZGRTZWxlY3RlZChyZXMpOwotCQkJCQllbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBJUHJvamVjdClhZGRTZWxlY3RlZChyZXMpOwotCQkJCQkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gX3Byb2plY3RWaXNpdG9yOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWxlZ2F0aW5nIGFjdGlvbiBoYXMgYmVlbiBpbnZva2VkLiBUaGlzIG1ldGhvZCBkb2VzIHRoZSBhY3R1YWwgd29yay4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICBBY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgcGx1Zy1pbiBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVZhbGlkYXRlQWN0aW9uIHZhY3Rpb24gPSBudWxsOwotCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgVmFsaWRhdGVBY3Rpb24pIHsKLQkJCXZhY3Rpb24gPSAoVmFsaWRhdGVBY3Rpb24pIGFjdGlvbjsKLQkJfQotCQlmaW5hbCBNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cyA9IGxvYWRTZWxlY3RlZCh2YWN0aW9uKTsKLQkJaWYgKChwcm9qZWN0cyA9PSBudWxsKSB8fCAocHJvamVjdHMuc2l6ZSgpID09IDApKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIElmIHRoZSBmaWxlcyBhcmVuJ3Qgc2F2ZWQgZG8gbm90IHJ1biB2YWxpZGF0aW9uLgotCQlpZighaGFuZGxlRmlsZXNUb1NhdmUocHJvamVjdHMpKXJldHVybjsKLQotCQlib29sZWFuIGNvbmZpcm0gPSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpCi0JCQkuZ2V0Q29uZmlybURpYWxvZygpOwotCQlNYW51YWxWYWxpZGF0aW9uUnVubmVyLnZhbGlkYXRlKHByb2plY3RzLCBWYWxUeXBlLk1hbnVhbCwgY29uZmlybSk7Ci0JfQotCQotCS8qKgotCSAqIFNlbGVjdGlvbiBpbiB0aGUgZGVza3RvcCBoYXMgY2hhbmdlZC4gUGx1Zy1pbiBwcm92aWRlciBjYW4gdXNlIGl0IHRvIGNoYW5nZSB0aGUgYXZhaWxhYmlsaXR5Ci0JICogb2YgdGhlIGFjdGlvbiBvciB0byBtb2RpZnkgb3RoZXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMuCi0JICogCi0JICogPHA+Ci0JICogQWN0aW9uIGRlbGVnYXRlIGNhbm5vdCBiZSBub3RpZmllZCBhYm91dCBzZWxlY3Rpb24gY2hhbmdlcyBiZWZvcmUgaXQgaXMgbG9hZGVkLiBGb3IgdGhhdAotCSAqIHJlYXNvbiwgY29udHJvbCBvZiBhY3Rpb24ncyBlbmFibGUgc3RhdGUgc2hvdWxkIGFsc28gYmUgcGVyZm9ybWVkIHRocm91Z2ggc2ltcGxlIFhNTCBydWxlcwotCSAqIGRlZmluZWQgZm9yIHRoZSBleHRlbnNpb24gcG9pbnQuIFRoZXNlIHJ1bGVzIGFsbG93IGVuYWJsZSBzdGF0ZSBjb250cm9sIGJlZm9yZSB0aGUgZGVsZWdhdGUKLQkgKiBoYXMgYmVlbiBsb2FkZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIHBsdWctaW4gYWN0aW9uCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIGRlc2t0b3AKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlfY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJYm9vbGVhbiBlbmFibGVkID0gcXVpY2tDaGVjayhzZWxlY3Rpb24pOwotCQkKLQkJLy8gRG9uJ3QgZm9yY2UgdGhlIHBsdWctaW4gdG8gYmUgYWN0aXZhdGVkIGp1c3QgdG8gY2hlY2sgdGhpcyBzZXR0aW5nLgotCQlpZiAoZW5hYmxlZCAmJiBWYWxpZGF0aW9uUGx1Z2luLmlzQWN0aXZhdGVkKCkgJiYgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmlzQWN0aXZhdGVkKCkpewotCQkJZW5hYmxlZCA9IGhhc01hbnVhbFZhbGlkYXRvcnMoc2VsZWN0aW9uKTsKLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0JCi0JLyoqCi0JICogRG8gYSBxdWljayBjaGVjayBvbiB0aGUgc2VsZWN0aW9uLCBzbyBzZWUgaWYgd2Uga25vdyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybiBmYWxzZSBpZiB3ZSBhcmUgc3VyZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gdmFsaWRhdGUgaXQuIFJldHVybiB0cnVlIGlmIHdlIGFyZSBzdGlsbCBub3Qgc3VyZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcXVpY2tDaGVjayhJU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKXJldHVybiBmYWxzZTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCU9iamVjdCBzZWwgPSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWwgIT0gbnVsbCl7Ci0JCQkJaWYgKHNlbCBpbnN0YW5jZW9mIElQcm9qZWN0KXsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClzZWw7Ci0JCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIGFueSBvZiB0aGUgc2VsZWN0ZWQgaXRlbXMgaGF2ZSBtYW51YWwgdmFsaWRhdG9ycyBlbmFibGVkLgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWFudWFsVmFsaWRhdG9ycyhJU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCQkJCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbil7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkJT2JqZWN0IHNlbCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoc2VsIGluc3RhbmNlb2YgSVJlc291cmNlKXsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlzZWw7Ci0JCQkJCWlmIChWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5oYXNWYWxpZGF0b3JzKHJlc291cmNlLCB0cnVlLCBmYWxzZSkpcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQkJCi0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7IAotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYW55IGZpbGVzIHRoYXQgbXVzdCBiZSBzYXZlZCBwcmlvciB0byBydW5uaW5nCi0JICogdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdHMKLQkgKiAJCQlUaGUgbGlzdCBvZiBwcm9qZWN0cyB0aGF0IHdpbGwgYmUgdmFsaWRhdGVkLgotCSAqIEByZXR1cm4KLQkgKiAJCQlUcnVlIGlmIGFsbCBmaWxlcyBoYXZlIGJlZW4gc2F2ZWQsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVGaWxlc1RvU2F2ZShNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cykKLQl7Ci0JICBMaXN0IGZpbGVMaXN0ID0gZ2V0SUZpbGVzKHByb2plY3RzKTsKLSAgICAgIGZpbmFsIElFZGl0b3JQYXJ0W10gZGlydHlFZGl0b3JzID0gU2F2ZUZpbGVzSGVscGVyLmdldERpcnR5RWRpdG9ycyhmaWxlTGlzdCk7Ci0gICAgICBpZihkaXJ0eUVkaXRvcnMgPT0gbnVsbCB8fCBkaXJ0eUVkaXRvcnMubGVuZ3RoID09IDApcmV0dXJuIHRydWU7Ci0gICAgICBib29sZWFuIHNhdmVBdXRvbWF0aWNhbGx5ID0gZmFsc2U7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2F2ZUF1dG9tYXRpY2FsbHkgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldFNhdmVBdXRvbWF0aWNhbGx5KCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgCS8vIEluIHRoaXMgY2FzZSBzaW1wbHkgZGVmYXVsdCB0byBmYWxzZS4KLSAgICAgIH0KLSAgICAgIFNhdmVGaWxlc0RpYWxvZyBzZkRpYWxvZyA9IG51bGw7Ci0gICAgICBpZighc2F2ZUF1dG9tYXRpY2FsbHkpCi0gICAgICB7Ci0JICAgIHNmRGlhbG9nID0gbmV3IFNhdmVGaWxlc0RpYWxvZyhWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JICAgIHNmRGlhbG9nLnNldElucHV0KEFycmF5cy5hc0xpc3QoZGlydHlFZGl0b3JzKSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKHNhdmVBdXRvbWF0aWNhbGx5IHx8IHNmRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spewotICAgIAkgIFByb2dyZXNzTW9uaXRvckRpYWxvZyBjdHggPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICAgIAotICAgICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKXsKLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uewotICAgICAgICAgICAgCSAgdHJ5IHsKLSAgICAgICAgICAgIAkJICBtb25pdG9yLmJlZ2luVGFzayhWYWxpZGF0aW9uVUlNZXNzYWdlcy5TYXZlRmlsZXNEaWFsb2dfc2F2aW5nLCBkaXJ0eUVkaXRvcnMubGVuZ3RoKTsKLSAgICAgICAgICAgIAkJICBpbnQgbnVtRGlydHlFZGl0b3JzID0gZGlydHlFZGl0b3JzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtRGlydHlFZGl0b3JzOyBpKyspewotICAgICAgICAgICAgICAgICAgICAJICBkaXJ0eUVkaXRvcnNbaV0uZG9TYXZlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAkgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAJCSAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgICAgCi0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjdHgucnVuKGZhbHNlLCB0cnVlLCBydW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkgIFZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgfQotICAgICAgfQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdDxJRmlsZT4gZ2V0SUZpbGVzKE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IHByb2plY3RzKSB7Ci0JCUxpc3Q8SUZpbGU+IGZpbGVMaXN0ID0gbmV3IExpbmtlZExpc3Q8SUZpbGU+KCk7Ci0JCWZvcihJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMua2V5U2V0KCkpIHsKLQkJICBmb3IoSVJlc291cmNlIHJlc291cmNlIDogcHJvamVjdHMuZ2V0KHByb2plY3QpKSB7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKWZpbGVMaXN0LmFkZCgoSUZpbGUpcmVzb3VyY2UpOwotCQkgIH0KLQkJfQotCQlyZXR1cm4gZmlsZUxpc3Q7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvblVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5NjNiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBWYWxpZGF0aW9uIFVJLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS52YWxpZGF0aW9udWkiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19zYXZpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX2Fsd2F5c19zYXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmUGFnZV9hbHdheXNfc2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5WYWxpZGF0aW9uRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5hYmxlVG9TYXZlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbFJlc3VsdHM7Ci0KLQkvLyByZXN1bHRzIHZhbGlkYXRpbmcgb25lIHJlc291cmNlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsRXJyb3IxUmVzb3VyY2UxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbEVycm9yc1Jlc291cmNlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxXYXJuMVJlc291cmNlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxXYXJuUmVzb3VyY2UxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbEluZm8xUmVzb3VyY2UxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbEluZm9SZXNvdXJjZTE7Ci0KLQkvLyByZXN1bHRzIHZhbGlkYXRpbmcgbXVsdGlwbGUgcmVzb3VyY2VzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsRXJyb3IxUmVzb3VyY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbEVycm9yc1Jlc291cmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxXYXJuMVJlc291cmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxXYXJuUmVzb3VyY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbEluZm8xUmVzb3VyY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbEluZm9SZXNvdXJjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxTdWNjZXNzOwotCQotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFZhbGlkYXRpb25VSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRpb25VSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YThhY2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbk9wZXJhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhbiBJV29ya3NwYWNlUnVubmFibGUgdG8gdGhlIElSdW5uYWJsZVdpdGhQcm9ncmVzcy4gVGhpcyBjbGFzcyBuZWVkcyB0byBiZQotICogdXNlZCB3aGVuIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBmcm9tIGEgSVJ1bm5hYmxlQ29udGV4dC4KLSAqIAotICogQHNlZSBJUnVubmFibGVDb250ZXh0Ci0gKiBAc2VlIFZhbGlkYXRpb25VSVBsdWdpbiNnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyBDcmVhdGlvbiBkYXRlOiAoNS84LzIwMDEgMToyODo0NSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlciBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JcHJpdmF0ZSBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBoZWFkbGVzc1J1bm5hYmxlID0gbnVsbDsKLQlwcml2YXRlIElXb3Jrc3BhY2VSdW5uYWJsZSB3b3Jrc3BhY2VSdW5uYWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uT3BlcmF0aW9uIHZhbGlkYXRpb25PcGVyYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UKLQkgKiAgICAgICAgICAgICBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoSVdvcmtzcGFjZVJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIHsKLQkJc2V0SGVhZGxlc3NSdW5uYWJsZShhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyk7Ci0JfQotCi0JcHVibGljIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlcihJV29ya3NwYWNlUnVubmFibGUgYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIHsKLQkJc2V0V29ya3NwYWNlUnVubmFibGUoYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoVmFsaWRhdGlvbk9wZXJhdGlvbiBvcCkgewotCQlzZXRWYWxpZGF0aW9uT3BlcmF0aW9uKG9wKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBnZXRXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JICovCi0JcHJvdGVjdGVkIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGdldEhlYWRsZXNzUnVubmFibGUoKSB7Ci0JCXJldHVybiBoZWFkbGVzc1J1bm5hYmxlOwotCX0KLQotCXByb3RlY3RlZCBJV29ya3NwYWNlUnVubmFibGUgZ2V0V29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCXJldHVybiB3b3Jrc3BhY2VSdW5uYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW5uYWJsZVdpdGhQcm9ncmVzcwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0SGVhZGxlc3NSdW5uYWJsZSgpICE9IG51bGwpIHsKLQkJCQlnZXRIZWFkbGVzc1J1bm5hYmxlKCkucnVuKG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSAoZ2V0V29ya3NwYWNlUnVubmFibGUoKSA9PSBudWxsKSA/IHZhbGlkYXRpb25PcGVyYXRpb24gOiBnZXRXb3Jrc3BhY2VSdW5uYWJsZSgpOwotCQkJCWlmIChydW5uYWJsZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2Ugc2V0V29ya3NwYWNlUnVubmFibGUoSVdvcmtzcGFjZVJ1bm5hYmxlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEhlYWRsZXNzUnVubmFibGUoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmV3SGVhZGxlc3NSdW5uYWJsZSkgewotCQloZWFkbGVzc1J1bm5hYmxlID0gbmV3SGVhZGxlc3NSdW5uYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXb3Jrc3BhY2VSdW5uYWJsZShJV29ya3NwYWNlUnVubmFibGUgbmV3V29ya3NwYWNlUnVubmFibGUpIHsKLQkJd29ya3NwYWNlUnVubmFibGUgPSBuZXdXb3Jrc3BhY2VSdW5uYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWxpZGF0aW9uT3BlcmF0aW9uKFZhbGlkYXRpb25PcGVyYXRpb24gb3ApIHsKLQkJdmFsaWRhdGlvbk9wZXJhdGlvbiA9IG9wOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vVmFsaWRhdGlvblVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1ZhbGlkYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjA0OTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vVmFsaWRhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVUlQbHVnaW4gZXh0ZW5kcyBXVFBVSVBsdWdpbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvblVJUGx1Z2luIF9wbHVnaW4gPSBudWxsOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9QUk9QX0ZJTEVfTkFNRSA9ICJ2YWxpZGF0ZV91aSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElDT05fRElSUyA9IG5ldyBTdHJpbmdbXXsiaWNvbnMifTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFZhbGlkYXRpb25VSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKF9wbHVnaW4gPT0gbnVsbCkgewotCQkJX3BsdWdpbiA9IHRoaXM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCdW5kbGVOYW1lKCkgewotCQlyZXR1cm4gVkFMSURBVElPTl9QUk9QX0ZJTEVfTkFNRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25VSVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBfcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgU3RyaW5nIGZvdW5kIHdpdGggdGhlIGdpdmVuIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKFBsYXRmb3JtLmdldEJ1bmRsZShWQUxJREFUSU9OX1BMVUdJTl9JRCksIGtleSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgeW91IG5lZWQgdG8gcnVuIG9uZSBvZiBvdXIgaGVhZGxlc3Mgb3BlcmF0aW9ucyBpbiB0aGUKLQkgKiBVSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhJV29ya3NwYWNlUnVubmFibGUgYVdvcmtzcGFjZVJ1bm5hYmxlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFXb3Jrc3BhY2VSdW5uYWJsZSk7Ci0JfQotCi0vLwlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcykgewotLy8JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKLS8vCX0KLQotCS8vIE5lZWQgYSB0aGlyZCwgVmFsaWRhdGlvbk9wZXJhdGlvbiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLCBiZWNhdXNlIFZhbGlkYXRpb25PcGVyYXRpb24KLQkvLyBpcyBib3RoIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSBhbmQgYW4gSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MuIFRoaXMgbWV0aG9kIHdpbGwKLQkvLyBleGlzdCBvbmx5IHdoaWxlIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGV4aXN0cy4KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhWYWxpZGF0aW9uT3BlcmF0aW9uIG9wKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKG9wKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLy8Jb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyLnNldFJlc291cmNlVXRpbENsYXNzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMudWkuVUlSZXNvdXJjZVV0aWwuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSAuZ2lmIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCBpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0JCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJaW1hZ2UgPSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFVSTCBnZXRJbWFnZVVSTChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0SW1hZ2VVUkwoa2V5LCBnZXRCdW5kbGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXksIEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIGdpZiA9ICIvIiArIGtleSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElDT05fRElSUy5sZW5ndGg7IGkrKykgewotCQkJcGF0aCA9IG5ldyBQYXRoKElDT05fRElSU1tpXSkuYXBwZW5kKGdpZik7Ci0JCQlpZiAoUGxhdGZvcm0uZmluZChidW5kbGUscGF0aCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwoIGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKXsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ci0JCWdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQkKLQkvKiogCi0JICogV3JpdGUgYSBtZXNzYWdlIGludG8gdGhlIGxvZy4gCi0JICogCi0JICogV2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIG9mIG1vdmluZyB0byBhIG5ldyBhcHByb2FjaCBmb3IgbG9jYWxpemVkIG1lc3NhZ2VzLiBUaGlzIGlzIHRoZSBuZXcgCi0JICogYXBwcm9hY2ggZm9yIGV4Y2VwdGlvbnMuCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5IG1lc3NhZ2Ugc2V2ZXJpdHksIHNlZSBJU3RhdXMKLQkgKiBAcGFyYW0gbWVzc2FnZSBhIGxvY2FsaXplZCBtZXNzYWdlCi0JICovCi0JcHVibGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKXsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCWdldExvZygpLmxvZyhzdGF0dXMpOwotCQkKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwYzZmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlclJ1bGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzICYmIGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIFZhbGlkYXRvci5WMilyZXR1cm4gX3ZhbEFkYXB0b3I7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcyAmJiBhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXJHcm91cClyZXR1cm4gX2ZnQWRhcHRvcjsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzICYmIGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlclJ1bGUpcmV0dXJuIF9ydWxlQWRhcHRvcjsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzICYmIGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIFZhbGlkYXRvck11dGFibGUpcmV0dXJuIF92YWxNdXRhYmxlQWRhcHRvcjsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MgfTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hBZGFwdGVyIF92YWxBZGFwdG9yID0gbmV3IElXb3JrYmVuY2hBZGFwdGVyKCkgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuICgoVmFsaWRhdG9yLlYyKSBvKS5nZXRHcm91cHMoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAoKFZhbGlkYXRvci5WMikgbykuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9OwotCXByaXZhdGUgSVdvcmtiZW5jaEFkYXB0ZXIgX3ZhbE11dGFibGVBZGFwdG9yID0gbmV3IElXb3JrYmVuY2hBZGFwdGVyKCkgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuICgoVmFsaWRhdG9yTXV0YWJsZSkgbykuZ2V0R3JvdXBzKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gKChWYWxpZGF0b3JNdXRhYmxlKSBvKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hBZGFwdGVyIF9mZ0FkYXB0b3IgPSBuZXcgSVdvcmtiZW5jaEFkYXB0ZXIoKSB7Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gKChGaWx0ZXJHcm91cCkgbykuZ2V0UnVsZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJCUZpbHRlckdyb3VwIGZnID0gKEZpbHRlckdyb3VwKSBvOwotCQkJcmV0dXJuIGZnLmdldERpc3BsYXlhYmxlVHlwZSgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSVdvcmtiZW5jaEFkYXB0ZXIgX3J1bGVBZGFwdG9yID0gbmV3IElXb3JrYmVuY2hBZGFwdGVyKCkgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCQlGaWx0ZXJSdWxlIHJ1bGUgPSAoRmlsdGVyUnVsZSkgbzsKLQkJCXJldHVybiBydWxlLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvSGVscENvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL0hlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjdhZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW4uVmFsaWRhdGlvblVJUGx1Z2luOwotCi1wdWJsaWMgaW50ZXJmYWNlIEhlbHBDb250ZXh0SWRzIHsKLQlTdHJpbmcgUHJlZmVyZW5jZVBhZ2UgPSBWYWxpZGF0aW9uVUlQbHVnaW4uVkFMSURBVElPTl9QTFVHSU5fSUQgKyAiLmp2Z3AwMDAwIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBGaWx0ZXJSdWxlID0gVmFsaWRhdGlvblVJUGx1Z2luLlZBTElEQVRJT05fUExVR0lOX0lEICsgIi5qdmdwMDEwMCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZSRmlsZUV4dCA9IFZhbGlkYXRpb25VSVBsdWdpbi5WQUxJREFUSU9OX1BMVUdJTl9JRCArICIuanZncDAxMDEiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGUk5hbWUgPSBWYWxpZGF0aW9uVUlQbHVnaW4uVkFMSURBVElPTl9QTFVHSU5fSUQgKyAiLmp2Z3AwMTAyIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlJQcm9qZWN0TmF0dXJlID0gVmFsaWRhdGlvblVJUGx1Z2luLlZBTElEQVRJT05fUExVR0lOX0lEICsgIi5qdmdwMDEwMyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZSRmFjZXQgPSBWYWxpZGF0aW9uVUlQbHVnaW4uVkFMSURBVElPTl9QTFVHSU5fSUQgKyAiLmp2Z3AwMTA0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlJDb250ZW50VHlwZSA9IFZhbGlkYXRpb25VSVBsdWdpbi5WQUxJREFUSU9OX1BMVUdJTl9JRCArICIuanZncDAxMDUiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBQcm9qZWN0UGFnZSA9IFZhbGlkYXRpb25VSVBsdWdpbi5WQUxJREFUSU9OX1BMVUdJTl9JRCArICIuanZwcDAwMDAiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFByb2plY3RGaWx0ZXJSdWxlID0gVmFsaWRhdGlvblVJUGx1Z2luLlZBTElEQVRJT05fUExVR0lOX0lEICsgIi5qdnBwMDEwMCI7ICAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL0ltYWdlTmFtZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL0ltYWdlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3MzE3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9JbWFnZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWw7Ci0KLS8qKgotICogTmFtZXMgb2YgdGhlIGltYWdlcy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1hZ2VOYW1lcyB7Ci0JCi0JU3RyaW5nIG9rVGFibGUgCQk9ICJva190YmwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGZhaWxUYWJsZSAJPSAiZmFpbF90YmwiOyAvLyROT04tTkxTLTEkCQotCVN0cmluZyBzZXR0aW5ncyAJPSAic2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGRpc2FibGVkIAk9ICJfZGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9NYW51YWxWYWxpZGF0aW9uUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9NYW51YWxWYWxpZGF0aW9uUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MGJjY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvTWFudWFsVmFsaWRhdGlvblJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVzdWx0U3VtbWFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLmRpYWxvZy5SZXN1bHRzRGlhbG9nOwotCi0vKioKLSAqIFJ1biBhIG1hbnVhbCB2YWxpZGF0aW9uLiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW51YWxWYWxpZGF0aW9uUnVubmVyIGV4dGVuZHMgV29ya3NwYWNlSm9iIHsKLQkKLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IAlfcHJvamVjdHM7Ci0JcHJpdmF0ZSBWYWxUeXBlIF92YWxUeXBlOwotCXByaXZhdGUgYm9vbGVhbglfc2hvd1Jlc3VsdHM7Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIHNlbGVjdGVkIHByb2plY3RzIGFuZC9vciByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHByb2plY3RzCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0ZWQgcHJvamVjdHMuIFRoZSBrZXkgaXMgYW4gSVByb2plY3QgYW5kIHRoZSB2YWx1ZSBpcwotCSAqICAgICAgICAgICAgdGhlIFNldCBvZiBJUmVzb3VyY2VzIHRoYXQgd2VyZSBzZWxlY3RlZC4gT2Z0ZW4gdGhpcyB3aWxsIGJlCi0JICogICAgICAgICAgICBldmVyeSByZXNvdXJjZSBpbiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gaXNNYW51YWwKLQkgKiAgICAgICAgICAgIElzIHRoaXMgYSBtYW51YWwgdmFsaWRhdGlvbj8KLQkgKiAKLQkgKiBAcGFyYW0gaXNCdWlsZAotCSAqICAgICAgICAgICAgSXMgdGhpcyBhIGJ1aWxkIGJhc2VkIHZhbGlkYXRpb24/Ci0JICogCi0JICogQHBhcmFtIHNob3dSZXN1bHRzCi0JICogICAgICAgICAgICBXaGVuIHRoZSB2YWxpZGF0aW9uIGlzIGZpbmlzaGVkLCBzaG93IHRoZSByZXN1bHRzIGluIGEgZGlhbG9nIGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGUoTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4gcHJvamVjdHMsIFZhbFR5cGUgdmFsVHlwZSwgYm9vbGVhbiBzaG93UmVzdWx0cyl7Ci0JCU1hbnVhbFZhbGlkYXRpb25SdW5uZXIgbWUgPSBuZXcgTWFudWFsVmFsaWRhdGlvblJ1bm5lcihwcm9qZWN0cywgdmFsVHlwZSwgc2hvd1Jlc3VsdHMpOwotCQkKLQkJLy9UT0RPIG9wdGltaXplIHRoaXMsIEkgZG9uJ3QgbGlrZSB0aGUgaWRlYSBvZiB2YWxpZGF0b3JzIGhhdmluZyB0byBsb2NrIHRoZSBlbnRpcmUgcHJvamVjdAotCQlTZXQ8SVByb2plY3Q+IGtleXMgPSBwcm9qZWN0cy5rZXlTZXQoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0QXJyYXkgPSBuZXcgSVByb2plY3Rba2V5cy5zaXplKCldOwotCQlrZXlzLnRvQXJyYXkocHJvamVjdEFycmF5KTsKLQkJaWYgKHByb2plY3RBcnJheS5sZW5ndGggPT0gMSltZS5zZXRSdWxlKHByb2plY3RBcnJheVswXSk7Ci0JCWVsc2UgewotCQkJbWUuc2V0UnVsZShNdWx0aVJ1bGUuY29tYmluZShwcm9qZWN0QXJyYXkpKTsKLQkJfQotCQltZS5zY2hlZHVsZSgpOwotCX0KLQkKLQlwcml2YXRlIE1hbnVhbFZhbGlkYXRpb25SdW5uZXIoTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4gcHJvamVjdHMsIFZhbFR5cGUgdmFsVHlwZSwgYm9vbGVhbiBzaG93UmVzdWx0cyl7Ci0JCXN1cGVyKFZhbFVJTWVzc2FnZXMuVmFsaWRhdGlvbik7Ci0JCV9wcm9qZWN0cyA9IHByb2plY3RzOwotCQlfdmFsVHlwZSA9IHZhbFR5cGU7Ci0JCV9zaG93UmVzdWx0cyA9IHNob3dSZXN1bHRzOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlmaW5hbCBWYWxPcGVyYXRpb24gdm8gPSBWYWxpZGF0aW9uUnVubmVyLnZhbGlkYXRlKF9wcm9qZWN0cywgX3ZhbFR5cGUsIG1vbml0b3IsIGZhbHNlKTsKLQkJZmluYWwgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLQkJaW50IHJlc291cmNlQ291bnQgPSAwOwotCQlmb3IgKFNldCBzIDogX3Byb2plY3RzLnZhbHVlcygpKXJlc291cmNlQ291bnQgKz0gcy5zaXplKCk7Ci0JCWZpbmFsIGludCBmaW5hbFJlc291cmNlQ291bnQgPSByZXNvdXJjZUNvdW50OwotCQlpZiAodm8uaXNDYW5jZWxlZCgpKXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCi0JCWlmIChfc2hvd1Jlc3VsdHMpewotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlSdW5uYWJsZSBydW4gPSBuZXcgUnVubmFibGUoKXsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJVmFsaWRhdGlvblJlc3VsdFN1bW1hcnkgdnIgPSB2by5nZXRSZXN1bHQoKTsKLQkJCQkJUmVzdWx0c0RpYWxvZyByZCA9IG5ldyBSZXN1bHRzRGlhbG9nKG51bGwsIHZyLCB0aW1lLCBmaW5hbFJlc291cmNlQ291bnQpOwotCQkJCQlyZC5vcGVuKCk7Ci0JCQkJfQotCQkJCQotCQkJfTsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bik7CQkJCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvVmFsVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvVmFsVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWRhOWI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL1ZhbFVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgVmFsVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCSAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9WQUxJREFUSU9OX0JVSUxERVI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRl9CVVRUT05fT1ZFUlJJREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRl9WQUxMSVNUX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZfQlVUVE9OX0VOQUJMRUFMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGX0JVVFRPTl9ESVNBQkxFQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZfTU5VX01BTlVBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGX01OVV9CVUlMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGX01OVV9TRVRUSU5HUzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdXc1NldHRpbmdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvTm90U2hvd1Jlc3VsdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZWdhdGVzRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZWdhdGVzQ29tYm9MYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcnNXYXJuaW5nczsKLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkJGX0VYQ19JTlRFUk5BTF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQkZfRVhDX0lOVEVSTkFMX1BBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkJGX0VYQ19JTlZBTElEX1JFR0lTVEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU0FCTEVfVkFMSURBVElPTjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQU5VQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlVJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VUVElOR1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZCRl9VSV9OT19WQUxJREFUT1JTX0lOU1RBTExFRDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfc2F2aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZlBhZ2VfYWx3YXlzX3NhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZlBhZ2VDb25maXJtRGlhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RPdmVycmlkZXNOb3RBbGxvd2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1blZhbGlkYXRpb25EaWFsb2dUaXRsZTsKLQkKLQkvKiBWYWxpZGF0b3IgRmlsdGVycyAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmROb0ZpbHRlcnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJDb25maWc7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVySGVscDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdXR0b25BZGRHcm91cEluY2x1ZGU7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1dHRvbkFkZEdyb3VwRXhjbHVkZTsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnV0dG9uQWRkUnVsZTsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnV0dG9uUmVtb3ZlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsRXh0ZW5zaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbFByb2plY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsRmFjZXRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsQ29udGVudFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxFbmFibGVQcm9qZWN0U3BlY2lmaWM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY0V4dGVuc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjUHJvamVjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY0ZhY2V0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjQ29udGVudFR5cGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uU3RhdHVzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyclN1bW1hcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvblN1Y2Nlc3NmdWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJXaXphcmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJTZWxlY3RGaWx0ZXJUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRmlsZUV4dGVuc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZpbGVFeHRlbnNpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckNhc2VTZW5zaXRpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJFeGFjdE1hdGNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRm9sZGVyT3JGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRm9sZGVyT3JGaWxlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJCcm93c2VGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRmlsZUZpbHRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckJyb3dzZUZvbGRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZvbGRlckZpbHRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGclByb2plY3ROYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJQcm9qZWN0TmF0dXJlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRnJTaW1wbGVGaWxlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZhY2l0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRmFjaXRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGckNvbnRlbnRUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyQ29udGVudFR5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGck1zZ1NldjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWJ1aWxkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVidWlsZE1zZzsKLQkKLQkJCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVmFsVUlNZXNzYWdlcy5jbGFzcyk7Ci0JICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9GaWx0ZXJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9GaWx0ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2ZWFhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvRmlsdGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLmRpYWxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLlZhbGlkYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5WYWxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIERpc3BsYXkgYSBmaWx0ZXIgZGlhbG9nIGZvciBhIHBhcnRpY3VsYXIgVmFsaWRhdG9yLCB0aGF0IGlzIGEgbGlzdCBvZiBhbGwgdGhlIGZpbHRlcnMgdGhhdCBhcmUgYWN0aXZlIGZvcgotICogdGhlIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCi0JLyoqIAotCSAqIElmIHdlIGFyZSBkb2luZyBwcm9qZWN0IGxldmVsIGZpbHRlcnMgdGhpcyB3aWxsIHBvaW50IHRvIHRoZSBwcm9qZWN0LiBUaGlzIGlzIG51bGwgaWYgd2UgYXJlIGRvaW5nCi0JICogd29ya3NwYWNlIGxldmVsIGZpbHRlcnMuIAotCSAqLwotCXByaXZhdGUgSVByb2plY3QJX3Byb2plY3Q7Ci0JCi0JcHJpdmF0ZSBWYWxpZGF0b3JNdXRhYmxlIAlfdmFsaWRhdG9yOwotCQotCXByaXZhdGUgVHJlZVZpZXdlcgkJX3RyZWU7Ci0JcHJpdmF0ZSBDb21ibwkJCV9kZWxlZ2F0aW5nOwotCXByaXZhdGUgSUFkYXB0ZXJGYWN0b3J5IF9hZGFwdG9yRmFjdG9yeSA9IG5ldyBBZGFwdGVyRmFjdG9yeSgpOwotCQotCXByaXZhdGUgQnV0dG9uCQlfYWRkR3JvdXBJbmNsdWRlOwotCXByaXZhdGUgQnV0dG9uCQlfYWRkR3JvdXBFeGNsdWRlOwotCXByaXZhdGUgQnV0dG9uCQlfYWRkUnVsZTsKLQlwcml2YXRlIEJ1dHRvbgkJX3JlbW92ZTsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIJX25vZGVDaGFuZ2VkTGlzdGVuZXI7Ci0JCi0JLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZ3JvdXAuIElmIGEgcnVsZSBpcyBzZWxlY3RlZCBpbnN0ZWFkLCB0aGVuIHRoaXMgd2lsbCBiZSBudWxsLiAqLwotCXByaXZhdGUgRmlsdGVyR3JvdXAJX3NlbGVjdGVkR3JvdXA7Ci0JCi0JLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcnVsZS4gSWYgYSBncm91cCBpcyBzZWxlY3RlZCBpbnN0ZWFkLCB0aGVuIHRoaXMgd2lsbCBiZSBudWxsLiAqLwotCXByaXZhdGUgRmlsdGVyUnVsZQlfc2VsZWN0ZWRSdWxlOwotCQotCXByaXZhdGUgQ29tYm9bXQkJX21lc3NhZ2VTZXY7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX21lc3NhZ2VzID0gbmV3IFN0cmluZ1tdewotCQlWYWxNZXNzYWdlcy5TZXZFcnJvciwgVmFsTWVzc2FnZXMuU2V2V2FybmluZywgVmFsTWVzc2FnZXMuU2V2SWdub3JlfTsKLQkKLQlwcml2YXRlIFNoZWxsCQlfc2hlbGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZGlhbG9nIHRoYXQga25vd3MgaG93IHRvIGNoYW5nZSBhIHZhbGlkYXRvcidzIGZpbHRlcnMuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvciB0aGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgdXBkYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IHRoZSBmaWx0ZXJzIGFyZSBiZWluZyBhZGRlZCB0by4gSWYgdGhlc2UgYXJlIHdvcmtzcGFjZQotCSAqIGxldmVsIGZpbHRlcnMsIHRoZW4gdGhpcyBtdXN0IGJlIG51bGwuIAotCSAqLwotCXB1YmxpYyBGaWx0ZXJEaWFsb2coU2hlbGwgc2hlbGwsIFZhbGlkYXRvck11dGFibGUgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KXsKLQkJc3VwZXIoc2hlbGwpOwotCQlfc2hlbGwgPSBzaGVsbDsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuQ0xPU0V8U1dULk1JTnxTV1QuTUFYfFNXVC5SRVNJWkUpOwotCQlfdmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChOTFMuYmluZChWYWxVSU1lc3NhZ2VzLmZkVGl0bGUsIF92YWxpZGF0b3IuZ2V0TmFtZSgpKSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYyA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlpZiAoIV92YWxpZGF0b3IuaXNWMlZhbGlkYXRvcigpKXsKLQkJCW5ldyBMYWJlbChjLCBTV1QuTk9ORSkuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLmZkTm9GaWx0ZXJzKTsKLQkJfQotCQllbHNlIHsKLQkJCUxhYmVsIGJsdXJiID0gbmV3IExhYmVsKGMsIFNXVC5MRUZUIHwgU1dULldSQVApOwotCQkJYmx1cmIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCQlibHVyYi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRmlsdGVySGVscCk7Ci0JCQkKLQkJCV90cmVlID0gbmV3IFRyZWVWaWV3ZXIoYywgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkJX3RyZWUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkJUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5yZWdpc3RlckFkYXB0ZXJzKF9hZGFwdG9yRmFjdG9yeSwgVmFsaWRhdG9yTXV0YWJsZS5jbGFzcyk7Ci0JCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMoX2FkYXB0b3JGYWN0b3J5LCBGaWx0ZXJHcm91cC5jbGFzcyk7Ci0JCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMoX2FkYXB0b3JGYWN0b3J5LCBGaWx0ZXJSdWxlLmNsYXNzKTsKLQkJCV90cmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQkJCV90cmVlLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0JCQlfdHJlZS5zZXRJbnB1dChfdmFsaWRhdG9yKTsKLQkJCV90cmVlLmV4cGFuZEFsbCgpOwotCQkJCi0JCQlhZGRCdXR0b25zKGMpOwotCQkJCi0JCQlTdHJpbmcgZGVsZWdhdGluZ0lkID0gX3ZhbGlkYXRvci5nZXREZWxlZ2F0aW5nSWQoKTsKLQkJCWlmIChkZWxlZ2F0aW5nSWQgIT0gbnVsbCl7Ci0JCQkJYWRkRGVsZWdhdG9yU2VsZWN0aW9uKGMpOwotCQkJfQotCQkJCQotCQkJX25vZGVDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJX3NlbGVjdGVkR3JvdXAgPSBudWxsOwotCQkJCQlfc2VsZWN0ZWRSdWxlID0gbnVsbDsKLQkJCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbC5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEZpbHRlckdyb3VwKXsKLQkJCQkJCQlfc2VsZWN0ZWRHcm91cCA9IChGaWx0ZXJHcm91cClzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChzZWwuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBGaWx0ZXJSdWxlKXsKLQkJCQkJCQlfc2VsZWN0ZWRSdWxlID0gKEZpbHRlclJ1bGUpc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQkJCi0JCQlfdHJlZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoX25vZGVDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCi0JCQlhZGRNZXNzYWdlTWFwcGluZ3MoYyk7Ci0JCX0KLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEJ1dHRvbnMoQ29tcG9zaXRlIGMpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5UT1ApOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULlRPUCwgZmFsc2UsIGZhbHNlLCAxLCAxKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotCQlfYWRkR3JvdXBJbmNsdWRlID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GSUxMIHwgU1dULkNFTlRFUik7Ci0JCV9hZGRHcm91cEluY2x1ZGUuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkJ1dHRvbkFkZEdyb3VwSW5jbHVkZSk7Ci0JCV9hZGRHcm91cEluY2x1ZGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JCQotCQlfYWRkR3JvdXBJbmNsdWRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFkZEdyb3VwKGZhbHNlKTsJCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRHcm91cChmYWxzZSk7CQkJCQkJCi0JCQl9Ci0JCQkKLQkJfSk7Ci0JCQkKLQkJX2FkZEdyb3VwRXhjbHVkZSA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRklMTCB8IFNXVC5DRU5URVIpOwotCQlfYWRkR3JvdXBFeGNsdWRlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5CdXR0b25BZGRHcm91cEV4Y2x1ZGUpOwotCQlfYWRkR3JvdXBFeGNsdWRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCQkKLQkJX2FkZEdyb3VwRXhjbHVkZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRHcm91cCh0cnVlKTsJCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRHcm91cCh0cnVlKTsJCQkJCQkKLQkJCX0KLQkJCQotCQl9KTsKLQotCQlfYWRkUnVsZSA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRklMTCB8IFNXVC5DRU5URVIpOwotCQlfYWRkUnVsZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuQnV0dG9uQWRkUnVsZSk7Ci0JCV9hZGRSdWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCQlfYWRkUnVsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkb0l0KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkb0l0KCk7Ci0JCQl9Ci0JCQkKLQkJCXByaXZhdGUgdm9pZCBkb0l0KCl7Ci0JCQkJTmV3RmlsdGVyUnVsZSBuZnIgPSBuZXcgTmV3RmlsdGVyUnVsZShfcHJvamVjdCk7Ci0JCQkJV2l6YXJkRGlhbG9nIHdkID0gbmV3IFdpemFyZERpYWxvZyhfc2hlbGwsIG5mcik7Ci0JCQkJd2Quc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJaW50IHJjID0gd2Qub3BlbigpOwotCQkJCWlmIChyYyA9PSBXaXphcmREaWFsb2cuQ0FOQ0VMKXJldHVybjsKLQkJCQkKLQkJCQlGaWx0ZXJSdWxlIHJ1bGUgPSBuZnIuZ2V0UnVsZSgpOwotCQkJCWlmIChydWxlICE9IG51bGwpewotCQkJCQlGaWx0ZXJHcm91cCBuZXdHcm91cCA9IEZpbHRlckdyb3VwLmFkZFJ1bGUoX3NlbGVjdGVkR3JvdXAsIHJ1bGUpOwotCQkJCQlfdmFsaWRhdG9yLnJlcGxhY2VGaWx0ZXJHcm91cChfc2VsZWN0ZWRHcm91cCwgbmV3R3JvdXApOwotCQkJCQlfc2VsZWN0ZWRHcm91cCA9IG5ld0dyb3VwOwotCQkJCQlyZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCi0JCV9yZW1vdmUgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZJTEwgfCBTV1QuQ0VOVEVSKTsKLQkJX3JlbW92ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQkJX3JlbW92ZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuQnV0dG9uUmVtb3ZlKTsKLQkJX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmUoKTsJCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlKCk7CQkJCQkJCi0JCQl9CQkJCQotCQl9KTsKLQkJCi0JCUJ1dHRvbiByZXN0b3JlID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GSUxMIHwgU1dULkNFTlRFUik7Ci0JCXJlc3RvcmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JCVN0cmluZyBkZWZhdWx0cyA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiZGVmYXVsdHMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN0b3JlLnNldFRleHQoZGVmYXVsdHMpOwotCQlyZXN0b3JlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc3RvcmVEZWZhdWx0cygpOwkJCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXN0b3JlRGVmYXVsdHMoKTsJCQkJCQkKLQkJCX0JCQkJCi0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVzdG9yZURlZmF1bHRzKCkgewotCQlpZiAoX3ZhbGlkYXRvci5pc1YyVmFsaWRhdG9yKCkpewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaWQgPSBfdmFsaWRhdG9yLmdldElkKCk7Ci0JCQkJVmFsaWRhdG9yW10gdmFscyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdFZhbGlkYXRvcnMoKTsKLQkJCQlmb3IgKFZhbGlkYXRvciB2IDogdmFscyl7Ci0JCQkJCWlmICh2LmdldElkKCkuZXF1YWxzKGlkKSl7Ci0JCQkJCQlfdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvck11dGFibGUodik7Ci0JCQkJCQlfdHJlZS5zZXRJbnB1dChfdmFsaWRhdG9yKTsKLQkJCQkJCV90cmVlLmV4cGFuZEFsbCgpOwotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSl7Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JfQotCi0KLQlwcml2YXRlIHZvaWQgYWRkTWVzc2FnZU1hcHBpbmdzKENvbXBvc2l0ZSBjKSB7Ci0JCWlmICghX3ZhbGlkYXRvci5pc1YyVmFsaWRhdG9yKCkpcmV0dXJuOwotCQlNYXA8U3RyaW5nLE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IG1hcHBpbmdzID0gX3ZhbGlkYXRvci5nZXRNZXNzYWdlU2V0dGluZ3MoKTsKLQkJaWYgKG1hcHBpbmdzID09IG51bGwgfHwgbWFwcGluZ3Muc2l6ZSgpID09IDApcmV0dXJuOwotCQkKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoYywgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJNc2dTZXYpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQotLy8JCUxhYmVsIGhlYWRpbmcgPSBuZXcgTGFiZWwoYywgU1dULkxFRlQpOwotLy8JCWhlYWRpbmcuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkVycm9yc1dhcm5pbmdzKTsKLS8vCQloZWFkaW5nLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpKTsKLS8vCQloZWFkaW5nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCQkKLQkJX21lc3NhZ2VTZXYgPSBuZXcgQ29tYm9bbWFwcGluZ3Muc2l6ZSgpXTsKLQkJaW50IGk9IDA7Ci0JCWZvciAoTWVzc2FnZVNldmVyaXR5U2V0dGluZyBtcyA6IG1hcHBpbmdzLnZhbHVlcygpKXsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTEVGVCk7Ci0JCQlsYWJlbC5zZXRUZXh0KCIgICAiICsgbXMuZ2V0TGFiZWwoKSArICI6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlDb21ibyBzZXYgPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5SSUdIVCk7Ci0JCQlfbWVzc2FnZVNldltpKytdID0gc2V2OwotCQkJc2V2LnNldEl0ZW1zKF9tZXNzYWdlcyk7Ci0JCQlzZXYuc2VsZWN0KG1zLmdldEN1cnJlbnQoKS5vcmRpbmFsKCkpOwotCQkJc2V2LnNldERhdGEobXMpOwotCQkJc2V2LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2VsZWN0KGUpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2VsZWN0KGUpOwotCQkJCX0KLQkJCQkKLQkJCQlwcml2YXRlIHZvaWQgc2VsZWN0KFNlbGVjdGlvbkV2ZW50IGUpewotCQkJCQlDb21ibyB3ID0gKENvbWJvKWUud2lkZ2V0OwotCQkJCQlNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIG1zID0gKE1lc3NhZ2VTZXZlcml0eVNldHRpbmcpdy5nZXREYXRhKCk7Ci0JCQkJCWludCBpID0gdy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQlpZiAobXMuc2V0Q3VycmVudChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5LnZhbHVlcygpW2ldKSkKLQkJCQkJCV92YWxpZGF0b3IuYnVtcENoYW5nZUNvdW50TWVzc2FnZXMoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCX0KLQkJCi0JLyoqCi0JICogQWRkIGEgY29tYm8gYm94IHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNoYW5nZSB3aGljaCBkZWxlZ2F0aW5nIHZhbGlkYXRvciB0byBjYWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREZWxlZ2F0b3JTZWxlY3Rpb24oQ29tcG9zaXRlIGMpIHsKLQkJTWFwIG1hcCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVsZWdhdGVEZXNjcmlwdG9ycyhfdmFsaWRhdG9yLmdldFZhbGlkYXRvckNsYXNzbmFtZSgpKTsKLQkJaWYgKG1hcCA9PSBudWxsKXJldHVybjsKLQkJCi0JCUNvbXBvc2l0ZSBsaW5lID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuTk9ORSk7Ci0JCWxpbmUuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKLQkJbGluZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChsaW5lLCBTV1QuQ0VOVEVSKTsKLQkJbGFiZWwuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkRlbGVnYXRlc0NvbWJvTGFiZWwpOwotCi0JCQkJCi0JCV9kZWxlZ2F0aW5nID0gbmV3IENvbWJvKGxpbmUsIFNXVC5SRUFEX09OTFkpOwotCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbWFwLnNpemUoKV07Ci0JCWZpbmFsIFN0cmluZyBpZHNbXSA9IG5ldyBTdHJpbmdbbWFwLnNpemUoKV07Ci0JCVN0cmluZyBzZWxlY3RlZCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7aSsrKXsKLQkJCVZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciB2ZCA9IChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IpaXQubmV4dCgpOwotCQkJaXRlbXNbaV0gPSB2ZC5nZXROYW1lKCk7Ci0JCQlpZHNbaV0gPSB2ZC5nZXRJZCgpOwotCQkJaWYgKHZkLmdldElkKCkuZXF1YWxzKF92YWxpZGF0b3IuZ2V0RGVsZWdhdGluZ0lkKCkpKXsKLQkJCQlzZWxlY3RlZCA9IHZkLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlfZGVsZWdhdGluZy5zZXRJdGVtcyhpdGVtcyk7Ci0JCV9kZWxlZ2F0aW5nLnNldFRleHQoc2VsZWN0ZWQpOwotCQlfZGVsZWdhdGluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBzZWwgPSBfZGVsZWdhdGluZy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCV92YWxpZGF0b3Iuc2V0RGVsZWdhdGluZ0lkKGlkc1tzZWxdKTsKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBuZXcgZmlsdGVyIGdyb3VwIHRvIHRoZSB2YWxpZGF0b3IuCi0JICogQHBhcmFtIGV4Y2x1ZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkR3JvdXAoYm9vbGVhbiBleGNsdWRlKXsKLQkJaWYgKCFfdmFsaWRhdG9yLmlzVjJWYWxpZGF0b3IoKSlyZXR1cm47Ci0JCUZpbHRlclJ1bGVbXSBydWxlcyA9IG5ldyBGaWx0ZXJSdWxlWzBdOwotCQlfdmFsaWRhdG9yLmFkZChGaWx0ZXJHcm91cC5jcmVhdGUoZXhjbHVkZSwgcnVsZXMpKTsKLQkJcmVmcmVzaCgpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goKXsKLQkJX3RyZWUucmVmcmVzaCgpOwotCQlfdHJlZS5leHBhbmRBbGwoKTsKLQkJdXBkYXRlQnV0dG9ucygpOwkJCi0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gZnJvbSB0aGUgdmFsaWRhdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmUoKXsKLQkJaWYgKF9zZWxlY3RlZFJ1bGUgIT0gbnVsbCl7Ci0JCQlGaWx0ZXJHcm91cCBncm91cCA9IGZpbmRHcm91cChfc2VsZWN0ZWRSdWxlKTsKLQkJCWlmIChncm91cCAhPSBudWxsKXsKLQkJCQlGaWx0ZXJHcm91cCBuZXdHcm91cCA9IEZpbHRlckdyb3VwLnJlbW92ZVJ1bGUoZ3JvdXAsIF9zZWxlY3RlZFJ1bGUpOwotCQkJCV92YWxpZGF0b3IucmVwbGFjZUZpbHRlckdyb3VwKGdyb3VwLCBuZXdHcm91cCk7Ci0JCQkJcmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoX3NlbGVjdGVkR3JvdXAgIT0gbnVsbCl7Ci0JCQlfdmFsaWRhdG9yLnJlbW92ZShfc2VsZWN0ZWRHcm91cCk7Ci0JCQlyZWZyZXNoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgZ3JvdXAgaW4gdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHRoYXQgaGFzIHRoaXMgcnVsZS4KLQkgKiBAcGFyYW0gcnVsZSBUaGUgcnVsZSB0aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yLgotCSAqIEByZXR1cm4gbnVsbCBpZiB3ZSBjYW4gbm90IGZpbmQgdGhlIGdyb3VwLgotCSAqLwotCXByaXZhdGUgRmlsdGVyR3JvdXAgZmluZEdyb3VwKEZpbHRlclJ1bGUgcnVsZSkgewotCQlmb3IgKEZpbHRlckdyb3VwIGdyb3VwIDogX3ZhbGlkYXRvci5nZXRHcm91cHMoKSl7Ci0JCQlmb3IgKEZpbHRlclJ1bGUgZnIgOiBncm91cC5nZXRSdWxlcygpKXsKLQkJCQlpZiAoZnIuZXF1YWxzKHJ1bGUpKXJldHVybiBncm91cDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJaWYgKF92YWxpZGF0b3IuaXNWMlZhbGlkYXRvcigpKXsKLQkJCV9hZGRHcm91cEV4Y2x1ZGUuc2V0RW5hYmxlZCghVmFsaWRhdG9ySGVscGVyLmhhc0V4Y2x1ZGVHcm91cChfdmFsaWRhdG9yKSk7Ci0JCX0KLQkJX2FkZFJ1bGUuc2V0RW5hYmxlZChfc2VsZWN0ZWRHcm91cCAhPSBudWxsKTsKLQkJX3JlbW92ZS5zZXRFbmFibGVkKF9zZWxlY3RlZEdyb3VwICE9IG51bGwgfHwgX3NlbGVjdGVkUnVsZSAhPSBudWxsKTsKLQkJaWYgKF9tZXNzYWdlU2V2ICE9IG51bGwpewotCQkJTWFwPFN0cmluZyxNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBtc2dzID0gX3ZhbGlkYXRvci5nZXRNZXNzYWdlU2V0dGluZ3MoKTsKLQkJCWlmIChtc2dzICE9IG51bGwgJiYgX21lc3NhZ2VTZXYubGVuZ3RoID09IG1zZ3Muc2l6ZSgpKXsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJZm9yIChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIG1zIDogbXNncy52YWx1ZXMoKSl7Ci0JCQkJCV9tZXNzYWdlU2V2W2krK10uc2VsZWN0KG1zLmdldEN1cnJlbnQoKS5vcmRpbmFsKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCVBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkudW5yZWdpc3RlckFkYXB0ZXJzKF9hZGFwdG9yRmFjdG9yeSk7Ci0JCWlmIChfdHJlZSAhPSBudWxsKV90cmVlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihfbm9kZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoNjAwLCA0NzUpOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0b3JNdXRhYmxlIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvZGlhbG9nL05ld0ZpbHRlclJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9OZXdGaWx0ZXJSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjRiOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvZGlhbG9nL05ld0ZpbHRlclJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuZGlhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlclJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuVmFsVUlNZXNzYWdlczsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGFkZHMgbmV3IHJ1bGVzIHRvIHZhbGlkYXRvcnMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmV3RmlsdGVyUnVsZSBleHRlbmRzIFdpemFyZCB7Ci0JCi0JcHJpdmF0ZSBQYWdlMSAJCQlfcGFnZTE7Ci0JcHJpdmF0ZSBJV2l6YXJkUGFnZQkJX3BhZ2UyOwotCQotCXByaXZhdGUgSVByb2plY3QJCV9wcm9qZWN0OwotCQotCXByaXZhdGUgRmlsdGVyUnVsZQkJX3J1bGU7Ci0JCi0JcHVibGljIE5ld0ZpbHRlclJ1bGUoSVByb2plY3QgcHJvamVjdCl7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQkJc2V0V2luZG93VGl0bGUoVmFsVUlNZXNzYWdlcy5GcldpemFyZCk7Ci0JCV9wYWdlMSA9IG5ldyBQYWdlMShwcm9qZWN0KTsKLQkJYWRkUGFnZShfcGFnZTEpOwotCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsJCi0JCWlmIChfcGFnZTIgIT0gbnVsbClyZXR1cm4gX3BhZ2UyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCXB1YmxpYyBGaWx0ZXJSdWxlIGdldFJ1bGUoKXsKLQkJcmV0dXJuIF9ydWxlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlpZiAoX3BhZ2UyID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlGaWx0ZXJXaXphcmRQYWdlIHBhZ2UgPSAoRmlsdGVyV2l6YXJkUGFnZSlfcGFnZTI7Ci0JCV9ydWxlID0gcGFnZS5nZXRGaWx0ZXJSdWxlKCk7Ci0JCXJldHVybiBfcnVsZSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpZiAocGFnZSA9PSBfcGFnZTEpewotCQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKGZhbHNlKTsKLQkJCV9wYWdlMiA9IHJldHVybk9yQnVpbGRQYWdlKF9wYWdlMS5nZXRTZWxlY3RlZEZpbHRlcigpKTsKLQkJCXJldHVybiBfcGFnZTI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVdpemFyZFBhZ2UgcmV0dXJuT3JCdWlsZFBhZ2UoaW50IHNlbGVjdGVkRmlsdGVyKSB7Ci0JCQlJV2l6YXJkUGFnZSBwYWdlID0gIG51bGw7Ci0JCQlpZiAoX3Byb2plY3QgIT0gbnVsbCAmJiBzZWxlY3RlZEZpbHRlciA9PSAyKXNlbGVjdGVkRmlsdGVyID0gNDsKLQkJCXN3aXRjaCAoc2VsZWN0ZWRGaWx0ZXIpewotCQkJY2FzZSAwOgotCQkJCXBhZ2UgPSBuZXcgRmlsZUV4dFBhZ2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlwYWdlID0gbmV3IEZpbGVQYWdlKF9wcm9qZWN0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlwYWdlID0gbmV3IFByb2plY3RQYWdlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJcGFnZSA9IG5ldyBGYWNldFBhZ2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlwYWdlID0gbmV3IENvbnRlbnRUeXBlUGFnZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQlhZGRQYWdlKHBhZ2UpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBhZ2UxIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JCQotCQlwcml2YXRlIGludCAJCV9zZWxlY3RlZEZpbHRlcjsKLQkJcHJpdmF0ZSBJUHJvamVjdAlfcHJvamVjdDsKLQotCQkKLQkJcHVibGljIFBhZ2UxKElQcm9qZWN0IHByb2plY3QpewotCQkJc3VwZXIoInBhZ2UxIiwgVmFsVUlNZXNzYWdlcy5GclNlbGVjdEZpbHRlclR5cGUsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJU3RyaW5nIGhlbHBJZCA9IF9wcm9qZWN0ID09IG51bGwgPyBIZWxwQ29udGV4dElkcy5GaWx0ZXJSdWxlIDogSGVscENvbnRleHRJZHMuUHJvamVjdEZpbHRlclJ1bGU7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgaGVscElkKTsKLQkJCVN0cmluZ1tdIGxhYmVscyA9IG51bGw7Ci0JCQlTdHJpbmdbXSBkZXNjID0gbnVsbDsKLQkJCWlmIChfcHJvamVjdCAhPSBudWxsKXsKLQkJCQlsYWJlbHMgPSBuZXcgU3RyaW5nW117VmFsVUlNZXNzYWdlcy5MYWJlbEV4dGVuc2lvbiwgVmFsVUlNZXNzYWdlcy5MYWJlbEZpbGUsCi0JCQkJCQlWYWxVSU1lc3NhZ2VzLkxhYmVsQ29udGVudFR5cGV9OwotCQkJCQotCQkJCWRlc2MgPSBuZXcgU3RyaW5nW117VmFsVUlNZXNzYWdlcy5EZXNjRXh0ZW5zaW9uLCBWYWxVSU1lc3NhZ2VzLkRlc2NGaWxlLAotCQkJCQkJVmFsVUlNZXNzYWdlcy5EZXNjQ29udGVudFR5cGV9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbGFiZWxzID0gbmV3IFN0cmluZ1tde1ZhbFVJTWVzc2FnZXMuTGFiZWxFeHRlbnNpb24sIFZhbFVJTWVzc2FnZXMuTGFiZWxGaWxlLAotCQkJCQkJVmFsVUlNZXNzYWdlcy5MYWJlbFByb2plY3RzLCBWYWxVSU1lc3NhZ2VzLkxhYmVsRmFjZXRzLAotCQkJCQkJVmFsVUlNZXNzYWdlcy5MYWJlbENvbnRlbnRUeXBlfTsKLQkJCQkKLQkJCQlkZXNjID0gbmV3IFN0cmluZ1tde1ZhbFVJTWVzc2FnZXMuRGVzY0V4dGVuc2lvbiwgVmFsVUlNZXNzYWdlcy5EZXNjRmlsZSwKLQkJCQkJCVZhbFVJTWVzc2FnZXMuRGVzY1Byb2plY3RzLCBWYWxVSU1lc3NhZ2VzLkRlc2NGYWNldHMsIAotCQkJCQkJVmFsVUlNZXNzYWdlcy5EZXNjQ29udGVudFR5cGV9OwotCQkJfQotCQkJCi0JCQlDb21wb3NpdGUgY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZG9JdChlKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRvSXQoZSk7Ci0JCQkJfQotCQkJCQotCQkJCXByaXZhdGUgdm9pZCBkb0l0KFNlbGVjdGlvbkV2ZW50IGUpewotCQkJCQlpZiAoZS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEJ1dHRvbil7Ci0JCQkJCQlCdXR0b24gYiA9IChCdXR0b24pZS5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChiLmdldERhdGEoKSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQkJCQlJbnRlZ2VyIGluZGV4ID0gKEludGVnZXIpIGIuZ2V0RGF0YSgpOwotCQkJCQkJCXNldFNlbGVjdGVkRmlsdGVyKGluZGV4LmludFZhbHVlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfTsKLQkJCWZvciAoaW50IGk9MDsgaTxsYWJlbHMubGVuZ3RoOyBpKyspewotCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5SQURJTyk7Ci0JCQkJYnV0dG9uLnNldFRleHQobGFiZWxzW2ldKTsKLQkJCQlidXR0b24uc2V0RGF0YShuZXcgSW50ZWdlcihpKSk7CQkJCi0JCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCQkobmV3IFRleHQoY29udHJvbCwgU1dULldSQVB8U1dULlJFQURfT05MWSkpLnNldFRleHQoZGVzY1tpXSk7Ci0JCQkJaWYgKGkgPT0gMClidXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwkJCQkKLQkJCX0JCQkKLQkJCXNldENvbnRyb2woY29udHJvbCk7CQkJCi0JCX0KLQotCQlwdWJsaWMgaW50IGdldFNlbGVjdGVkRmlsdGVyKCkgewotCQkJcmV0dXJuIF9zZWxlY3RlZEZpbHRlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkRmlsdGVyKGludCBzZWxlY3RlZEZpbHRlcikgewotCQkJX3NlbGVjdGVkRmlsdGVyID0gc2VsZWN0ZWRGaWx0ZXI7Ci0JCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQkJCQkJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVFeHRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIEZpbHRlcldpemFyZFBhZ2UgewotCQkKLQkJcHJpdmF0ZSBUZXh0IAlfcGF0dGVybjsKLQkJcHJpdmF0ZSBCdXR0b24JX2Nhc2U7Ci0JCQotCQlwdWJsaWMgRmlsZUV4dFBhZ2UoKXsKLQkJCXN1cGVyKCJmaWxlZXh0IiwgVmFsVUlNZXNzYWdlcy5GckZpbGVFeHRlbnNpb24sIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBIZWxwQ29udGV4dElkcy5GUkZpbGVFeHQpOwotCQkJQ29tcG9zaXRlIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJc2V0Q29udHJvbChjb250cm9sKTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQkobmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKSkuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZyRmlsZUV4dGVuc2lvbkxhYmVsKTsKLQkJCV9wYXR0ZXJuID0gbmV3IFRleHQoY29udHJvbCwgU1dULkJPUkRFUik7Ci0JCQlfcGF0dGVybi5zZXRGb2N1cygpOwotCQkJX3BhdHRlcm4uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0KLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQkJCi0JCQlfY2FzZSA9IG5ldyBCdXR0b24oY29udHJvbCwgU1dULkNIRUNLKTsKLQkJCV9jYXNlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckNhc2VTZW5zaXRpdmUpOwotCQkJX2Nhc2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCV9jYXNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5CRUdJTk5JTkcsZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCQkKLQkJfQotCi0JCXB1YmxpYyBGaWx0ZXJSdWxlIGdldEZpbHRlclJ1bGUoKSB7Ci0JCQlpZiAoIWlzUGFnZUNvbXBsZXRlKCkpcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gRmlsdGVyUnVsZS5GaWxlRXh0LmNyZWF0ZUZpbGVFeHQoX3BhdHRlcm4uZ2V0VGV4dCgpLCBfY2FzZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJcmV0dXJuIF9wYXR0ZXJuICE9IG51bGwgJiYgX3BhdHRlcm4uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JCX0KLQkJCi0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIEZpbHRlcldpemFyZFBhZ2UgewotCQkKLQkJcHJpdmF0ZSBUZXh0IAlfcGF0dGVybjsKLQkJcHJpdmF0ZSBCdXR0b24JX2Jyb3dzZUZpbGU7Ci0JCXByaXZhdGUgQnV0dG9uCV9icm93c2VGb2xkZXI7Ci0JCXByaXZhdGUgQnV0dG9uCV9jYXNlOwotCQlwcml2YXRlIEJ1dHRvbglfc2ltcGxlRmlsZU5hbWU7Ci0JCQotCQlwcml2YXRlIElQcm9qZWN0CV9wcm9qZWN0OwotCQlwcml2YXRlIGludAkJCV90eXBlID0gRmlsdGVyUnVsZS5GaWxlLkZpbGVUeXBlRmlsZTsKLQkJcHJpdmF0ZSBJUGF0aAkJX2Z1bGxGaWxlTmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcJCV9yb290OwotCQkKLQkJcHVibGljIEZpbGVQYWdlKElQcm9qZWN0IHByb2plY3QpewotCQkJc3VwZXIoImZpbGUiLCBWYWxVSU1lc3NhZ2VzLkZyRm9sZGVyT3JGaWxlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSGVscENvbnRleHRJZHMuRlJOYW1lKTsKLQkJCWZpbmFsIENvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXNldENvbnRyb2woY29udHJvbCk7Ci0JCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSkpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckZvbGRlck9yRmlsZUxhYmVsKTsKLQkJCV9wYXR0ZXJuID0gbmV3IFRleHQoY29udHJvbCwgU1dULkJPUkRFUik7Ci0JCQlfcGF0dGVybi5zZXRGb2N1cygpOwotCQkJX3BhdHRlcm4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMzAwLCBTV1QuREVGQVVMVCkpOwotCQkJX3BhdHRlcm4uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0KLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCi0JCQlfcm9vdCA9IG51bGw7Ci0JCQlJUGF0aCBiYXNlID0gX3Byb2plY3QgPT0gbnVsbCA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKSA6Ci0JCQkJX3Byb2plY3QuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChiYXNlICE9IG51bGwpX3Jvb3QgPSBiYXNlLnRvT1NTdHJpbmcoKTsKLQkJCQkJCQotCQkJX2Jyb3dzZUZpbGUgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5QVVNIKTsKLQkJCV9icm93c2VGaWxlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckJyb3dzZUZpbGUpOwotCQkJX2Jyb3dzZUZpbGUuc2V0RW5hYmxlZChfcm9vdCAhPSBudWxsKTsKLQkJCV9icm93c2VGaWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJYnJvd3NlKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlicm93c2UoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHJpdmF0ZSB2b2lkIGJyb3dzZSgpewotCQkJCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coY29udHJvbC5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJCWZkLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckZpbGVGaWx0ZXIpOwotCQkJCQlmZC5zZXRGaWx0ZXJQYXRoKF9yb290KTsKLQkJCQkJCi0JCQkJCVN0cmluZyBmaWxlID0gZmQub3BlbigpOwotCQkJCQlpZiAoZmlsZSAhPSBudWxsKXsKLQkJCQkJCWlmIChmaWxlLnN0YXJ0c1dpdGgoX3Jvb3QpKWZpbGUgPSBmaWxlLnN1YnN0cmluZyhfcm9vdC5sZW5ndGgoKSsxKTsKLQkJCQkJCWVsc2UgZmlsZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJaWYgKGZpbGUgIT0gbnVsbCl7Ci0JCQkJCQlfZnVsbEZpbGVOYW1lID0gbmV3IFBhdGgoZmlsZSk7Ci0JCQkJCQlpZiAoX3Byb2plY3QgPT0gbnVsbClfZnVsbEZpbGVOYW1lID0gX2Z1bGxGaWxlTmFtZS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCi0JCQkJCQlpZiAoX3NpbXBsZUZpbGVOYW1lLmdldFNlbGVjdGlvbigpKXsKLQkJCQkJCQlfdHlwZSA9IEZpbHRlclJ1bGUuRmlsZS5GaWxlVHlwZUZpbGU7Ci0JCQkJCQkJX3BhdHRlcm4uc2V0VGV4dChfZnVsbEZpbGVOYW1lLmxhc3RTZWdtZW50KCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJX3R5cGUgPSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGdWxsOwotCQkJCQkJCV9wYXR0ZXJuLnNldFRleHQoX2Z1bGxGaWxlTmFtZS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJX2Z1bGxGaWxlTmFtZSA9IG51bGw7Ci0JCQkJCQlfcGF0dGVybi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0pOwotCQkJCi0JCQlfYnJvd3NlRm9sZGVyID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUFVTSCk7Ci0JCQlfYnJvd3NlRm9sZGVyLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckJyb3dzZUZvbGRlcik7Ci0JCQlfYnJvd3NlRm9sZGVyLnNldEVuYWJsZWQoX3Jvb3QgIT0gbnVsbCk7Ci0JCQlfYnJvd3NlRm9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJYnJvd3NlKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlicm93c2UoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHJpdmF0ZSB2b2lkIGJyb3dzZSgpewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZmQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbnRyb2wuZ2V0U2hlbGwoKSk7Ci0JCQkJCWZkLnNldE1lc3NhZ2UoVmFsVUlNZXNzYWdlcy5GckZvbGRlckZpbHRlcik7Ci0JCQkJCWZkLnNldEZpbHRlclBhdGgoX3Jvb3QpOwotCQkJCQlTdHJpbmcgZGlyID0gZmQub3BlbigpOwotCQkJCQlpZiAoZGlyICE9IG51bGwpewotCQkJCQkJX2Z1bGxGaWxlTmFtZSA9IG51bGw7Ci0JCQkJCQlfdHlwZSA9IEZpbHRlclJ1bGUuRmlsZS5GaWxlVHlwZUZvbGRlcjsKLQkJCQkJCWlmIChkaXIuc3RhcnRzV2l0aChfcm9vdCkgJiYgZGlyLmxlbmd0aCgpID4gX3Jvb3QubGVuZ3RoKCkpewotCQkJCQkJCWRpciA9IGRpci5zdWJzdHJpbmcoX3Jvb3QubGVuZ3RoKCkrMSk7Ci0JCQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpcik7Ci0JCQkJCQkJaWYgKF9wcm9qZWN0ID09IG51bGwpcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJCQlfcGF0dGVybi5zZXRUZXh0KHBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCV9wYXR0ZXJuLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJCQotCQkJX2Nhc2UgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5DSEVDSyk7Ci0JCQlfY2FzZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJDYXNlU2Vuc2l0aXZlKTsKLQkJCV9jYXNlLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlfY2FzZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLGZhbHNlLCBmYWxzZSwgNCwgMSkpOwotCQkJCi0JCQlhZGRTaW1wbGVGaWxlTmFtZUJ1dHRvbihjb250cm9sKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRTaW1wbGVGaWxlTmFtZUJ1dHRvbihmaW5hbCBDb21wb3NpdGUgY29udHJvbCkgewotCQkJX3NpbXBsZUZpbGVOYW1lID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuQ0hFQ0spOwotCQkJX3NpbXBsZUZpbGVOYW1lLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GclNpbXBsZUZpbGVOYW1lKTsKLQkJCV9zaW1wbGVGaWxlTmFtZS5zZXRTZWxlY3Rpb24oX3R5cGUgPT0gRmlsdGVyUnVsZS5GaWxlLkZpbGVUeXBlRmlsZSk7Ci0JCQlfc2ltcGxlRmlsZU5hbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORyxmYWxzZSwgZmFsc2UsIDQsIDEpKTsKLQkJCQotCQkJX3NpbXBsZUZpbGVOYW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChfdHlwZSA9PSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGb2xkZXIpcmV0dXJuOwotCQkJCQlpZiAoX3NpbXBsZUZpbGVOYW1lLmdldFNlbGVjdGlvbigpKXsKLQkJCQkJCWlmIChfZnVsbEZpbGVOYW1lICE9IG51bGwpX3BhdHRlcm4uc2V0VGV4dChfZnVsbEZpbGVOYW1lLmxhc3RTZWdtZW50KCkpOwotCQkJCQkJX3R5cGUgPSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGaWxlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKF9mdWxsRmlsZU5hbWUgIT0gbnVsbClfcGF0dGVybi5zZXRUZXh0KF9mdWxsRmlsZU5hbWUudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQkJCV90eXBlID0gRmlsdGVyUnVsZS5GaWxlLkZpbGVUeXBlRnVsbDsJCQkJCX0KLQkJCQkJfQkJCQkKLQkJCQl9KTsKLQkJfQotCi0JCXB1YmxpYyBGaWx0ZXJSdWxlIGdldEZpbHRlclJ1bGUoKSB7Ci0JCQlpZiAoIWlzUGFnZUNvbXBsZXRlKCkpcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gRmlsdGVyUnVsZS5jcmVhdGVGaWxlKF9wYXR0ZXJuLmdldFRleHQoKSwgX2Nhc2UuZ2V0U2VsZWN0aW9uKCksIF90eXBlKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlpZiAoX3BhdHRlcm4gPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoX3BhdHRlcm4uZ2V0VGV4dCgpID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIF9wYXR0ZXJuLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb2plY3RQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIEZpbHRlcldpemFyZFBhZ2V7Ci0JCQotCQlwcml2YXRlIENvbWJvCQlfbmF0dXJlczsKLQkJcHJpdmF0ZSBTdHJpbmdbXQlfaWRzOwotCQkKLQkJcHVibGljIFByb2plY3RQYWdlKCl7Ci0JCQlzdXBlcigicHJvamVjdCIsIFZhbFVJTWVzc2FnZXMuRnJQcm9qZWN0TmF0dXJlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSGVscENvbnRleHRJZHMuRlJQcm9qZWN0TmF0dXJlKTsKLQkJCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXNldENvbnRyb2woY29udHJvbCk7Ci0JCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSkpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GclByb2plY3ROYXR1cmVMYWJlbCk7Ci0JCQkKLQkJCUlQcm9qZWN0TmF0dXJlRGVzY3JpcHRvcltdIHBuID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldE5hdHVyZURlc2NyaXB0b3JzKCk7Ci0JCQlTdHJpbmcgaXRlbXNbXSA9IG5ldyBTdHJpbmdbcG4ubGVuZ3RoXTsKLQkJCV9pZHMgPSBuZXcgU3RyaW5nW3BuLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPTA7IGk8cG4ubGVuZ3RoOyBpKyspewotCQkJCV9pZHNbaV0gPSBwbltpXS5nZXROYXR1cmVJZCgpOwotCQkJCWl0ZW1zW2ldID0gcG5baV0uZ2V0TGFiZWwoKSArICIgLSAiICsgX2lkc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJX25hdHVyZXMgPSBuZXcgQ29tYm8oY29udHJvbCwgU1dULkRST1BfRE9XTik7Ci0JCQlfbmF0dXJlcy5zZXRJdGVtcyhpdGVtcyk7Ci0JCQlfbmF0dXJlcy5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJCQkJCQotCQl9Ci0KLQkJcHVibGljIEZpbHRlclJ1bGUgZ2V0RmlsdGVyUnVsZSgpIHsKLQkJCWlmICghaXNQYWdlQ29tcGxldGUoKSlyZXR1cm4gbnVsbDsKLQkJCWludCBpID0gX25hdHVyZXMuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWlmIChpID09IC0xKXJldHVybiBudWxsOwotCQkJCi0JCQlyZXR1cm4gRmlsdGVyUnVsZS5jcmVhdGVQcm9qZWN0KF9pZHNbaV0pOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCWlmIChfbmF0dXJlcyA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJCWlmIChfbmF0dXJlcy5nZXRUZXh0KCkgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gX25hdHVyZXMuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JCX0KLQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGYWNldFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgRmlsdGVyV2l6YXJkUGFnZSB7Ci0JCQotCQlwcml2YXRlIFRleHQJX3BhdHRlcm47Ci0JCQotCQlwdWJsaWMgRmFjZXRQYWdlKCl7Ci0JCQlzdXBlcigiZmFjZXQiLCBWYWxVSU1lc3NhZ2VzLkZyRmFjaXQsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBIZWxwQ29udGV4dElkcy5GUkZhY2V0KTsKLQkJCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXNldENvbnRyb2woY29udHJvbCk7Ci0JCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSkpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckZhY2l0TGFiZWwpOwotCQkJX3BhdHRlcm4gPSBuZXcgVGV4dChjb250cm9sLCBTV1QuQk9SREVSKTsKLQkJCV9wYXR0ZXJuLnNldEZvY3VzKCk7Ci0JCQlfcGF0dGVybi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgzMDAsIFNXVC5ERUZBVUxUKSk7Ci0JCQlfcGF0dGVybi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0KLQotCQlwdWJsaWMgRmlsdGVyUnVsZSBnZXRGaWx0ZXJSdWxlKCkgewotCQkJaWYgKCFpc1BhZ2VDb21wbGV0ZSgpKXJldHVybiBudWxsOwotCQkJRmlsdGVyUnVsZSBydWxlID0gRmlsdGVyUnVsZS5jcmVhdGVGYWNldChfcGF0dGVybi5nZXRUZXh0KCkpOwotCQkJcmV0dXJuIHJ1bGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJaWYgKF9wYXR0ZXJuID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQkJaWYgKF9wYXR0ZXJuLmdldFRleHQoKSA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb250ZW50VHlwZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgRmlsdGVyV2l6YXJkUGFnZSB7Ci0JCXByaXZhdGUgQ29tYm8JX3BhdHRlcm47Ci0JCXByaXZhdGUgQnV0dG9uCV9leGFjdE1hdGNoOwotCQlwcml2YXRlIE1hcDxTdHJpbmcsIElDb250ZW50VHlwZT4gX21hcDsKLQkJCi0JCXB1YmxpYyBDb250ZW50VHlwZVBhZ2UoKXsKLQkJCXN1cGVyKCJjb250ZW50VHlwZSIsIFZhbFVJTWVzc2FnZXMuRnJDb250ZW50VHlwZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIEhlbHBDb250ZXh0SWRzLkZSQ29udGVudFR5cGUpOwotCQkJQ29tcG9zaXRlIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJc2V0Q29udHJvbChjb250cm9sKTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQkobmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKSkuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZyQ29udGVudFR5cGVMYWJlbCk7Ci0JCQkKLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0QWxsQ29udGVudFR5cGVzKCk7Ci0JCQlfbWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBJQ29udGVudFR5cGU+KCk7Ci0JCQlmb3IgKElDb250ZW50VHlwZSB0eXBlIDogdHlwZXMpewotCQkJCVN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCluYW1lID0gdHlwZS5nZXRJZCgpOwotCQkJCV9tYXAucHV0KG5hbWUsIHR5cGUpOwotCQkJfQotCQkJU3RyaW5nIGl0ZW1zW10gPSBuZXcgU3RyaW5nW19tYXAuc2l6ZSgpXTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoU3RyaW5nIGxhYmVsIDogX21hcC5rZXlTZXQoKSl7Ci0JCQkJaXRlbXNbaSsrXSA9IGxhYmVsOwotCQkJfQotCQkJX3BhdHRlcm4gPSBuZXcgQ29tYm8oY29udHJvbCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQkJX3BhdHRlcm4uc2V0Rm9jdXMoKTsKLQkJCV9wYXR0ZXJuLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDMwMCwgU1dULkRFRkFVTFQpKTsKLQkJCV9wYXR0ZXJuLnNldFZpc2libGVJdGVtQ291bnQoMjApOwotCQkJX3BhdHRlcm4uc2V0SXRlbXMoaXRlbXMpOwotCQkJX3BhdHRlcm4uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0KLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQkJCi0JCQlfZXhhY3RNYXRjaCA9IG5ldyBCdXR0b24oY29udHJvbCwgU1dULkNIRUNLKTsKLQkJCV9leGFjdE1hdGNoLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckV4YWN0TWF0Y2gpOwotCQkJX2V4YWN0TWF0Y2guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCV9leGFjdE1hdGNoLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5CRUdJTk5JTkcsZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0KLQkJfQotCi0JCXB1YmxpYyBGaWx0ZXJSdWxlIGdldEZpbHRlclJ1bGUoKSB7Ci0JCQlpZiAoIWlzUGFnZUNvbXBsZXRlKCkpcmV0dXJuIG51bGw7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IF9tYXAuZ2V0KF9wYXR0ZXJuLmdldFRleHQoKSk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKXJldHVybiBudWxsOwotCQkJRmlsdGVyUnVsZSBydWxlID0gRmlsdGVyUnVsZS5jcmVhdGVDb250ZW50VHlwZSh0eXBlLmdldElkKCksIF9leGFjdE1hdGNoLmdldFNlbGVjdGlvbigpKTsKLQkJCXJldHVybiBydWxlOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCWlmIChfcGF0dGVybiA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJCWlmIChfcGF0dGVybi5nZXRUZXh0KCkgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gX3BhdHRlcm4uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JCX0KLQkJCi0JfQotCQotCWludGVyZmFjZSBGaWx0ZXJXaXphcmRQYWdlIHsKLQkJLyoqCi0JCSAqIEFuc3dlciB0aGUgcnVsZSB0aGF0IHdhcyBjcmVhdGVkLgotCQkgKiAKLQkJICogQHJldHVybiBudWxsIGlmIHRoZSB1c2VyIGRpZG4ndCBjcmVhdGUgYSBuZXcgcnVsZS4KLQkJICovCi0JCUZpbHRlclJ1bGUgZ2V0RmlsdGVyUnVsZSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvUmVzdWx0c0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvZGlhbG9nL1Jlc3VsdHNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzNGViNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvUmVzdWx0c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5kaWFsb2c7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsUHJlZk1hbmFnZXJHbG9iYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlc3VsdFN1bW1hcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkuVmFsaWRhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuVmFsVUlNZXNzYWdlczsKLQotLyoqCi0gKiBBIGRpYWxvZyBmb3IgZGlzcGxheWluZyB0aGUgcmVzdWx0cyBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc3VsdHNEaWFsb2cgZXh0ZW5kcyBJY29uQW5kTWVzc2FnZURpYWxvZyB7Ci0JCi0JcHJpdmF0ZSBWYWxpZGF0aW9uUmVzdWx0U3VtbWFyeSAJX3Jlc3VsdDsKLQlwcml2YXRlIGxvbmcJCQkJX3RpbWU7Ci0JcHJpdmF0ZSBpbnQJCQkJCV9yZXNvdXJjZUNvdW50OwotCXByaXZhdGUgQnV0dG9uIF9oaWRlQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZGlhbG9nIGZvciBkaXNwbGF5aW5nIHZhbGlkYXRpb24gcmVzdWx0cy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhpcyBjYW4gYmUgbnVsbAotCSAqIEBwYXJhbSByZXN1bHRzIHRoZSByZXN1bHRzIG9mIHRoZSB2YWxpZGF0aW9uCi0JICogQHBhcmFtIHRpbWUgdGhlIHRpbWUgdGhhdCB0aGUgdmFsaWRhdGlvbiB0b29rIGluIG1pbGxpc2Vjb25kcwotCSAqIEBwYXJhbSByZXNvdXJjZUNvdW50IHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRoYXQgd2VyZSB2YWxpZGF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzdWx0c0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgVmFsaWRhdGlvblJlc3VsdFN1bW1hcnkgcmVzdWx0cywgbG9uZyB0aW1lLCBpbnQgcmVzb3VyY2VDb3VudCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCV9yZXN1bHQgPSByZXN1bHRzOwotCQlfdGltZSA9IHRpbWU7Ci0JCV9yZXNvdXJjZUNvdW50ID0gcmVzb3VyY2VDb3VudDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZihfaGlkZUJ1dHRvbiE9bnVsbCkgewotCQkJVmFsTWFuYWdlciB2bSA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotCQkJR2xvYmFsUHJlZmVyZW5jZXMgZ3AgPSB2bS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpOwotCQkJR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMgZ3B2ID0gZ3AuYXNWYWx1ZXMoKTsKLQkJCWdwdi5jb25maXJtRGlhbG9nID0gIV9oaWRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJaW50IGNoYW5nZXMgPSB2bS5yZXBsYWNlKGdwdik7Ci0JCQlpZiAoY2hhbmdlcyAhPSAwKVZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKS5zYXZlUHJlZmVyZW5jZXMoKTsKLQkJfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBvcGVuKCkgewotCQlpZiAoIUVycm9yRGlhbG9nLkFVVE9NQVRFRF9NT0RFKSB7Ci0JCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCQl9Ci0JCXNldFJldHVybkNvZGUoT0spOwotCQlyZXR1cm4gT0s7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpID4gMClyZXR1cm4gZ2V0RXJyb3JJbWFnZSgpOwotCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSA+IDApcmV0dXJuIGdldFdhcm5pbmdJbWFnZSgpOwotCQlyZXR1cm4gZ2V0SW5mb0ltYWdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQltZXNzYWdlID0gZ2V0TWVzc2FnZSgpOwotCQljcmVhdGVNZXNzYWdlQXJlYShwYXJlbnQpOwotCQkJCQotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5zcGFuKDIsIDEpLmNyZWF0ZSgpKTsJCQotCQlhZGRIaWRlQ2hlY2tib3gocGFyZW50KTsKLQotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSGlkZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJX2hpZGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGFGYWN0b3J5LnN3dERlZmF1bHRzKCkuYWxpZ24oU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORykuc3BhbigyLCAxKS5hcHBseVRvKF9oaWRlQnV0dG9uKTsKLQkJX2hpZGVCdXR0b24uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkRvTm90U2hvd1Jlc3VsdHMpOwotCQlpZiAoVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRDb25maXJtRGlhbG9nKCkgJiYgX2hpZGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCS8vIHRlbGwgdGhlIHVzZXIgd2hlcmUgdG8gcmUtZW5hYmxlIGl0PwotCQl9Ci0JCV9oaWRlQnV0dG9uLnNldFNlbGVjdGlvbighVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRDb25maXJtRGlhbG9nKCkpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxSZXN1bHRzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBvayA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIGZhbHNlKTsKLQkJb2suc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKCl7Ci0JCWlmIChfcmVzb3VyY2VDb3VudCA+IDEpIHsKLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKSA+IDEpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEVycm9yc1Jlc291cmNlcywgbmV3IE9iamVjdFtde19yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpLCBfcmVzb3VyY2VDb3VudCwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpfSk7Ci0JCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUVycm9yKCkgPT0gMSkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsRXJyb3IxUmVzb3VyY2VzLCBfcmVzb3VyY2VDb3VudCwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKLQotCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlXYXJuaW5nKCkgPiAxKQotCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxXYXJuUmVzb3VyY2VzLCBuZXcgT2JqZWN0W117X3Jlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSwgX3Jlc291cmNlQ291bnQsIE1pc2MuZ2V0VGltZU1TKF90aW1lKX0pOwotCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlXYXJuaW5nKCkgPT0gMSkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsV2FybjFSZXNvdXJjZXMsIF9yZXNvdXJjZUNvdW50LCBNaXNjLmdldFRpbWVNUyhfdGltZSkpOwotCi0JCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSA+IDEpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEluZm9SZXNvdXJjZXMsIG5ldyBPYmplY3RbXXtfcmVzdWx0LmdldFNldmVyaXR5SW5mbygpLCBfcmVzb3VyY2VDb3VudCwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpfSk7Ci0JCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSA9PSAxKQotCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxJbmZvMVJlc291cmNlcywgX3Jlc291cmNlQ291bnQsIE1pc2MuZ2V0VGltZU1TKF90aW1lKSk7Ci0JCX0KLQkJZWxzZSBpZiAoX3Jlc291cmNlQ291bnQgPT0gMSkgewotCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpID4gMSkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsRXJyb3JzUmVzb3VyY2UxLCBfcmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKSwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKSA9PSAxKQotCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxFcnJvcjFSZXNvdXJjZTEsIE1pc2MuZ2V0VGltZU1TKF90aW1lKSk7Ci0KLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5V2FybmluZygpID4gMSkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsV2FyblJlc291cmNlMSwgX3Jlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKLQkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5V2FybmluZygpID09IDEpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbFdhcm4xUmVzb3VyY2UxLCBNaXNjLmdldFRpbWVNUyhfdGltZSkpOwotCi0JCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSA+IDEpCi0JCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEluZm9SZXNvdXJjZTEsIF9yZXN1bHQuZ2V0U2V2ZXJpdHlJbmZvKCksIE1pc2MuZ2V0VGltZU1TKF90aW1lKSk7Ci0JCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSA9PSAxKQotCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxJbmZvMVJlc291cmNlMSwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKLQkJfQotCQlyZXR1cm4gVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsU3VjY2VzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9WYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjFkYTI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkZ1bGxCdWlsZEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsUHJlZk1hbmFnZXJHbG9iYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlc1ZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5EZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5IZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5JbWFnZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLlZhbFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuZGlhbG9nLkZpbHRlckRpYWxvZzsKLQotLyoqCi0gKiBGcm9tIHRoaXMgcGFnZSB0aGUgdXNlciBjYW4gY29uZmlndXJlIGluZGl2aWR1YWwgdmFsaWRhdG9ycy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBhbmQgaXRzIGlubmVyIGNsYXNzZXMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgb2YKLSAqIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgSVZhbGlkYXRpb25QYWdlIF9wYWdlSW1wbCA9IG51bGw7Ci0JcHJpdmF0ZSBTaGVsbCBfc2hlbGw7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uUGFnZSB7Ci0JCQotCQlDb21wb3NpdGUgY3JlYXRlUGFnZShDb21wb3NpdGUgcGFyZW50KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQkJYm9vbGVhbiBwZXJmb3JtT2soKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQkJYm9vbGVhbiBwZXJmb3JtRGVmYXVsdHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQkJQ29tcG9zaXRlIGdldENvbnRyb2woKTsKLQkJdm9pZCBkaXNwb3NlKCk7Ci0JCXZvaWQgbG9zZUZvY3VzKCk7Ci0JCXZvaWQgZ2FpbkZvY3VzKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIGNsYXNzIEludmFsaWRQYWdlIGltcGxlbWVudHMgSVZhbGlkYXRpb25QYWdlIHsKLQkJcHJpdmF0ZSBDb21wb3NpdGUgcGFnZSA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlID0gbnVsbDsKLQkJcHJpdmF0ZSBHcmlkTGF5b3V0IGxheW91dCA9IG51bGw7Ci0JCXByaXZhdGUgTGFiZWwgbWVzc2FnZUxhYmVsID0gbnVsbDsKLQotCQlwdWJsaWMgSW52YWxpZFBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJcGFnZSA9IGNyZWF0ZVBhZ2UocGFyZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIHBhZ2UgaXMgYWRkZWQgdG8gdGhlIFByb3BlcnRpZXMgZ3VpZGUgaWYgc29tZSBpbnRlcm5hbCBwcm9ibGVtCi0JCSAqIG9jY3VycmVkOyBmb3IgZXhhbXBsZSwgdGhlIGhpZ2hsaWdodGVkIGl0ZW0gaW4gdGhlIHdvcmtiZW5jaCBpcyBub3QKLQkJICogYW4gSVByb2plY3QgKGFjY29yZGluZyB0byB0aGlzIHBhZ2UncyBwbHVnaW4ueG1sLCB0aGlzIHBhZ2UgaXMgb25seQotCQkgKiB2YWxpZCB3aGVuIGFuIElQcm9qZWN0IGlzIHNlbGVjdGVkKS4KLQkJICovCi0JCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlUGFnZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkvLyBEb24ndCBjcmVhdGUgdGhlIGRlZmF1bHQgYW5kIGFwcGx5IGJ1dHRvbnMuCi0JCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCi0JCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LAlTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzYzEsIFNXVC5OT05FKTsKLQkJCXNjMS5zZXRDb250ZW50KGNvbXBvc2l0ZSk7Ci0JCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQltZXNzYWdlTGFiZWwuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5WQUxJRF9SRUdJU1RFUik7Ci0KLQkJCWNvbXBvc2l0ZS5zZXRTaXplKGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNpbmNlIHRoaXMgcGFnZSBvY2N1cnMgdW5kZXIgaW52YWxpZCBjaXJjdW1zdGFuY2VzLCB0aGVyZSBpcyBub3RoaW5nCi0JCSAqIHRvIHNhdmUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCW1lc3NhZ2VMYWJlbC5kaXNwb3NlKCk7Ci0JCQkvLyBsYXlvdXQuZGlzcG9zZSgpOwotCQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxvc2VGb2N1cygpIHsKLQkJCS8vIFRoaXMgcGFnZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGNvbnRlbnRzIG9mIGFueSBvdGhlciBwYWdlIGluCi0JCQkvLyB0aGUgd2l6YXJkLCBzbyBkbyBub3RoaW5nLgotCQl9Ci0KLQkJcHVibGljIHZvaWQgZ2FpbkZvY3VzKCkgewotCQkJLy8gVGhpcyBwYWdlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY29udGVudHMgb2YgYW55IG90aGVyIHBhZ2UgaW4KLQkJCS8vIHRoZSB3aXphcmQsIHNvIGRvIG5vdGhpbmcuCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFZhbGlkYXRvckxpc3RQYWdlIGltcGxlbWVudHMgSVZhbGlkYXRpb25QYWdlIHsKLQkJcHJpdmF0ZSBDb21wb3NpdGUgX3BhZ2U7Ci0JCXByaXZhdGUgVGFibGVWaWV3ZXIgX3ZhbGlkYXRvckxpc3Q7Ci0JCXByaXZhdGUgQnV0dG9uIF9lbmFibGVBbGxCdXR0b247Ci0JCXByaXZhdGUgQnV0dG9uIF9kaXNhYmxlQWxsQnV0dG9uOwotCQlwcml2YXRlIEJ1dHRvbiBfb3ZlcnJpZGU7Ci0JCXByaXZhdGUgQnV0dG9uIF9zdXNwZW5kOwotCQlwcml2YXRlIEJ1dHRvbiBfYXV0b1NhdmU7Ci0JCXByaXZhdGUgQnV0dG9uIF9jb25maXJtQnV0dG9uOwotCQlwcml2YXRlIExhYmVsIF9saXN0TGFiZWw7Ci0JCXByaXZhdGUgVGFibGUgX3ZhbGlkYXRvcnNUYWJsZTsKLQkJcHJpdmF0ZSBHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcyAJX2dsb2JhbFByZWZlcmVuY2VzID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5hc1ZhbHVlcygpOwotCQlwcml2YXRlIEdsb2JhbENvbmZpZ3VyYXRpb24gX2dsb2JhbENvbmZpZzsKLQkJcHJpdmF0ZSBWYWxpZGF0b3JNdXRhYmxlW10gX3ZhbGlkYXRvcnM7Ci0JCQotCQlwcml2YXRlIGludCBfY2hhbmdlQ291bnQ7Ci0KLQkJLyoqCi0JCSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHRoZSBDaGVja2JveFRhYmxlVmlld2VyIGluIHRoZQotCQkgKiBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UkVmFsaWRhdG9yTGlzdFBhZ2UgY2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFZhbGlkYXRvck11dGFibGVbXSkgewotCQkJCQlyZXR1cm4gKFZhbGlkYXRvck11dGFibGVbXSkgaW5wdXRFbGVtZW50OwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IKLQkJICogVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlJFZhbGlkYXRvckxpc3RQYWdlJ3MgY2hlY2tib3hUYWJsZVZpZXdlciBlbGVtZW50LgotCQkgKi8KLQkJcHVibGljIGNsYXNzIFZhbGlkYXRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbClyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFsaWRhdG9yTXV0YWJsZSkKLQkJCQkJcmV0dXJuICgoVmFsaWRhdG9yTXV0YWJsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGltYWdlTmFtZSkgewotCQkJCWJvb2xlYW4gaXNEaXNhYmxlZCA9ICFfdmFsaWRhdG9yc1RhYmxlLmlzRW5hYmxlZCgpOwotCQkJCWlmIChpc0Rpc2FibGVkKWltYWdlTmFtZSA9IGltYWdlTmFtZSArIEltYWdlTmFtZXMuZGlzYWJsZWQ7Ci0KLQkJCQlyZXR1cm4gVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKGltYWdlTmFtZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJVmFsaWRhdG9yTXV0YWJsZSB2ID0gKFZhbGlkYXRvck11dGFibGUpIGVsZW1lbnQ7Ci0JCQkJaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCQkJcmV0dXJuIGdldEltYWdlKHYuaXNNYW51YWxWYWxpZGF0aW9uKCkgPyBJbWFnZU5hbWVzLm9rVGFibGUgOiBJbWFnZU5hbWVzLmZhaWxUYWJsZSk7Ci0JCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQkJCXJldHVybiBnZXRJbWFnZSh2LmlzQnVpbGRWYWxpZGF0aW9uKCkgPyBJbWFnZU5hbWVzLm9rVGFibGUgOiBJbWFnZU5hbWVzLmZhaWxUYWJsZSk7Ci0JCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKSB7Ci0JCQkJCWlmIChoYXNTZXR0aW5ncyh2KSlyZXR1cm4gZ2V0SW1hZ2UoSW1hZ2VOYW1lcy5zZXR0aW5ncyk7Ci0JCQkJCXJldHVybiAgbnVsbDsKLQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlpZiAoY29sdW1uSW5kZXggPT0gMClyZXR1cm4gKChWYWxpZGF0b3JNdXRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHNvcnQgdGhlIENoZWNrYm94VGFibGVWaWV3ZXIgZWxlbWVudHMuCi0JCSAqLwotCQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvblZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQkvLyBDYW4ndCBpbnN0YW50aWF0ZSBWaWV3ZXJTb3J0ZXIgYmVjYXVzZSBpdCdzIGFic3RyYWN0LCBzbyB1c2UgdGhpcwotCQkJCS8vIGlubmVyIGNsYXNzIHRvIHJlcHJlc2VudCBpdC4KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgVmFsaWRhdG9yTGlzdFBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX3BhZ2UgPSBjcmVhdGVQYWdlKHBhcmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0dXBUYWJsZUNvbHVtbnMoVGFibGUgdGFibGUpIHsKLQkJCVRhYmxlQ29sdW1uIHZhbGlkYXRvckNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQkJdmFsaWRhdG9yQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5WQUxJREFUT1IpOwotCQkJdmFsaWRhdG9yQ29sdW1uLnNldFdpZHRoKDI0NSk7Ci0JCQlUYWJsZUNvbHVtbiBtYW51YWxDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQkJbWFudWFsQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5NQU5VQUwpOwotCQkJbWFudWFsQ29sdW1uLnBhY2soKTsKLQkJCVRhYmxlQ29sdW1uIGJ1aWxkQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJCWJ1aWxkQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5CVUlMRCk7Ci0JCQlidWlsZENvbHVtbi5wYWNrKCk7Ci0JCQlUYWJsZUNvbHVtbiBzZXR0aW5nc0NvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCQlzZXR0aW5nc0NvbHVtbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuU0VUVElOR1MpOwotCQkJc2V0dGluZ3NDb2x1bW4ucGFjaygpOwotCQl9Ci0JCQotCQlwcml2YXRlIFZhbGlkYXRvck11dGFibGVbXSBnZXREZWZhdWx0VmFsaWRhdG9ycygpewotCQkJVmFsaWRhdG9yW10gdmFscyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnMoKTsKLQkJCVZhbGlkYXRvck11dGFibGVbXSB2bXMgPSBuZXcgVmFsaWRhdG9yTXV0YWJsZVt2YWxzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPTA7IGk8dmFscy5sZW5ndGg7IGkrKyl2bXNbaV0gPSBuZXcgVmFsaWRhdG9yTXV0YWJsZSh2YWxzW2ldKTsKLQkJCXJldHVybiB2bXM7Ci0JCX0KLQotCQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX2dsb2JhbENvbmZpZyA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkpOwotCQkJX3ZhbGlkYXRvcnMgPSBnZXREZWZhdWx0VmFsaWRhdG9ycygpOwotCQkJCi0JCQlDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCQlHcmlkTGF5b3V0IHZhbGlkYXRvckdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCXZhbGlkYXRvckdyb3VwTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJdmFsaWRhdG9yR3JvdXAuc2V0TGF5b3V0KHZhbGlkYXRvckdyb3VwTGF5b3V0KTsKLQkJCUdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5ncmFiKHRydWUsIHRydWUpLmFwcGx5VG8odmFsaWRhdG9yR3JvdXApOwotCQkJCi0JCQluZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkJYWRkT3ZlcnJpZGUodmFsaWRhdG9yR3JvdXApOwotCQkJYWRkU3VzcGVuZCh2YWxpZGF0b3JHcm91cCk7Ci0JCQlhZGRBdXRvU2F2ZSh2YWxpZGF0b3JHcm91cCk7Ci0JCQlhZGRDb25maXJtKHZhbGlkYXRvckdyb3VwKTsKLQotCQkJX2xpc3RMYWJlbCA9IG5ldyBMYWJlbCh2YWxpZGF0b3JHcm91cCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgbGlzdExhYmVsRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJbGlzdExhYmVsRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlfbGlzdExhYmVsLnNldExheW91dERhdGEobGlzdExhYmVsRGF0YSk7Ci0JCQlfbGlzdExhYmVsLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX1ZBTExJU1RfVElUTEUpOwotCQkJCi0JCQlfdmFsaWRhdG9yc1RhYmxlID0gbmV3IFRhYmxlKHZhbGlkYXRvckdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCQlQb2ludCBwcmVmZXJyZWRTaXplID0gX3ZhbGlkYXRvcnNUYWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIodHJ1ZSwgdHJ1ZSkuaGludChwcmVmZXJyZWRTaXplKQotCQkJCS5zcGFuKDIsMSkuYXBwbHlUbyhfdmFsaWRhdG9yc1RhYmxlKTsKLQkJCQkJCQotCi0JCQlfdmFsaWRhdG9yc1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQlfdmFsaWRhdG9yc1RhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQkJX3ZhbGlkYXRvckxpc3QgPSBuZXcgVGFibGVWaWV3ZXIoX3ZhbGlkYXRvcnNUYWJsZSk7CQkJCi0vLwkJCV92YWxpZGF0b3JzVGFibGUuc2V0TGF5b3V0RGF0YSh2YWxpZGF0b3JMaXN0RGF0YSk7Ci0vLwkJCV92YWxpZGF0b3JMaXN0LmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YSh2YWxpZGF0b3JMaXN0RGF0YSk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWYWxpZGF0aW9uTGFiZWxQcm92aWRlcigpKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlcigpKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldFNvcnRlcihuZXcgVmFsaWRhdGlvblZpZXdlclNvcnRlcigpKTsKLQkJCXNldHVwVGFibGVDb2x1bW5zKF92YWxpZGF0b3JzVGFibGUpOwotCi0JCQlfdmFsaWRhdG9yTGlzdC5zZXRJbnB1dChfdmFsaWRhdG9ycyk7Ci0JCQlfdmFsaWRhdG9yc1RhYmxlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuYnV0dG9uICE9IDEpcmV0dXJuOwotCi0JCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBfdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0JCQkJCWlmICh0YWJsZUl0ZW0gPT0gbnVsbCB8fCB0YWJsZUl0ZW0uaXNEaXNwb3NlZCgpKXJldHVybjsKLQkJCQkJaW50IGNvbHVtbk51bWJlcjsKLQkJCQkJaW50IGNvbHVtbnNDb3VudCA9IF92YWxpZGF0b3JzVGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCQkJaWYgKGNvbHVtbnNDb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBJZiBubyBUYWJsZUNvbHVtbiwgVGFibGUgYWN0cyBhcyBpZiBpdCBoYXMgYSBzaW5nbGUKLQkJCQkJCS8vIGNvbHVtbiB3aGljaCB0YWtlcyB0aGUgd2hvbGUgd2lkdGguCi0JCQkJCQljb2x1bW5OdW1iZXIgPSAwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29sdW1uTnVtYmVyID0gLTE7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNDb3VudDsgaSsrKSB7Ci0JCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoaSk7Ci0JCQkJCQkJaWYgKGJvdW5kcy5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQkJCQkJY29sdW1uTnVtYmVyID0gaTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGNvbHVtbk51bWJlciA9PSAtMSlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQljb2x1bW5DbGlja2VkKGNvbHVtbk51bWJlcik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCV92YWxpZGF0b3JzVGFibGUuc2V0TWVudShjcmVhdGVDb250ZXh0TWVudSgpKTsKLQkJCV92YWxpZGF0b3JzVGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCXN1cGVyLmZvY3VzR2FpbmVkKGUpOwotCQkJCQlpZiAoX3ZhbGlkYXRvcnNUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApIHsKLQkJCQkJCV92YWxpZGF0b3JzVGFibGUuc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWFkZEVuYWJsZURpc2FibGUodmFsaWRhdG9yR3JvdXApOwotCi0JCQl1cGRhdGVXaWRnZXRzKCk7Ci0KLQkJCWFwcGx5RGlhbG9nRm9udCh2YWxpZGF0b3JHcm91cCk7Ci0JCQl2YWxpZGF0b3JHcm91cC5zZXRTaXplKHZhbGlkYXRvckdyb3VwLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCQkJcmV0dXJuIHZhbGlkYXRvckdyb3VwOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZEVuYWJsZURpc2FibGUoQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwKSB7Ci0JCQlfZW5hYmxlQWxsQnV0dG9uID0gbmV3IEJ1dHRvbih2YWxpZGF0b3JHcm91cCwgU1dULlBVU0gpOwotCQkJX2VuYWJsZUFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfQlVUVE9OX0VOQUJMRUFMTCk7Ci0JCQlfZW5hYmxlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcmZvcm1FbmFibGVBbGwoKTsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsCi0JCQkJCQkJVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJX2Rpc2FibGVBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCQlfZGlzYWJsZUFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX0JVVFRPTl9ESVNBQkxFQUxMKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcmZvcm1EaXNhYmxlQWxsKCk7Ci0JCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQlkaXNwbGF5QW5kTG9nRXJyb3IoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFLAotCQkJCQkJCVZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBhZGRDb25maXJtKENvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCkgewotCQkJR3JpZERhdGEgZ2Q7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJX2NvbmZpcm1CdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJX2NvbmZpcm1CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlfY29uZmlybUJ1dHRvbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUHJlZlBhZ2VDb25maXJtRGlhbG9nKTsKLQkJCV9jb25maXJtQnV0dG9uLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMuY29uZmlybURpYWxvZyk7Ci0JCQlfY29uZmlybUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCS8vIGRvIG5vdCBpbmNyZW1lbnQgdGhlIF9jaGFuZ2VDb3VudCBhcyB0aGlzIGJ5IGl0c2VsZiBzaG91bGQgbm90IHRyaWdnZXIgYSBidWlsZCBwcm9tcHQKLQkJCQkJX2dsb2JhbFByZWZlcmVuY2VzLmNvbmZpcm1EaWFsb2cgPSBfY29uZmlybUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJX2NvbmZpcm1CdXR0b24uc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRBdXRvU2F2ZShDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCUdyaWREYXRhIGdkOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCV9hdXRvU2F2ZSA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQlfYXV0b1NhdmUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlfYXV0b1NhdmUuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlByZWZQYWdlX2Fsd2F5c19zYXZlKTsKLQkJCV9hdXRvU2F2ZS5zZXRTZWxlY3Rpb24oX2dsb2JhbFByZWZlcmVuY2VzLnNhdmVBdXRvbWF0aWNhbGx5KTsKLQkJCV9hdXRvU2F2ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCS8vIGRvIG5vdCBpbmNyZW1lbnQgdGhlIF9jaGFuZ2VDb3VudCBhcyB0aGlzIGJ5IGl0c2VsZiBzaG91bGQgbm90IHRyaWdnZXIgYSBidWlsZCBwcm9tcHQKLQkJCQkJX2dsb2JhbFByZWZlcmVuY2VzLnNhdmVBdXRvbWF0aWNhbGx5ID0gX2F1dG9TYXZlLmdldFNlbGVjdGlvbigpOwotCQkJCQlfYXV0b1NhdmUuc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRTdXNwZW5kKENvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCkgewotCQkJR3JpZERhdGEgZ2Q7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCi0JCQlfc3VzcGVuZCA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQlfc3VzcGVuZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCV9zdXNwZW5kLnNldFRleHQoVmFsVUlNZXNzYWdlcy5ESVNBQkxFX1ZBTElEQVRJT04pOwotCQkJX3N1c3BlbmQuc2V0U2VsZWN0aW9uKF9nbG9iYWxQcmVmZXJlbmNlcy5kaXNhYmxlQWxsVmFsaWRhdGlvbik7Ci0JCQlfc3VzcGVuZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCV9zdXNwZW5kLnNldEZvY3VzKCk7Ci0JCQkJCV92YWxpZGF0b3JzVGFibGUuc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlfZW5hYmxlQWxsQnV0dG9uLnNldEVuYWJsZWQoIV9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkT3ZlcnJpZGUoQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwKSB7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCi0JCQlfb3ZlcnJpZGUgPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJX292ZXJyaWRlLnNldExheW91dERhdGEoZ2QpOwotCQkJX292ZXJyaWRlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX0JVVFRPTl9PVkVSUklERSk7Ci0JCQlfb3ZlcnJpZGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCV9vdmVycmlkZS5zZXRTZWxlY3Rpb24oX2dsb2JhbFByZWZlcmVuY2VzLm92ZXJyaWRlKTsKLQkJCV9vdmVycmlkZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCV9nbG9iYWxQcmVmZXJlbmNlcy5vdmVycmlkZSA9IF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJX292ZXJyaWRlLnNldEZvY3VzKCk7Ci0JCQkJCQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE1lbnUgY3JlYXRlQ29udGV4dE1lbnUoKSB7Ci0JCQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudShfdmFsaWRhdG9yc1RhYmxlLmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotCQkJZmluYWwgTWVudUl0ZW0gbWFudWFsSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQkJbWFudWFsSXRlbS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9NTlVfTUFOVUFMKTsKLQkJCWZpbmFsIE1lbnVJdGVtIGJ1aWxkSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQkJYnVpbGRJdGVtLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX01OVV9CVUlMRCk7Ci0JCQlmaW5hbCBNZW51SXRlbSBzZXR0aW5nc0l0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJc2V0dGluZ3NJdGVtLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX01OVV9TRVRUSU5HUyk7Ci0KLQkJCWNsYXNzIE1lbnVJdGVtTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gKE1lbnVJdGVtKSBlLmdldFNvdXJjZSgpOwotCQkJCQlpbnQgaW5kZXggPSBtZW51LmluZGV4T2YobWVudUl0ZW0pICsgMTsKLQkJCQkJY29sdW1uQ2xpY2tlZChpbmRleCk7Ci0JCQkJfQotCQkJfQotCQkJTWVudUl0ZW1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNZW51SXRlbUxpc3RlbmVyKCk7Ci0JCQltYW51YWxJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWJ1aWxkSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlzZXR0aW5nc0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgX3ZhbGlkYXRvckxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCVZhbGlkYXRvck11dGFibGUgdncgPSAoVmFsaWRhdG9yTXV0YWJsZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQltYW51YWxJdGVtLnNldFNlbGVjdGlvbih2dy5pc01hbnVhbFZhbGlkYXRpb24oKSk7Ci0JCQkJCWJ1aWxkSXRlbS5zZXRTZWxlY3Rpb24odncuaXNCdWlsZFZhbGlkYXRpb24oKSk7Ci0JCQkJCXNldHRpbmdzSXRlbS5zZXRFbmFibGVkKGhhc1NldHRpbmdzKHZ3KSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXJldHVybiBtZW51OwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29sdW1uQ2xpY2tlZChpbnQgY29sdW1uVG9FZGl0KSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIF92YWxpZGF0b3JMaXN0LmdldFNlbGVjdGlvbigpOwotCQkJVmFsaWRhdG9yTXV0YWJsZSB2YWwgPSAoVmFsaWRhdG9yTXV0YWJsZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQlzd2l0Y2ggKGNvbHVtblRvRWRpdCkgewotCQkJY2FzZSAxOgotCQkJCV9jaGFuZ2VDb3VudCsrOwotCQkJCXZhbC5zZXRNYW51YWxWYWxpZGF0aW9uKCF2YWwuaXNNYW51YWxWYWxpZGF0aW9uKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCV9jaGFuZ2VDb3VudCsrOwotCQkJCXZhbC5zZXRCdWlsZFZhbGlkYXRpb24oIXZhbC5pc0J1aWxkVmFsaWRhdGlvbigpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlpZiAodmFsLmlzVjJWYWxpZGF0b3IoKSl7Ci0JCQkJCVZhbGlkYXRvck11dGFibGUgbmV3VmFsID0gbmV3IFZhbGlkYXRvck11dGFibGUodmFsKTsKLQkJCQkJRmlsdGVyRGlhbG9nIGZkID0gbmV3IEZpbHRlckRpYWxvZyhfc2hlbGwsIG5ld1ZhbCwgbnVsbCk7Ci0JCQkJCWlmIChXaW5kb3cuT0sgPT0gZmQub3BlbigpKXsKLQkJCQkJCV9jaGFuZ2VDb3VudCsrOwotCQkJCQkJbmV3VmFsID0gZmQuZ2V0VmFsaWRhdG9yKCk7Ci0JCQkJCQlpbnQgaSA9IGZpbmRpdCh2YWwpOwotCQkJCQkJaWYgKGkgIT0gLTEpX3ZhbGlkYXRvcnNbaV0gPSBuZXdWYWw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWhhbmRsZU9sZERlbGVnYXRlKHZhbCk7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZmluZGl0KFZhbGlkYXRvck11dGFibGUgdmFsKSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8X3ZhbGlkYXRvcnMubGVuZ3RoOyBpKyspaWYgKF92YWxpZGF0b3JzW2ldID09IHZhbClyZXR1cm4gaTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVPbGREZWxlZ2F0ZShWYWxpZGF0b3JNdXRhYmxlIHZhbCkgewotCQkJaWYgKCF2YWwuaXNWMVZhbGlkYXRvcigpKXJldHVybjsKLQkJCQotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdmFsLmdldFZtZCgpOwotCQkgICAgaWYgKCF2bWQuaXNEZWxlZ2F0aW5nKCkpcmV0dXJuOwotCQkgICAgCi0JCSAgICBTdHJpbmcgZGVsZWdhdGVJRCA9IF9nbG9iYWxDb25maWcuZ2V0RGVsZWdhdGVVbmlxdWVOYW1lKHZtZCk7Ci0JCSAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCSAgICBEZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cgZGlhbG9nID0gCi0JCSAgICAJbmV3IERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyhzaGVsbCwgdm1kLCBkZWxlZ2F0ZUlEKTsKLQkJCi0JCSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0JCQotCQkgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0JICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSyl7Ci0JICAgICAgICAJX2NoYW5nZUNvdW50Kys7Ci0JICAgICAgICAJX2dsb2JhbENvbmZpZy5zZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kLCBkaWFsb2cuZ2V0RGVsZWdhdGVJRCgpKTsKLQkgICAgICAgIH0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIERvZXMgdGhpcyB2YWxpZGF0b3IgaGF2ZSBleHRyYSBzZXR0aW5ncyB0aGF0IGNhbiBiZSBjb25maWd1cmVkPwotCQkgKiBAcGFyYW0gdgotCQkgKiBAcmV0dXJuIHRydWUgaWYgaXQgZG9lcwotCQkgKi8KLQkJYm9vbGVhbiBoYXNTZXR0aW5ncyhWYWxpZGF0b3JNdXRhYmxlIHYpewotCQkJaWYgKHYuaXNWMlZhbGlkYXRvcigpKXJldHVybiB0cnVlOwotCQkJaWYgKHYuZ2V0RGVsZWdhdGluZ0lkKCkgIT0gbnVsbClyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkvLyBOZWVkIHRvIHVwZGF0ZSBldmVuIHRoZSB3aWRnZXRzIHRoYXQgZG8gbm90IGNoYW5nZSBiYXNlZCBvbiBhbm90aGVyCi0JCQkvLyB3aWRnZXRzIGJlY2F1c2Ugb2YgcGVyZm9ybURlZmF1bHRzKCkuIElmIHBlcmZvcm1EZWZhdWx0cygpIGlzCi0JCQkvLyBzZWxlY3RlZCwgdGhlbiB0aGUgcGFnZVByZWZlcmVuY2VzIHZhbHVlcyBhcmUgcmVzZXQsIGFuZCB0aGVzZSB3aWRnZXRzCi0JCQkvLyBtaWdodCBhbHNvIG5lZWQgdG8gYmUgdXBkYXRlZC4KLQkJCXVwZGF0ZUFsbFdpZGdldHMoKTsKLQkJCXVwZGF0ZUhlbHAoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVBbGxXaWRnZXRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX3N1c3BlbmQuc2V0U2VsZWN0aW9uKF9nbG9iYWxQcmVmZXJlbmNlcy5kaXNhYmxlQWxsVmFsaWRhdGlvbik7Ci0JCQlfYXV0b1NhdmUuc2V0U2VsZWN0aW9uKF9nbG9iYWxQcmVmZXJlbmNlcy5zYXZlQXV0b21hdGljYWxseSk7Ci0JCQlfY29uZmlybUJ1dHRvbi5zZXRTZWxlY3Rpb24oX2dsb2JhbFByZWZlcmVuY2VzLmNvbmZpcm1EaWFsb2cpOwotCQkJX292ZXJyaWRlLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMub3ZlcnJpZGUpOwotCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRFbmFibGVkKCFfc3VzcGVuZC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlfZW5hYmxlQWxsQnV0dG9uLnNldEVuYWJsZWQoIV9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLnNldEVuYWJsZWQoIV9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldElucHV0KF92YWxpZGF0b3JzKTsKLQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCV9nbG9iYWxQcmVmZXJlbmNlcy5kaXNhYmxlQWxsVmFsaWRhdGlvbiA9IF9zdXNwZW5kLmdldFNlbGVjdGlvbigpOwotCQkJX2dsb2JhbFByZWZlcmVuY2VzLnNhdmVBdXRvbWF0aWNhbGx5ID0gX2F1dG9TYXZlLmdldFNlbGVjdGlvbigpOwotCQkJVmFsTWFuYWdlciB2bSA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotCQkJaW50IGNoYW5nZXMgPSB2bS5yZXBsYWNlKF9nbG9iYWxQcmVmZXJlbmNlcyk7Ci0JCQlpZiAoKGNoYW5nZXMgJiBHbG9iYWxQcmVmZXJlbmNlcy5CdWlsZENoYW5nZU1hc2spICE9IDApX2NoYW5nZUNvdW50Kys7Ci0JCQkKLQkJCVZhbFByZWZNYW5hZ2VyR2xvYmFsIHZwbSA9IFZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKTsKLQkJCXZwbS5zYXZlUHJlZmVyZW5jZXModm0uZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKSwgX3ZhbGlkYXRvcnMsIG51bGwpOwotCQkJc2F2ZVYxUHJlZmVyZW5jZXMoKTsKLQkJCQotCQkJaWYgKF9jaGFuZ2VDb3VudCA+IDAgJiYgCi0JCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oX3NoZWxsLCBWYWxVSU1lc3NhZ2VzLlJlYnVpbGRUaXRsZSwgVmFsVUlNZXNzYWdlcy5SZWJ1aWxkTXNnKSl7Ci0JCQkJCi0JCQkJRnVsbEJ1aWxkSm9iIGZiaiA9IG5ldyBGdWxsQnVpbGRKb2IoKTsKLQkJCQlmYmouc2NoZWR1bGUoKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2F2ZSB0aGUgVjEgcHJlZmVyZW5jZXMsIHNvIHRoYXQgdGhlIG9sZCB2YWxpZGF0b3JzIGNvbnRpbnVlIHRvIHdvcmsuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2F2ZVYxUHJlZmVyZW5jZXMoKXsKLQkJCXRyeSB7Ci0JCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnYyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQkJZ2Muc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oX2dsb2JhbFByZWZlcmVuY2VzLmRpc2FibGVBbGxWYWxpZGF0aW9uKTsKLQkJCQlnYy5zZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycyhnZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycygpKTsJCQkJCi0JCQkJZ2Muc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhnZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKCkpOwotCQotCQkJCWdjLnBhc3NpdmF0ZSgpOwotCQkJCWdjLnN0b3JlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKLQkJCQlWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQkJCQotCQl9Ci0KLQkJLyoqCi0JCSAqIEFuc3dlciBhbGwgdGhlIFYxIHZhbGlkYXRvcnMgdGhhdCBhcmUgbWFudWFsbHkgZW5hYmxlZC4KLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKCkgewotCQkJTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQkJZm9yIChWYWxpZGF0b3JNdXRhYmxlIHYgOiBfdmFsaWRhdG9ycyl7Ci0JCQkJaWYgKHYuaXNNYW51YWxWYWxpZGF0aW9uKCkgJiYgdi5pc1YxVmFsaWRhdG9yKCkpbGlzdC5hZGQodi5nZXRWbWQoKSk7Ci0JCQl9Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQW5zd2VyIGFsbCB0aGUgVjEgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciBidWlsZC4KLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoKSB7Ci0JCQlMaXN0PFZhbGlkYXRvck1ldGFEYXRhPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCQlmb3IgKFZhbGlkYXRvck11dGFibGUgdiA6IF92YWxpZGF0b3JzKXsKLQkJCQlpZiAodi5pc0J1aWxkVmFsaWRhdGlvbigpICYmIHYuaXNWMVZhbGlkYXRvcigpKWxpc3QuYWRkKHYuZ2V0Vm1kKCkpOwotCQkJfQotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX2NoYW5nZUNvdW50Kys7Ci0JCQlWYWxpZGF0b3JbXSB2YWxzID0gVmFsTWFuYWdlci5nZXREZWZhdWx0VmFsaWRhdG9ycygpOwotCQkJX3ZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdG9yTXV0YWJsZVt2YWxzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPTA7IGk8dmFscy5sZW5ndGg7IGkrKylfdmFsaWRhdG9yc1tpXSA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlKHZhbHNbaV0pOwotCQkJdXBkYXRlV2lkZ2V0cygpOwotCQkJZ2V0RGVmYXVsdHNCdXR0b24oKS5zZXRGb2N1cygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRW5hYmxlQWxsKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJc2V0QWxsVmFsaWRhdG9ycyh0cnVlKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uc2V0Rm9jdXMoKTsKLQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURpc2FibGVBbGwoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQlzZXRBbGxWYWxpZGF0b3JzKGZhbHNlKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHNldEFsbFZhbGlkYXRvcnMoYm9vbGVhbiBib29sKXsKLQkJCV9jaGFuZ2VDb3VudCsrOwotCQkJZm9yIChWYWxpZGF0b3JNdXRhYmxlIHYgOiBfdmFsaWRhdG9ycyl7Ci0JCQkJdi5zZXRCdWlsZFZhbGlkYXRpb24oYm9vbCk7Ci0JCQkJdi5zZXRNYW51YWxWYWxpZGF0aW9uKGJvb2wpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGVscCgpIHsKLS8vCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChfc3VzcGVuZCwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9ESVNBQkxFX0FMTF9FTkFCTEVEKTsKLQkJfQotCi0JCS8qCi0JCSAqIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgY29udHJvbHMgaW50byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkJICovCi0KLQkJcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIF9wYWdlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCV9hdXRvU2F2ZS5kaXNwb3NlKCk7Ci0JCQlfc3VzcGVuZC5kaXNwb3NlKCk7Ci0JCQlfZGlzYWJsZUFsbEJ1dHRvbi5kaXNwb3NlKCk7Ci0JCQlfZW5hYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKLQkJCV9saXN0TGFiZWwuZGlzcG9zZSgpOwotCQkJX3N1c3BlbmQuZGlzcG9zZSgpOwotCQkJX3ZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsb3NlRm9jdXMoKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBnYWluRm9jdXMoKSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIEhlbHBDb250ZXh0SWRzLlByZWZlcmVuY2VQYWdlKTsKLQkJdHJ5IHsKLQkJCV9zaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCQkJX3BhZ2VJbXBsID0gbmV3IFZhbGlkYXRvckxpc3RQYWdlKHBhcmVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCV9wYWdlSW1wbCA9IG5ldyBJbnZhbGlkUGFnZShwYXJlbnQpOwotCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSwgVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7Ci0JCX0KLQotCQlyZXR1cm4gX3BhZ2VJbXBsLmdldENvbnRyb2woKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuCi0JICogcHJlc3NlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgZnJhbWV3b3JrIGhvb2sgbWV0aG9kIGZvciBzdWJjbGFzc2VzIHRvIGRvIHNwZWNpYWwgdGhpbmdzIHdoZW4KLQkgKiB0aGUgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLCBidXQgc2hvdWxkCi0JICogY2FsbCA8Y29kZT5zdXBlci5wZXJmb3JtRGVmYXVsdHM8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCi0JCXRyeSB7Ci0JCQlfcGFnZUltcGwucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSAiT0siIG9yICJBcHBseSIgYnV0dG9uIG9uIHRoZSBQcm9wZXJ0aWVzCi0JICogR3VpZGUvUHJvcGVydGllcyBQYWdlLCByZXNwZWN0aXZlbHksIHNvbWUgcHJvY2Vzc2luZyBpcyBwZXJmb3JtZWQgYnkgdGhpcwotCSAqIFByb3BlcnR5UGFnZS4gSWYgdGhlIHBhZ2UgaXMgZm91bmQsIGFuZCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCB0cnVlIGlzCi0JICogcmV0dXJuZWQuIE90aGVyd2lzZSwgZmFsc2UgaXMgcmV0dXJuZWQsIGFuZCB0aGUgZ3VpZGUgZG9lc24ndCBmaW5pc2guCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQl0cnkgewotCQkJcmV0dXJuIF9wYWdlSW1wbC5wZXJmb3JtT2soKTsKLQkJfSAKLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luY2UgdGhlIHBhZ2VzIGFyZSBpbm5lciBjbGFzc2VzIG9mIGEgY2hpbGQgUHJlZmVyZW5jZVBhZ2UsIG5vdCBhCi0JICogUHJlZmVyZW5jZVBhZ2UgaXRzZWxmLCBEaWFsb2dQYWdlJ3MgYXV0b21hdGljIGRpc3Bvc2FsIG9mIGl0cyBjaGlsZHJlbidzCi0JICogd2lkZ2V0cyBjYW5ub3QgYmUgdXNlZC4gSW5zdGVhZCwgZGlzcG9zZSBvZiBlYWNoIGlubmVyIGNsYXNzJyB3aWRnZXRzCi0JICogZXhwbGljaXRseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoX3BhZ2VJbXBsICE9IG51bGwpIHsKLQkJCQlfcGFnZUltcGwuZGlzcG9zZSgpOwotCQkJCV9wYWdlSW1wbCA9IG51bGw7Ci0JCQl9Ci0KLQkJCS8vIFRPRE8gZmlndXJlIG91dCB3aGF0IHRoaXMgdGhpbmcgZGlkCi0JCQkvLyBFeHRlbnNpb25NYW5nZXIuaW5zdGFuY2UoKS5nZXREZWxlZ2F0ZSgpLmRpc3Bvc2VQcmVmZXJlbmNlUGFnZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlkaXNwbGF5QW5kTG9nRXJyb3IoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFLCBWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXhjKSB7Ci0JCVZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQl9Ci0KLQkvKgotCSAqIHBhY2thZ2UgdmlzaWJpbGl0eSBiZWNhdXNlIGlmIHRoaXMgbWV0aG9kIGlzIHByaXZhdGUsIHRoZW4gdGhlIGNvbXBpbGVyCi0JICogbmVlZHMgdG8gY3JlYXRlIGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZCBmb3IgdGhlIGludGVybmFsIGNsYXNzZXMsIGFuZAotCSAqIHRoYXQgY2FuIGhhdmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgotCSAqLwotCXZvaWQgZGlzcGxheUFuZExvZ0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGMpIHsKLQkJbG9nRXJyb3IoZXhjKTsKLQkJZGlzcGxheU1lc3NhZ2UodGl0bGUsIG1lc3NhZ2UsIG9yZy5lY2xpcHNlLnN3dC5TV1QuSUNPTl9FUlJPUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlNZXNzYWdlKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIGludCBpSWNvblR5cGUpIHsKLQkJTWVzc2FnZUJveCBtZXNzYWdlQm94ID0gbmV3IE1lc3NhZ2VCb3goZ2V0U2hlbGwoKSwKLQkJCQlvcmcuZWNsaXBzZS5zd3QuU1dULk9LIHwgaUljb25UeXBlCXwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCW1lc3NhZ2VCb3guc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJbWVzc2FnZUJveC5zZXRUZXh0KHRpdGxlKTsKLQkJbWVzc2FnZUJveC5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0JCWlmIChfcGFnZUltcGwgPT0gbnVsbClyZXR1cm47Ci0JCWlmICh2aXNpYmxlKV9wYWdlSW1wbC5nYWluRm9jdXMoKTsKLQkJZWxzZSBfcGFnZUltcGwubG9zZUZvY3VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBnZXREZWZhdWx0c0J1dHRvbigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRzQnV0dG9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVmFsaWRhdGlvblByb3BlcnR5UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVmFsaWRhdGlvblByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2M1NzRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuR2xvYmFsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFByZWZNYW5hZ2VyUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXIuVXNlUHJvamVjdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLlByb2plY3RQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkuRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbi5WYWxpZGF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuSW1hZ2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5WYWxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLmRpYWxvZy5GaWx0ZXJEaWFsb2c7Ci0KLS8qKgotICogRnJvbSB0aGlzIHBhZ2UgdGhlIHVzZXIgY2FuIGNvbmZpZ3VyZSBpbmRpdmlkdWFsIHZhbGlkYXRvcnMgb24gaW5kaXZpZHVhbCBwcm9qZWN0cy4KLSAqIAotICogQGF1dGhvciBrYXJhc2l1awotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSAgewotCi0JcHJpdmF0ZSBJVmFsaWRhdGlvblBhZ2UgX3BhZ2VJbXBsOwotCXByaXZhdGUgU2hlbGwgCQkJX3NoZWxsOwotCi0JcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvblBhZ2UgewotCQkKLQkJQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0JCWJvb2xlYW4gcGVyZm9ybU9rKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0JCWJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0JCUNvbXBvc2l0ZSBnZXRDb250cm9sKCk7Ci0JCXZvaWQgZGlzcG9zZSgpOwotCQl2b2lkIGxvc2VGb2N1cygpOwotCQl2b2lkIGdhaW5Gb2N1cygpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFnZSBpbXBsZW1lbnRzIElWYWxpZGF0aW9uUGFnZSB7Ci0JCQotCQlwcml2YXRlIENvbXBvc2l0ZSBwYWdlID0gbnVsbDsKLQkJcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlID0gbnVsbDsKLQkJcHJpdmF0ZSBHcmlkTGF5b3V0IGxheW91dCA9IG51bGw7Ci0JCXByaXZhdGUgTGFiZWwgbWVzc2FnZUxhYmVsID0gbnVsbDsKLQotCQlwdWJsaWMgSW52YWxpZFBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJcGFnZSA9IGNyZWF0ZVBhZ2UocGFyZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIHBhZ2UgaXMgYWRkZWQgdG8gdGhlIFByb3BlcnRpZXMgZ3VpZGUgaWYgc29tZSBpbnRlcm5hbCBwcm9ibGVtCi0JCSAqIG9jY3VycmVkOyBmb3IgZXhhbXBsZSwgdGhlIGhpZ2hsaWdodGVkIGl0ZW0gaW4gdGhlIHdvcmtiZW5jaCBpcyBub3QKLQkJICogYW4gSVByb2plY3QgKGFjY29yZGluZyB0byB0aGlzIHBhZ2UncyBwbHVnaW4ueG1sLCB0aGlzIHBhZ2UgaXMgb25seQotCQkgKiB2YWxpZCB3aGVuIGFuIElQcm9qZWN0IGlzIHNlbGVjdGVkKS4KLQkJICovCi0JCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlUGFnZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCi0JCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzYzEsIFNXVC5OT05FKTsKLQkJCXNjMS5zZXRDb250ZW50KGNvbXBvc2l0ZSk7Ci0JCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQltZXNzYWdlTGFiZWwuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5WQUxJRF9SRUdJU1RFUik7Ci0KLQkJCWNvbXBvc2l0ZS5zZXRTaXplKGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNpbmNlIHRoaXMgcGFnZSBvY2N1cnMgdW5kZXIgaW52YWxpZCBjaXJjdW1zdGFuY2VzLCB0aGVyZSBpcyBub3RoaW5nCi0JCSAqIHRvIHNhdmUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCW1lc3NhZ2VMYWJlbC5kaXNwb3NlKCk7Ci0JCQkvLyBsYXlvdXQuZGlzcG9zZSgpOwotCQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxvc2VGb2N1cygpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGdhaW5Gb2N1cygpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgVmFsaWRhdG9yTGlzdFBhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgewotCQlwcml2YXRlIENvbXBvc2l0ZSAJCV9wYWdlOwotCi0JCXByaXZhdGUgVGFibGVWaWV3ZXIgCV92YWxpZGF0b3JMaXN0OwotCQlwcml2YXRlIEJ1dHRvbiAJCQlfZW5hYmxlQWxsQnV0dG9uOwotCQlwcml2YXRlIEJ1dHRvbiAJCQlfZGlzYWJsZUFsbEJ1dHRvbjsKLQkJcHJpdmF0ZSBCdXR0b24gCQkJX292ZXJyaWRlOwotCQlwcml2YXRlIEJ1dHRvbiAJCQlfc3VzcGVuZDsKLQkJcHJpdmF0ZSBMaW5rCQkJX2NvbmZpZ0xpbms7Ci0JCXByaXZhdGUgQnV0dG9uCQkJX2FkZFZhbGlkYXRpb25CdWlsZGVyOwotCQlwcml2YXRlIFRhYmxlIAkJCV92YWxpZGF0b3JzVGFibGU7Ci0JCXByaXZhdGUgVmFsaWRhdG9yTXV0YWJsZVtdCQlfdmFsaWRhdG9yczsKLQkJCi0JCS8qKiBOdW1iZXIgb2YgdGhpbmdzIHRoYXQgbWF5IGhhdmUgY2hhbmdlZC4gKi8KLQkJcHJpdmF0ZSBpbnQJCQkJX2NoYW5nZXM7Ci0KLQkJLyoqCi0JCSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHRoZSBDaGVja2JveFRhYmxlVmlld2VyIGluIHRoZQotCQkgKiBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UkVmFsaWRhdG9yTGlzdFBhZ2UgY2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFZhbGlkYXRvck11dGFibGVbXSkgewotCQkJCQlyZXR1cm4gKFZhbGlkYXRvck11dGFibGVbXSkgaW5wdXRFbGVtZW50OwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IKLQkJICogVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlJFZhbGlkYXRvckxpc3RQYWdlJ3MgY2hlY2tib3hUYWJsZVZpZXdlcgotCQkgKiBlbGVtZW50LgotCQkgKi8KLQkJcHVibGljIGNsYXNzIFZhbGlkYXRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbClyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFsaWRhdG9yKQotCQkJCQlyZXR1cm4gKChWYWxpZGF0b3JNdXRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VOYW1lKSB7Ci0JCQkJYm9vbGVhbiBpc0Rpc2FibGVkID0gIV92YWxpZGF0b3JzVGFibGUuaXNFbmFibGVkKCk7Ci0JCQkJaWYgKGlzRGlzYWJsZWQpCi0JCQkJCWltYWdlTmFtZSA9IGltYWdlTmFtZSArIEltYWdlTmFtZXMuZGlzYWJsZWQ7Ci0KLQkJCQlyZXR1cm4gVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKGltYWdlTmFtZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJVmFsaWRhdG9yTXV0YWJsZSB2ID0gKFZhbGlkYXRvck11dGFibGUpIGVsZW1lbnQ7Ci0JCQkJaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCQkJcmV0dXJuIGdldEltYWdlKHYuaXNNYW51YWxWYWxpZGF0aW9uKCkgPyBJbWFnZU5hbWVzLm9rVGFibGUKLQkJCQkJCQk6IEltYWdlTmFtZXMuZmFpbFRhYmxlKTsKLQkJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQkJcmV0dXJuIGdldEltYWdlKHYuaXNCdWlsZFZhbGlkYXRpb24oKSA/IEltYWdlTmFtZXMub2tUYWJsZQotCQkJCQkJCTogSW1hZ2VOYW1lcy5mYWlsVGFibGUpOwotCQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykgewotCQkJCQlpZiAoaGFzU2V0dGluZ3ModikpcmV0dXJuIGdldEltYWdlKEltYWdlTmFtZXMuc2V0dGluZ3MpOwotCQkJCQlyZXR1cm4gIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKXJldHVybiAoKFZhbGlkYXRvck11dGFibGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBWYWxpZGF0b3JMaXN0UGFnZShDb21wb3NpdGUgcGFyZW50KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQlfcGFnZSA9IGNyZWF0ZVBhZ2UocGFyZW50KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXR1cFRhYmxlQ29sdW1ucyhUYWJsZSB0YWJsZSkgewotCQkJVGFibGVDb2x1bW4gdmFsaWRhdG9yQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQl2YWxpZGF0b3JDb2x1bW4uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlZBTElEQVRPUik7Ci0JCQl2YWxpZGF0b3JDb2x1bW4uc2V0V2lkdGgoMjQ1KTsKLQkJCVRhYmxlQ29sdW1uIG1hbnVhbENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCQltYW51YWxDb2x1bW4uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLk1BTlVBTCk7Ci0JCQltYW51YWxDb2x1bW4ucGFjaygpOwotCQkJVGFibGVDb2x1bW4gYnVpbGRDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQkJYnVpbGRDb2x1bW4uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkJVSUxEKTsKLQkJCWJ1aWxkQ29sdW1uLnBhY2soKTsKLQkJCVRhYmxlQ29sdW1uIHNldHRpbmdzQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJCXNldHRpbmdzQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5TRVRUSU5HUyk7Ci0JCQlzZXR0aW5nc0NvbHVtbi5wYWNrKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJVmFsaWRhdG9yW10gdmFscyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdChnZXRQcm9qZWN0KCksIFVzZVByb2plY3RQcmVmZXJlbmNlcy5NdXN0VXNlKTsKLQkJCV92YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvck11dGFibGVbdmFscy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaT0wOyBpPHZhbHMubGVuZ3RoOyBpKyspX3ZhbGlkYXRvcnNbaV0gPSBuZXcgVmFsaWRhdG9yTXV0YWJsZSh2YWxzW2ldKTsKLQotCQkJQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQkJR3JpZExheW91dCB2YWxpZGF0b3JHcm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQl2YWxpZGF0b3JHcm91cExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCXZhbGlkYXRvckdyb3VwLnNldExheW91dCh2YWxpZGF0b3JHcm91cExheW91dCk7Ci0JCQlHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuZ3JhYih0cnVlLCB0cnVlKS5hcHBseVRvKHZhbGlkYXRvckdyb3VwKTsKLQotCQkJYWRkT3ZlcnJpZGUodmFsaWRhdG9yR3JvdXApOwotCQkJYWRkQ29uZmlnTGluayh2YWxpZGF0b3JHcm91cCk7Ci0JCQkvLwotCQkJYWRkTGluZSh2YWxpZGF0b3JHcm91cCk7Ci0JCQlhZGRTdXNwZW5kKHZhbGlkYXRvckdyb3VwKTsKLQkJCWFkZFZhbGlkYXRpb25CdWlsZGVyKHZhbGlkYXRvckdyb3VwKTsKLQkJCW5ldyBMYWJlbCh2YWxpZGF0b3JHcm91cCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCQlMYWJlbCBsaXN0TGFiZWwgPSBuZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGxpc3RMYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWxpc3RMYWJlbERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJbGlzdExhYmVsLnNldExheW91dERhdGEobGlzdExhYmVsRGF0YSk7Ci0JCQlsaXN0TGFiZWwuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfVkFMTElTVF9USVRMRSk7Ci0JCQkKLQkJCV92YWxpZGF0b3JzVGFibGUgPSBuZXcgVGFibGUodmFsaWRhdG9yR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IF92YWxpZGF0b3JzVGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCUdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5ncmFiKHRydWUsIHRydWUpLmhpbnQocHJlZmVycmVkU2l6ZSkKLQkJCQkuc3BhbigyLDEpLmFwcGx5VG8oX3ZhbGlkYXRvcnNUYWJsZSk7Ci0KLQkJCV92YWxpZGF0b3JzVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCV92YWxpZGF0b3JzVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCQlfdmFsaWRhdG9yTGlzdCA9IG5ldyBUYWJsZVZpZXdlcihfdmFsaWRhdG9yc1RhYmxlKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldExhYmVsUHJvdmlkZXIobmV3IFZhbGlkYXRpb25MYWJlbFByb3ZpZGVyKCkpOwotCQkJX3ZhbGlkYXRvckxpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWYWxpZGF0aW9uQ29udGVudFByb3ZpZGVyKCkpOwotCQkJX3ZhbGlkYXRvckxpc3Quc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQlzZXR1cFRhYmxlQ29sdW1ucyhfdmFsaWRhdG9yc1RhYmxlKTsKLQotCQkJX3ZhbGlkYXRvckxpc3Quc2V0SW5wdXQoX3ZhbGlkYXRvcnMpOwotCQkJX3ZhbGlkYXRvcnNUYWJsZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJCWlmIChlLmJ1dHRvbiAhPSAxKXJldHVybjsKLQotCQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gX3ZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJCQlpZiAodGFibGVJdGVtID09IG51bGwgfHwgdGFibGVJdGVtLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJLy8gaXRlbSBubyBsb25nZXIgZXhpc3RzCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaW50IGNvbHVtbk51bWJlcjsKLQkJCQkJaW50IGNvbHVtbnNDb3VudCA9IF92YWxpZGF0b3JzVGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCQkJaWYgKGNvbHVtbnNDb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBJZiBubyBUYWJsZUNvbHVtbiwgVGFibGUgYWN0cyBhcyBpZiBpdCBoYXMgYSBzaW5nbGUgY29sdW1uCi0JCQkJCQkvLyB3aGljaCB0YWtlcyB0aGUgd2hvbGUgd2lkdGguCi0JCQkJCQljb2x1bW5OdW1iZXIgPSAwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29sdW1uTnVtYmVyID0gLTE7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNDb3VudDsgaSsrKSB7Ci0JCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoaSk7Ci0JCQkJCQkJaWYgKGJvdW5kcy5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQkJCQkJY29sdW1uTnVtYmVyID0gaTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGNvbHVtbk51bWJlciA9PSAtMSlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQljb2x1bW5DbGlja2VkKGNvbHVtbk51bWJlcik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCV92YWxpZGF0b3JzVGFibGUuc2V0TWVudShjcmVhdGVDb250ZXh0TWVudSgpKTsKLQkJCV92YWxpZGF0b3JzVGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCXN1cGVyLmZvY3VzR2FpbmVkKGUpOwotCQkJCQlpZiAoX3ZhbGlkYXRvcnNUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApIHsKLQkJCQkJCV92YWxpZGF0b3JzVGFibGUuc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWFkZEJ1dHRvbnModmFsaWRhdG9yR3JvdXApOwotCi0JCQl1cGRhdGVXaWRnZXRzKCk7Ci0KLQkJCWFwcGx5RGlhbG9nRm9udCh2YWxpZGF0b3JHcm91cCk7Ci0JCQl2YWxpZGF0b3JHcm91cC5zZXRTaXplKHZhbGlkYXRvckdyb3VwLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCi0JCQlyZXR1cm4gdmFsaWRhdG9yR3JvdXA7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQnV0dG9ucyhDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCQotCQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHZhbGlkYXRvckdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJCQotCQkJX2VuYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJX2VuYWJsZUFsbEJ1dHRvbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9CVVRUT05fRU5BQkxFQUxMKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJcGVyZm9ybUVuYWJsZUFsbCgpOwotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSxWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQlfZGlzYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfQlVUVE9OX0RJU0FCTEVBTEwpOwotCQkJX2Rpc2FibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJcGVyZm9ybURpc2FibGVBbGwoKTsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkU3VzcGVuZChDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlfc3VzcGVuZCA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQlfc3VzcGVuZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCV9zdXNwZW5kLnNldFRleHQoVmFsVUlNZXNzYWdlcy5ESVNBQkxFX1ZBTElEQVRJT04pOwotCQkJX3N1c3BlbmQuc2V0U2VsZWN0aW9uKGdldFByb2plY3RQcmVmZXJlbmNlcygpLmdldFN1c3BlbmQoKSk7Ci0JCQlfc3VzcGVuZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCV9zdXNwZW5kLnNldEZvY3VzKCk7Ci0JCQkJCV9jaGFuZ2VzKys7Ci0JCQkJCWVuYWJsZURpc2FibGVXaWRnZXRzKCk7Ci0JCQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJLy9BZGQgYSBsaW5lIHNlcGFyYXRvcgotCQlwcml2YXRlIHZvaWQgYWRkTGluZShDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHZhbGlkYXRvckdyb3VwLFNXVC5TRVBBUkFUT1IgfCBTV1QuU0hBRE9XX09VVCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCWxpbmUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgYWRkQ29uZmlnTGluayhDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApewotCQkJX2NvbmZpZ0xpbmsgPSBuZXcgTGluayh2YWxpZGF0b3JHcm91cCxTV1QuTm9uZSk7Ci0JCQlHcmlkRGF0YSBsYXlvdXQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJX2NvbmZpZ0xpbmsuc2V0TGF5b3V0RGF0YShsYXlvdXQpOwotCQkJX2NvbmZpZ0xpbmsuc2V0VGV4dCgiPEE+IisgLy8kTk9OLU5MUy0xJAotCQkJCVZhbFVJTWVzc2FnZXMuQ29uZmlnV3NTZXR0aW5ncysiPC9BPiIpOyAvLyROT04tTkxTLTEkCi0JCQlfY29uZmlnTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9OT19MSU5LID0gIlByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2Uubm9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJcHVibGljIHZvaWQgZG9MaW5rQWN0aXZhdGVkKExpbmsgZSkgewotCQkJCQlTdHJpbmcgaWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlEKCk7Ci0JCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXXtpZH0sIERBVEFfTk9fTElOSykub3BlbigpOwotCQkJCQl0cnkgewotCQkJCQkJdXBkYXRlV2lkZ2V0cygpOwotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGllKSB7Ci0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKSB7Ci0JCQkJCXJldHVybiAiVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRvTGlua0FjdGl2YXRlZCgoTGluaykgZS53aWRnZXQpOwkJCQkJCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkb0xpbmtBY3RpdmF0ZWQoKExpbmspIGUud2lkZ2V0KTsJCQkJCQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCX0KLQkJCi0JCS8qKgotCQkgKiBJZiB0aGUgY3VycmVudCBwcm9qZWN0IGRvZXNuJ3QgaGF2ZSB0aGUgdmFsaWRhdGlvbiBidWlsZGVyIGNvbmZpZ3VyZWQgb24gaXQsIAotCQkgKiBhbmQgdGhlIHVzZXIgaGFzIGFza2VkIHVzIHRvIGFkZCBhIGJ1aWxkZXIsIGFkZCB0aGUgYnVpbGRlci4gCi0JCSAqIE90aGVyd2lzZSByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZy4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBhZGRCdWlsZGVyKCkgewotCQkJaWYgKF9hZGRWYWxpZGF0aW9uQnVpbGRlciAhPSBudWxsICYmIF9hZGRWYWxpZGF0aW9uQnVpbGRlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlWYWxpZGF0b3JNYW5hZ2VyLmFkZFByb2plY3RCdWlsZFZhbGlkYXRpb25TdXBwb3J0KGdldFByb2plY3QoKSk7Ci0JCX0KLQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFkZFZhbGlkYXRpb25CdWlsZGVyKENvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCkgewotCQkJaWYgKGhhc1ZhbGlkYXRpb25CdWlsZGVyKCkpcmV0dXJuOwotCQkJCi0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJX2FkZFZhbGlkYXRpb25CdWlsZGVyID0gbmV3IEJ1dHRvbih2YWxpZGF0b3JHcm91cCwgU1dULkNIRUNLKTsKLQkJCV9hZGRWYWxpZGF0aW9uQnVpbGRlci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCV9hZGRWYWxpZGF0aW9uQnVpbGRlci5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuQUREX1ZBTElEQVRJT05fQlVJTERFUik7Ci0JCQlfYWRkVmFsaWRhdGlvbkJ1aWxkZXIuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQkJCQotCQkvKioKLQkJICogRG9lcyB0aGlzIHZhbGlkYXRvciBoYXZlIGV4dHJhIHNldHRpbmdzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQ/Ci0JCSAqIEBwYXJhbSB2Ci0JCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBkb2VzCi0JCSAqLwotCQlib29sZWFuIGhhc1NldHRpbmdzKFZhbGlkYXRvck11dGFibGUgdil7Ci0JCQlpZiAodi5pc1YyVmFsaWRhdG9yKCkpcmV0dXJuIHRydWU7Ci0JCQlpZiAodi5nZXREZWxlZ2F0aW5nSWQoKSAhPSBudWxsKXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFuc3dlciBpZiB0aGlzIHByb2plY3QgaGFzIGEgdmFsaWRhdG9yIGJ1aWxkZXIgYXNzaWduZWQgdG8gaXQuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRhdGlvbkJ1aWxkZXIoKXsKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpOwotCQkJCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhWYWxpZGF0aW9uUGx1Z2luLlZBTElEQVRJT05fQlVJTERFUl9JRCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCi0JCXByaXZhdGUgdm9pZCBhZGRPdmVycmlkZShDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0vLwkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCV9vdmVycmlkZSA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQlfb3ZlcnJpZGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlfb3ZlcnJpZGUuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkxhYmVsRW5hYmxlUHJvamVjdFNwZWNpZmljKTsKLQkJCV9vdmVycmlkZS5zZXRTZWxlY3Rpb24oZ2V0UHJvamVjdFByZWZlcmVuY2VzKCkuZ2V0T3ZlcnJpZGUoKSk7Ci0JCQlfb3ZlcnJpZGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlfb3ZlcnJpZGUuc2V0Rm9jdXMoKTsKLQkJCQkJX2NoYW5nZXMrKzsKLQkJCQkJVmFsTWFuYWdlciB2bSA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotCQkJCQlpZiAodm0uZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpKXsKLS8vCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLS8vCQkJCQkJVXNlUHJvamVjdFByZWZlcmVuY2VzIHVzZVByb2plY3QgPSBVc2VQcm9qZWN0UHJlZmVyZW5jZXMuTm9ybWFsOwotLy8JCQkJCQlpZiAoX292ZXJyaWRlLmdldFNlbGVjdGlvbigpKXVzZVByb2plY3QgPSBVc2VQcm9qZWN0UHJlZmVyZW5jZXMuTXVzdFVzZTsKLS8vCQkJCQkJX3ZhbGlkYXRvcnMgPSBjb3B5VmFsaWRhdG9ycyh2bS5nZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QocHJvamVjdCwgdXNlUHJvamVjdCkpOwotLy8JCQkJCQlfdmFsaWRhdG9yTGlzdC5zZXRJbnB1dChfdmFsaWRhdG9ycyk7Ci0JCQkJCQllbmFibGVEaXNhYmxlV2lkZ2V0cygpOwotCQkJCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhfc2hlbGwsIFZhbFVJTWVzc2FnZXMuVmFsaWRhdGlvbiwgCi0JCQkJCQkJVmFsVUlNZXNzYWdlcy5Qcm9qZWN0T3ZlcnJpZGVzTm90QWxsb3dlZCk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE1lbnUgY3JlYXRlQ29udGV4dE1lbnUoKSB7Ci0JCQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudShfdmFsaWRhdG9yc1RhYmxlLmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotCQkJZmluYWwgTWVudUl0ZW0gbWFudWFsSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQkJbWFudWFsSXRlbS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9NTlVfTUFOVUFMKTsKLQkJCWZpbmFsIE1lbnVJdGVtIGJ1aWxkSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCQkJYnVpbGRJdGVtLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX01OVV9CVUlMRCk7Ci0JCQlmaW5hbCBNZW51SXRlbSBzZXR0aW5nc0l0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJc2V0dGluZ3NJdGVtLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX01OVV9TRVRUSU5HUyk7Ci0KLQkJCWNsYXNzIE1lbnVJdGVtTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gKE1lbnVJdGVtKSBlLmdldFNvdXJjZSgpOwotCQkJCQlpbnQgaW5kZXggPSBtZW51LmluZGV4T2YobWVudUl0ZW0pICsgMTsKLQkJCQkJY29sdW1uQ2xpY2tlZChpbmRleCk7Ci0JCQkJfQotCQkJfQotCQkJTWVudUl0ZW1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNZW51SXRlbUxpc3RlbmVyKCk7Ci0JCQltYW51YWxJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWJ1aWxkSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlzZXR0aW5nc0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgX3ZhbGlkYXRvckxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCVZhbGlkYXRvck11dGFibGUgdmFsID0gKFZhbGlkYXRvck11dGFibGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJbWFudWFsSXRlbS5zZXRTZWxlY3Rpb24odmFsLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLQkJCQkJYnVpbGRJdGVtLnNldFNlbGVjdGlvbih2YWwuaXNCdWlsZFZhbGlkYXRpb24oKSk7Ci0JCQkJCXNldHRpbmdzSXRlbS5zZXRFbmFibGVkKGhhc1NldHRpbmdzKHZhbCkpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlyZXR1cm4gbWVudTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNvbHVtbkNsaWNrZWQoaW50IGNvbHVtblRvRWRpdCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBfdmFsaWRhdG9yTGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCVZhbGlkYXRvck11dGFibGUgdmFsID0gKFZhbGlkYXRvck11dGFibGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJc3dpdGNoIChjb2x1bW5Ub0VkaXQpIHsKLQkJCWNhc2UgMToKLQkJCQl2YWwuc2V0TWFudWFsVmFsaWRhdGlvbighdmFsLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQl2YWwuc2V0QnVpbGRWYWxpZGF0aW9uKCF2YWwuaXNCdWlsZFZhbGlkYXRpb24oKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJaWYgKHZhbC5pc1YyVmFsaWRhdG9yKCkpewotCQkJCQlWYWxpZGF0b3JNdXRhYmxlIG5ld1ZhbCA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlKHZhbCk7Ci0JCQkJCUZpbHRlckRpYWxvZyBmZCA9IG5ldyBGaWx0ZXJEaWFsb2coX3NoZWxsLCBuZXdWYWwsIGdldFByb2plY3QoKSk7Ci0JCQkJCWlmIChXaW5kb3cuT0sgPT0gZmQub3BlbigpKXsKLQkJCQkJCV9jaGFuZ2VzKys7Ci0JCQkJCQluZXdWYWwgPSBmZC5nZXRWYWxpZGF0b3IoKTsKLQkJCQkJCWludCBpID0gZmluZGl0KHZhbCk7Ci0JCQkJCQlpZiAoaSAhPSAtMSlfdmFsaWRhdG9yc1tpXSA9IG5ld1ZhbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaGFuZGxlT2xkRGVsZWdhdGUodmFsKTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCX0KLQotCQlwcml2YXRlIGludCBmaW5kaXQoVmFsaWRhdG9yTXV0YWJsZSB2YWwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxfdmFsaWRhdG9ycy5sZW5ndGg7IGkrKylpZiAoX3ZhbGlkYXRvcnNbaV0gPT0gdmFsKXJldHVybiBpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaGFuZGxlT2xkRGVsZWdhdGUoVmFsaWRhdG9yTXV0YWJsZSB2YWwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCF2YWwuaXNWMVZhbGlkYXRvcigpKXJldHVybjsKLQkJCQkKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2YWwuZ2V0Vm1kKCk7Ci0JCQkgICAgaWYgKCF2bWQuaXNEZWxlZ2F0aW5nKCkpcmV0dXJuOwotCQkJICAgIAotCQkJICAgIEdsb2JhbENvbmZpZ3VyYXRpb24gZ2MgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJICAgIFN0cmluZyBkZWxlZ2F0ZUlEID0gZ2MuZ2V0RGVsZWdhdGVVbmlxdWVOYW1lKHZtZCk7Ci0JCQkgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJICAgIERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyBkaWFsb2cgPSAKLQkJCSAgICAJbmV3IERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyhzaGVsbCwgdm1kLCBkZWxlZ2F0ZUlEKTsKLQkJCQotCQkJICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0JCQkKLQkJCSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSyl7Ci0JCSAgICAgICAgCV9jaGFuZ2VzKys7Ci0JCSAgICAgICAgCWdjLnNldERlbGVnYXRlVW5pcXVlTmFtZSh2bWQsIGRpYWxvZy5nZXREZWxlZ2F0ZUlEKCkpOwotCQkgICAgICAgIH0KLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpewotCQkJCQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCS8vIE5lZWQgdG8gdXBkYXRlIGV2ZW4gdGhlIHdpZGdldHMgdGhhdCBkbyBub3QgY2hhbmdlIGJhc2VkIG9uIGFub3RoZXIKLQkJCS8vIHdpZGdldHMgYmVjYXVzZSBvZiBwZXJmb3JtRGVmYXVsdHMoKS4gSWYgcGVyZm9ybURlZmF1bHRzKCkgaXMgc2VsZWN0ZWQsCi0JCQkvLyB0aGVuIHRoZSBwYWdlUHJlZmVyZW5jZXMgdmFsdWVzIGFyZSByZXNldCwgYW5kIHRoZXNlIHdpZGdldHMKLQkJCS8vIG1pZ2h0IGFsc28gbmVlZCB0byBiZSB1cGRhdGVkLgotCQkJdXBkYXRlQWxsV2lkZ2V0cygpOwotCQkJdXBkYXRlSGVscCgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0c0ZvckRlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX3N1c3BlbmQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCV9vdmVycmlkZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZW5hYmxlRGlzYWJsZVdpZGdldHMoKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldElucHV0KF92YWxpZGF0b3JzKTsKLQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVBbGxXaWRnZXRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJX3N1c3BlbmQuc2V0U2VsZWN0aW9uKGdldFByb2plY3RQcmVmZXJlbmNlcygpLmdldFN1c3BlbmQoKSk7Ci0JCQlfb3ZlcnJpZGUuc2V0U2VsZWN0aW9uKGdldFByb2plY3RQcmVmZXJlbmNlcygpLmdldE92ZXJyaWRlKCkpOwotCQkJZW5hYmxlRGlzYWJsZVdpZGdldHMoKTsKLQkJCV92YWxpZGF0b3JMaXN0LnNldElucHV0KF92YWxpZGF0b3JzKTsKLQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQotCQkJYWRkQnVpbGRlcigpOwotCQkJZm9yIChWYWxpZGF0b3JNdXRhYmxlIHZtIDogX3ZhbGlkYXRvcnMpaWYgKHZtLmlzQ2hhbmdlZCgpKV9jaGFuZ2VzKys7Ci0JCQlpZiAoX2NoYW5nZXMgPT0gMClyZXR1cm4gdHJ1ZTsKLQkJCS8vIFsyMTM2MzFdIHRoaXMgd2FybmluZyBzaG91bGQgb25seSBiZSBzaG93biBpZiB0aGUgdXNlciBhY3R1YWxseSB0cmllZCB0byBvdmVycmlkZQotCQkJLy8gdGhlIHZhbGlkYXRvcnMKLQkJCWlmICghVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpICYmIF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSl7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhfc2hlbGwsIFZhbFVJTWVzc2FnZXMuVmFsaWRhdGlvbiwgVmFsVUlNZXNzYWdlcy5Qcm9qZWN0T3ZlcnJpZGVzTm90QWxsb3dlZCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJdXBkYXRlVjFQcm9qZWN0U2V0dGluZ3MoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCQlQcm9qZWN0UHJlZmVyZW5jZXMgcHAgPSBuZXcgUHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QsIF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSwgX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCksIG51bGwpOwotCQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0IHZwbSA9IG5ldyBWYWxQcmVmTWFuYWdlclByb2plY3QocHJvamVjdCk7Ci0JCQl2cG0uc2F2ZVByZWZlcmVuY2VzKHBwLCBfdmFsaWRhdG9ycyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFVwZGF0ZSB0aGUgdmVyc2lvbiAxIHByb2plY3Qgc2V0dGluZ3MuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlVjFQcm9qZWN0U2V0dGluZ3MoKSB7Ci0JCQl0cnkgewotCQkJCVByb2plY3RDb25maWd1cmF0aW9uIHBjID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKGdldFByb2plY3QoKSk7Ci0JCQkJcGMuc2V0RG9lc1Byb2plY3RPdmVycmlkZShfb3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCXBjLnNldERpc2FibGVBbGxWYWxpZGF0aW9uKF9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQkJCQotCQl9Ci0KLQkJLyoqCi0JCSAqIEFuc3dlciB0aGUgc3BlY2lmaWMgcHJvamVjdCBwcmVmZXJlbmNlcy4gSWYgdGhlIHByb2plY3QgZGlkbid0IGhhdmUgYW55IHNwZWNpZmljIHByb2plY3QKLQkJICogcHJlZmVyZW5jZXMsIHRoZW4gY3JlYXRlIGEgZGVmYXVsdCBzZXQuCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgUHJvamVjdFByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcygpewotCQkJcmV0dXJuIFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFByb2plY3RQcmVmZXJlbmNlcyhnZXRQcm9qZWN0KCkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJVmFsaWRhdG9yW10gdmFscyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdChnZXRQcm9qZWN0KCksIFVzZVByb2plY3RQcmVmZXJlbmNlcy5NdXN0Tm90VXNlKTsKLQkJCV92YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvck11dGFibGVbdmFscy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaT0wOyBpPHZhbHMubGVuZ3RoOyBpKyspX3ZhbGlkYXRvcnNbaV0gPSBuZXcgVmFsaWRhdG9yTXV0YWJsZSh2YWxzW2ldKTsKLQotCQkJX2NoYW5nZXMrKzsKLQkJCXVwZGF0ZVdpZGdldHNGb3JEZWZhdWx0cygpOwotCQkJZ2V0RGVmYXVsdHNCdXR0b24oKS5zZXRGb2N1cygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRW5hYmxlQWxsKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJc2V0QWxsVmFsaWRhdG9ycyh0cnVlKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uc2V0Rm9jdXMoKTsKLQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldEFsbFZhbGlkYXRvcnMoYm9vbGVhbiBib29sKSB7Ci0JCQlmb3IgKFRhYmxlSXRlbSBpdGVtIDogX3ZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtcygpKSB7Ci0JCQkJVmFsaWRhdG9yTXV0YWJsZSB2YWwgPSAoVmFsaWRhdG9yTXV0YWJsZSkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJdmFsLnNldE1hbnVhbFZhbGlkYXRpb24oYm9vbCk7Ci0JCQkJdmFsLnNldEJ1aWxkVmFsaWRhdGlvbihib29sKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1EaXNhYmxlQWxsKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJc2V0QWxsVmFsaWRhdG9ycyhmYWxzZSk7Ci0JCQlfZGlzYWJsZUFsbEJ1dHRvbi5zZXRGb2N1cygpOwotCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIZWxwKCkgewotLy8JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKF9zdXNwZW5kLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0RJU0FCTEVfQUxMX0VOQUJMRUQpOwotCQl9Ci0KLQkJLyoKLQkJICogU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBjb250cm9scyBpbnRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCQkgKi8KLQotCQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gX3BhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJX292ZXJyaWRlLmRpc3Bvc2UoKTsKLQkJCV9zdXNwZW5kLmRpc3Bvc2UoKTsKLQkJCV9jb25maWdMaW5rLmRpc3Bvc2UoKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKLQkJCV9lbmFibGVBbGxCdXR0b24uZGlzcG9zZSgpOwotCQkJX3ZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKS5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgd2lkZ2V0cyBiYXNlZCBvbiBzb21lIHRvcCBsZXZlbCBwcmVmZXJlbmNlcy4gCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgZW5hYmxlRGlzYWJsZVdpZGdldHMoKSB7Ci0JCQlib29sZWFuIGdsb2JhbE92ZXJyaWRlID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpOwotCQkJYm9vbGVhbiBlbmFibGUgPSAhX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkgJiBfb3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCkgJiBnbG9iYWxPdmVycmlkZTsKLQkJCV9zdXNwZW5kLnNldEVuYWJsZWQoX292ZXJyaWRlLmdldFNlbGVjdGlvbigpICYgZ2xvYmFsT3ZlcnJpZGUpOwotCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQlfZW5hYmxlQWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCV9kaXNhYmxlQWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCV9jb25maWdMaW5rLnNldEVuYWJsZWQoIWdsb2JhbE92ZXJyaWRlIHx8ICFfb3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbG9zZUZvY3VzKCkgewotCQkJLy8gVGhpcyBwYWdlIGRvZXMgbm90IG5lZWQgdG8gY2FjaGUgYW55dGhpbmcgYmVmb3JlIGl0IGxvc2VzIGZvY3VzLgotCQl9Ci0KLQkJcHVibGljIHZvaWQgZ2FpbkZvY3VzKCkgewotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIEhlbHBDb250ZXh0SWRzLlByb2plY3RQYWdlKTsKLQkJCV9zaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCQkJX3BhZ2VJbXBsID0gbmV3IFZhbGlkYXRvckxpc3RQYWdlKHBhcmVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCV9wYWdlSW1wbCA9IG5ldyBJbnZhbGlkUGFnZShwYXJlbnQpOwotCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSwgVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7Ci0JCX0KLQotCQlyZXR1cm4gX3BhZ2VJbXBsLmdldENvbnRyb2woKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCi0JCXRyeSB7Ci0JCQlfcGFnZUltcGwucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQl0cnkgewotCQkJcmV0dXJuIF9wYWdlSW1wbC5wZXJmb3JtT2soKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSwgVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB0aGUgcGFnZXMgYXJlIGlubmVyIGNsYXNzZXMgb2YgYSBjaGlsZCBQcmVmZXJlbmNlUGFnZSwgbm90IGEKLQkgKiBQcmVmZXJlbmNlUGFnZSBpdHNlbGYsIERpYWxvZ1BhZ2UncyBhdXRvbWF0aWMgZGlzcG9zYWwgb2YgaXRzIGNoaWxkcmVuJ3MKLQkgKiB3aWRnZXRzIGNhbm5vdCBiZSB1c2VkLiBJbnN0ZWFkLCBkaXNwb3NlIG9mIGVhY2ggaW5uZXIgY2xhc3MnIHdpZGdldHMKLQkgKiBleHBsaWNpdGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCWlmIChfcGFnZUltcGwgIT0gbnVsbCkgewotCQkJCV9wYWdlSW1wbC5kaXNwb3NlKCk7Ci0JCQkJX3BhZ2VJbXBsID0gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSwgVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4YykgewotCQlWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JfQotCi0JLyoKLQkgKiBwYWNrYWdlIHZpc2liaWxpdHkgYmVjYXVzZSBpZiB0aGlzIG1ldGhvZCBpcyBwcml2YXRlLCB0aGVuIHRoZSBjb21waWxlcgotCSAqIG5lZWRzIHRvIGNyZWF0ZSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBpbnRlcm5hbCBjbGFzc2VzLCBhbmQKLQkgKiB0aGF0IGNhbiBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4KLQkgKi8KLQl2b2lkIGRpc3BsYXlBbmRMb2dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjKSB7Ci0JCWxvZ0Vycm9yKGV4Yyk7Ci0JCWRpc3BsYXlNZXNzYWdlKHRpdGxlLCBtZXNzYWdlLCBvcmcuZWNsaXBzZS5zd3QuU1dULklDT05fRVJST1IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5TWVzc2FnZShTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBpbnQgaUljb25UeXBlKSB7Ci0JCU1lc3NhZ2VCb3ggbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94KGdldFNoZWxsKCksCi0JCQlvcmcuZWNsaXBzZS5zd3QuU1dULk9LIHwgaUljb25UeXBlIHwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCW1lc3NhZ2VCb3guc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJbWVzc2FnZUJveC5zZXRUZXh0KHRpdGxlKTsKLQkJbWVzc2FnZUJveC5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0JCWlmIChfcGFnZUltcGwgPT0gbnVsbClyZXR1cm47Ci0JCWlmICh2aXNpYmxlKV9wYWdlSW1wbC5nYWluRm9jdXMoKTsKLQkJZWxzZSBfcGFnZUltcGwubG9zZUZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2dldERlZmF1bHRzQnV0dG9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGdldERlZmF1bHRzQnV0dG9uKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdHNCdXR0b24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJSUFkYXB0YWJsZSBzZWxlY3RlZEVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3RlZEVsZW1lbnQgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KXJldHVybiAoSVByb2plY3QpIHNlbGVjdGVkRWxlbWVudDsKLQotCQlPYmplY3QgYWRhcHRlZE9iamVjdCA9IHNlbGVjdGVkRWxlbWVudC5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJaWYgKGFkYXB0ZWRPYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdClyZXR1cm4gKElQcm9qZWN0KSBhZGFwdGVkT2JqZWN0OwotCQlyZXR1cm4gbnVsbDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhZTA5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2YWxpZGF0ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZhbGlkYXRlX2NvcmUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZmMiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM2OTA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLXZhbGlkYXRlLmphcgotYnVpbGQueG1sCi1jb21tb24uamFyCi12YWxpZGF0ZXNyYy56aXAKLWNvbW1vbnNyYy56aXAKLXNyYy56aXAKLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uXzEuMC4wLnppcAotQGRvdAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwY2MxOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2RlYnVnPXRydWUKLQotIyBTZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3aXNoIHBlcmZvcm1hbmNlIGluZm9ybWF0aW9uIHRvIGJlIGxvZ2dlZAotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdGltaW5ncz1mYWxzZQotCi0jIHNldCB0aGlzIHRvIHRydWUgaWYgeW91IHdhbnQgdmVyc2lvbiAxIHZhbGlkYXRvciB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92MT1mYWxzZQotCi0jIFNldCB0aGlzIHRvIGEgZmlsZSBuYW1lLCBpZiB5b3Ugd2lzaCB0aGUgcmVzdWx0cyB0byBiZSBsb2dnZWQgdG8gYSBmaWxlLCBvdGhlcndpc2UKLSMgdGhleSB3aWxsIGJlIHdyaXR0ZW4gdG8gc3RkZXJyLiBXaGVuIGxvZ2dlZCB0byBhIGZpbGUgdGhlIHJlc3VsdHMgYXJlIGluIGEKLSMgQ1NWIChjb21tYSBzZXBhcmF0ZWQgdmFsdWVzKSBmb3JtLiBXaGVuIGxvZ2dlZCB0byBzdGRlcnIgdGhleSBhcmUgaW4gYSBtb3JlIAotIyBodW1hbiByZWFkYWJsZSBmb3JtLgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdGltaW5ncy90cmFjZWZpbGU9Ci0KLSMgQnkgZGVmYXVsdCB0aW1lcyB0aGF0IGFyZSB3cml0dGVuIHRvIHRoZSB0cmFjZSBmaWxlIGFyZSBpbiBtaWxsaXNlY29uZHMgZm9yIGVsYXBzZWQKLSMgdGltZSBhbmQgbmFub3NlY29uZHMgZm9yIGNwdSB0aW1lLiBJZiB5b3UgZmluZCB0aGVzZSB0aW1lcyBlYXNpZXIgdG8gcmVhZCBhcyBzZWNvbmRzCi0jIGFzIGV4cHJlc3NlZCBieSBhIGRvdWJsZSwgdGhlIGZvbGxvd2luZyBmbGFnIGNhbiBiZSB0dXJuZWQgb24uCi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi90aW1pbmdzL3VzZURvdWJsZXM9ZmFsc2UKLQotIyBJZiBleHRyYSBkZXRhaWwgaXMgbmVlZGVkIGZvciBhIHBhcnRpY3VsYXIgdmFsaWRhdG9yIGl0J3MgaWQgY2FuIGJlIHNwZWNpZmllZCBoZXJlLgotIyBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCBtb3JlIGRldGFpbCBvbiB0aGUgWE1MIHZhbGlkYXRvciB5b3Ugd291bGQgdXNlCi0jIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWwgCi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9leHRyYVZhbERldGFpbD0KLQotIyBUbyBtYWtlIGRlYnVnZ2luZyBlYXNpZXIsIHlvdSBjYW4gbWFrZSBpdCBhcHBlYXIgaXMgaWYgb25seSBvbmUgdmFsaWRhdG9yIGhhcyBiZWVuIAotIyByZWdpc3RlcmVkIHZpYSB0aGUgZXh0ZW5zaW9uIHBvaW50cy4gWW91IGRvIHRoaXMgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIGZpbHRlcgotIyB0byB2YWxpZGF0b3IgaWQgb2YgdGhlIG9uZSB2YWxpZGF0b3IgdGhhdCB5b3Ugd2FudCByZWdpc3RlcmVkLgotIwotIyBBcyBhbiBleGFtcGxlLCB5b3UgY291bGQgdXNlIHRoaXMgcGx1Zy1pbiBpZCBmb3IgYSB2MSB2YWxpZGF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJWYWxpZGF0b3IKLSMgYW5kIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLkhUTUxWYWxpZGF0b3IgZm9yIGEgdjIgdmFsaWRhdG9yCi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9maWx0ZXIvYWxsRXhjZXB0PQotCi0jIFRoZSB0cmFjaW5nIGxldmVsLiBJZiBub3Qgc3VwcGxpZWQgYSBkZWZhdWx0IG9mIHplcm8gaXMgdXNlZC4gVGhlIGhpZ2hlciB0aGUgbnVtYmVyIHRoZQotIyBtb3JlIHZlcmJvc2UgdGhlIHRyYWNpbmcuCi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi90cmFjZS9sZXZlbD0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDZkYWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODUwN2RkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotI0ZyaSBBcHIgMTEgMDc6MTU6NDQgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Xwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Xwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkZGMxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gSnVuIDExIDE0OjU4OjIyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkua2V5d29yZHRoaXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YWU0ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24iLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW47eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2N2QxNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgeHNkcy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgeHNkcy8KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSB2YWxpZGF0ZV9jb3JlLyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLyxcCi0gICAgICAgICAgIHZhbGlkYXRlLyxcCi0gICAgICAgICAgIHZmMi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMTFkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZSI+PC9wYWNrYWdlPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnBsdWdpbiI+PC9wYWNrYWdlPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzcyMmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVkFMSURBVElPTl9CVUlMREVSX05BTUU9VmFsaWRhdGlvbgotVkFMSURBVElPTl9QUk9CTEVNTUFSS0VSX05BTUU9VmFsaWRhdGlvbiBNZXNzYWdlCi1Qcm9ibGVtTWFya2VyVjI9VmFsaWRhdGlvbiBNZXNzYWdlCi0KLVZBTElEQVRJT05fUFJPSkVDVE1BUktFUl9OQU1FPUVuYWJsZWQgVmFsaWRhdG9ycwotVkFMSURBVElPTl9QUkVGRVJFTkNFTUFSS0VSX05BTUU9VmFsaWRhdGlvbiBQcmVmZXJlbmNlcwotVmFsaWRhdG9yPVZhbGlkYXRvcgotUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yPVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcgotdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI9dmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIKLVZhbGlkYXRvckRlbGVnYXRlcz1WYWxpZGF0b3IgRGVsZWdhdGVzCi0KLUJ1bmRsZS1OYW1lLjAgPSBWYWxpZGF0aW9uIEZyYW1ld29yawotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLQotRXh0ZW5zaW9uLnZhbGlkYXRvcj1WYWxpZGF0b3IgKFZlcnNpb24gMikKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxNzU2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gIAotPCEtLSBWYWxpZGF0aW9uIGV4dGVuc2lvbiBwb2ludHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2YWxpZGF0b3IiIG5hbWU9IiVWYWxpZGF0b3IiIHNjaGVtYT0ieHNkcy92YWxpZGF0b3JFeHRTY2hlbWEuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdG9yVjIiIG5hbWU9IiVFeHRlbnNpb24udmFsaWRhdG9yIiBzY2hlbWE9InhzZHMvdmFsaWRhdG9yLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIgbmFtZT0iJVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIgc2NoZW1hPSJ4c2RzL3JlZmVyZW5jaWFsRmlsZUV4dFNjaGVtYS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciIgbmFtZT0iJXZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIiBzY2hlbWE9InhzZHMvdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdGlvbkhlbHBlciIgbmFtZT0idmFsaWRhdGlvbkhlbHBlciIgc2NoZW1hPSJ4c2RzL3ZhbGlkYXRpb25IZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdG9yRGVsZWdhdGVzIiBuYW1lPSIlVmFsaWRhdG9yRGVsZWdhdGVzIiBzY2hlbWE9InhzZHMvdmFsaWRhdG9yRGVsZWdhdGVzLmV4c2QiLz4gICAKLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InZhbGlkYXRvckdyb3VwIiBuYW1lPSJWYWxpZGF0b3IgR3JvdXAiIHNjaGVtYT0ieHNkcy92YWxpZGF0b3Jncm91cC5leHNkIi8+ICAgCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleGNsdWRlIiBuYW1lPSJWYWxpZGF0b3IgRXhjbHVzaW9ucyIgc2NoZW1hPSJ4c2RzL2V4Y2x1ZGUuZXhzZCIvPiAgIAotICAgCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBWYWxpZGF0aW9uIENvbnRyaWJ1dGlvbnMgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0idmFsaWRhdGlvbmJ1aWxkZXIiCi0gICAgICAgICBuYW1lPSIlVkFMSURBVElPTl9CVUlMREVSX05BTUUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuYnVpbGRlcnMiPgotICAgICAgPGJ1aWxkZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0aW9uQnVpbGRlciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYnVpbGRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSBQcm9ibGVtIG1hcmtlcnMgbXVzdCBiZSBhIHN1YnR5cGUgb2YgcHJvYmxlbW1hcmtlciB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhc2sgdmlldyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJwcm9ibGVtbWFya2VyIgotICAgICAgICAgbmFtZT0iJVZBTElEQVRJT05fUFJPQkxFTU1BUktFUl9OQU1FIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIj4KLSAgICAgIDwvc3VwZXI+Ci0gICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9wZXJzaXN0ZW50PgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ib3duZXIiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ2YWxpZGF0aW9uU2V2ZXJpdHkiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ0YXJnZXRPYmplY3QiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJncm91cE5hbWUiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJtZXNzYWdlSWQiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gRG9uJ3Qgd2FudCB0byBkaXNwbGF5IHRoaXMgbWFya2VyIGluIHRoZSB0YXNrIHZpZXcgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJvamVjdG1hcmtlciIKLSAgICAgICAgIG5hbWU9IiVWQUxJREFUSU9OX1BST0pFQ1RNQVJLRVJfTkFNRSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9ImVuYWJsZWRWYWxpZGF0b3JMaXN0Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iYXV0b1ZhbGlkYXRlIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0icnVuV2hlbkJ1aWxkIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ibWF4TnVtTWVzc2FnZXMiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJvdmVycmlkZUdsb2JhbFByZWZlcmVuY2VzIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idmVyc2lvbiI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSBEb24ndCB3YW50IHRvIGRpc3BsYXkgdGhpcyBtYXJrZXIgaW4gdGhlIHRhc2sgdmlldyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJwcmVmZXJlbmNlbWFya2VyIgotICAgICAgICAgbmFtZT0iJVZBTElEQVRJT05fUFJFRkVSRU5DRU1BUktFUl9OQU1FIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIj4KLSAgICAgIDwvc3VwZXI+Ci0gICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9wZXJzaXN0ZW50PgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iZW5hYmxlZFZhbGlkYXRvckxpc3QiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJhdXRvVmFsaWRhdGUiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJydW5XaGVuQnVpbGQiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJtYXhOdW1NZXNzYWdlcyI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9InByb2plY3RzQ2FuT3ZlcnJpZGUiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ2ZXJzaW9uIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tIEdSSyAtIEkgYWRkZWQgYSBuZXcgcHJvYmxlbSBtYXJrZXIgc28gdGhhdCB3ZSBjYW4ga2VlcCB0aGUgdjIgY2hhbmdlcyBzZXBhcmF0ZSBmcm9tIHRoZSB2MSBmcmFtZXdvcmsuIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InByb2JsZW1tYXJrZXIyIgotICAgICAgICAgbmFtZT0iJVByb2JsZW1NYXJrZXJWMiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im93bmVyIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3Byb3BlcnR5X2ZpbGVzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3Byb3BlcnR5X2ZpbGVzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmQwZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wcm9wZXJ0eV9maWxlcy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRXJyQ29uZmlnPUlXQUUwMTAwRSBFeHRlbnNpb24gY29uZmlndXJhdGlvbiBlcnJvci4gQW4gaW50ZXJuYWwgZXJyb3IgaGFzIGhhcHBlbmVkLCB0aGUgdmFsaWRhdG9yIHswfSBoYXMgaW5jb3JyZWN0bHkgY29uZmlndXJlZCB0aGUgdmFsaWRhdGlvbiBleHRlbnNpb24gcG9pbnQuCi1FcnJHcm91cE5hbWU9SVdBRTAxMDFFIEludmFsaWQgZWxlbWVudCwgZXhwZWN0IGVpdGhlciB0aGUgZWxlbWVudCAiaW5jbHVkZSIgb3IgImV4Y2x1ZGUiLgotRXJyRmlsdGVyUnVsZT1JV0FFMDEwMkUgQW4gaW52YWxpZCBmaWx0ZXIgcnVsZSBoYXMgYmVlbiBlbmNvdW50ZXJlZC4gQ29udHJpYnV0aW5nIHBsdWctaW46IHswfSwgZWxlbWVudCBuYW1lOiB7MX0KLQotRXJyR3JvdXBOb1R5cGU9SVdBRTAxMDNFIEdyb3VwcyBtdXN0IGhhdmUgYSB2YWxpZCB0eXBlLCBubyB0eXBlIHdhcyByZXR1cm5lZAotRXJyR3JvdXBJbnZhbGlkVHlwZT1JV0FFMDEwNEUgR3JvdXBzIG11c3QgaGF2ZSBhIHZhbGlkIHR5cGUsIHRoZSBmb2xsb3dpbmcgaW52YWxpZCB0eXBlIHdhcyByZXR1cm5lZDogezB9Ci1FcnJEZXBlbmRlbmN5VmVyc2lvbj1JV0FFMDEwNUUgT25seSB2ZXJzaW9uIHswfSBpcyBzdXBwb3J0ZWQKLQotRXJyUGF0dGVybkF0dHJpYj1JV0FFMDEwNkUgVGhlIHBhdHRlcm4gYXR0cmlidXRlIG11c3QgYmUgc3VwcGxpZWQKLUVyclR5cGVSZXE9SVdBRTAxMDdFIFR5cGUgaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGUgZm9yIGZpbGUgZmlsdGVycwotCi1WYmZFeGNTeW50YXhOb1ZhbENsYXNzPUlXQUUwMDE2RSBWYWxpZGF0b3IgY2Fubm90IGJlIGNyZWF0ZWQgYmVjYXVzZSBubyAiY2xhc3MiIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDxydW4+IGVsZW1lbnQgb2YgdGhlIHBsdWdpbi54bWwgZmlsZSBmb3IgdGhlIHZhbGlkYXRvciBuYW1lZCB7MH0uIENhbm5vdCBjcmVhdGUgYSB2YWxpZGF0b3IgdW5sZXNzIGEgPHJ1bj4gZWxlbWVudCBleGlzdHMgdGhhdCBzcGVjaWZpZXMgdGhlICJjbGFzcyIgYXR0cmlidXRlLiBUaGUgdmFsdWUgb2YgdGhlICJjbGFzcyIgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBJV29ya2JlbmNoSGVscGVyIGludGVyZmFjZS4KLVZiZkV4Y1N5bnRheE5vVmFsUnVuPUlXQUUwMDE1RSBWYWxpZGF0b3IgY2Fubm90IGJlIGNyZWF0ZWQgYmVjYXVzZSBubyA8cnVuPiBlbGVtZW50IGlzIHNwZWNpZmllZCBpbiB0aGUgcGx1Z2luLnhtbCBmaWxlIGZvciB0aGUgdmFsaWRhdG9yIG5hbWVkIHswfS4gQ2Fubm90IGNyZWF0ZSBhIHZhbGlkYXRvciB1bmxlc3MgYSA8cnVuPiBlbGVtZW50IGV4aXN0cyB0aGF0IHNwZWNpZmllcyB0aGUgImNsYXNzIiBhdHRyaWJ1dGUuIFRoZSB2YWx1ZSBvZiB0aGUgImNsYXNzIiBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIElXb3JrYmVuY2hIZWxwZXIgaW50ZXJmYWNlLgotVmJmRXhjU3ludGF4Tm9WYWxOdWxsPUlXQUUwMDE4RSBWYWxpZGF0b3IgY2xhc3MgezB9IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBJQ29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihTdHJpbmcpIHJldHVybmVkIG51bGwuCi0KLUVyclR5cGU9VGhlIHZhbHVlIG9mIHRoZSB0eXBlIGF0dHJpYnV0ZSBpcyBpbmNvcnJlY3QuIEl0IHdhcyBzcGVjaWZpZWQgYXMgezB9IGJ1dCB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlOiB7MX0sIHsyfSwgezN9Ci1Db25maWdFcnJvcj1JdCBhcHBlYXJzIHRoYXQgdmFsaWRhdG9yIHswfSAod2l0aCBpZCB7MX0pIGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHksIGl0IHByb2R1Y2VkIHsyfSBtZXNzYWdlcyB3aGlsZSB2YWxpZGF0aW5nIHszfS4gSXQgaGFzIGJlZW4gZGlzYWJsZWQuIFRyeSByZXN0b3JpbmcgdGhlIGRlZmF1bHRzIGZvciB0aGlzIHZhbGlkYXRvci4KLQotRGVjb2RlRXJyb3IxPUlXQUUwMDE5RSBUaGVyZSB3YXMgYSBwcm9ibGVtIGRlc2VyaWFsaXppbmcgYSBzdHJpbmcuIEEgYm9vbGVhbiB3YXMgZXhwZWN0ZWQgYnV0IG5vdCBmb3VuZC4gCi1FcnJvcjIwPUlXQUUwMDIwRSBJbnRlcm5hbCBlcnJvciwgdGhlIGluY29taW5nIHZhbGlkYXRvciBtdXN0IGJlIGEgdjIgdmFsaWRhdG9yCi1FcnJvcjIxPVRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jeSBjb3VsZCBub3QgYmUgcmVzdG9yZWQgYmVjYXVzZSB0aGUgZm9sbG93aW5nIHJlc291cmNlIHswfSBjb3VsZCBubyBsb25nZXIgYmUgZm91bmQuCi1Hcm91cEluY2x1ZGU9SW5jbHVkZSBHcm91cAotR3JvdXBFeGNsdWRlPUV4Y2x1ZGUgR3JvdXAKLQotVHlwZUluY2x1ZGU9aW5jbHVkZQotVHlwZUV4Y2x1ZGU9ZXhjbHVkZQotCi1Kb2JOYW1lPVZhbGlkYXRpb24KLUpvYk5hbWVNb25pdG9yPVZhbGlkYXRpb24gTW9uaXRvcgotSm9iSW5kZXhTYXZlPUluZGV4IFNhdmUKLQotTWlncmF0aW9uSm9iTmFtZT1WYWxpZGF0aW9uIFNldHVwCi0KLVJ1bGVQcm9qZWN0TmF0dXJlPVByb2plY3QgbmF0dXJlCi1SdWxlRmlsZUV4dD1GaWxlIGV4dGVuc2lvbgotUnVsZUZpbGU9RmlsZQotUnVsZUNvbnRlbnRUeXBlPUNvbnRlbnQgVHlwZQotUnVsZUZhY2V0PUZhY2V0Ci1SdWxlRm9sZGVyPUZvbGRlcgotUnVsZUZ1bGw9UXVhbGlmaWVkIEZpbGUKLVJ1bGVQYXR0ZXJuPVBhdHRlcm4KLQotRmlsZUV4dFdpdGhDYXNlPXswfTogezF9IChjYXNlIHNlbnNpdGl2ZSkKLUZpbGVFeHRXaXRob3V0Q2FzZT17MH06IHsxfQotCi1Db250ZW50VHlwZUV4YWN0PXswfTogezF9IChleGNsdWRlcyBzdWJ0eXBlcykKLUNvbnRlbnRUeXBlTm90RXhhY3Q9ezB9OiB7MX0gKGluY2x1ZGVzIHN1YnR5cGVzKQotCi1Mb2dWYWxTdGFydD1WYWxpZGF0b3IgezB9IHN0YXJ0aW5nIHRvIHZhbGlkYXRlOiB7MX0KLUxvZ1ZhbEVuZD1WYWxpZGF0b3IgezB9IGZpbmlzaGVkIHZhbGlkYXRpbmc6IHsxfQotTG9nVmFsRW5kVGltZT1WYWxpZGF0b3IgezB9IHdpdGggaWQgezF9IGZpbmlzaGVkIHZhbGlkYXRpbmc6IHsyfSBpbiB7M30KLUxvZ1ZhbFN1bW1hcnk9VmFsaWRhdG9yIHswfSB3aXRoIGlkIHsxfSB2YWxpZGF0ZWQgezJ9IHJlc291cmNlcyBpbiB7M30KLUxvZ1ZhbFN1bW1hcnkyPVZhbGlkYXRvciB7MH0gd2l0aCBpZCB7MX0gdmFsaWRhdGVkIHsyfSByZXNvdXJjZXMgaW4gezN9IHVzaW5nIHs0fSBvZiBDUFUgdGltZQotTG9nU2Vzc2lvbj1TZXNzaW9uIHN0YXJ0ZWQgb246IHswfQotCi1TZXZFcnJvcj1FcnJvcgotU2V2V2FybmluZz1XYXJuaW5nCi1TZXZJZ25vcmU9SWdub3JlCi0KLVRpbWVVbmRlcj11bmRlciBhIHNlY29uZAotVGltZU5hbm89ezB9IG5hbm9zZWNvbmRzCi1UaW1lTWljcm89ezB9IG1pY3Jvc2Vjb25kcwotVGltZVNlYz17MH0gc2Vjb25kcwotVGltZU1pbj17MH0gbWludXRlcwotCi1Sb2d1ZVZhbGlkYXRvcj1Sb2d1ZSB2YWxpZGF0b3IgZGVsZWdhdGUgZnJvbSBjb250cmlidXRvciB7MH0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wcm9wZXJ0eV9maWxlcy92YWxpZGF0ZV9iYXNlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3Byb3BlcnR5X2ZpbGVzL3ZhbGlkYXRlX2Jhc2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyNTgzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3Byb3BlcnR5X2ZpbGVzL3ZhbGlkYXRlX2Jhc2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVG8gYXZvaWQgbmFtZSBjb2xsaXNpb25zLCBlYWNoIGV4dGVuc2lvbiBwb2ludCBzaG91bGQgcHJlZmFjZSB0aGVpciBwcm9wZXJ0eSBuYW1lcyB3aXRoIGFuIGlkZW50aWZpZXIuCi0jCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAgICAqIENvZGUgb3JpZW50ZWQgaW5zdHJ1Y3Rpb25zOgotIyAgICAgKgotIyAgICAgKiBJbiB0aGUgc3RyaW5nLCB5b3UgbWF5IHNlZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgc2VxdWVuY2VzOgotIyAgICAgKiBhKSB7bn0gIHdoZXJlIG4gaXMgYSBudW1iZXIuIFRoZXNlIGFyZSByZXBsYWNlYWJsZSBwYXJhbWV0ZXJzLgotIyAgICAgKiBiKSAnJyAgSW4gLnByb3BlcnRpZXMgZmlsZXMsIGluIG9yZGVyIHRvIHNlZSBvbmUgYXBvc3Ryb3BoZSAoJykgaW4gdGhlIGZpbmFsCi0jICAgICAqICAgIHN0cmluZywgc29tZXRpbWVzIHR3byBhcG9zdHJvcGhlcyBtdXN0IGJlIGVudGVyZWQgaW4gdGhlIHN0cmluZy4gSW4gdGhlIHRyYW5zbGF0ZWQKLSMgICAgICogICAgc3RyaW5nLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUge259IGluIHRoZSBzdHJpbmcsIHRoZW4gdG8gc2hvdyBvbmUgYXBvc3Ryb3BoZQotIyAgICAgKiAgICB0byB0aGUgdXNlciwgcHV0IHR3byBhcG9zdHJvcGhlcyBpbiB0aGUgc3RyaW5nLiBJZiB0aGVyZSBhcmUgbm8ge259IGluIHRoZSBzdHJpbmcsCi0jICAgICAqICAgIHRoZW4gcHV0IG9uZSBhcG9zdHJvcGhlLgotIyAgICAgKiAgICBGb3IgZXhhbXBsZSwgc2F5IHRoYXQgeW91IHdhbnQgdGhlIHVzZXIgdG8gcmVhZCAiR2VvcmdlJ3MgZmlsZSIuIAotIyAgICAgKiAgICAgICAgR0VPUkdFPUdlb3JnZSdzIGZpbGUgd2FzIG9uIHRoZSBkZXNrLgotIyAgICAgKiAgICAgICAgR0VPUkdFMj1HZW9yZ2UnJ3MgZmlsZSBhbmQgezB9IHdlcmUgb24gdGhlIGRlc2suCi0jICAgICAqICAgIEdFT1JHRSB1c2VzIG9uZSBhcG9zdHJvcGhlIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHtufSBhbmQgR0VPUkdFMgotIyAgICAgKiAgICB1c2VzIHR3byBhcG9zdHJvcGhlcyBiZWNhdXNlIHRoZXJlIGlzIGEge259LgotIyAgICAgKiBjKSAnJyB0ZXh0ICcnIHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBkb3VibGUKLSMgICAgICogICAgYXBvc3Ryb3BoZXMgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAKLSMgICAgICogZCkgPHRleHQ+IHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBhbmdsZQotIyAgICAgKiAgICBicmFja2V0cyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0jICAgICAqIGUpICJ0ZXh0IiB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIAotIyAgICAgKiAgICBtYXJrcyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0jICAgICAqICAgIAotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyAgICAgKiBPdGhlciBpbnN0cnVjdGlvbnMKLSMgICAgICogYSkgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdGV4dCB0aGF0IGlzIG9uIGEgbGluZSB3aGljaCBiZWdpbnMgd2l0aCBhIGNvbW1lbnQgCi0jICAgICAqICAgIHN5bWJvbCAoIykuCi0jICAgICAqIGIpIERvIG5vdCB0cmFuc2xhdGUgdGhlc2Ugd29yZHM6IAotIyAgICAgKiAgICAgICAgc2NoZW1hLCBFSkIsIFJEQiwgSkFSLCBSTUksIEJNUCwgQ01QLCBPT1NRTAotIyAgICAgKiBjKSBQbGVhc2UgcmV0dXJuIHRoZSAucHJvcGVydGllcyBmaWxlcyB1c2luZyB0aGUgc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotIyAgICAgKiAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHR3byBvZiB0aGUgZmlsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lLgotIyAgICAgKgotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBBbnkgb3RoZXIgY29tbWVudHMgdG8gdGhlIHRyYW5zbGF0b3JzIGFyZSBvbiBsaW5lcyB3aGljaCBzdGFydCBsaWtlIHRoaXM6ICAjIDJUQzoKLSMKLSMgVmVyc2lvbiAxLjE0Ci0jCi0jCi0jIElEOgotIyAgICBWQkYgLSBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrCi0jICAgICAgIFZCRl9FWEM9RXhjZXB0aW9uIG9yIGVycm9yIHRleHQKLSMgICAgICAgVkJGX1NUQVRVUz1TdGF0dXMgbWVzc2FnZQotIyAgICAgICBWQkZfVEFTSz1UYXNrIGxpc3QgbWVzc2FnZQotIwotCi0jIAotIyBCZWdpbiBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrIFN0cmluZ3MKLSMKLSMgSURzOgotIyAgICBWQkZfRVhDPUV4Y2VwdGlvbiBvciBlcnJvciB0ZXh0Ci0jICAgIFZCRl9TVEFUVVM9U3RhdHVzIG1lc3NhZ2UKLSMgICAgVkJGX1RBU0s9VGFzayBsaXN0IG1lc3NhZ2UKLSMKLVZCRl9FWENfQ0FOTk9UX0FERF9NQVJLRVI9SVdBRTAwMDFFIFRoZSBtYXJrZXIgY2Fubm90IGJlIGFkZGVkIHRvIHJlc291cmNlIHswfSBpbiB0aGUgdGFzayBsaXN0LgotVkJGX0VYQ19DQU5OT1RfUkVNT1ZFX01BUktFUj1JV0FFMDAwMkUgVGhlIG1hcmtlciBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHJlc291cmNlIHswfSBpbiB0aGUgdGFzayBsaXN0LgotCi1WQkZfRVhDX0hFTFBFUl9NSVNTSU5HPUlXQUUwMDAzRSBVbmFibGUgdG8gbG9hZCB7MH0gYmVjYXVzZSBpdCBkaWQgbm90IHNwZWNpZnkgYSA8aGVscGVyPi4gRWFjaCB2YWxpZGF0b3IgbXVzdCBpZGVudGlmeSB0aGUgaGVscGVyIGNsYXNzIHRoYXQgbG9hZHMgaXRzIE1PRiBtb2RlbC4KLVZCRl9FWENfSEVMUEVSX0NBTk5PVExPQUQ9SVdBRTAwMDRFIFVuYWJsZSB0byBsb2FkIHswfSBiZWNhdXNlIGl0cyA8aGVscGVyPiwgezF9LCBjb3VsZCBub3QgYmUgbG9hZGVkLiBFbnN1cmUgdGhhdCB0aGUgY2FzZS1zZW5zaXRpdmUgZmlsZSBuYW1lIGlzIHNwZWxsZWQgY29ycmVjdGx5LgotCi1WQkZfRVhDX0lOVEVSTkFMPUlXQUUwMDA1RSBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdmFsaWRhdGlvbi4gVmFsaWRhdGlvbiB3YXMgYmVpbmcgcnVuIG9uIHByb2plY3QgezB9IHdpdGggdmFsaWRhdG9yIHsxfS4gVGhlIG1lc3NhZ2UgdGhyb3duIHdhcyB7Mn0uCi0KLSMgMlRDOiBJbiB0aGUgZm9sbG93aW5nIHN0cmluZywgInR5cGUiIGlzIGEgbm91bgotVkJGX0VYQ19JTlZBTElEX1RZUEVfRklMVEVSPUlXQUUwMDA2RSBJbnZhbGlkIHR5cGUgZmlsdGVyOyB7MH0gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7MX0uCi1WQkZfRVhDX0lOVkFMSURfUkVTT1VSQ0U9SVdBRTAwMDdFIENhbm5vdCBhZGQgbWVzc2FnZSAiezB9IiB3aXRoIHRhcmdldCBvYmplY3QgInsxfSIgYmVjYXVzZSBubyBmaWxlLCBmb2xkZXIsIG9yIHByb2plY3QgY2FuIGJlIGZvdW5kIHdpdGggd2hpY2ggdG8gYXNzb2NpYXRlIHRoZSBtZXNzYWdlLgotCi1WQkZfRVhDX01JU1NJTkdfVkFMSURBVE9SX0VQPUlXQUUwMDA4RSBUaGUgdmFsaWRhdG9yIGZyYW1ld29yayBjb3VsZCBub3QgYmUgc3RhcnRlZC4gVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lZCBcInswfVwiIGNvdWxkIG5vdCBiZSBmb3VuZC4gU2F2ZSBhbGwgbG9nIGZpbGVzIGFuZCBjb250YWN0IHlvdXIgSUJNIHJlcHJlc2VudGF0aXZlLgotVkJGX0VYQ19NSVNTSU5HX1BST0pFQ1ROQVRVUkVfSUQ9SVdBRTAwMDlFIEEgcHJvamVjdE5hdHVyZSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBJRC4gVmFsaWRhdGlvbiBpcyBpZ25vcmluZyB0aGlzIHRhZyBhbmQgY29udGludWluZy4KLQotVkJGX0VYQ19SVU5USU1FPUlXQUUwMDEwRSBSdW4tdGltZSBleGNlcHRpb24gezB9IG9jY3VycmVkIGR1cmluZyB2YWxpZGF0aW9uLiBUaGUgdmFsaWRhdG9yIGJlaW5nIHJ1biB3YXMgezF9IGFuZCB0aGUgbWVzc2FnZSB0aHJvd24gd2FzIHsyfS4KLQotVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSPUlXQUUwMDEyRSBObyA8aGVscGVyPiBlbGVtZW50IGlzIHNwZWNpZmllZCBpbiB0aGUgcGx1Z2luLnhtbCBmaWxlIGZvciB2YWxpZGF0b3IgezB9LiBTaW5jZSB0aGUgaGVscGVyIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgdmFsaWRhdG9yIHdpbGwgbm90IGJlIGxvYWRlZC4KLVZCRl9FWENfU1lOVEFYX05PX0hFTFBFUl9DTEFTUz1JV0FFMDAxM0UgTm8gImNsYXNzIiBhdHRyaWJ1dGUgaW4gdGhlIDxoZWxwZXI+IGVsZW1lbnQgaXMgc3BlY2lmaWVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUgZm9yIHZhbGlkYXRvciB7MH0uIFRoZSBoZWxwZXIgY2Fubm90IGJlIGNyZWF0ZWQgd2l0aG91dCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGl0LiBTaW5jZSB0aGUgaGVscGVyIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgdmFsaWRhdG9yIHdpbGwgbm90IGJlIGxvYWRlZC4KLVZCRl9FWENfU1lOVEFYX05PX0hFTFBFUl9USFJPV0FCTEU9SVdBRTAwMTRFIFRoZSBoZWxwZXIgezB9IGNhbm5vdCBiZSBjcmVhdGVkIGJlY2F1c2UgYSBUaHJvd2FibGUgd2FzIGNhdWdodC4KLVZCRl9FWENfU1lOVEFYX05PX1ZBTF9USFJPV0FCTEU9SVdBRTAwMTdFIENhbm5vdCBjcmVhdGUgdmFsaWRhdG9yIHswfSBiZWNhdXNlIGEgVGhyb3dhYmxlIHdhcyBjYXVnaHQuCi0KLVZCRl9FWENfRElTQUJMRVY9SVdBRTAwMTlFIENhbm5vdCBpbnN0YW50aWF0ZSB2YWxpZGF0b3IgezB9LiBEaXNhYmxpbmcgdGhlIHZhbGlkYXRvcjsgcmVhZCB0aGUgbG9nIGZvciBkZXRhaWxzLgotVkJGX0VYQ19ESVNBQkxFSD1JV0FFMDAyMEUgQ2Fubm90IGluc3RhbnRpYXRlIGhlbHBlciB7MH0uIERpc2FibGluZyB2YWxpZGF0b3IgezF9OyByZWFkIHRoZSBsb2cgZm9yIGRldGFpbHMuCi1WQkZfRVhDX09SUEhBTl9JVkFMSURBVE9SPUlXQUUwMDIxRSBDYW5ub3QgbG9jYXRlIG1ldGEtZGF0YSBmb3IgdmFsaWRhdG9yIHswfS4KLQotVkJGX0VYQ19WQUxJREFUT1JOQU1FX0lTX05VTEw9SVdBRTAwMjJFIFRoZSBwbHVnaW4gd2l0aCBJRCB7MH0gaGFzIGJlZW4gZGlzYWJsZWQgYmVjYXVzZSBpdHMgZ2V0TmFtZSgpIG1ldGhvZCByZXR1cm5zIG51bGwuIFRoZSBtZXRob2QgbXVzdCByZXR1cm4gYSB2YWx1ZS4KLQotVkJGX0VYQ19OVUxMQ1JFQVRFPUlXQUUwMDIzRSBDYW5ub3QgY3JlYXRlIGEgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9uIGEgbnVsbCByZXNvdXJjZS4KLVZCRl9FWENfTlVMTFNBVkU9SVdBRTAwMjRFIENhbm5vdCBzYXZlIGEgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9uIGEgbnVsbCByZXNvdXJjZS4KLVZCRl9FWENfU0FWRT1JV0FFMDAyNUUgQ291bGQgbm90IHNhdmUgdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBvbiByZXNvdXJjZSB7MH0uCi1WQkZfRVhDX05VTExSRVRSSUVWRT1JV0FFMDAyNkUgQ2Fubm90IHJldHJpZXZlIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSByZXNvdXJjZSBpcyBudWxsLgotVkJGX0VYQ19SRVRSSUVWRT1JV0FFMDAyN0UgQ291bGQgbm90IHJldHJpZXZlIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHJlc291cmNlIHswfS4KLQotVkJGX0VYQ19CQURWTUQ9SVdBRTAwMjhFIFZhbGlkYXRvck1ldGFEYXRhW10gbXVzdCBub3QgYmUgbnVsbCBvciBlbXB0eS4KLVZCRl9FWENfT1BFTlBSSj1JV0FFMDAyOUUgUHJvamVjdCB7MH0gbXVzdCBiZSBvcGVuLgotVkJGX0VYQ19FWElTVFBSSj1JV0FFMDAzMEUgUHJvamVjdCB7MH0gbXVzdCBleGlzdC4KLVZCRl9FWENfQkFEUFJKPUlXQUUwMDMxRSBQcm9qZWN0IHswfSBtdXN0IGJlIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlc291cmNlcyBpbiB0aGUgSVJlc291cmNlW10uCi1WQkZfRVhDX01VTFRJUFJKPUlXQUUwMDMyRSBBbGwgSVJlc291cmNlIGluc3RhbmNlcyBpbiB0aGUgSVJlc291cmNlW10gbXVzdCBiZSBwYXJ0IG9mIHRoZSBzYW1lIElQcm9qZWN0IGluc3RhbmNlLiBUaGUgcmVzb3VyY2VzIGNvbWUgZnJvbSB0aGUgZm9sbG93aW5nIHByb2plY3RzOiB7MH0uCi1WQkZfRVhDX0JBRFZBTD1JV0FFMDAzM0UgVmFsaWRhdG9yIHswfSBtdXN0IGJlIGNvbmZpZ3VyZWQgb24gezF9OwotCi1WQkZfU1RBVFVTX0lOSVRJQUxJWklORz1Jbml0aWFsaXppbmcgezB9LgotCi1WQkZfU1RBVFVTX1ZBTElEQVRPUl9DTEVBTlVQPVBlcmZvcm1pbmcgY2xlYW51cCBvbiB7MH0gYmVmb3JlIHRlcm1pbmF0aW9uLgotCi1WQkZfU1RBVFVTX1BST0dSRVNTTU9OSVRPUl9USVRMRT1WYWxpZGF0aW5nCi1WQkZfU1RBVFVTX05VTExfREVMVEE9TGFzdCBidWlsZCBzdGF0ZSBvZiB7MH0gY291bGQgbm90IGJlIHJldHJpZXZlZC4gUGVyZm9ybWluZyBhIGZ1bGwgdmFsaWRhdGlvbi4KLQotVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRD1WYWxpZGF0aW9uIG9mIHswfSB1c2luZyB7MX0gd2FzIGNhbmNlbGxlZC4KLQotVkJGX1NUQVRVU19TVEFSVF9SRU1PVklOR19PTERfTUVTU0FHRVM9UmVtb3ZpbmcgezB9IG1lc3NhZ2VzIG9uIHsxfSBoYXMgc3RhcnRlZC4uLgotVkJGX1NUQVRVU19GSU5JU0hfUkVNT1ZJTkdfT0xEX01FU1NBR0VTPU1lc3NhZ2VzIHJlbW92ZWQuCi0KLVZCRl9TVEFUVVNfU1RBUlRJTkdfVkFMSURBVElPTj1WYWxpZGF0aW9uIG9mIHswfSBieSB7MX0gaGFzIHN0YXJ0ZWQuLi4KLVZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT049VmFsaWRhdGlvbiBvZiB7MH0gYnkgezF9IGlzIGNvbXBsZXRlLiBBbGwga25vd24gcHJvYmxlbXMgaGF2ZSBiZWVuIHJlcG9ydGVkLgotVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZPVZhbGlkYXRpb24gb2YgezB9IGJ5IHsxfSBlbmRlZCBhYm5vcm1hbGx5LiBUaGUgbGlzdCBvZiBwcm9ibGVtcyBtYXkgYmUgaW5jb21wbGV0ZS4gUGxlYXNlIGNoZWNrIHRoZSBpbmZvcm1hdGlvbiBtZXNzYWdlcyBmb3IgdGhlIGNhdXNlIG9mIHRoZSBhYm5vcm1hbCB0ZXJtaW5hdGlvbi4KLQotVkJGX1NUQVRVU19MT09LSU5HPUxvb2tpbmcgZm9yIHZhbGlkYXRpb24gbWVzc2FnZXMgb3duZWQgYnkgdW5pbnN0YWxsZWQgdmFsaWRhdG9ycy4uLgotVkJGX1NUQVRVU19MT09LSU5HRE9ORT1Mb29raW5nIGZvciB2YWxpZGF0aW9uIG1lc3NhZ2VzIG93bmVkIGJ5IHVuaW5zdGFsbGVkIHZhbGlkYXRvcnMuLi5kb25lLgotVkJGX1NUQVRVU19SRU1PVklORz1SZW1vdmluZyB2YWxpZGF0aW9uIG1lc3NhZ2VzIG93bmVkIGJ5IHVuaW5zdGFsbGVkIHZhbGlkYXRvcnMuLi4KLVZCRl9TVEFUVVNfUkVNT1ZJTkdET05FPVJlbW92aW5nIHZhbGlkYXRpb24gbWVzc2FnZXMgb3duZWQgYnkgdW5pbnN0YWxsZWQgdmFsaWRhdG9ycy4uLmRvbmUuCi0KLVZCRl9XUk9OR19DT05URVhUX0ZPUl9ERUxFR0FURT1UaGUgdmFsaWRhdG9yIHswfSBpcyBhIGJlaW5nIGludm9rZWQgd2l0aCBhIHdyb25nIGNvbnRleHQuIFBsZWFzZSB1c2UgYW4gSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC4KLVZCRl9OT19ERUxFR0FURT1UaGUgdmFsaWRhdG9yIHswfSBpcyBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yIGJ1dCBubyBkZWxlZ2F0ZSBjYW4gZm91bmQgZm9yIGl0LgotVkJGX0NBTk5PVF9JTlNUQU5USUFURV9ERUxFR0FURT1UaGUgdmFsaWRhdG9yIGRlbGVnYXRlIHswfSByZWdpc3RlcmVkIGZvciB7MX0gY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KLQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2Ugd2lsbCBiZSBkZWxldGVkIHNvb24uCi1WQkZfVEFTS19XQVJOX01FU1NBR0VfTElNSVRfQUJPUlQ9SVdBRTAwMzRXIElXQUQzMDAwSTogezF9IHRlcm1pbmF0ZWQgdmFsaWRhdGlvbiBvZiB7MH0gYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgd2VyZSByZXBvcnRlZC4gU29tZSBtZXNzYWdlcyBtYXkgYmUgbWlzc2luZy4KLQotVkJGX1RBU0tfV0FSTl9NRVNTQUdFX0xJTUlUX1ZBTD1JV0FFMDAzNVcgSVdBRDMwMDBJOiBTb21lIG1lc3NhZ2VzIG1heSBiZSBtaXNzaW5nIGJlY2F1c2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGhhcyBiZWVuIHJlcG9ydGVkLiBJbmNyZWFzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgYW5kIHRyeSBhZ2Fpbi4KLVZCRl9WQUxJREFUSU9OX0pPQl9NU0c9V2FpdGluZyBmb3IgYnVpbGQKLQotIwotIyBFbmQgVmFsaWRhdGlvbiBCdWlsZGVyIEZyYW1ld29yayBTdHJpbmdzCi0jCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YWVmMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBWYWxpZGF0aW9uIGNvbnN0YW50cyBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBtYXJrZXIgZXh0ZW5zaW9uIHBvaW50IGFuZCB0aGUgdXNlcidzIHByZWZlcmVuY2VzLgotICogCi0gKiBPbmx5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzaG91bGQgdXNlIHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCVN0cmluZyBESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcgPSAiZGlzYWJsZUFsbFZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkIC8vIGJvb2xlYW4KLQlTdHJpbmcgU0FWRV9BVVRPTUFUSUNBTExZX1NFVFRJTkcgPSAic2F2ZUF1dG9tYXRpY2FsbHkiOyAvLyROT04tTkxTLTEkIC8vIGJvb2xlYW4KLQotCS8vIERlZmF1bHRzIGZvciB0aGUgcHJlZmVyZW5jZSBhbmQgcHJvamVjdCB2YWx1ZXMKLQkKLQlTdHJpbmcgQ1VSUkVOVF9WRVJTSU9OID0gKFN0cmluZykgVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRIZWFkZXJzKCkuZ2V0KG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHMuQlVORExFX1ZFUlNJT04pOyAgLy8gdGhpcyBpcyBhIGNvbnN0YW50LCBzbyBpdCBzaG91bGQgYmUgaW50ZXJuCi0JYm9vbGVhbiBERUZBVUxUX0FTWU5DID0gdHJ1ZTsKLQlib29sZWFuIERFRkFVTFRfRElTQUJMRV9WQUxJREFUSU9OX1NFVFRJTkcgPSBmYWxzZTsKLQlWYWxpZGF0b3JNZXRhRGF0YVtdIERFRkFVTFRfRU5BQkxFRF9WQUxJREFUT1JTID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhQXJyYXlFbmFibGVkQnlEZWZhdWx0KCk7ICAvLyBzdG9yZSBhIGNvcHkgaGVyZSBzbyB0aGF0IHdlIGRvbid0IG1vZGlmeSB0aGUgb3JpZ2luYWwgYW5kIGRvbid0IGNyZWF0ZSBhIGNvcHkgZXZlcnkgdGltZSB3ZSBuZWVkIHRoaXMgdmFsdWUKLQlpbnQgREVGQVVMVF9NQVhOVU1NRVNTQUdFUyA9IDUwOwotCWludCBERVBUSF9JTkZJTklURSA9IElSZXNvdXJjZS5ERVBUSF9JTkZJTklURTsKLQlpbnQgREVQVEhfWkVSTyA9IElSZXNvdXJjZS5ERVBUSF9aRVJPOwotCVN0cmluZyBFTEVNRU5UX1NFUEFSQVRPUiA9ICI7IjsgLy8kTk9OLU5MUy0xJCAvLyBzZXBhcmF0ZXMgdGhlIG5hbWUgb2Ygb25lIElWYWxpZGF0b3IgZnJvbSB0aGUgbmV4dCBpbiB0aGUgbGlzdCBvZiBlbmFibGVkIHZhbGlkYXRvcnMgZm9yIGEgcHJvamVjdCBvciBwcmVmZXJlbmNlCi0JU3RyaW5nIERFTEVHQVRFU19TRVBBUkFUT1IgPSAiPSI7IC8vJE5PTi1OTFMtMSQgLy8gU2VwYXJhdGVzIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvciBpZCBmcm9tIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3IgaWQgaW4gdGhlIGxpc3Qgb2YgZGVsZWdhdGVzCi0KLQkvLyBUaGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0IG1hdGNoIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSBwcmVmZXJlbmNlIG1hcmtlciBhcyBzaG93biBpbiBwbHVnaW4ueG1sCi0JLy8gRXZlbiB0aG91Z2ggdGhlIHBsdWdpbi54bWwgdmFsdWVzIGFyZSBub3QgdXNlZCB0byBjcmVhdGUgbmV3IFByZWZlcmVuY2Ugb3IgUHJvamVjdCBtYXJrZXJzLAotCS8vIG1haW50YWluaW5nIG9uZSBsb2NhbCBuYW1lIGVuc3VyZXMgdGhhdCB0aGVyZSdzIG5vIGNvbmZ1c2lvbiB3cml0aW5nIHRoZSBtaWdyYXRpb24gY29kZS4KLQkvLyBUaGVzZSBhcmUgdGhlIFF1YWxpZmllZE5hbWVzIHVzZWQgdG8gcGVyc2lzdCB0aGUgdXNlcidzIHNldHRpbmdzLgotCVN0cmluZyBFTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTID0gImVuYWJsZWRNYW51YWxWYWxpZGF0b3JMaXN0IjsgLy8kTk9OLU5MUy0xJCAvLyBTdHJpbmcKLQlTdHJpbmcgRU5BQkxFRF9CVUlMRF9WQUxJREFUT1JTID0gImVuYWJsZWRCdWlsZFZhbGlkYXRvckxpc3QiOyAvLyROT04tTkxTLTEkIC8vIFN0cmluZwotCVN0cmluZyBERUxFR0FURV9WQUxJREFUT1JTID0gImRlbGVnYXRlVmFsaWRhdG9yTGlzdCI7IC8vJE5PTi1OTFMtMSQgLy8gU3RyaW5nCi0JU3RyaW5nIEoyRUVfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlIjsgLy8kTk9OLU5MUy0xJCAvLyBGb3IgNC4wMywgdGhpcyBpcyB0aGUgcGx1Z2luIGlkIHRoYXQgdGhlIHZhbGlkYXRpb24gY29uc3RhbnRzIHdlcmUgZGVjbGFyZWQgaW4uCi0JU3RyaW5nIE1BWE5VTU1FU1NBR0VTID0gIm1heE51bU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJCAvLyBpbnRlZ2VyCi0JU3RyaW5nIFBMVUdJTl9JRCA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEOwotCVN0cmluZyBQUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERSA9ICJwcm9qZWN0c0Nhbk92ZXJyaWRlIjsgLy8kTk9OLU5MUy0xJCAvLyBib29sZWFuCi0JLy8gZW5kIHZhbGlkYXRpb24gbWVzc2FnZSBtYXJrZXIgY29uc3RhbnRzCi0KLQkvLyBQcmVmZXJlbmNlIGFuZCBQcm9qZWN0IGNvbnN0YW50cwotCVN0cmluZyBQUkVGRVJFTkNFX01BUktFUiA9IFBMVUdJTl9JRCArICIucHJlZmVyZW5jZW1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJKX01BUktFUiA9IFBMVUdJTl9JRCArICIucHJvamVjdG1hcmtlciI7IC8vJE5PTi1OTFMtMSQgLy8gVGhlIGV4dGVuc2lvbiB3aGljaCBzYXZlcyB1c2VyIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgZm9yIGEgcGFydGljdWxhciBwcm9qZWN0IChlLmcuIHdoaWNoIHZhbGlkYXRvcnMgcnVuIG9uIHRoZSBwcm9qZWN0KQotCVN0cmluZyBQUkpfTUFSS0VSXzQwMyA9IEoyRUVfUExVR0lOX0lEICsgIi5wcm9qZWN0bWFya2VyIjsgLy8kTk9OLU5MUy0xJCAvLyBUaGUgZXh0ZW5zaW9uIHdoaWNoIHNhdmVzIHVzZXIgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBmb3IgYSBwYXJ0aWN1bGFyIHByb2plY3QgKGUuZy4gd2hpY2ggdmFsaWRhdG9ycyBydW4gb24gdGhlIHByb2plY3QpCi0JU3RyaW5nIFBSSl9PVkVSUklERUdMT0JBTCA9ICJvdmVycmlkZUdsb2JhbFByZWZlcmVuY2VzIjsgLy8kTk9OLU5MUy0xJCAvLyBib29sZWFuIChVc2UgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyBvciBvdmVycmlkZSkKLQotCVF1YWxpZmllZE5hbWUgVVNFUl9QUkVGRVJFTkNFID0gbmV3IFF1YWxpZmllZE5hbWUoUExVR0lOX0lELCAiVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBmb3IgdGhlIElSZXNvdXJjZQotCVF1YWxpZmllZE5hbWUgVVNFUl9NQU5VQUxfUFJFRkVSRU5DRSA9IG5ldyBRdWFsaWZpZWROYW1lKFBMVUdJTl9JRCwgIlZhbGlkYXRpb25NYW51YWxDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUmVzb3VyY2UKLQlRdWFsaWZpZWROYW1lIFVTRVJfQlVJTERfUFJFRkVSRU5DRSA9IG5ldyBRdWFsaWZpZWROYW1lKFBMVUdJTl9JRCwgIlZhbGlkYXRpb25CdWlsZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBmb3IgdGhlIElSZXNvdXJjZQotCVF1YWxpZmllZE5hbWUgREVMRUdBVEVTX1BSRUZFUkVOQ0UgPSBuZXcgUXVhbGlmaWVkTmFtZShQTFVHSU5fSUQsICJWYWxpZGF0aW9uRGVsZWdhdGVzQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGZvciB0aGUgSVJlc291cmNlCi0KLQkvLyBWYWxpZGF0aW9uIG1lc3NhZ2UgbWFya2VyIGNvbnN0YW50cwotCQotCS8qKiAKLQkgKiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIC0gVGhlIG1hcmtlciBpZCB3aGljaCBpcyB1c2VkIHRvIGFkZCB2MSB2YWxpZGF0aW9uIG1hcmtlcnMgCi0JICogdG8gdGhlIHRhc2sgbGlzdCAqLwotCVN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9IFBMVUdJTl9JRCArICIucHJvYmxlbW1hcmtlciI7IC8vJE5PTi1OTFMtMSQgCi0JCi0JLyoqIEZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0aGlzIGZpZWxkIGFzc29jaWF0ZXMgYSBtZXNzYWdlIHdpdGggYSBncm91cCwgc28gdGhhdCBhIHN1YnNldCBvZiBtZXNzYWdlcyBtYXkgYmUgcmVtb3ZlZCBmcm9tIGEgZmlsZS4gKi8KLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfR1JPVVAgPSAiZ3JvdXBOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAgUGVyc2lzdCB0aGUgbWVzc2FnZSBpZCBvZiB0aGUgbWVzc2FnZSwgbm90IGp1c3QgdGhlIHRyYW5zbGF0ZWQgdGV4dC4gKi8KLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfTUVTU0FHRUlEID0gIm1lc3NhZ2VJZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0IG1hdGNoIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgbWFya2VyIGFzIHNob3duIGluIHBsdWdpbi54bWwKLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfT1dORVIgPSAib3duZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBJVmFsaWRhdG9yIHdobyBvd25zIHRoZSBJTWFya2VyIG9uIHRoZSB0YXNrIGxpc3QKLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFkgPSAidmFsaWRhdGlvblNldmVyaXR5IjsgLy8kTk9OLU5MUy0xJCAvLyBvbmUgb2YgdGhlIFNldmVyaXR5RW51bSB2YWx1ZXMKLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUID0gInRhcmdldE9iamVjdCI7IC8vJE5PTi1OTFMtMSQgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHRhcmdldCBvYmplY3QgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgSVJlc291cmNlLCB0aGlzIGZpZWxkIGlkZW50aWZpZXMgd2hpY2ggdGFyZ2V0T2JqZWN0IG93bnMgYSBwYXJ0aWN1bGFyIG1lc3NhZ2UuCi0JU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFdTQUQgdmVyc2lvbnMgd2hpY2ggY3JlYXRlZCBtYXJrZXJzIG9mIHRoZXNlIHR5cGVzCi0JU3RyaW5nIFZFUlNJT040XzAzID0gIjQuMDMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZFUlNJT041XzAgPSAiNS4wIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWRVJTSU9ONV8wMSA9ICI1LjAuMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBlbmQgcHJlZmVyZW5jZSBhbmQgcHJvamVjdCBkZWZhdWx0cwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFhZDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIE9ubHkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGNhbiB1c2UgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbk1hbmFnZXIgX2luc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbk1hbmFnZXIoKSB7fQotCi0JcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSB2YWxpZGF0aW9uIG1hcmtlciwgcmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIHdobyBvd25zCi0JICogdGhlIG1lc3NhZ2UuIElmIHRoZSB2YWxpZGF0b3IgY2Fubm90IGJlIGZvdW5kIG9yIGlmIHRoZSBtYXJrZXIgaXMgbm90IGEgdmFsaWRhdGlvbiBtYXJrZXIsCi0JICogcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3IoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKG1hcmtlciA9PSBudWxsKXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlpZiAoIW1hcmtlci5nZXRUeXBlKCkuZXF1YWxzKFZBTElEQVRJT05fTUFSS0VSKSlyZXR1cm4gbnVsbDsKLQotCQkJT2JqZWN0IGF0dHJpYiA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJaWYgKGF0dHJpYiA9PSBudWxsKXJldHVybiBudWxsOwotCQkJcmV0dXJuIGF0dHJpYi50b1N0cmluZygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWFya2VyIGlzIGEgdmFsaWRhdGlvbiBtYXJrZXIuIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhWQUxJREFUSU9OX01BUktFUik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgdXNlIGJ5IHRoZSBUVlQgVmFsaWRhdGlvbiBwbHVnLWluIE9OTFkhISEgTm8gY29kZSBzaG91bGQgYWNjZXNzIHRoZQotCSAqIHZhbGlkYXRpb24gbWFya2VycyBpbiB0aGUgbGlzdCBkaXJlY3RseSBleGNlcHQgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBhbmQgdGhlIFRWVAotCSAqIFZhbGlkYXRpb24gcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxWYWxpZGF0aW9uTWFya2VycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmICgocHJvamVjdCA9PSBudWxsKSB8fCAoIXByb2plY3QuaXNPcGVuKCkpKXJldHVybjsKLQotCQl0cnkgewotCQkJcHJvamVjdC5kZWxldGVNYXJrZXJzKFZBTElEQVRJT05fTUFSS0VSLCBmYWxzZSwgREVQVEhfSU5GSU5JVEUpOyAvLyBmYWxzZSBtZWFucyBvbmx5Ci0JCQkvLyBjb25zaWRlciBWQUxJREFUSU9OX01BUktFUiwgbm90IHZhcmlhbnRzIG9mIFZBTElEQVRJT05fTUFSS0VSLiAKLQkJCS8vU2luY2UgYWRkVGFzayBvbmx5IGFkZHMgVkFMSURBVElPTl9NQVJLRVIsIHdlIGRvbid0IG5lZWQgdG8gY29uc2lkZXIgaXRzIHN1YnR5cGVzLgotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGZvciB0aGUgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBHbG9iYWxDb25maWd1cmF0aW9uIGdldEdsb2JhbENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlHbG9iYWxDb25maWd1cmF0aW9uIGdwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWdwID0gKEdsb2JhbENvbmZpZ3VyYXRpb24pIHJvb3QuZ2V0U2Vzc2lvblByb3BlcnR5KFVTRVJfUFJFRkVSRU5DRSk7Ci0JCQlpZiAoZ3AgPT0gbnVsbClncCA9IGdldEdsb2JhbENvbmZpZ3VyYXRpb24ocm9vdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUkVUUklFVkUsIG5ldyBTdHJpbmdbXXtyb290LmdldE5hbWUoKX0pKTsKLQkJfQotCQlyZXR1cm4gZ3A7Ci0JfQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIEdsb2JhbENvbmZpZ3VyYXRpb24gZ2V0R2xvYmFsQ29uZmlndXJhdGlvbihJV29ya3NwYWNlUm9vdCByb290KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBudWxsOwotCQl0cnkgewotCQkJZ3AgPSAoR2xvYmFsQ29uZmlndXJhdGlvbikgcm9vdC5nZXRTZXNzaW9uUHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCWlmIChncCA9PSBudWxsKSB7Ci0JCQkJZ3AgPSBuZXcgR2xvYmFsQ29uZmlndXJhdGlvbihyb290KTsKLS8vCQkJCVByZWZlcmVuY2VzV3JhcHBlciBwcmVmcyA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhudWxsLCBudWxsKTsKLS8vCQkJCXByZWZzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZ3ApOwotCQkJCQotCQkJCWdwLmdldFZlcnNpb24oKTsgLy8gaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbidzIHZlcnNpb24gYXR0cmlidXRlCi0JCQkJZ3AubG9hZCgpOyAvLyBpbml0aWFsaXplIHRoaXMgaW5zdGFuY2UgZnJvbSB0aGUgc3RvcmVkIHZhbHVlcwotCQkJCWdwLnBhc3NpdmF0ZSgpOyAvLyBzdG9yZSB0aGlzIGluc3RhbmNlIGFzIGEgcHJvcGVydHkgb24gdGhlIElSZXNvdXJjZQotCQkJfQotCQkJcmV0dXJuIGdwOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JFVFJJRVZFLCBuZXcgU3RyaW5nW117cm9vdC5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUHJvamVjdENvbmZpZ3VyYXRpb24gZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24oSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByanAgPSAoUHJvamVjdENvbmZpZ3VyYXRpb24pIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KFVTRVJfUFJFRkVSRU5DRSk7Ci0JCQlpZiAocHJqcCA9PSBudWxsIHx8ICFwcmpwLmdldFJlc291cmNlKCkuZXhpc3RzKCkpIHsKLQkJCQlwcmpwID0gbmV3IFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCXByanAuZ2V0VmVyc2lvbigpOyAvLyBpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uJ3MgdmVyc2lvbiBhdHRyaWJ1dGUKLQkJCQlwcmpwLmxvYWQoKTsgLy8gaW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlIGZyb20gdGhlIHN0b3JlZCB2YWx1ZXMKLQkJCQlwcmpwLnBhc3NpdmF0ZSgpOyAvLyBzdG9yZSB0aGlzIGluc3RhbmNlIGFzIGEgcHJvcGVydHkgb24gdGhlIElSZXNvdXJjZQotCQkJfQotCQkJcmV0dXJuIHByanA7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUkVUUklFVkUsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJfQotCX0KLQotCXB1YmxpYyBQcm9qZWN0Q29uZmlndXJhdGlvbiBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbldpdGhvdXRNaWdyYXRlKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcmpwID0gKFByb2plY3RDb25maWd1cmF0aW9uKSBwcm9qZWN0LmdldFNlc3Npb25Qcm9wZXJ0eShVU0VSX1BSRUZFUkVOQ0UpOwotCQkJaWYgKHByanAgPT0gbnVsbCB8fCAhcHJqcC5nZXRSZXNvdXJjZSgpLmV4aXN0cygpKSB7Ci0JCQkJcHJqcCA9IG5ldyBQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCQlwcmpwLmdldFZlcnNpb24oKTsgLy8gaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbidzIHZlcnNpb24gYXR0cmlidXRlCi0JCQkJcHJqcC5sb2FkKCk7IC8vIGluaXRpYWxpemUgdGhpcyBpbnN0YW5jZSBmcm9tIHRoZSBzdG9yZWQgdmFsdWVzCi0JCQkJcHJqcC5wYXNzaXZhdGUoKTsgLy8gc3RvcmUgdGhpcyBpbnN0YW5jZSBhcyBhIHByb3BlcnR5IG9uIHRoZSBJUmVzb3VyY2UKLQkJCX0KLQkJCXJldHVybiBwcmpwOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JFVFJJRVZFLCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoZSBuYXR1cmUgb2YgdGhlIHByb2plY3QgaGFzIGNoYW5nZWQ7IHVwZGF0ZSB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGRvZXNuJ3QgZG8gYW55dGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQcm9qZWN0TmF0dXJlKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zaW5nKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChpc01pZ3JhdGVkKHByb2plY3QpKSB7Ci0JCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCQlpZighcHJqcC51c2VHbG9iYWxQcmVmZXJlbmNlKCkpcHJqcC5zdG9yZSgpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIGFueXRoaW5nLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRpbmcoSVByb2plY3QgcHJvamVjdCkgewotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIGFueXRoaW5nLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgb3BlbmluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIERvIG5vdCBsb2FkIG9yIG1pZ3JhdGUgdGhlIHByb2plY3QgaW4gdGhpcyBtZXRob2Q7IGxldCB0aGUgZ2V0Q29uZmlndXJhdGlvbihJUHJvamVjdCkKLQkJLy8gbWV0aG9kIGRvIHRoYXQuIERvIG5vdCBsb2FkIHRoZSBwcm9qZWN0IGJlZm9yZSBpdCdzIG5lY2Vzc2FyeS4KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGFyZSBhdCB0aGUgY3VycmVudCBsZXZlbCBvZiBtZXRhZGF0YSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsTWlncmF0ZWQoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5nZXRSb290KCk7Ci0JCWlmIChyb290ID09IG51bGwpcmV0dXJuIGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdwID0gKEdsb2JhbENvbmZpZ3VyYXRpb24pIHJvb3QuZ2V0U2Vzc2lvblByb3BlcnR5KFVTRVJfUFJFRkVSRU5DRSk7Ci0JCQlpZiAoZ3AgIT0gbnVsbCkgewotCQkJCXJldHVybiBncC5pc1ZlcnNpb25DdXJyZW50KCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBzZXJpYWxpemVkUHJqcCA9IHJvb3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KFVTRVJfUFJFRkVSRU5DRSk7Ci0JCQlpZiAoc2VyaWFsaXplZFByanAgIT0gbnVsbCkgewotCQkJCWdwID0gbmV3IEdsb2JhbENvbmZpZ3VyYXRpb24ocm9vdCk7Ci0JCQkJZ3AuZ2V0VmVyc2lvbigpOyAvLyBpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uJ3MgdmVyc2lvbiBhdHRyaWJ1dGUKLQkJCQlyZXR1cm4gZ3AuaXNWZXJzaW9uQ3VycmVudCgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JFVFJJRVZFLCBuZXcgU3RyaW5nW117cm9vdC5nZXROYW1lKCl9KSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHByb2plY3QgaGFzIHRoZSBjdXJyZW50IGxldmVsIG9mIG1ldGFkYXRhLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNaWdyYXRlZChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQkKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IChQcm9qZWN0Q29uZmlndXJhdGlvbikgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCQlpZiAocHJqcCAhPSBudWxsKXJldHVybiBwcmpwLmlzVmVyc2lvbkN1cnJlbnQoKTsKLQkJCQkKLQkJCQlTdHJpbmcgc2VyaWFsaXplZFByanAgPSBwcm9qZWN0LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShVU0VSX1BSRUZFUkVOQ0UpOwotCQkJCWlmIChzZXJpYWxpemVkUHJqcCAhPSBudWxsKSB7Ci0JCQkJCXByanAgPSBuZXcgUHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJCXByanAuZ2V0VmVyc2lvbigpOyAKLQkJCQkJcmV0dXJuIHByanAuaXNWZXJzaW9uQ3VycmVudCgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGFwcHJvcHJpYXRlIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gd2hldGhlciB0aGUgcHJvamVjdCBoYXMgb3ZlcnJpZGRlbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIG9yIG5vdC4gSWYgdGhlIHByb2plY3QgZXhpc3RzIGFuZCBpcyBhbGxvd2VkIHRvIG92ZXJyaWRlIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBhbnN3ZXIgdGhlCi0JICogcHJvamVjdCBjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgYW5zd2VyIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbi4KLQkgKiBAcGFyYW0gcHJvamVjdCBpdCBjYW4gYmUgbnVsbAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm4gZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwYyA9IGdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQlpZiAocGMgIT0gbnVsbCAmJiAhcGMudXNlR2xvYmFsUHJlZmVyZW5jZSgpKXJldHVybiBwYzsKLQkJcmV0dXJuIGdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRXZlbnRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V2ZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjAzYjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRXZlbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cyBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRNYW5hZ2VyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgc3RhdGljIEV2ZW50TWFuYWdlciBfaW5zdDsKLQkKLQkvLyBmYWxzZSBtZWFucyB0aGF0IGVjbGlwc2UgaXMgbm90IHNodXR0aW5nIGRvd24sIGFuZCB0cnVlIG1lYW5zIHRoYXQgaXQgaXMgc2h1dHRpbmcgZG93bi4gCi0JcHJpdmF0ZSBib29sZWFuIF9zaHV0ZG93bjsgCi0KLQlwcml2YXRlIElSZXNvdXJjZURlbHRhVmlzaXRvciBfcG9zdEF1dG9CdWlsZFZpc2l0b3I7Ci0JcHJpdmF0ZSBib29sZWFuIF9pc0FjdGl2ZTsgLy8gaGFzIHRoZSByZWdpc3RyeSBiZWVuIHJlYWQ/Ci0JCi0JcHJpdmF0ZSBTZXQ8SVByb2plY3RDaGFuZ2VMaXN0ZW5lcj4gX2xpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PElQcm9qZWN0Q2hhbmdlTGlzdGVuZXI+KCk7Ci0KLQlwcml2YXRlIEV2ZW50TWFuYWdlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEV2ZW50TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAoX2luc3QgPT0gbnVsbClfaW5zdCA9IG5ldyBFdmVudE1hbmFnZXIoKTsKLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQcm9qZWN0Q2hhbmdlTGlzdGVuZXIoSVByb2plY3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcil7Ci0JCVRyYWNpbmcubG9nKCJFdmVudE1hbmFnZXItMDM6IGFkZCBsaXN0ZW5lcjogIiwgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCV9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvamVjdENoYW5nZUxpc3RlbmVyKElQcm9qZWN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpewotCQlfbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaWduYWwoSVByb2plY3QgcHJvamVjdCwgaW50IHR5cGUpewotCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSl7Ci0JCQlTdHJpbmcgbmFtZSA9ICJOdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHByb2plY3QgIT0gbnVsbCluYW1lID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCQlUcmFjaW5nLmxvZygiRXZlbnRNYW5hZ2VyLTAyOiBzaWduYWwgcHJvamVjdDogIiArIG5hbWUgKyAiLCBJUHJvamVjdENoYW5nZUxpc3RlbmVyIHR5cGU6ICIgKyB0eXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZm9yIChJUHJvamVjdENoYW5nZUxpc3RlbmVyIHBjbCA6IF9saXN0ZW5lcnMpewotCQkJdHJ5IHsKLQkJCQlwY2wucHJvamVjdENoYW5nZWQocHJvamVjdCwgdHlwZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbmluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIVZhbGlkYXRpb25QbHVnaW4uaXNBY3RpdmF0ZWQoKSlyZXR1cm47Ci0JCQotCQlzaWduYWwocHJvamVjdCwgSVByb2plY3RDaGFuZ2VMaXN0ZW5lci5Qcm9qZWN0T3BlbmVkKTsKLQotCQkvLyBXaGVuIHRoZSBwcm9qZWN0IGlzIG9wZW5lZCwgY2hlY2sgZm9yIGFueSBvcnBoYW5lZCB0YXNrcyBvciB0YXNrcyB3aG9zZSBvd25lcnMgbmVlZCB0byBiZSB1cGRhdGVkLgotLy8JCUNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5vcGVuaW5nKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFWYWxpZGF0aW9uUGx1Z2luLmlzQWN0aXZhdGVkKCkpcmV0dXJuOwotCQkKLQkJc2lnbmFsKHByb2plY3QsIElQcm9qZWN0Q2hhbmdlTGlzdGVuZXIuUHJvamVjdENsb3NlZCk7Ci0JCQotCQl0cnkgewotCQkJYm9vbGVhbiBpc01pZ3JhdGVkID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzTWlncmF0ZWQocHJvamVjdCk7Ci0JCQkvLyBJZiBpdCdzIG5vdCBtaWdyYXRlZCwgdGhlbiBpdCBoYXNuJ3QgYmVlbiBsb2FkZWQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGxvYWQgdGhlCi0JCQkvLyB2YWxpZGF0b3IgYW5kIGl0cyBwcmVyZXF1aXNpdGUgcGx1Zy1pbnMgdW50aWwgdGhleSdyZSBuZWVkZWQuCi0JCQlpZiAoaXNNaWdyYXRlZCkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KS5nZXRWYWxpZGF0b3JzKCk7Ci0JCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKSB7Ci0KLQkJCQkJaWYgKCF2bWQuaXNBY3RpdmUoKSkgewotCQkJCQkJLy8gSWYgdGhpcyB2YWxpZGF0b3IgaGFzIG5vdCBiZWVuIGFjdGl2YXRlZCwgb3IgaWYgaXQgaGFzIGJlZW4gc2h1dCBkb3duLAotCQkJCQkJLy8gZG9uJ3QgYWN0aXZhdGUgaXQgYWdhaW4uCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQloZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHByb2plY3QpOwotCQkJCQkJaGVscGVyLmNsb3NpbmcoKTsKLQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCi0JCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgcGFydGljdWxhciBoZWxwZXIsIGxvZyB0aGUgZXJyb3IgYW5kCi0JCQkJCQkvLyBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHZhbGlkYXRvci4KLQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmNsb3NpbmcocHJvamVjdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKXJldHVybjsKLQkJCi0JCXNpZ25hbChwcm9qZWN0LCBJUHJvamVjdENoYW5nZUxpc3RlbmVyLlByb2plY3REZWxldGVkKTsKLQotCQl0cnkgewotCQkJYm9vbGVhbiBpc01pZ3JhdGVkID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzTWlncmF0ZWQocHJvamVjdCk7Ci0JCQkvLyBJZiBpdCdzIG5vdCBtaWdyYXRlZCwgdGhlbiBpdCBoYXNuJ3QgYmVlbiBsb2FkZWQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGxvYWQgdGhlCi0JCQkvLyB2YWxpZGF0b3IgYW5kIGl0cyBwcmVyZXF1aXNpdGUgcGx1Zy1pbnMgdW50aWwgdGhleSdyZSBuZWVkZWQuCi0JCQlpZiAoaXNNaWdyYXRlZCkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KS5nZXRWYWxpZGF0b3JzKCk7Ci0JCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKSB7Ci0KLQkJCQkJaWYgKCF2bWQuaXNBY3RpdmUoKSkgewotCQkJCQkJLy8gSWYgdGhpcyB2YWxpZGF0b3IgaGFzIG5vdCBiZWVuIGFjdGl2YXRlZCwgb3IgaWYgaXQgaGFzIGJlZW4gc2h1dCBkb3duLAotCQkJCQkJLy8gZG9uJ3QgYWN0aXZhdGUgaXQgYWdhaW4uCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQloZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHByb2plY3QpOwotCQkJCQkJaGVscGVyLmRlbGV0aW5nKCk7Ci0JCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGlzIHBhcnRpY3VsYXIgaGVscGVyLCBsb2cgdGhlIGVycm9yIGFuZAotCQkJCQkJLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCB2YWxpZGF0b3IuCi0JCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0vLwkJCQlDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZGVsZXRpbmcocHJvamVjdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiBhIHByb2plY3QncyBkZXNjcmlwdGlvbiBjaGFuZ2VzLCBUaGUgcHJvamVjdCBtYXkgaGF2ZSBjaGFuZ2VkIGl0cyBuYXR1cmUuIFVwZGF0ZSB0aGUgY2FjaGUKLQkgKiB0byByZWZsZWN0IHRoZSBuZXcgbmF0dXJlcy4gVGhlIHByb2plY3QgY291bGQgYmUgb3BlbmluZy4gTWlncmF0ZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9zdEF1dG9DaGFuZ2UoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaWYgKF9wb3N0QXV0b0J1aWxkVmlzaXRvciA9PSBudWxsKSB7Ci0JCQlfcG9zdEF1dG9CdWlsZFZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIHN1YmRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChzdWJkZWx0YSA9PSBudWxsKXJldHVybiBmYWxzZTsKLQotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdWJkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdClyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQkJaWYgKChzdWJkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pID09IElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSB7Ci0JCQkJCQkJc2lnbmFsKHByb2plY3QsIElQcm9qZWN0Q2hhbmdlTGlzdGVuZXIuUHJvamVjdENoYW5nZWQpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKChzdWJkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gSVJlc291cmNlRGVsdGEuT1BFTikgewotCQkJCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQkJCS8vIFByb2plY3Qgd2FzIGp1c3Qgb3BlbmVkLiBJZiBwcm9qZWN0LmlzT3BlbigpIGhhZCByZXR1cm5lZCBmYWxzZSwKLQkJCQkJCQkJLy8gcHJvamVjdCB3b3VsZCBqdXN0IGhhdmUgYmVlbiBjbG9zZWQuCi0JCQkJCQkJCW9wZW5pbmcocHJvamVjdCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKChzdWJkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0JCQkJCQkJc2lnbmFsKHByb2plY3QsIElQcm9qZWN0Q2hhbmdlTGlzdGVuZXIuUHJvamVjdEFkZGVkKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlkZWx0YS5hY2NlcHQoX3Bvc3RBdXRvQnVpbGRWaXNpdG9yLCB0cnVlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIG1hbmFnZXIgdGhhdCBzb21lIHJlc291cmNlIGNoYW5nZXMgaGF2ZSBoYXBwZW5lZCBvbiB0aGUgcGxhdGZvcm0uIElmIHRoZSBjaGFuZ2UKLQkgKiBpcyBhIHByb2plY3QgZGVsZXRpb24sIHRoYXQgcHJvamVjdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KLQkgKiAKLQkgKiBAc2VlIElSZXNvdXJjZURlbHRhCi0JICogQHNlZSBJUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKF9zaHV0ZG93biAmJiAhaXNBY3RpdmUoKSkgewotCQkJLy8gSWYgd2UncmUgc2h1dHRpbmcgZG93biwgYW5kIG5vdGhpbmcgaGFzIGJlZW4gYWN0aXZhdGVkLCBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpewotCQkJVHJhY2luZy5sb2coIkV2ZW50bWFuYWdlci0wMTogSVJlc291cmNlQ2hhbmdlRXZlbnQgdHlwZT0iICsgLy8kTk9OLU5MUy0xJAotCQkJCU1pc2MucmVzb3VyY2VDaGFuZ2VFdmVudFR5cGUoZXZlbnQuZ2V0VHlwZSgpKSArIAotCQkJCSIsIHJlc291cmNlPSIgKyAgLy8kTk9OLU5MUy0xJAotCQkJCWV2ZW50LmdldFJlc291cmNlKCkgKyAiLCBzb3VyY2U9IiArIGV2ZW50LmdldFNvdXJjZSgpICsgIiwgZGVsdGE9IiArICAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQlldmVudC5nZXREZWx0YSgpKTsJCQkJCi0JCX0KLQkJCi0JCWlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLQkJCWJvb2xlYW4gaXNQcm9qZWN0ID0gZXZlbnQuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElQcm9qZWN0OwotCQkJaWYgKChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSkgJiYgaXNQcm9qZWN0KSB7Ci0JCQkJZGVsZXRpbmcoKElQcm9qZWN0KSBldmVudC5nZXRSZXNvdXJjZSgpKTsKLQkJCX0gZWxzZSBpZiAoKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UpICYmIGlzUHJvamVjdCkgewotCQkJCWNsb3NpbmcoKElQcm9qZWN0KSBldmVudC5nZXRSZXNvdXJjZSgpKTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpIHsKLQkJCQlwb3N0QXV0b0NoYW5nZShldmVudC5nZXREZWx0YSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IHRoZSBWYWxpZGF0aW9uUGx1Z2luIGlzIHNodXR0aW5nIGRvd24uIChVc3VhbGx5IGltcGxpZXMgdGhhdAotCSAqIGVpdGhlciB0aGUgcGx1Zy1pbiBjb3VsZCBub3QgbG9hZCwgb3IgdGhhdCB0aGUgd29ya2JlbmNoIGlzIHNodXR0aW5nIGRvd24uKQotCSAqIDxwPgotCSAqIFRoZSBtYW5hZ2VyIHdpbGwgdGhlbiBub3RpZnkgYWxsIGFjdGl2ZSBoZWxwZXJzIG9mIHRoZSBzaHV0ZG93biwgc28gdGhhdCB0aGV5IG1heSBwZXJmb3JtIGFueQotCSAqIGxhc3QtbWludXRlIHdyaXRlcyB0byBkaXNrLCBjbGVhbnVwLCBldGMuCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXRyeSB7Ci0JCQkvLyByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpIG5lZWRzIHRvIGtub3cgd2hlbiBhIHNodXRkb3duIGhhcyBzdGFydGVkLgotCQkJX3NodXRkb3duID0gdHJ1ZTsKLQotCQkJLy8gSWYgdGhlIHZhbGlkYXRvcnMgYXJlIGxvYWRlZCwgdGhlbiBmb3IgZXZlcnkgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoLAotCQkJLy8gd2UgbXVzdCBzZWUgaWYgaXQgaGFzIGJlZW4gbG9hZGVkLiBJZiBpdCBoYXMsIGV2ZXJ5IGVuYWJsZWQgSVdvcmtiZW5jaENvbnRleHQKLQkJCS8vIG11c3QgYmUgY2FsbGVkIHRvIGNsZWFuIHVwLiBJZiB0aGUgcHJvamVjdCBoYXNuJ3QgYmVlbiBsb2FkZWQsIHRoZW4gbm8KLQkJCS8vIElXb3JrYmVuY2hDb250ZXh0IGJ1aWx0IGFueXRoaW5nLCBhbmQgdGhlcmUncyBub3RoaW5nIHRvIGNsZWFuIHVwLgotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3RzKCk7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gbnVsbDsKLQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7Ci0JCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCS8vIElmIHRoZSBwcm9qZWN0IGlzbid0IG9wZW5lZCwgdGhlcmUncyBub3RoaW5nIHRvIGNsZWFuIHVwLgotCQkJCQkvLyBJZiB0aGUgcHJvamVjdCB3YXMgb3BlbmVkLCBpdCB3b3VsZCBoYXZlIGJlZW4gbWlncmF0ZWQsIGFuZCB0aGVyZSdzIHNvbWV0aGluZwotCQkJCQkvLyB0byBjbGVhbiB1cC4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQkJCQkJYm9vbGVhbiBpc01pZ3JhdGVkID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzTWlncmF0ZWQocHJvamVjdCk7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1pZ3JhdGVkLCB0aGVuIGl0IGhhc24ndCBiZWVuIGxvYWRlZCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gbG9hZAotCQkJCQkvLyB0aGUgdmFsaWRhdG9yIGFuZCBpdHMgcHJlcmVxdWlzaXRlIHBsdWctaW5zIHVudGlsIHRoZXkncmUgbmVlZGVkLgotCQkJCQlpZiAoaXNNaWdyYXRlZCkgewotCQkJCQkJcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQotCQkJCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRMaXN0ID0gcHJqcC5nZXRFbmFibGVkVmFsaWRhdG9ycygpOwotCQkJCQkJLy8gaWYgdm1kTGlzdCBpcyBudWxsLCBJUHJvamVjdCBoYXMgbmV2ZXIgYmVlbiBsb2FkZWQsIHNvIG5vdGhpbmcgdG8gY2xlYW4gdXAKLQkJCQkJCWlmICh2bWRMaXN0ICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHZtZExpc3QubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdm1kTGlzdFtqXTsKLQotCQkJCQkJCQlpZiAoIXZtZC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCQkJCQkvLyBJZiB0aGlzIHZhbGlkYXRvciBoYXMgbm90IGJlZW4gYWN0aXZhdGVkLCBvciBpZiBpdCBoYXMgYmVlbgotCQkJCQkJCQkJLy8gc2h1dCBkb3duLCBkb24ndCBhY3RpdmF0ZSBpdCBhZ2Fpbi4KLQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gdm1kLmdldEhlbHBlcihwcm9qZWN0KTsKLQkJCQkJCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWhlbHBlci5zaHV0ZG93bigpOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCQkJCQkJCS8vIFNpbmNlIHdlJ3JlIHNodXR0aW5nIGRvd24sIGlnbm9yZSB0aGUgZXhjZXB0aW9uLgotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIFNpbmNlIHdlJ3JlIHNodXR0aW5nIGRvd24sIGlnbm9yZSB0aGUgZXhjZXB0aW9uLgotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCS8vIEhhdmUgdG8gdXNlIHRoaXMgY29udm9sdXRlZCB0ZWNobmlxdWUgZm9yIHRoZSBzaHV0ZG93biBwcm9ibGVtLgotCQkvLyBpLmUuLCB3aGVuIGVjbGlwc2UgaXMgc2h1dCBkb3duLCBpZiB2YWxpZGF0aW9uIHBsdWctaW4gaGFzbid0IGJlZW4gbG9hZGVkLAotCQkvLyB0aGUgRXZlbnRNYW5hZ2VyIGlzIGFjdGl2YXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIGFuZCBpdAotCQkvLyBzZW5kcyBtYW55IGV4Y2VwdGlvbnMgdG8gdGhlIC5sb2cuIEF0IGZpcnN0LCBJIHdyb3RlIGEKLQkJLy8gc3RhdGljIG1ldGhvZCBvbiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIsIHdoaWNoIHJldHVybmVkIHRydWUKLQkJLy8gaWYgdGhlIHJlZ2lzdHJ5IGhhZCBiZWVuIHJlYWQsIGFuZCBmYWxzZSBvdGhlcndpc2UuIEhvd2V2ZXIsCi0JCS8vIHRoYXQgZGlkbid0IHNvbHZlIHRoZSBleGNlcHRpb24gcHJvYmxlbSwgYmVjYXVzZSBlY2xpcHNlJ3MKLQkJLy8gY2xhc3MgbG9hZGVyIGZhaWxlZCB0byBsb2FkIHRoZSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgY2xhc3MuCi0JCS8vCi0JCS8vIFRoZSBmaXggaXMgdG8ga2VlcCBhbGwgc2h1dGRvd24gbWVjaGFuaXNtcyBpbiB0aGlzIGNsYXNzLgotCQkvLyBUcmFjayBldmVyeXRoaW5nIGluIGhlcmUuCi0JCXJldHVybiBfaXNBY3RpdmU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgb25jZSB0aGUgcmVnaXN0cnkgaGFzIGJlZW4KLQkgKiByZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZShib29sZWFuIGIpIHsKLQkJX2lzQWN0aXZlID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHdvcmtiZW5jaCBpcyBydW5uaW5nIGluIFVJIG9yIEhlYWRsZXNzLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFRoaXMgcGx1Zy1pbiBubyBsb25nZXIgZGVwZW5kcyBvbiBqZW0uIElmIHlvdSBuZWVkIHRoaXMgZnVuY3Rpb24gdXNlIHRoZSBqZW0KLQkgKiBjb2RlIGRpcmVjdGx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hlYWRsZXNzKCkgewotCQkvL3JldHVybiBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmdldEN1cnJlbnRDb250ZXh0KCkgPT0gVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5IRUFETEVTU19DT05URVhUOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9GaWx0ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ZpbHRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhMzZiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ZpbHRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgdGhlIFZhbGlkYXRpb25PcGVyYXRpb24gaGllcmFyY2h5LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmlsdGVyVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgVk1ERGVsdGFWaXNpdG9yIF9kZWx0YVZpc2l0b3IgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFZNRFJlc291cmNlVmlzaXRvciBfcmVzb3VyY2VWaXNpdG9yID0gbnVsbDsKLQotCXByaXZhdGUgaW50ZXJmYWNlIFZNRFJlY29yZGVyIHsKLQkJcHVibGljIE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiBnZXRSZXN1bHQoKTsKLQotCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzKTsKLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBWTUREZWx0YVZpc2l0b3IgZXh0ZW5kcyBWTURSZWNvcmRlciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBWTURSZXNvdXJjZVZpc2l0b3IgZXh0ZW5kcyBWTURSZWNvcmRlciwgSVJlc291cmNlVmlzaXRvciB7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXJVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgU2V0IG9mIGVuYWJsZWQgVmFsaWRhdG9yTWV0YURhdGEsIGNyZWF0ZSBhIE1hcCB3aXRoIGVhY2ggVmFsaWRhdG9yTWV0YURhdGEgYXMgYSBrZXkKLQkgKiB3aXRoIGFuIGFzc29jaWF0ZWQgbnVsbCB2YWx1ZS4KLQkgKi8KLQlzdGF0aWMgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IHdyYXBJbk1hcChTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCU1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PigpOwotCQlpZiAoKGVuYWJsZWRWYWxpZGF0b3JzID09IG51bGwpIHx8IChlbmFibGVkVmFsaWRhdG9ycy5zaXplKCkgPT0gMCkpcmV0dXJuIHJlc3VsdDsKLQotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGVuYWJsZWRWYWxpZGF0b3JzKXJlc3VsdC5wdXQodm1kLCBudWxsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBjaGVja0NhbmNlbGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbClyZXR1cm47Ci0JCWVsc2UgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIE1hcCBvZiBWTUQgPD0+U2V0KElGaWxlRGVsdGEpLCBlaXRoZXIgcmV0dXJuIHRoZSBleGlzdGluZyBTZXQgb3IgY3JlYXRlIGEgU2V0IGFuZAotCSAqIHJldHVybiBpdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTZXQ8SUZpbGVEZWx0YT4gZ2V0UmVzb3VyY2VEZWx0YXMoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGVuYWJsZWRWYWxpZGF0b3JzLCAKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlTZXQ8SUZpbGVEZWx0YT4gZmlsZURlbHRhcyA9IGVuYWJsZWRWYWxpZGF0b3JzLmdldCh2bWQpOwotCQlpZiAoZmlsZURlbHRhcyA9PSBudWxsKSB7Ci0JCQlmaWxlRGVsdGFzID0gbmV3IEhhc2hTZXQ8SUZpbGVEZWx0YT4oKTsKLQkJCWVuYWJsZWRWYWxpZGF0b3JzLnB1dCh2bWQsIGZpbGVEZWx0YXMpOwotCQl9Ci0JCXJldHVybiBmaWxlRGVsdGFzOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBJRmlsZURlbHRhIHR5cGUsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBJUmVzb3VyY2VEZWx0YSB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRSZXNvdXJjZURlbHRhVHlwZShpbnQgaWZpbGVEZWx0YVR5cGUpIHsKLQkJc3dpdGNoIChpZmlsZURlbHRhVHlwZSkgewotCQkJY2FzZSAoSUZpbGVEZWx0YS5BRERFRCkgOiB7Ci0JCQkJcmV0dXJuIElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJfQotCi0JCQljYXNlIChJRmlsZURlbHRhLkRFTEVURUQpIDogewotCQkJCXJldHVybiBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOwotCQkJfQotCi0JCQljYXNlIChJRmlsZURlbHRhLkNIQU5HRUQpIDoKLQkJCWRlZmF1bHQgOiB7Ci0JCQkJcmV0dXJuIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgSVJlc291cmNlRGVsdGEgdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIElGaWxlRGVsdGEgdHlwZS4KLQkgKi8KLQlzdGF0aWMgaW50IGdldEZpbGVEZWx0YVR5cGUoaW50IGlyZXNvdXJjZURlbHRhVHlwZSkgewotCQlzd2l0Y2ggKGlyZXNvdXJjZURlbHRhVHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2gKLQkJCXsKLQkJCQlyZXR1cm4gSUZpbGVEZWx0YS5BRERFRDsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogLy8gcmVzb3VyY2VzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaAotCQkJewotCQkJCXJldHVybiBJRmlsZURlbHRhLkNIQU5HRUQ7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgd29ya2JlbmNoCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuREVMRVRFRDsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NIDogLy8gaW5jb21pbmcgd29ya2JlbmNoIHJlc291cmNlCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuQURERUQ7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDogLy8gb3V0Z29pbmcgd29ya2JlbmNoIHJlc291cmNlCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuREVMRVRFRDsKLQkJCX0KLQotCQkJZGVmYXVsdCA6IHsKLQkJCQlyZXR1cm4gSUZpbGVEZWx0YS5DSEFOR0VEOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGJvdGggY29uZmlndXJlZCBvbiB0aGlzIHR5cGUgb2YgcHJvamVjdCwgKGFzIHN0b3JlZCBpbgotCSAqIGdldFByb2plY3QoKSksIGFuZCBlbmFibGVkIGJ5IHRoZSB1c2VyIG9uIHRoaXMgcHJvamVjdC4KLQkgKi8KLQlzdGF0aWMgdm9pZCBhZGRGaWxlRGVsdGEoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGVuYWJsZWRWYWxpZGF0b3JzLCAKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCwgV29ya2JlbmNoRmlsZURlbHRhIGZpbGVEZWx0YSkgewotCQlTZXQ8SUZpbGVEZWx0YT4gZmlsZURlbHRhcyA9IGdldFJlc291cmNlRGVsdGFzKGVuYWJsZWRWYWxpZGF0b3JzLCB2bWQpOwotCQlmaWxlRGVsdGFzLmFkZChmaWxlRGVsdGEpOwotCQllbmFibGVkVmFsaWRhdG9ycy5wdXQodm1kLCBmaWxlRGVsdGFzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBNYXAgd3JhcHBlciwgd2l0aCBlYWNoIFZNRCBmcm9tIGVuYWJsZWRWYWxpZGF0b3JzIGFzIHRoZSBrZXksIGFuZCB0aGUgdmFsdWUgYSBTZXQgb2YKLQkgKiBJRmlsZURlbHRhIHdyYXBwZXIgYXJvdW5kIHRoZSBjaGFuZ2VkIE9iamVjdFtdLgotCSAqIAotCSAqIElmIGZpbHRlckluIGlzIHRydWUsIGRvIG5vdCBjaGVjayBpZiB0aGUgcmVzb3VyY2VzIGFyZSBmaWx0ZXJlZCBpbiBieSB0aGUgdmFsaWRhdG9yLiBJZgotCSAqIGZpbHRlckluIGlzIGZhbHNlLCBjaGVjayBpZiB0aGUgcmVzb3VyY2VzIGFyZSBmaWx0ZXJlZCBpbiBieSB0aGUgdmFsaWRhdG9yIChyZWNvbW1lbmRlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gCi0JCWdldEZpbGVEZWx0YXMoU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkVmFsaWRhdG9ycywgT2JqZWN0W10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBmaWx0ZXJJbikgewotCQkvLyBieSBkZWZhdWx0IGFzc3VtZSB0aGF0IHRoZSByZXNvdXJjZXMgaGF2ZSBjaGFuZ2VkLCBpLmUuIG5vdCBhZGRlZCBvciBkZWxldGVkCi0JCXJldHVybiBnZXRGaWxlRGVsdGFzKGVuYWJsZWRWYWxpZGF0b3JzLCBjaGFuZ2VkUmVzb3VyY2VzLCBJRmlsZURlbHRhLkNIQU5HRUQsIGZpbHRlckluKTsgCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTWFwIHdyYXBwZXIsIHdpdGggZWFjaCBWTUQgZnJvbSBlbmFibGVkVmFsaWRhdG9ycyBhcyB0aGUga2V5LCBhbmQgdGhlIHZhbHVlIGEgU2V0IG9mCi0JICogSUZpbGVEZWx0YSB3cmFwcGVyIGFyb3VuZCB0aGUgY2hhbmdlZCBPYmplY3RbXSwgd2l0aCBlYWNoIGRlbHRhIG9mIHR5cGUgZGVsdGFUeXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IAotCQlnZXRGaWxlRGVsdGFzKFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZW5hYmxlZFZhbGlkYXRvcnMsIE9iamVjdFtdIGNoYW5nZWRSZXNvdXJjZXMsIGludCBpZmlsZURlbHRhVHlwZSkgewotCQkvLyBieSBkZWZhdWx0IGNoZWNrIGlmIHRoZSBPYmplY3RzIGFyZSBmaWx0ZXJlZCBpbiBieSB0aGUgdmFsaWRhdG9yCi0JCXJldHVybiBnZXRGaWxlRGVsdGFzKGVuYWJsZWRWYWxpZGF0b3JzLCBjaGFuZ2VkUmVzb3VyY2VzLCBpZmlsZURlbHRhVHlwZSwgZmFsc2UpOyAKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBNYXAgd3JhcHBlciwgd2l0aCBlYWNoIFZNRCBmcm9tIGVuYWJsZWRWYWxpZGF0b3JzIGFzIHRoZSBrZXksIGFuZCB0aGUgdmFsdWUgYSBTZXQgb2YKLQkgKiBJRmlsZURlbHRhIHdyYXBwZXIgYXJvdW5kIHRoZSBjaGFuZ2VkIE9iamVjdFtdLgotCSAqIDxwPgotCSAqIElmICJmb3JjZSIgaXMgdHJ1ZSwgdGhlbiBkb24ndCBjaGVjayBpZiB0aGUgb2JqZWN0IGlzIGZpbHRlcmVkIGluIGJ5IHRoZSB2YWxpZGF0b3Igb3Igbm90LgotCSAqIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBjYW4gdXNlIHZhbGlkYXRvcnMgdGhhdCBkb24ndCBmaWx0ZXIgaW4gdGhlc2UgcGFydGljdWxhciByZXNvdXJjZXMsCi0JICogYnV0IGNhbiB1c2UgYSBkZWZhdWx0RXh0ZW5zaW9uJ3MgdmFsaWRhdG9ycyBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGdldEZpbGVEZWx0YXMoU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkVmFsaWRhdG9ycywgCi0JCU9iamVjdFtdIGNoYW5nZWRSZXNvdXJjZXMsIGludCBpZmlsZURlbHRhVHlwZSwgYm9vbGVhbiBmb3JjZSkgewotCQkKLQkJTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+KCk7Ci0JCWlmICgoZW5hYmxlZFZhbGlkYXRvcnMgPT0gbnVsbCkgfHwgKGVuYWJsZWRWYWxpZGF0b3JzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWJvb2xlYW4gY2Fubm90TG9hZCA9IGZhbHNlOwotCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSBudWxsOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCQl0cnkgewotCQkJCVNldDxJRmlsZURlbHRhPiBkZWx0YXMgPSBuZXcgSGFzaFNldDxJRmlsZURlbHRhPigpOwotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBjaGFuZ2VkUmVzb3VyY2VzW2ldOwotCQkJCQlXb3JrYmVuY2hGaWxlRGVsdGEgd2ZkID0gbnVsbDsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQkJSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpIG9iajsKLQkJCQkJCWlmIChmb3JjZSB8fCAhZmlsdGVyT3V0KG1vbml0b3IsIHZtZCwgcmVzLCBnZXRSZXNvdXJjZURlbHRhVHlwZShpZmlsZURlbHRhVHlwZSkpKSB7Ci0JCQkJCQkJaGVscGVyID0gdm1kLmdldEhlbHBlcihyZXMuZ2V0UHJvamVjdCgpKTsKLQotCQkJCQkJCXdmZCA9IGdldEZpbGVEZWx0YShoZWxwZXIsIHZtZCwgcmVzLCBnZXRSZXNvdXJjZURlbHRhVHlwZShpZmlsZURlbHRhVHlwZSkpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJd2ZkID0gbmV3IFdvcmtiZW5jaEZpbGVEZWx0YShvYmopOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHdmZCAhPSBudWxsKSB7Ci0JCQkJCQlkZWx0YXMuYWRkKHdmZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0LnB1dCh2bWQsIGRlbHRhcyk7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQljYW5ub3RMb2FkID0gdHJ1ZTsKLQotCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCX0KLQotCQlpZiAoY2Fubm90TG9hZCkgewotCQkJLy8gU29tZSBvZiB0aGUgdmFsaWRhdG9ycyBzaG91bGQgbm90IGJlIGluIHRoZSByZXN1bHQgc2V0IGJlY2F1c2UgZWl0aGVyIHRoZWlyCi0JCQkvLyB2YWxpZGF0b3IgY2xhc3Mgb3IgaGVscGVyIGNsYXNzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQuCi0JCQlPYmplY3RbXSB2bWRzID0gZW5hYmxlZFZhbGlkYXRvcnMudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSB2bWRzW2ldOwotCQkJCWlmICh2bWQuY2Fubm90TG9hZCgpKSB7Ci0JCQkJCXJlc3VsdC5yZW1vdmUodm1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV29ya2JlbmNoRmlsZURlbHRhIGdldEZpbGVEZWx0YShJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVJlc291cmNlIHJlc291cmNlLCBpbnQgaXJlc291cmNlRGVsdGFUeXBlKSB7Ci0JCS8vIHN0cmlwIG9mZiB0aGUgZWNsaXBzZS1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBoZWxwZXIuZ2V0UG9ydGFibGVOYW1lKHJlc291cmNlKTsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwpIHsKLQkJCS8vIFRoZSByZXNvdXJjZSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCi0JCQkvLyBDYW4ndCBzZWUgaG93IHRoaXMgd291bGQgaGFwcGVuLCBidXQgY2hlY2sgZm9yIGl0IGFueXdheS4KLQkJCQotCQkJLy8gWzEyMjk2MF0gbnVsbCBzaG91bGQgYmUgYWxsb3dlZAotLy8JCQlTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19TWU5UQVhfTlVMTF9OQU1FKSwgCi0vLwkJCQluZXcgT2JqZWN0W117cmVzb3VyY2UuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotLy8JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgcmVzdWx0KTsKLQotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmIChyZXNvdXJjZVBhdGggIT0gbnVsbCkgewotCQkJCS8vIFNpbmNlIG51bGwgZmlsZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQsIGRlZmF1bHQgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotCQkJCS8vIHJlc291cmNlLgotCQkJCWZpbGVOYW1lID0gcmVzb3VyY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCAKLQkJCQkJInBvcnRhYmxlTmFtZSBpcyBudWxsIGFuZCBwYXRoIGlzIG51bGwgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWludCBpZmlsZURlbHRhVHlwZSA9IGdldEZpbGVEZWx0YVR5cGUoaXJlc291cmNlRGVsdGFUeXBlKTsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hGaWxlRGVsdGEoZmlsZU5hbWUsIGlmaWxlRGVsdGFUeXBlLCByZXNvdXJjZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGQgdGhlIElSZXNvdXJjZSB0byB0aGUgdm1kJ3MgbGlzdCBvZiByZXNvdXJjZXMgdG8gdmFsaWRhdGUuIFJldHVybiB0cnVlIGlmIHRoZSBhZGQgd2FzCi0JICogc3VjY2Vzc2Z1bCBvciBmYWxzZSBpZiB0aGUgYWRkIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGRUb0ZpbGVMaXN0KE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgU2V0PElGaWxlRGVsdGE+PiBlbmFibGVkVmFsaWRhdG9ycywgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlc291cmNlRGVsdGEsIGJvb2xlYW4gaXNGdWxsQnVpbGQpIHsKLQkJaWYgKCh2bWQgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaGVscGVyLnJlZ2lzdGVyUmVzb3VyY2UocmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5hZGRJbnRlcm5hbEVycm9yVGFzayhyZXNvdXJjZS5nZXRQcm9qZWN0KCksIHZtZCwgZXhjKTsKLQotCQkJLy8gRG9uJ3QgcmV0dXJuIC4uLiBldmVuIHRob3VnaCB0aGUgcmVnaXN0ZXIgdGhyZXcgYW4gZXhjZXB0aW9uLCB0aGF0J3Mgbm90IHRvIHNheQotCQkJLy8gdGhhdCB0aGUgdmFsaWRhdG9yIGNhbid0IHZhbGlkYXRlLgotCQl9Ci0KLQkJaWYgKGlzRnVsbEJ1aWxkKSB7Ci0JCQkvLyBUbyBpbmRpY2F0ZSBhIGZ1bGwgYnVpbGQgdG8gdGhlIHZhbGlkYXRvciwgZG9uJ3QgYnVpbGQgdXAgYSBsaXN0IG9mIGZpbGVzOwotCQkJLy8gcGFzcyBpbiBudWxsIGluc3RlYWQuIEdpdmVuIHRoYXQgdGhlIGxpc3Qgb2YgZmlsZXMgc2hvdWxkIG5vdCBiZSB1c2VkLAotCQkJLy8gZG9uJ3QgY2FsY3VsYXRlIGl0LgotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCi0JCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBnZXRGaWxlRGVsdGEoaGVscGVyLCB2bWQsIHJlc291cmNlLCByZXNvdXJjZURlbHRhKTsKLQkJaWYgKG5ld0ZpbGVEZWx0YSAhPSBudWxsKSB7Ci0JCQkvLyBpZiBkZWx0YSBpcyBudWxsLCBnZXRGaWxlRGVsdGEgd2lsbCBoYXZlIGxvZ2dlZCB0aGUgcHJvYmxlbSBhbHJlYWR5Ci0JCQlhZGRGaWxlRGVsdGEoZW5hYmxlZFZhbGlkYXRvcnMsIHZtZCwgbmV3RmlsZURlbHRhKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgYSBmdWxsIHZlcmlmaWNhdGlvbiBvciBhIGRlbHRhIHZlcmlmaWNhdGlvbiBpcyBpbiBwcm9ncmVzcywgYm90aCB3aWxsIGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBwcm9jZXNzIHRoZSByZXNvdXJjZS4gVGhpcyBtZXRob2QgY2FsbHMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yIHRvIGZpbHRlciB0aGUKLQkgKiByZXNvdXJjZSAoaS5lLiwgdGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgcmVzb3VyY2UgZmFpbHMgdGhlIGZpbHRlciB0ZXN0KS4KLQkgKiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBhbHNvIHNlbmRzIG91dHB1dCB0byB0aGUgPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4sIGFuZCBjYWxscwotCSAqIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogVG8gcHJvY2VzcyBhIHJlc291cmNlLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdGVwczogMS4gY2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIHJlZ2lzdGVyZWQgZm9yCi0JICogdGhpcyB2YWxpZGF0b3IgKGkuZS4sIHRoZSB2YWxpZGF0b3IgaGFzIGVpdGhlciBzcGVjaWZpZWQgaXQgaW4gYSBmaWx0ZXIsIG9yIGhhcyBub3QgZmlsdGVyZWQKLQkgKiBpdCBvdXQgZXhwbGljaXRseSkgMi4gY2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCi0JICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZSBWYWxpZGF0b3IgaXRzZWxmLCBpbgotCSAqIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluCi0JICogcGx1Z2luLnhtbC4gMy4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuIDQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQotCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUgSVByb2dyZXNzTW9uaXRvcidzIHN0YXR1cyBieSBvbmUKLQkgKiAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gZmlsdGVyT3V0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZURlbHRhKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWNoZWNrQ2FuY2VsZWQobW9uaXRvcik7Ci0JCXJldHVybiAhKHZtZC5pc0FwcGxpY2FibGVUbyhyZXNvdXJjZSwgcmVzb3VyY2VEZWx0YSkpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgYSBmdWxsIHZlcmlmaWNhdGlvbiBvciBhIGRlbHRhIHZlcmlmaWNhdGlvbiBpcyBpbiBwcm9ncmVzcywgYm90aAotCSAqIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCB0byBwcm9jZXNzIHRoZSByZXNvdXJjZS4gVGhpcyBtZXRob2QgY2FsbHMgdGhlCi0JICogY3VycmVudCBWYWxpZGF0b3IgdG8gZmlsdGVyIHRoZSByZXNvdXJjZSAoaS5lLiwgdGhpcyBtZXRob2QgcmV0dXJucyBpZgotCSAqIHRoZSByZXNvdXJjZSBmYWlscyB0aGUgZmlsdGVyIHRlc3QpLiBJdCBhbHNvIHNlbmRzIG91dHB1dCB0byB0aGUKLQkgKiA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yPC9jb2RlPiwgYW5kIGNhbGxzIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0bwotCSAqIHZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLQkgKiA8cD4KLQkgKiBUbyBwcm9jZXNzIGEgcmVzb3VyY2UsIHRoZXJlIGFyZSBzZXZlcmFsIHN0ZXBzOgotCSAqIDxvbD4KLQkgKiA8bGk+Q2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdmFsaWRhdG9yIChpLmUuLCB0aGUKLQkgKiB2YWxpZGF0b3IgaGFzIGVpdGhlciBzcGVjaWZpZWQgaXQgaW4gYSBmaWx0ZXIsIG9yIGhhcyBub3QgZmlsdGVyZWQgaXQgb3V0Ci0JICogZXhwbGljaXRseSkKLQkgKiA8bGk+Q2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCi0JICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZQotCSAqIFZhbGlkYXRvciBpdHNlbGYsIGluIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlCi0JICogZnJhbWV3b3JrLCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiA8bGk+SWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uCi0JICogdGhlIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogPGxpPldoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQotCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUKLQkgKiBJUHJvZ3Jlc3NNb25pdG9yJ3Mgc3RhdHVzIGJ5IG9uZSAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCi0JICogPC9vbD4KLQkgKi8KLQlzdGF0aWMgdm9pZCBmaWx0ZXJPdXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZW5hYmxlZFZhbGlkYXRvcnMsIAotCQlJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZURlbHRhLCBib29sZWFuIGlzRnVsbEJ1aWxkKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpcmV0dXJuOwotCi0JCWNoZWNrQ2FuY2VsZWQobW9uaXRvcik7Ci0KLQkJYm9vbGVhbiBjYW5ub3RMb2FkID0gZmFsc2U7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogZW5hYmxlZFZhbGlkYXRvcnMua2V5U2V0KCkpIHsKLQkJCWNoZWNrQ2FuY2VsZWQobW9uaXRvcik7Ci0KLQkJCWlmICghZmlsdGVyT3V0KG1vbml0b3IsIHZtZCwgcmVzb3VyY2UsIHJlc291cmNlRGVsdGEpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gTm90aWZ5IHRoZSBoZWxwZXIgdGhhdCBhIHJlc291cmNlIGlzIGFib3V0IHRvIGJlIGZpbHRlcmVkIGluCi0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IHZtZC5nZXRIZWxwZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQkJYWRkVG9GaWxlTGlzdChlbmFibGVkVmFsaWRhdG9ycywgaGVscGVyLCB2bWQsIHJlc291cmNlLCByZXNvdXJjZURlbHRhLCBpc0Z1bGxCdWlsZCk7Ci0JCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNhbm5vdExvYWQgPSB0cnVlOwotCi0JCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNhbm5vdExvYWQpIHsKLQkJCS8vIFNvbWUgb2YgdGhlIHZhbGlkYXRvcnMgbmVlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNldCBiZWNhdXNlIHRoZSB2YWxpZGF0b3IKLQkJCS8vIG9yIGhlbHBlciBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgotCQkJT2JqZWN0W10gdm1kcyA9IGVuYWJsZWRWYWxpZGF0b3JzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgdm1kc1tpXTsKLQkJCQlpZiAodm1kLmNhbm5vdExvYWQoKSkgewotCQkJCQllbmFibGVkVmFsaWRhdG9ycy5yZW1vdmUodm1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIGEgZnVsbCB2ZXJpZmljYXRpb24gb3IgYSBkZWx0YSB2ZXJpZmljYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIGJvdGggd2lsbCBjYWxsIHRoaXMKLQkgKiBtZXRob2QgdG8gcHJvY2VzcyB0aGUgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byBmaWx0ZXIgdGhlCi0JICogcmVzb3VyY2UgKGkuZS4sIHRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHJlc291cmNlIGZhaWxzIHRoZSBmaWx0ZXIgdGVzdCkuCi0JICogPGNvZGU+cHJvY2VzczwvY29kZT4gYWxzbyBzZW5kcyBvdXRwdXQgdG8gdGhlIDxjb2RlPklQcm9ncmVzc01vbml0b3I8L2NvZGU+LCBhbmQgY2FsbHMKLQkgKiB0aGUgY3VycmVudCBWYWxpZGF0b3IgdG8gdmFsaWRhdGUgdGhlIHJlc291cmNlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgYW4gaW5jcmVtZW50YWwsIG5vdCBhIGZ1bGwsIHZhbGlkYXRpb24uIFRoZSBmdWxsIHZhbGlkYXRpb24KLQkgKiBmYWtlcyBhbiBJUmVzb3VyY2VEZWx0YSwgYW5kIHRoZSBpbmNyZW1lbnRhbCBuZWVkcyB0byBjaGVjayB0aGF0IHRoZSBkZWx0YSBpcyBvbmUgb2YgdGhlCi0JICogZGVsdGFzIHdoaWNoIGlzIGZpbHRlcmVkIGluIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKiAKLQkgKiBAc2VlIGZpbHRlck91dChJUmVzb3VyY2VEZWx0YSkKLQkgKiAKLQkgKiBUbyBwcm9jZXNzIGEgcmVzb3VyY2UsIHRoZXJlIGFyZSBzZXZlcmFsIHN0ZXBzOiAxLiBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgcmVnaXN0ZXJlZCBmb3IKLQkgKiB0aGlzIHZhbGlkYXRvciAoaS5lLiwgdGhlIHZhbGlkYXRvciBoYXMgZWl0aGVyIHNwZWNpZmllZCBpdCBpbiBhIGZpbHRlciwgb3IgaGFzIG5vdCBmaWx0ZXJlZAotCSAqIGl0IG91dCBleHBsaWNpdGx5KSAyLiBjYWxsIDxjb2RlPmlzVmFsaWRhdGlvblNvdXJjZTwvY29kZT4gb24gdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHdpdGgKLQkgKiB0aGUgY3VycmVudCByZXNvdXJjZS4gVGhpcyBtZXRob2QgcGVyZm9ybXMgZnVydGhlciBmaWx0ZXJpbmcgYnkgdGhlIFZhbGlkYXRvciBpdHNlbGYsIGluCi0JICogYWRkaXRpb24gdG8gdGhlIHN0YXRpYyBmaWx0ZXJpbmcgZG9uZSBieSB0aGUgZnJhbWV3b3JrLCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4KLQkgKiBwbHVnaW4ueG1sLiAzLiBJZiB0aGUgcmVzb3VyY2UgcGFzc2VzIGJvdGggZmlsdGVycywgY2FsbCA8Y29kZT52YWxpZGF0ZTwvY29kZT4gb24gdGhlCi0JICogdmFsaWRhdG9yLCB3aXRoIHRoZSByZXNvdXJjZS4gNC4gV2hlbiBjb21wbGV0ZSAoZWl0aGVyIGJ5IGZhaWxpbmcgdG8gcGFzcyBhIGZpbHRlciwgb3IgYnkgdGhlCi0JICogY29tcGxldGlvbiBvZiB0aGUgPGNvZGU+dmFsaWRhdGU8L2NvZGU+KSwgaW5jcmVtZW50IHRoZSBJUHJvZ3Jlc3NNb25pdG9yJ3Mgc3RhdHVzIGJ5IG9uZQotCSAqIChpLmUuLCBvbmUgcmVzb3VyY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLikKLQkgKi8KLQlzdGF0aWMgdm9pZCBmaWx0ZXJPdXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZW5hYmxlZFZhbGlkYXRvcnMsIAotCQkJSVJlc291cmNlIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkvLyBmaWx0ZXIgaW4gb25seSByZXNvdXJjZXMgd2hpY2ggaGF2ZSBiZWVuIGFkZGVkLCBkZWxldGVkLCBvciBpdHMgY29udGVudCBjaGFuZ2VkLgotCQkvLyBtb3ZlcyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgYW4gYWRkICYgZGVsZXRlIGNvbWJpbmF0aW9uCi0JCWlmIChmaWx0ZXJPdXQoZGVsdGEpKXJldHVybjsKLQkJCi0JCWZpbHRlck91dChtb25pdG9yLCBlbmFibGVkVmFsaWRhdG9ycywgcmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSwgZmFsc2UpOyAvLyBmYWxzZSA9Ci0JCS8vIGluY3JlbWVudGFsCi0JCS8vIGJ1aWxkCi0JfQotCi0JLyoqCi0JICogRmlsdGVyIG91dCByZXNvdXJjZSBkZWx0YXMgd2hpY2ggZG9uJ3QgY29ycmVzcG9uZCB0byBjaGFuZ2VzIHRoYXQgdmFsaWRhdG9ycyBjYW4gdmFsaWRhdGUuCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2lsbCBmaWx0ZXIgaW4gZGVsdGFzIG9ubHkgaWYgdGhlIGRlbHRhIGlzIGFuIGFkZCwgYSBkZWxldGUsIG9yIGlmIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUgaGFzIGNoYW5nZWQuCi0JICogCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGRlbHRhIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQsIGFuZCBmYWxzZSBpZiB3ZSBzaG91bGQgdmFsaWRhdGUgaXQuCi0JICogCi0JICogQHNlZSBJUmVzb3VyY2VEZWx0YQotCSAqLwotCXN0YXRpYyBib29sZWFuIGZpbHRlck91dChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAoZGVsdGEgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2gKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgd29ya2JlbmNoCi0JCQl7Ci0JCQkJLy8gSWYgdGhlIGRlbHRhIGlzIGFuIElQcm9qZWN0LCBhbmQgdGhlIElQcm9qZWN0IGlzIGdldHRpbmcgZGVsZXRlZCBvciBjbG9zZWQsIGRvbid0Ci0JCQkJLy8gdmFsaWRhdGUgaXQgb3IgaXRzIGNoaWxkcmVuLgotCQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogLy8gcmVzb3VyY2VzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaAotCQkJewotCQkJCS8vIFdlIHdhbnQgdG8gYWRkIHRoZSBlbnRlcnByaXNlIGJlYW4gb25seSBpZiBpdHMgc291cmNlIGZpbGUncwotCQkJCS8vIGNvbnRlbnRzIGhhdmUgY2hhbmdlZC4gKGZvciBleGFtcGxlLCBpZiBhIGZvbGRlciBoYXMgYmVlbgotCQkJCS8vIGFkZGVkIHRvIHRoZSBwcm9qZWN0LCB0aGUgSUZpbGUgd2lsbCBiZSBjaGFuZ2VkIGJlY2F1c2UKLQkJCQkvLyBpdHMgcG9zaXRpb24gaGFzIGJlZW4gY2hhbmdlZCwgYnV0IHRoZSBlbnRlcnByaXNlIGJlYW4KLQkJCQkvLyBkb2Vzbid0IG5lZWQgdG8gYmUgcmVkZXBsb3llZC4gU2VlIElSZXNvdXJjZURlbHRhLmdldEZsYWdzKCkKLQkJCQkvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4pCi0JCQkJLy8KLQkJCQkvLyBPciwgaWYgZWpiLWphci54bWwgaGFzIGNoYW5nZWQsIHRoZSBFSkJKYXIgaXMgZGVzdHJveWVkICYgY3JlYXRlZAotCQkJCS8vIGZyb20gc2NyYXRjaCwgc28gdGhlIGxpc3Qgb2YgRW50ZXJwcmlzZUJlYW4gaXMgbmV3LiBQdXJnZSB0aGUgb2xkCi0JCQkJLy8gRUpCSmFyIGZyb20gdGhlIEVKQkNhY2hlIChzaW5jZSBpdCB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYWdhaW4pLAotCQkJCS8vIGFuZCBsb2FkIHRoZSBuZXcgRUpCSmFyIGludG8gdGhlIGNhY2hlLgotCQkJCWlmICgoZGVsdGEuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSAmJiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbiBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQotCSAqIHZhbGlkYXRvcnMuIFRoYXQgaXMsIHRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIGNoYW5nZXMgd2hpY2ggY2FuIG9jY3VyIHRvIGFuIElQcm9qZWN0IHdoaWNoCi0JICogc2hvdWxkIG5vdCB0cmlnZ2VyIGEgcmV2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IG9yIGl0cyBjaGlsZHJlbi4gKGUuZy4gcHJvamVjdCBpcyBkZWxldGVkIG9yCi0JICogY2xvc2VkLikgRm9yIHRob3NlIGNhc2VzLCBvciBpZiB0aGUgSVJlc291cmNlRGVsdGEgaXMgaW52YWxpZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UKLQkgKiAoZG8gbm90IHZhbGlkYXRlIHRoZSBJUHJvamVjdCBvciBpdHMgY2hpbGRyZW4pLiBPdGhlcndpc2UsIHJldHVybiB0cnVlICh2YWxpZGF0ZSB0aGUgcmVzb3VyY2UgJgotCSAqIGl0cyBjaGlsZHJlbikuIElmIGFuIElQcm9qZWN0IGl0c2VsZiBoYXMgbm90IGNoYW5nZWQsIGJ1dCBvbmUgb2YgaXRzIGNoaWxkcmVuIGhhcwotCSAqIChkZWx0YS5nZXRLaW5kKCkgb2YgTk9fQ0hBTkdFKSwgdGhlbiByZXR1cm4gdHJ1ZSBzbyB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgdmFsaWRhdGVkLgotCSAqLwotCXN0YXRpYyBib29sZWFuIHNob3VsZFByb2Nlc3MoSVJlc291cmNlIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAoKHJlc291cmNlICE9IG51bGwpICYmICEocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKGRlbHRhID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDogLy8gcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSB3b3JrYmVuY2g7IG1heSBiZSBwYXJ0Ci0JCQkvLyBvZiBhIG1vdmUKLQkJCXsKLQkJCQlpZiAoMCAhPSAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pKSB7Ci0JCQkJCS8vIElmIGl0J3MgYmVpbmcgbW92ZWQsIGRvbid0IHJldmFsaWRhdGUgaXRzIGNoaWxkcmVuLiBJZiBpdCdzIGJlaW5nIGFkZGVkLCBmYWxsCi0JCQkJCS8vIHRocm91Z2ggdG8gdGhlICJyZXR1cm4gdHJ1ZTsiIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgd29ya2JlbmNoOyBtYXkgYmUKLQkJCS8vIHBhcnQgb2YgYSBtb3ZlCi0JCQl7Ci0JCQkJLy8gV2hldGhlciBpdCdzIGJlaW5nIGRlbGV0ZWQgb3IgbW92ZWQsIGRvbid0IHJldmFsaWRhdGUgaXRzIGNoaWxkcmVuLgotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogLy8gcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBpbiB0aGUgd29ya2JlbmNoOyBtYXkgYmUgcGFydAotCQkJLy8gb2YgYSBtb3ZlCi0JCQl7Ci0JCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgewotCQkJCQkvLyBDaGFuZ2UgaXMgcmVsYXRlZCB0byB0aGUgT1BFTiBiaXQuIFdoZXRoZXIgdGhlIHByb2plY3Qgd2FzIGNsb3NlZCBhbmQgaXMgbm93Ci0JCQkJCS8vIG9wZW4sCi0JCQkJCS8vIG9yIHRoZSBwcm9qZWN0IHdhcyBvcGVuIGFuZCBpcyBub3cgY2xvc2VkLCBkb24ndCBuZWVkIHRvIHJldmFsaWRhdGUgdGhlCi0JCQkJCS8vIGNoaWxkcmVuLgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSAhPSAwKSB7Ci0JCQkJCS8vIHByb2plY3Qgd2FzIG1vdmVkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFZNRFJlc291cmNlVmlzaXRvciBnZXRSZXNvdXJjZVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCWlmIChfcmVzb3VyY2VWaXNpdG9yID09IG51bGwpIHsKLQkJCV9yZXNvdXJjZVZpc2l0b3IgPSBuZXcgVk1EUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJCXByaXZhdGUgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IF92bWREZWx0YXMgPSBudWxsOwotCQkJCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCQkJCXB1YmxpYyBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZ2V0UmVzdWx0KCkgewotCQkJCQlyZXR1cm4gX3ZtZERlbHRhczsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZhbGlkYXRvcnMpIHsKLQkJCQkJX3ZtZERlbHRhcyA9IHdyYXBJbk1hcCh2YWxpZGF0b3JzKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCXJldHVybiBfcHJvZ3Jlc3NNb25pdG9yOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG0pIHsKLQkJCQkJX3Byb2dyZXNzTW9uaXRvciA9IG07Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlGaWx0ZXJVdGlsLmNoZWNrQ2FuY2VsZWQoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCQkJCS8vIFdlIGRvbid0IG5lZWQgdG8gZmlsdGVyIG91dCBhbnl0aGluZywgYmVjYXVzZSBhIGZ1bGwgdmFsaWRhdGlvbgotCQkJCQkvLyBpcyBhYm91dCB0byBiZSBwZXJmb3JtZWQuCi0JCQkJCWZpbHRlck91dChnZXRQcm9ncmVzc01vbml0b3IoKSwgX3ZtZERlbHRhcywgcmVzLCBJUmVzb3VyY2VEZWx0YS5DSEFOR0VELCB0cnVlKTsKLQotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHJlc291cmNlJ3MgY2hpbGRyZW4gYXMgd2VsbAotCQkJCX0KLQkJCX07Ci0JCX0KLQkJX3Jlc291cmNlVmlzaXRvci5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCV9yZXNvdXJjZVZpc2l0b3Iuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCi0JCXJldHVybiBfcmVzb3VyY2VWaXNpdG9yOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFZNRERlbHRhVmlzaXRvciBnZXREZWx0YVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCWlmIChfZGVsdGFWaXNpdG9yID09IG51bGwpIHsKLQkJCV9kZWx0YVZpc2l0b3IgPSBuZXcgVk1ERGVsdGFWaXNpdG9yKCkgewotCQkJCXByaXZhdGUgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IF92bWREZWx0YXMgPSBudWxsOwotCQkJCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCQkJCXB1YmxpYyBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gZ2V0UmVzdWx0KCkgewotCQkJCQlyZXR1cm4gX3ZtZERlbHRhczsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZhbGlkYXRvcnMpIHsKLQkJCQkJX3ZtZERlbHRhcyA9IHdyYXBJbk1hcCh2YWxpZGF0b3JzKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCXJldHVybiBfcHJvZ3Jlc3NNb25pdG9yOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG0pIHsKLQkJCQkJX3Byb2dyZXNzTW9uaXRvciA9IG07Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgc3ViZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJY2hlY2tDYW5jZWxlZChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWlmIChzdWJkZWx0YSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gc3ViZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoMikpIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWx0ZXJVdGlsLTAxOiBzdWJkZWx0YSBvZiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZChyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiIGhhcyByZXNvdXJjZSBkZWx0YSBraW5kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZChzdWJkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiIERvZXMgdGhlIHJlc291cmNlIGV4aXN0PyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZChyZXNvdXJjZS5leGlzdHMoKSk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIgSXMgaXQgYSBwaGFudG9tPyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZChyZXNvdXJjZS5pc1BoYW50b20oKSk7Ci0JCQkJCQlUcmFjaW5nLmxvZyhidWZmZXIpOwotCQkJCQl9Ci0KLQkJCQkJLy8gSWYgdGhlIGRlbHRhIGlzIGFuIElQcm9qZWN0LCBhbmQgdGhlIElQcm9qZWN0IGlzIGdldHRpbmcgZGVsZXRlZCBvciBjbG9zZWQsCi0JCQkJCS8vIGRvbid0IHZhbGlkYXRlIGl0IG9yIGl0cyBjaGlsZHJlbi4KLQkJCQkJaWYgKHNob3VsZFByb2Nlc3MocmVzb3VyY2UsIHN1YmRlbHRhKSkgewotCQkJCQkJZmlsdGVyT3V0KGdldFByb2dyZXNzTW9uaXRvcigpLCBfdm1kRGVsdGFzLCByZXNvdXJjZSwgc3ViZGVsdGEpOwotCQkJCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSBkZWx0YSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGRvIG5vdCB2aXNpdCB0aGUgZGVsdGEncyBjaGlsZHJlbgotCQkJCX0KLQkJCX07Ci0JCX0KLQkJX2RlbHRhVmlzaXRvci5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCV9kZWx0YVZpc2l0b3Iuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCi0JCXJldHVybiBfZGVsdGFWaXNpdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGxvYWREZWx0YXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCAKLQkJCWZpbmFsIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZW5hYmxlZFZhbGlkYXRvcnMsCUlSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVZNRERlbHRhVmlzaXRvciB2aXNpdG9yID0gZ2V0RGVsdGFWaXNpdG9yKG1vbml0b3IsIGVuYWJsZWRWYWxpZGF0b3JzKTsKLQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IsIHRydWUpOyAvLyB0cnVlIG1lYW5zIGluY2x1ZGUgcGhhbnRvbSByZXNvdXJjZXMKLQkJcmV0dXJuIHZpc2l0b3IuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gbG9hZERlbHRhcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIAotCQkJZmluYWwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkVmFsaWRhdG9ycywJSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlWTURSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IGdldFJlc291cmNlVmlzaXRvcihtb25pdG9yLCBlbmFibGVkVmFsaWRhdG9ycyk7Ci0JCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tCi0JCS8vIHJlc291cmNlcwotCQlyZXR1cm4gdmlzaXRvci5nZXRSZXN1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0dsb2JhbENvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvR2xvYmFsQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGMwNDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvR2xvYmFsQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBnbG9iYWwgUHJlZmVyZW5jZXMgYXMgc2V0IG9uIHRoZSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9iYWxDb25maWd1cmF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gewotCXN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFX0RFRkFVTFQgPSB0cnVlOwotCXN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZfU0FWRV9BVVRPTUFUSUNBTExZX0RFRkFVTFQgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBfY2FuUHJvamVjdHNPdmVycmlkZSA9IGdldENhblByb2plY3RzT3ZlcnJpZGVEZWZhdWx0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIF9zYXZlQXV0b21hdGljYWxseSA9IGdldFNhdmVBdXRvbWF0aWNhbGx5RGVmYXVsdCgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpbiBhbGwgY2FzZXMgZXhjZXB0IGZvciB0aGUgUHJlZmVyZW5jZSBwYWdlJ3MgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBHbG9iYWxDb25maWd1cmF0aW9uKElXb3Jrc3BhY2VSb290IHJvb3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIocm9vdCwgY29udmVydFRvQXJyYXkoVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldEFsbFZhbGlkYXRvcnMoKSkpOwotCi0JCS8vIENhbid0IHB1dCB0aGUgY2FsbCB0byBsb2FkKCkgYW5kIHBhc3NpdmF0ZSgpIGluIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3RvciBkdWUKLQkJLy8gdG8gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uLgotCQkvLyAgICAxLiBGaXJzdCB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IgaXMgY2FsbGVkLCBhbmQgdGhhdCBsb2FkcyB0aGUgc3RvcmVkIHZhbHVlcy4KLQkJLy8gICAgMi4gVGhlbiB0aGlzIGNsYXNzJ3MgPGluaXQ+IG1ldGhvZCBpcyBjYWxsZWQsIGFuZCB0aGF0IGluaXRpYWxpemVzIHRoZSAib3ZlcnJpZGUiIGZpZWxkCi0JCS8vIAkgIHRvIHRoZSBkZWZhdWx0LCB3aGljaCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHN0b3JlZCB2YWx1ZS4KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRoZSBQcmVmZXJlbmNlIHBhZ2UsIHNvIHRoYXQgdGhlIHBhZ2UgY2FuIHN0b3JlIHZhbHVlcwotCSAqIHdpdGhvdXQgcGVyc2lzdGluZyB0aGVtIChpLmUuLCBpZiB0aGUgdXNlciBwcmVzc2VzIENhbmNlbCB0aGVuIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZS4pCi0JICovCi0JcHVibGljIEdsb2JhbENvbmZpZ3VyYXRpb24oR2xvYmFsQ29uZmlndXJhdGlvbiBvcmlnaW5hbCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlzdXBlcihvcmlnaW5hbC5nZXRSZXNvdXJjZSgpKTsKLQkJb3JpZ2luYWwuY29weVRvKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblByb2plY3RzT3ZlcnJpZGUoKSB7Ci0JCXJldHVybiBfY2FuUHJvamVjdHNPdmVycmlkZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYW5Qcm9qZWN0c092ZXJyaWRlKGJvb2xlYW4gY2FuKSB7Ci0JCV9jYW5Qcm9qZWN0c092ZXJyaWRlID0gY2FuOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRTYXZlQXV0b21hdGljYWxseSgpIHsKLQkJcmV0dXJuIF9zYXZlQXV0b21hdGljYWxseTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2F2ZUF1dG9tYXRpY2FsbHkoYm9vbGVhbiBzYXZlKSB7Ci0JCV9zYXZlQXV0b21hdGljYWxseSA9IHNhdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRUb0RlZmF1bHQoKSAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihnZXREaXNhYmxlVmFsaWRhdGlvbkRlZmF1bHQoKSk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKGdldEVuYWJsZWRWYWxpZGF0b3JzRGVmYXVsdCgpKTsKLQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJc2V0Q2FuUHJvamVjdHNPdmVycmlkZShnZXRDYW5Qcm9qZWN0c092ZXJyaWRlRGVmYXVsdCgpKTsKLQkJc2V0U2F2ZUF1dG9tYXRpY2FsbHkoZ2V0U2F2ZUF1dG9tYXRpY2FsbHlEZWZhdWx0KCkpOwotCQlzZXREZWZhdWx0RGVsZWdhdGVzKGdldFZhbGlkYXRvcnMoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZXhpc3RzIG9ubHkgZm9yIG1pZ3JhdGlvbiBwdXJwb3Nlcy4gVGhlIHJvb3QgbWFya2VyIG11c3QgYmUgZGVsZXRlZCBhZnRlcgotCSAqIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1hcmtlcltdIGdldE1hcmtlcigpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBnZXRSb290KCk7Ci0JCQlJTWFya2VyW10gbWFya2VycyA9IHJvb3QuZmluZE1hcmtlcnMoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkVGRVJFTkNFX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9PTkUpOwotCi0JCQlpZiAobWFya2Vycy5sZW5ndGggPT0gMSkgewotCQkJCXJldHVybiBtYXJrZXJzOwotCQkJfQotCQkJLy8gam9iIGlzIGRvbmUuIE5vdGhpbmcgdG8gbWlncmF0ZS4KLQkJCXJldHVybiBudWxsOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gQ2FuJ3QgZmluZCB0aGUgSU1hcmtlcj8gQXNzdW1lIGl0J3MgZGVsZXRlZC4KLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNYXJrZXJbXSBtYXJrZXIpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIDUuMCBwcmVmZXJlbmNlcyB3ZXJlIHN0b3JlZCBpbiBhbiBJTWFya2VyLCBhbmQgdGhlIGN1cnJlbnQucHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbgotCQkvLyBQZXJzaXN0ZW50UHJvcGVydGllcyBvbiB0aGUgSVJlc291cmNlLgotCQkvLyBBIDUuMCByb290IGNhbiBoYXZlIG5vIG1hcmtlciB2YWx1ZXMgaWYgdGhlIHByZWZlcmVuY2UgcGFnZSwgcHJvcGVydGllcyBwYWdlLCBhbmQKLQkJLy8gdmFsaWRhdGlvbiB3ZXJlIG5ldmVyIHZpZXdlZCBvciBydW4uCi0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gZ2V0Um9vdCgpOwotCQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJLy8gVGhlcmUgd2VyZSBubyBnbG9iYWwgcHJlZmVyZW5jZXMgaW4gNC4wMywgc28gdGhlIG1pZ3JhdGlvbiBpcyB0byBjcmVhdGUgc29tZS4KLQkJCQlyZXNldFRvRGVmYXVsdCgpOyAvLyBhc3NpZ24gdGhlIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBuZXcgR2xvYmFsIFByZWZlcmVuY2UKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlNYXJrZXIgcm9vdE1hcmtlciA9IG1hcmtlclswXTsgLy8gZ2V0TWFya2VyKCkgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlJ3MgYSBtYXJrZXIKLQkJCS8vIGluIHRoZSBhcnJheQotLy8JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzID0gbnVsbDsKLS8vCQkJU3RyaW5nIGVuYWJsZWRWYWxpZGF0b3JzU3RyaW5nID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX1ZBTElEQVRPUlMpOwotLy8JCQlpZiAoZW5hYmxlZFZhbGlkYXRvcnNTdHJpbmcgPT0gbnVsbCkgewotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRU5BQkxFRF9WQUxJREFUT1JTOwotLy8JCQl9IGVsc2UgewotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50c0FycmF5KGVuYWJsZWRWYWxpZGF0b3JzU3RyaW5nKTsKLS8vCQkJfQotLy8KLS8vCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCQkJU3RyaW5nIGVuYWJsZWRNYW51YWxWYWxpZGF0b3JzID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTKTsKLQkJCXNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMpKTsKLQkJCVN0cmluZyBlbmFibGVkQnVpbGRWYWxpZGF0b3JzID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX0JVSUxEX1ZBTElEQVRPUlMpOwotCQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0U3RyaW5nQXNFbmFibGVkRWxlbWVudHNBcnJheShlbmFibGVkQnVpbGRWYWxpZGF0b3JzKSk7Ci0vLwkJCWlmIChlbmFibGVkTWFudWFsVmFsaWRhdG9ycy5lcXVhbHMobnVsbCkgfHwgZW5hYmxlZEJ1aWxkVmFsaWRhdG9ycy5lcXVhbHMobnVsbCkpIAotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRU5BQkxFRF9WQUxJREFUT1JTOwotCQkJc2V0Q2FuUHJvamVjdHNPdmVycmlkZShnZXRWYWx1ZShyb290TWFya2VyLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFLCBQUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERV9ERUZBVUxUKSk7Ci0JCQlyb290LmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMobWFya2VyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlUbyhHbG9iYWxDb25maWd1cmF0aW9uIGdwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNvcHlUbyhncCk7Ci0KLQkJLy8gTmVlZCB0byBoYXZlIGEgZGlzdGluY3QgbWV0aG9kIGZvciB0aGlzIGNoaWxkIGNsYXNzIChpLmUuLCB0aGUgcGFyYW1ldGVyCi0JCS8vIGlzIG5vdCBhIFZhbGlkYXRpb25Db25maWd1cmF0aW9uKSBiZWNhdXNlIGlmIHRoaXMgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY2FsbGVkIGFzIHBhcnQgb2YgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24ncyBjb25zdHJ1Y3RvciwgdGhlbiB0aGUgdmFsdWUgb2YKLQkJLy8gdGhpcyBmaWVsZCBpcyBvdmVyd3JpdHRlbi4gRmllbGRzIG9mIHRoaXMgY2xhc3MgYXJlIGluaXRpYWxpemVkIHRvIHRoZQotCQkvLyBkZWZhdWx0IGFmdGVyIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBwYXJlbnQgaXMgY3JlYXRlZC4KLQkJZ3Auc2V0Q2FuUHJvamVjdHNPdmVycmlkZShjYW5Qcm9qZWN0c092ZXJyaWRlKCkpOwotCQlncC5zZXRTYXZlQXV0b21hdGljYWxseShnZXRTYXZlQXV0b21hdGljYWxseSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2FuUHJvamVjdHNPdmVycmlkZURlZmF1bHQoKSB7Ci0JCXJldHVybiBQUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERV9ERUZBVUxUOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2F2ZUF1dG9tYXRpY2FsbHlEZWZhdWx0KCkgewotCQlyZXR1cm4gUFJFRl9TQVZFX0FVVE9NQVRJQ0FMTFlfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwuYXR0cmlidXRlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2Rlc2VyaWFsaXplKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShTdHJpbmcgc3RvcmVkQ29uZmlndXJhdGlvbikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlzdXBlci5kZXNlcmlhbGl6ZShzdG9yZWRDb25maWd1cmF0aW9uKTsKLQotCQlpZiAoc3RvcmVkQ29uZmlndXJhdGlvbiAhPSBudWxsICYmIHN0b3JlZENvbmZpZ3VyYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBJZiBpdCdzIG51bGwsIHRoZW4gc3VwZXIuZGVzZXJpYWxpemUgaGFzIGFscmVhZHkgY2FsbGVkIHJlc2V0VG9EZWZhdWx0IHRvIGluaXRpYWxpemUKLQkJCS8vIHRoaXMgaW5zdGFuY2UuCi0JCQlpbnQgY2FuT3ZlcnJpZGVJbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFKTsKLQkJCWludCBkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRElTQUJMRV9BTExfVkFMSURBVElPTl9TRVRUSU5HKTsKLQkJCWludCBzYXZlQXV0b21hdGljYWxseUluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FWRV9BVVRPTUFUSUNBTExZX1NFVFRJTkcpOwotCQkJaWYgKGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgY2FuT3ZlcnJpZGUgPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyhjYW5PdmVycmlkZUluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERS5sZW5ndGgoKSwgZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCk7Ci0JCQkJc2V0Q2FuUHJvamVjdHNPdmVycmlkZShCb29sZWFuLnZhbHVlT2YoY2FuT3ZlcnJpZGUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJCWlmKHNhdmVBdXRvbWF0aWNhbGx5SW5kZXggIT0gLTEpCi0JCQl7Ci0JCQkJU3RyaW5nIHNhdmVBdXRvbWF0aWNhbGx5ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcoc2F2ZUF1dG9tYXRpY2FsbHlJbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FWRV9BVVRPTUFUSUNBTExZX1NFVFRJTkcubGVuZ3RoKCksIGNhbk92ZXJyaWRlSW5kZXgpOwotCQkJCXNldFNhdmVBdXRvbWF0aWNhbGx5KEJvb2xlYW4udmFsdWVPZihzYXZlQXV0b21hdGljYWxseSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLmF0dHJpYnV0ZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNzZXJpYWxpemUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FWRV9BVVRPTUFUSUNBTExZX1NFVFRJTkcpOwotCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGdldFNhdmVBdXRvbWF0aWNhbGx5KCkpKTsKLQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFKTsKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihjYW5Qcm9qZWN0c092ZXJyaWRlKCkpKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci5zZXJpYWxpemUoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVByb2plY3RWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lQcm9qZWN0VmFsaWRhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTk5ODhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVByb2plY3RWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogVmFsaWRhdG9ySGVscGVyIGV4dGVuc2lvbnMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RWYWxpZGF0aW9uSGVscGVyIHsKLQkKLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldE91dHB1dENvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JcHVibGljIElDb250YWluZXJbXSBnZXRTb3VyY2VDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpOwotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2VJbnN0YW5jZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyOTJiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCBieSBleHRlbnNpb25zIHRvIGFkZCB2YWxpZCB2YWxpZGF0aW9uIHR5cGVzIHRvIHRoZSB2YWxpZGF0ZQotICogbWVudSBhY3Rpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIHsKLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIElSZXNvdXJjZSB0eXBlIGZvciB0aGUgZXh0ZW5zaWJsZSBvYmplY3Qgc2VsZWN0aW9uLAotCSAqIHNob3VsZCBiZSBpbnN0YW5jZSBvZiBJRm9sZGVyLCBJRmlsZSwgb3IgSVByb2plY3QgaWYgdGhpcyBleHRlbnNpb24ga25vd3MKLQkgKiBob3cgdG8gaGFuZGxlIHRoZSBzZWxlY3Rpb24sIG90aGVyd2lzZSBpdCBzaG91bGQgcmV0dXJuIG51bGwKLQkgKi8gCi0JcHVibGljIElSZXNvdXJjZSBnZXRCYXNlVmFsaWRhdGlvblR5cGUoT2JqZWN0IHNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgY2xhc3NuYW1lIG9mIHRoZSB2YWxpZGF0aW9uIHR5cGUgdG8gcmVnaXN0ZXIgZm9yIHZhbGlkYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25UeXBlU3RyaW5nKCk7Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoU3RyaW5nIHZhbGlkYXRpb25UeXBlKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ludGVybmFsVmFsaWRhdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjlkYmE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEludGVybmFsVmFsaWRhdG9yTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BfR1JPVVAgPSAiVmFsaWRhdGlvbk9wZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQgLy8gd2hlbiB0aGUgVmFsaWRhdGlvbk9wZXJhdGlvbgotCi0JLy8gYWRkcyBhIG1lc3NhZ2UgdG8gdGhlIHRhc2sKLQkvLyBsaXN0OyBlLmcuIGNhbmNlbCwgb3IgaW50ZXJuYWwKLQkvLyBlcnJvciwgdGhpcyBncm91cCBuYW1lIGlzIHVzZWQKLQkvLyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZQotCS8vIG1lc3NhZ2VzIHRoYXQgdGhlIHZhbGlkYXRvcgotCS8vIGl0c2VsZiBwdXQsIGFuZCB0aGUgb25lcyB3aGljaAotCS8vIHRoZSB2YWxpZGF0b3Igb3ducywgYnV0IHRoZQotCS8vIG9wZXJhdGlvbiBwdXQuIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyKCkgewotCQkvL2RlZmF1bHQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEludGVybmFsVmFsaWRhdG9yTWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBTZXQgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB3cmFwSW5TZXQoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWlmICgodm1kcyA9PSBudWxsKSB8fCAodm1kcy5sZW5ndGggPT0gMCkpcmV0dXJuIHJlc3VsdDsKLQotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpcmVzdWx0LmFkZCh2bWQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHRocm93cyBhIFRocm93YWJsZSwgbG9nIHRoZSBpbnRlcm5hbCBlcnJvciB0byB0aGUgdGFzayBsaXN0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW50ZXJuYWxFcnJvclRhc2soSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBUaHJvd2FibGUgZXhjKSB7Ci0JCWFkZE9wZXJhdGlvblRhc2socHJvamVjdCwgdm1kLCBSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMLCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCkgPyAiIiA6IGV4Yy5nZXRNZXNzYWdlKCkpfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdXNlciBpcyBjYW5jZWxsaW5nIHZhbGlkYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvamVjdC9yZXNvdXJjZSwgQWRkIGFuIGluZm9ybWF0aW9uIHRhc2sKLQkgKiB0byB0aGUgdGFzayBsaXN0IGluZm9ybWluZyB0aGUgdXNlciB0aGF0IHZhbGlkYXRpb24gaGFzIG5vdCBiZWVuIHJ1biBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotCSAqIAotCSAqIElmIHRoZSBjdXJyZW50IHZhbGlkYXRvciB0aHJvd3MgYSBUaHJvd2FibGUsIGxvZyB0aGUgaW50ZXJuYWwgZXJyb3IgdG8gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25UYXNrKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpIHsKLQkJTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdGlvblBsdWdpbi5nZXRNZXNzYWdlKCk7Ci0JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKTsKLQkJbWVzc2FnZS5zZXRJZChtZXNzYWdlSWQpOwotCQltZXNzYWdlLnNldFBhcmFtcyhwYXJtcyk7Ci0JCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKE9QX0dST1VQKTsKLQotCQkvLyBBbHRob3VnaCB0aGUgbWVzc2FnZSBpcyBvd25lZCBieSB0aGUgdmFsaWRhdG9yLCB0aGUgc3RyaW5nIG9mIHRoZSBtZXNzYWdlIGhhcyB0byBiZQotCQkvLyBsb2FkZWQgYnkgdGhpcyBjbGFzcycgQ2xhc3NMb2FkZXIKLQkJV29ya2JlbmNoUmVwb3J0ZXIuYWRkTWVzc2FnZShwcm9qZWN0LCB2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIG1lc3NhZ2UpOwotCX0KLQotCi0JLyoqCi0JICogSWYgdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBwcmV2aW91cyB2YWxpZGF0aW9uIHdpdGggdGhpcyB2YWxpZGF0b3IsIG9yIGlmIHRoZXJlIHdhcyBhCi0JICogVGhyb3dhYmxlIGNhdWdodCBkdXJpbmcgdGhlIGxhc3QgZXhlY3V0aW9uIG9mIHRoaXMgdmFsaWRhdG9yLCBhbmQgdGhlIHZhbGlkYXRvciBpcyBpbiB0aGUKLQkgKiBwcm9jZXNzIG9mIHZhbGlkYXRpbmcgbm93LCByZW1vdmUgdGhlIGZvcm1lciBpbmZvcm1hdGlvbiB0YXNrIG1lc3NhZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU9wZXJhdGlvblRhc2tzKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlXb3JrYmVuY2hSZXBvcnRlci5yZW1vdmVNZXNzYWdlU3Vic2V0KHByb2plY3QsIHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIE9QX0dST1VQKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzZXMuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRvck5hbWVzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgewotCQlTZXQ8U3RyaW5nPiB0ZW1wID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKSkgewotCQkJCXRlbXAuYWRkKG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gdm1kTmFtZXMgPSBuZXcgU3RyaW5nW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHZtZE5hbWVzKTsKLQkJcmV0dXJuIHZtZE5hbWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdG9yTmFtZXMoQ29sbGVjdGlvbjxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kcykgewotCQlTZXQ8U3RyaW5nPiB0ZW1wID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKSkgewotCQkJCXRlbXAuYWRkKG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gdm1kTmFtZXMgPSBuZXcgU3RyaW5nW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHZtZE5hbWVzKTsKLQkJcmV0dXJuIHZtZE5hbWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdmFsaWRhdG9ycyB0aGF0IHZhbGlkYXRlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JzRm9yRXh0ZW5zaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWxlRXh0ZW5zaW9uKSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCi0JCQkvLyBHZXQgYWxsIG9mIHRoZSB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2plY3QgZm9yIHRoZSBnaXZlbiBmaWxlIGV4dGVuc2lvbgotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gcHJqcC5nZXRWYWxpZGF0b3JzKCk7Ci0KLQkJCS8vIENvbnN0cnVjdCBhIGZha2UgSUZpbGUgdHlwZSB0byByZXByZXNlbnQgYSBmaWxlIHdpdGggdGhpcyBleHRlbnNpb24uCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKElQYXRoLlNFUEFSQVRPUik7Ci0JCQlidWZmZXIuYXBwZW5kKGZpbGVFeHRlbnNpb24pOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdGVtcCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVt2bWRzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdm1kc1tpXTsKLQkJCQlpZiAodm1kLmlzQXBwbGljYWJsZVRvKGZpbGUpKSB7Ci0JCQkJCXRlbXBbY291bnQrK10gPSB2bWQ7Ci0JCQkJfQotCQkJfQotCi0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzBdOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB2YWxpZGF0b3IgbmFtZXMgdGhhdCB2YWxpZGF0ZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24uCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRvck5hbWVzRm9yRXh0ZW5zaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWxlRXh0ZW5zaW9uKSB7Ci0JCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IGdldFZhbGlkYXRvcnNGb3JFeHRlbnNpb24ocHJvamVjdCwgZmlsZUV4dGVuc2lvbik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW3ZtZHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJbmFtZXNbaV0gPSB2bWRzW2ldLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9qZWN0Q29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9qZWN0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjM5ZWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvamVjdENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgUHJvamVjdCBQcmVmZXJlbmNlcyBhcyBzZXQgb24gdGhlIFByb2plY3QncyBWYWxpZGF0aW9uIFByb3BlcnRpZXMgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RDb25maWd1cmF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gewotCQotCS8qKiBmYWxzZSAtIElmIHRoZSB1c2VyIGhhcyBuZXZlciBzZXQgYSBwcmVmZXJlbmNlIGJlZm9yZSwgdGhpcyBpcyB0aGUgb3ZlcnJpZGUgZGVmYXVsdCAqLwotCXN0YXRpYyBmaW5hbCBib29sZWFuIFBSSl9PVkVSUklERUdMT0JBTF9ERUZBVUxUID0gZmFsc2U7Ci0JCi0JLyoqIGRlZmF1bHRfdmFsdWUgLSB0aGUgY29uZmlndXJhdGlvbiBpcyB1c2luZyB0aGUgZGVmYXVsdHMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERlZmF1bHRWYWx1ZSA9ICJkZWZhdWx0X3ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgYm9vbGVhbiBfZG9lc1Byb2plY3RPdmVycmlkZSA9IGdldERvZXNQcm9qZWN0T3ZlcnJpZGVEZWZhdWx0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGluIGFsbCBjYXNlcyBleGNlcHQgZm9yIHRoZSBQcm9wZXJ0aWVzIHBhZ2UncyB2YWx1ZXMuCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RDb25maWd1cmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyBtZXRob2QgZXh0cmFjdHMganVzdCB0aGlzIHByb2plY3QncyB2YWxpZGF0b3JzIGZyb20gdGhlCi0JCS8vIGdsb2JhbCBsaXN0LgotCQlzdXBlcihwcm9qZWN0LCBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoY29udmVydFRvQXJyYXkoVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldEFsbFZhbGlkYXRvcnMoKSksIHByb2plY3QpKTsKLQotCQkvLyBDYW4ndCBwdXQgdGhlIGNhbGwgdG8gbG9hZCgpIGFuZCBwYXNzaXZhdGUoKSBpbiB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IgZHVlCi0JCS8vIHRvIHRoZSBvcmRlciBvZiBpbml0aWFsaXphdGlvbi4KLQkJLy8gICAgMS4gRmlyc3QgdGhlIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCwgYW5kIHRoYXQgbG9hZHMgdGhlIHN0b3JlZCB2YWx1ZXMuCi0JCS8vICAgIDIuIFRoZW4gdGhpcyBjbGFzcydzIDxpbml0PiBtZXRob2QgaXMgY2FsbGVkLCBhbmQgdGhhdCBpbml0aWFsaXplcyB0aGUgIm92ZXJyaWRlIiBmaWVsZAotCQkvLyAgICAgICB0byB0aGUgZGVmYXVsdCwgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdG9yZWQgdmFsdWUuCi0JfQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgUHJvcGVydGllcyBwYWdlLCBzbyB0aGF0IHRoZSBwYWdlIGNhbiBzdG9yZSB2YWx1ZXMKLQkgKiB3aXRob3V0IHBlcnNpc3RpbmcgdGhlbSAoaS5lLiwgaWYgdGhlIHVzZXIgcHJlc3NlcyBDYW5jZWwgdGhlbiBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUuKQotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIFByb2plY3RDb25maWd1cmF0aW9uKFByb2plY3RDb25maWd1cmF0aW9uIG9yaWdpbmFsKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKG9yaWdpbmFsLmdldFJlc291cmNlKCkpOwotCQlvcmlnaW5hbC5jb3B5VG8odGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB0byB1c2UsIHdoZXRoZXIgZ2xvYmFsIG9yIHByb2plY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXNlR2xvYmFsUHJlZmVyZW5jZSgpIHsKLQkJdHJ5IHsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGdwID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmICghZ3AuY2FuUHJvamVjdHNPdmVycmlkZSgpKSB7Ci0JCQkJLy8gSWYgcHJvamVjdCdzIGNhbid0IG92ZXJyaWRlIHRoZSBnbG9iYWwsIHVzZSB0aGUgZ2xvYmFsCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIElmIHRoZSBwcm9qZWN0IG92ZXJyaWRlcywgdGhlbiBkb24ndCB1c2UgdGhlIGdsb2JhbC4KLQkJCS8vIElmIHRoZSBwcm9qZWN0IGRvZXMgbm90IG92ZXJyaWRlLCB1c2UgdGhlIGdsb2JhbC4KLQkJCXJldHVybiAhX2RvZXNQcm9qZWN0T3ZlcnJpZGU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RG9lc1Byb2plY3RPdmVycmlkZSgpewotCQlyZXR1cm4gX2RvZXNQcm9qZWN0T3ZlcnJpZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9lc1Byb2plY3RPdmVycmlkZSgpIHsKLQkJLy8gSWYgdGhlIGdsb2JhbCBwcmVmZXJlbmNlIGRvZXNuJ3QgYWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUsIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlCi0JCS8vIHZhbHVlIG9mIF9kb2VzUHJvamVjdE92ZXJyaWRlIGlzLgotCQlyZXR1cm4gIXVzZUdsb2JhbFByZWZlcmVuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2VzUHJvamVjdE92ZXJyaWRlKGJvb2xlYW4gZG9lcykgewotCQlfZG9lc1Byb2plY3RPdmVycmlkZSA9IGRvZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHByZWZlcmVuY2VzIHNob3VsZCBiZSB1c2VkIHRoZW4gdGhlIHByZWZlcmVuY2Ugc2V0dGluZ3MgYXJlIHJldHVybmVkOyBvdGhlcndpc2UgcmV0dXJuCi0JICogdGhlIHByb2plY3Qgc2V0dGluZ3MuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRFbmFibGVkVmFsaWRhdG9ycygpLCBnZXRSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiAgewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCksIGdldFJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZ2V0RGlzYWJsZWRWYWxpZGF0b3JzKCkKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXREaXNhYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXREaXNhYmxlZFZhbGlkYXRvcnMoKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERpc2FibGVkVmFsaWRhdG9ycygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5wcmVmZXJlbmNlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2dldFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRWYWxpZGF0b3JzKCksIGdldFJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZGF0b3JzKCk7Ci0JfQotCi0gIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldERlbGVnYXRpbmdWYWxpZGF0b3JzKCk7Ci0gIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5hdHRyaWJ1dGUuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhib29sZWFuKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoYm9vbGVhbiBpbmNyZW1lbnRhbCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhpbmNyZW1lbnRhbCksIGdldFJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKGluY3JlbWVudGFsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNpc0VuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQodm1kKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKHZtZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jbnVtYmVyT2ZEaXNhYmxlZFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZEaXNhYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLm51bWJlck9mRGlzYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm51bWJlck9mRGlzYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jbnVtYmVyT2ZFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKCkKLQkgKi8KLQlwdWJsaWMgaW50IG51bWJlck9mRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkubnVtYmVyT2ZFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm51bWJlck9mRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5wcmVmZXJlbmNlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI251bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkubnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5udW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jbnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLm51bWJlck9mSW5jcmVtZW50YWxWYWxpZGF0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm51bWJlck9mSW5jcmVtZW50YWxWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jbnVtYmVyT2ZWYWxpZGF0b3JzKCkKLQkgKi8KLQlwdWJsaWMgaW50IG51bWJlck9mVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkubnVtYmVyT2ZWYWxpZGF0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm51bWJlck9mVmFsaWRhdG9ycygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBwcm9qZWN0J3MgdmFsdWVzLCBvciB3aXRoIHRoZSBnbG9iYWwgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JICogVmFsaWRhdG9ycyB0aGF0IGFyZSBub3QgY29uZmlndXJlZCBvbiB0aGlzIHByb2plY3Qgd2lsbCBiZSBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRWYWxpZGF0b3JzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgewotCQlzdXBlci5zZXRFbmFibGVkVmFsaWRhdG9ycyhleHRyYWN0UHJvamVjdFZhbGlkYXRvcnModm1kcywgZ2V0UmVzb3VyY2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBwcm9qZWN0J3MgdmFsdWVzLCBvciB3aXRoIHRoZSBnbG9iYWwgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JICogVmFsaWRhdG9ycyB0aGF0IGFyZSBub3QgY29uZmlndXJlZCBvbiB0aGlzIHByb2plY3Qgd2lsbCBiZSBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCXN1cGVyLnNldFZhbGlkYXRvcnMoZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKHZtZHMsIGdldFJlc291cmNlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHNldCBvZiB2YWxpZGF0b3JzLCB1c3VhbGx5IHRoZSBnbG9iYWwgcHJlZmVyZW5jZSBzZXQsIGNoYW5nZSB0aGUgc2V0IHNvIHRoYXQgaXQKLQkgKiBjb250YWlucyBvbmx5IHRoZSB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQgb24gdGhpcyBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvck1ldGFEYXRhW10gZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcywgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCk7Ci0JCWludCBsZW5ndGggPSAodm1kcyA9PSBudWxsKSA/IDAgOiB2bWRzLmxlbmd0aDsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB0ZW1wID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2xlbmd0aF07Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRlbXA7Ci0JCX0KLQotCQlpbnQgY291bnQgPSAwOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2bWRzW2ldOwotCQkJaWYgKHJlYWRlci5pc0NvbmZpZ3VyZWRPblByb2plY3Qodm1kLCBwcm9qZWN0KSkgewotCQkJCXRlbXBbY291bnQrK10gPSB2bWQ7Ci0JCQl9Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXRlbXAgPSBudWxsOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRUb0RlZmF1bHQoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgcHJvamVjdCBpcyB3aGF0ZXZlciB0aGUgcHJlZmVyZW5jZSB2YWx1ZXMgYXJlCi0JCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCi0JCXNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdwLmdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotCQlzZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGdwLmdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXNldERlbGVnYXRpbmdWYWxpZGF0b3JzKGdwLmdldERlbGVnYXRpbmdWYWxpZGF0b3JzKCkpOwotCQkKLQkJLy8gZXhjZXB0IGZvciB0aGlzIGZpZWxkLCB3aGljaCBpcyB1bmlxdWUgdG8gdGhlIHByb2plY3QgcHJlZmVyZW5jZXMKLQkJc2V0RG9lc1Byb2plY3RPdmVycmlkZShnZXREb2VzUHJvamVjdE92ZXJyaWRlRGVmYXVsdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldFRvRGVmYXVsdEZvclByb2plY3REZXNjcmlwdGlvbkNoYW5nZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBwcm9qZWN0IGlzIHdoYXRldmVyIHRoZSBwcmVmZXJlbmNlIHZhbHVlcyBhcmUKLQkJR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCXNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdwLmdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotCQlzZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGdwLmdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXNldERlbGVnYXRpbmdWYWxpZGF0b3JzKGdwLmdldERlbGVnYXRpbmdWYWxpZGF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwcm9qZWN0J3MgbmF0dXJlIGhhcyBjaGFuZ2VkLCBzbyByZWNhbGN1bGF0ZSB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIG9uIHRoZQotCSAqIHByb2plY3QsIGFuZCByZXNldCB0aGUgdmFsdWVzIG9mIHRoZSBwcm9qZWN0IHRvIHRoZSBkZWZhdWx0LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGRvZXNuJ3QgZG8gYW55dGhpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFByb2plY3ROYXR1cmUoKSB7Ci0JCS8qCi0JCSAqIFdlIGRvIG5vdCB3YW50IHRvIHBlcmZvcm0gdGhlIHJlc2V0dGluZyB0aGUgb2YgdGhlIHZhbGlkYXRvcnMgYXMgdGhlIG5hdHVyZSBuZXZlciBnZXRzCi0JCSAqIHJlc2V0IGR1ZSB0byBjaGFuZ2UgaW4gdGhlIHByb2plY3QgcmVmZXJlbmNlcyAtIFZLQiBHbG9iYWxDb25maWd1cmF0aW9uIGdwID0KLQkJICogQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJICogc2V0VmFsaWRhdG9ycyhncC5nZXRWYWxpZGF0b3JzKCkpOyAvLyBSZXNldCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIG9uIHRoZQotCQkgKiBwcm9qZWN0ICh0aGUgUHJvamVjdENvbmZpZ3VyYXRpb24gYXV0b21hdGljYWxseSBzYXZlcyBvbmx5IHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlCi0JCSAqIGNvbmZpZ3VyZWQgb24gdGhlIHByb2plY3QpLiByZXNldFRvRGVmYXVsdCgpOyAvLyBHaXZlbiB0aGF0IHRoZSBwcm9qZWN0IGlzICJuZXciLCByZXNldAotCQkgKiBpdHMgdmFsdWVzIHRvIHRoZSBQcmVmZXJlbmNlcy4KLQkJICovCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZXhpc3RzIG9ubHkgZm9yIG1pZ3JhdGlvbiBwdXJwb3Nlcy4gVGhlIHByb2plY3QgbWFya2VyIG11c3QgYmUgZGVsZXRlZCBhZnRlcgotCSAqIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1hcmtlcltdIGdldE1hcmtlcigpIHsKLQkJdHJ5IHsKLQkJCS8vIEZpcnN0IHRyeSB0byBmaW5kIHRoZSA0LjAzIHByb2plY3QgbWFya2VyLgotCQkJSU1hcmtlcltdIGFsbE1hcmtlcnMgPSBnZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKENvbmZpZ3VyYXRpb25Db25zdGFudHMuUFJKX01BUktFUl80MDMsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0KLQkJCS8vIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gdGhpcyBtaWdodCBiZSBhIDUuMCBwcm9qZWN0IG1hcmtlci4KLQkJCWlmICgoYWxsTWFya2VycyA9PSBudWxsKSB8fCAoYWxsTWFya2Vycy5sZW5ndGggPT0gMCkpIHsKLQkJCQlhbGxNYXJrZXJzID0gZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSSl9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQl9Ci0KLQkJCS8vIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBwcm9qZWN0bWFya2VyLgotCQkJaWYgKGFsbE1hcmtlcnMubGVuZ3RoID09IDEpIHsKLQkJCQlyZXR1cm4gYWxsTWFya2VyczsKLQkJCX0KLQkJCS8vIEpvYiBpcyBkb25lLiBOb3RoaW5nIHRvIG1pZ3JhdGUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZChJTWFya2VyW10gbWFya2VyKSB7Ci0JCS8vIDQuMDMgcHJvamVjdCBwcmVmZXJlbmNlcyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgotCQkvLyAgICAxLiBPbmx5IHByZWZlcmVuY2VzIHRoYXQgY291bGQgYmUgc2V0IHdlcmUgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBhbmQgdGhlIGF1dG8tdmFsaWRhdGUKLQkJLy8gb3B0aW9uLgotCQkvLyAgICAyLiBUaGUgcHJlZmVyZW5jZXMgd2VyZSBzdG9yZWQgaW4gYW4gSU1hcmtlciBpbnN0ZWFkIG9mIGEgUGVyc2lzdGVudFByb3BlcnR5LgotCQkvLyBUaGUgNS4wIHByb2plY3Qgc2V0dGluZ3Mgd2VyZSBzdG9yZWQgaW4gYW4gSU1hcmtlciwgYW5kIHRoZSBjdXJyZW50IHNldHRpbmdzIGFyZSBzdG9yZWQKLQkJLy8gaW4gYSBQZXJzaXN0ZW50UHJvcGVydHkuCi0JCS8vIEEgNS4wIHByb2plY3QgY291bGQgaGF2ZSBhIG51bGwgdmFsaWRhdGlvbiBtYXJrZXIgaWYgdGhlIHZhbGlkYXRpb24gcGFnZSB3YXMgbmV2ZXIKLQkJLy8gb3BlbmVkIG9uIGl0LCBhbmQgaWYgdmFsaWRhdGlvbiB3YXMgbmV2ZXIgcnVuLgotCQl0cnkgewotCQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJLy8gQXNzdW1lIGRlZmF1bHQgdmFsdWVzCi0JCQkJcmVzZXRUb0RlZmF1bHQoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlNYXJrZXIgcHJqTWFya2VyID0gbWFya2VyWzBdOyAvLyBnZXRQcm9qZWN0TWFya2VyKCkgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlJ3MgYQotCQkJLy8gbWFya2VyIGluIHRoZSBhcnJheQotLy8JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQotLy8JCQlTdHJpbmcgZW5hYmxlZFZhbFN0ciA9IChTdHJpbmcpIGdldFZhbHVlKHByak1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX1ZBTElEQVRPUlMpOwotLy8JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWwgPSBudWxsOwotLy8JCQlpZiAoZW5hYmxlZFZhbFN0ciA9PSBudWxsKSB7Ci0vLwkJCQllbmFibGVkVmFsID0gZ3AuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLS8vCQkJfSBlbHNlIHsKLS8vCQkJCWVuYWJsZWRWYWwgPSBnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50c0FycmF5KGVuYWJsZWRWYWxTdHIpOwotLy8JCQl9Ci0vLwkJCXNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRWYWwpOwotCQkJCi0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRNYW5hdWFsVmFsID0gbnVsbDsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZEJ1aWxkVmFsID0gbnVsbDsKLQkJCVN0cmluZyBlbmFibGVkTWFudWFsVmFsU3RyID0gKFN0cmluZykgZ2V0VmFsdWUocHJqTWFya2VyLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfTUFOVUFMX1ZBTElEQVRPUlMpOwotCQkJU3RyaW5nIGVuYWJsZWRCdWlsZFZhbFN0ciA9IChTdHJpbmcpIGdldFZhbHVlKHByak1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX0JVSUxEX1ZBTElEQVRPUlMpOwotLy8JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWwgPSBudWxsOwotLy8JCQlpZiAoZW5hYmxlZE1hbnVhbFZhbFN0ci5lcXVhbHMobnVsbCkgfHwgZW5hYmxlZEJ1aWxkVmFsU3RyLmVxdWFscyhudWxsKSkgewotLy8JCQkJZW5hYmxlZFZhbCA9IGdwLmdldEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0vLwkJCX0gZWxzZSB7Ci0JCQlpZiAoIWVuYWJsZWRNYW51YWxWYWxTdHIuZXF1YWxzKG51bGwpICYmICFlbmFibGVkQnVpbGRWYWxTdHIuZXF1YWxzKG51bGwpKSB7Ci0JCQkJZW5hYmxlZE1hbmF1YWxWYWwgPSBnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50c0FycmF5KGVuYWJsZWRNYW51YWxWYWxTdHIpOwotCQkJCXNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGVuYWJsZWRNYW5hdWFsVmFsKTsKLQkJCQllbmFibGVkQnVpbGRWYWwgPSBnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50c0FycmF5KGVuYWJsZWRNYW51YWxWYWxTdHIpOwotCQkJCXNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZW5hYmxlZEJ1aWxkVmFsKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHZlcnNpb24gPSBsb2FkVmVyc2lvbihtYXJrZXIpOyAvLyBJbiA0LjAzLCBldmVyeSBwcm9qZWN0IGhhZCBpdHMgb3duIHZhbGlkYXRvcnMgJgotCQkJLy8gYXV0by12YWxpZGF0ZSBzZXR0aW5ncy4KLQkJCUJvb2xlYW4gYm9vbFZhbCA9IChCb29sZWFuKSBnZXRWYWx1ZShwcmpNYXJrZXIsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuUFJKX09WRVJSSURFR0xPQkFMKTsKLQkJCWlmICgoYm9vbFZhbCA9PSBudWxsKSAmJiAodmVyc2lvbi5lcXVhbHMoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WRVJTSU9ONF8wMykpKSB7Ci0JCQkJLy8gRGlmZmVyZW50IGRlZmF1bHQgZm9yIDQuMDMuIEluIDQuMDMsIGFsbCBwcm9qZWN0cyBvdmVycm9kZSB0aGUgZ2xvYmFsLCBiZWNhdXNlCi0JCQkJLy8gdGhlCi0JCQkJLy8gZ2xvYmFsIHByZWZlcmVuY2VzIGRpZG4ndCBleGlzdC4KLQkJCQlzZXREb2VzUHJvamVjdE92ZXJyaWRlKHRydWUpOwotCQkJfSBlbHNlIGlmIChib29sVmFsID09IG51bGwpIHsKLQkJCQlzZXREb2VzUHJvamVjdE92ZXJyaWRlKGdldERvZXNQcm9qZWN0T3ZlcnJpZGVEZWZhdWx0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXREb2VzUHJvamVjdE92ZXJyaWRlKGJvb2xWYWwuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCQlnZXRSZXNvdXJjZSgpLmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMobWFya2VyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlUbyhQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNvcHlUbyhwcmpwKTsKLQotCQkvLyBOZWVkIHRvIGhhdmUgYSBkaXN0aW5jdCBtZXRob2QgZm9yIHRoaXMgY2hpbGQgY2xhc3MgKGkuZS4sIHRoZSBwYXJhbWV0ZXIKLQkJLy8gaXMgbm90IGEgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24pIGJlY2F1c2UgaWYgdGhpcyBpbml0aWFsaXphdGlvbiBpcwotCQkvLyBjYWxsZWQgYXMgcGFydCBvZiBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbidzIGNvbnN0cnVjdG9yLCB0aGVuIHRoZSB2YWx1ZSBvZgotCQkvLyB0aGlzIGZpZWxkIGlzIG92ZXJ3cml0dGVuLiBGaWVsZHMgb2YgdGhpcyBjbGFzcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlCi0JCS8vIGRlZmF1bHQgYWZ0ZXIgdGhlIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHBhcmVudCBpcyBjcmVhdGVkLgotCQlwcmpwLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUoZG9lc1Byb2plY3RPdmVycmlkZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RG9lc1Byb2plY3RPdmVycmlkZURlZmF1bHQoKSB7Ci0JCXJldHVybiBQUkpfT1ZFUlJJREVHTE9CQUxfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGhhdmUgbm90IGNoYW5nZWQgc2luY2UgdGhpcyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB3YXMKLQkgKiBjb25zdHJ1Y3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLiAoVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciB0aGUgUHJvcGVydGllcyBhbmQgUHJlZmVyZW5jZSBwYWdlczsKLQkgKiBpZiB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIGhhc24ndCBjaGFuZ2VkLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSB0YXNrIGxpc3Q7Ci0JICogdXBkYXRpbmcgdGhlIHRhc2sgbGlzdCBpcyBhIGNvc3RseSBvcGVyYXRpb24uKQotCSAqIAotCSAqIFRoZSAiYWxsb3ciIHBhcmFtZXRlciByZXByZXNlbnRzIHdoZXRoZXIgb3Igbm90IHRoZSBnbG9iYWwgImFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIiBoYXMKLQkgKiBiZWVuIGNoYW5nZWQ6IC0gVFJVRSBtZWFucyB0aGF0IHRoZSBwcmVmZXJlbmNlICJhbGxvdyIgcGFyYW1ldGVyIGhhcyBiZWVuIGNoYW5nZWQgLSBGQUxTRQotCSAqIG1lYW5zIHRoYXQgdGhlIHByZWZlcmVuY2UgImFsbG93IiBwYXJhbXRlciBoYXMgbm90IGJlZW4gY2hhbmdlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuYWJsZWRWYWxpZGF0b3JzQ2hhbmdlZChWYWxpZGF0b3JNZXRhRGF0YVtdIG9sZEVuYWJsZWRWbWQsIGJvb2xlYW4gYWxsb3cpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QgY2hlY2sgdGhlIG9idmlvdXM6IGlzIGV2ZXJ5IGVuYWJsZWQgdmFsaWRhdG9yIHN0aWxsIGVuYWJsZWQsIGFuZCBpcwotCQkvLyB0aGUgbnVtYmVyIG9mIGVuYWJsZWQgdmFsaWRhdG9ycyB0aGUgc2FtZSBhcyBpdCB3YXMgYmVmb3JlPyBJZiBub3QsIHJldHVybiB0cnVlLgotCQlpZiAoc3VwZXIuaGFzRW5hYmxlZFZhbGlkYXRvcnNDaGFuZ2VkKG9sZEVuYWJsZWRWbWQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0KLQkJLy8gSWYgdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHZhbGlkYXRvcnMgaGF2ZSBjaGFuZ2VkLCBkb2VzIHRoZSB0YXNrIGxpc3QgbmVlZCB0byBiZSB1cGRhdGVkPwotCQkvLyBQUkVGIHwgUFJPSiB8IFVQREFURQotCQkvLyBBTExPVyB8IE9WRVJSSURFIHwgVEFTSyBMSVNUCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAwIHwgMCB8IDEKLQkJLy8gICAgIDAgfCAxIHwgMQotCQkvLyAgICAgMSB8IDAgfCAxCi0JCS8vICAgICAxIHwgMSB8IDAKLQkJLy8KLQkJLy8gSWYgdGhlIGdsb2JhbCAiYWxsb3ciIHByZWZlcmVuY2UgY2hhbmdlcyBmcm9tICJhbGxvdyIgdG8gImRvbid0IGFsbG93Iiwgb3IgdmljZSB2ZXJzYSwKLQkJLy8gYW5kIHRoZSBwcm9qZWN0IG92ZXJyaWRlcyB0aGUgcHJlZmVyZW5jZXMsIGFuZCB0aGUgdmFsaWRhdG9ycyBkaWZmZXIgYmV0d2VlbiB0aGUgcHJvamVjdAotCQkvLyBhbmQgdGhlIHByZWZlcmVuY2VzLCB0aGVuIHRoZSB0YXNrIGxpc3QgbXVzdCBiZSB1cGRhdGVkLgotCQlpZiAoYWxsb3cpIHsKLQkJCS8vICJhbGxvdyIgaGFzIGNoYW5nZWQsIHNvIHNlZSBpZiB0aGUgcHJlZmVyZW5jZSBhbmQgdGhlIHByb2plY3QgdmFsaWRhdG9ycyBtYXRjaC4KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gcHJvakVuYWJsZWRWbWQgPSBzdXBlci5nZXRFbmFibGVkVmFsaWRhdG9ycygpOyAvLyBieXBhc3MgdGhlIGNoZWNrCi0JCQkvLyBmb3Igd2hldGhlciB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGFyZSB0byBiZSB1c2VkIG9yIG5vdAotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlyZXR1cm4gZ3AuaGFzRW5hYmxlZFZhbGlkYXRvcnNDaGFuZ2VkKHByb2pFbmFibGVkVm1kKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGF2ZURlbGVnYXRlc0NoYW5nZWQoTWFwPFN0cmluZywgU3RyaW5nPiBvbGREZWxlZ2F0ZXMsIGJvb2xlYW4gYWxsb3cpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQotICAgIGlmIChzdXBlci5oYXZlRGVsZWdhdGVzQ2hhbmdlZChvbGREZWxlZ2F0ZXMpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoYWxsb3cpIHsKLSAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvakRlbGVnYXRlcyA9IHN1cGVyLmdldERlbGVnYXRpbmdWYWxpZGF0b3JzKCk7IAotICAgICAgR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ3AuaGF2ZURlbGVnYXRlc0NoYW5nZWQocHJvakRlbGVnYXRlcyk7Ci0gICAgfQotICAgICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotCXB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKERlZmF1bHRWYWx1ZSkpIHsKLQkJCXJlc2V0VG9EZWZhdWx0KCk7Ci0JCX0gZWxzZSBpZiAoc3RvcmVkQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlpbnQgcHJqT3ZlcnJpZGVJbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSSl9PVkVSUklERUdMT0JBTCk7Ci0JCQlpbnQgZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRJU0FCTEVfQUxMX1ZBTElEQVRJT05fU0VUVElORyk7Ci0JCQlpbnQgdmVyc2lvbkluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkVSU0lPTik7Ci0JCQlpZiAoZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBkaXNhYmxlQWxsVmFsaWRhdGlvbiA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRJU0FCTEVfQUxMX1ZBTElEQVRJT05fU0VUVElORy5sZW5ndGgoKSwgdmVyc2lvbkluZGV4KTsKLQkJCQlzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihCb29sZWFuLnZhbHVlT2YoZGlzYWJsZUFsbFZhbGlkYXRpb24pLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oZmFsc2UpOwotCQkJfQotCQkJLy8gcHJvamVjdCBkb2Vzbid0IG92ZXJyaWRlIHRoZSBnbG9iYWwKLQkJCWlmIChkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIHByak92ZXJyaWRlID0gc3RvcmVkQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcocHJqT3ZlcnJpZGVJbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuUFJKX09WRVJSSURFR0xPQkFMLmxlbmd0aCgpLCBkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4KTsKLQkJCQlzZXREb2VzUHJvamVjdE92ZXJyaWRlKEJvb2xlYW4udmFsdWVPZihwcmpPdmVycmlkZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBzZXJpYWxpemUoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkpfT1ZFUlJJREVHTE9CQUwpOwotCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGRvZXNQcm9qZWN0T3ZlcnJpZGUoKSkpOwotCQlpZiAoZG9lc1Byb2plY3RPdmVycmlkZSgpKSB7Ci0JCQkvLyBTdG9yZSBjb21tb24gdmFsdWVzIGZvciB0aGUgUHJvamVjdCBjb25maWd1cmF0aW9uIG9ubHkgaWYgdGhleSBkaWZmZXIgZnJvbSB0aGUgZ2xvYmFsCi0JCQlidWZmZXIuYXBwZW5kKHN1cGVyLnNlcmlhbGl6ZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoYm9vbGVhbiBmdWxsQnVpbGQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyhDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGZ1bGxCdWlsZCksIGdldFJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhmdWxsQnVpbGQpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgc2V0IG9mIHZhbGlkYXRvcnMsIHVzdWFsbHkgdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHNldCwgY2hhbmdlIHRoZSBzZXQgc28gdGhhdCBpdAotCSAqIGNvbnRhaW5zIG9ubHkgdGhlIHZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiB0aGlzIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGFbXSBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gb25seVJlZmVyZW5jZWQpIHsKLQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQkJaW50IGxlbmd0aCA9ICh2bWRzID09IG51bGwpID8gMCA6IHZtZHMubGVuZ3RoOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbGVuZ3RoXTsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCWludCBjb3VudCA9IDA7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0JCQlpZiAocmVhZGVyLmlzQ29uZmlndXJlZE9uUHJvamVjdCh2bWQsIHByb2plY3QpKSB7Ci0JCQkJaWYgKCFvbmx5UmVmZXJlbmNlZCB8fCB2bWQuaXNEZXBlbmRlbnRWYWxpZGF0b3IoKSkKLQkJCQkJdGVtcFtjb3VudCsrXSA9IHZtZDsKLQkJCX0KLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJdGVtcCA9IG51bGw7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwuYXR0cmlidXRlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2dldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoYm9vbGVhbiBmdWxsQnVpbGQsIGJvb2xlYW4gb25seVJlZmVyZW5jZWQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyhDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGZ1bGxCdWlsZCksIGdldFJlc291cmNlKCksIG9ubHlSZWZlcmVuY2VkKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoZnVsbEJ1aWxkLCBvbmx5UmVmZXJlbmNlZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLmF0dHJpYnV0ZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNnZXRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEluY3JlbWVudGFsVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyhDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldEluY3JlbWVudGFsVmFsaWRhdG9ycygpLCBnZXRSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW5jcmVtZW50YWxWYWxpZGF0b3JzKCk7Ci0JfQotCi0JcHVibGljIGludCBudW1iZXJPZk1hbnVhbFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLm51bWJlck9mTWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb257Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmlzRGlzYWJsZUFsbFZhbGlkYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEaXNhYmxlQWxsVmFsaWRhdGlvbigpOwotCX0JCi0KLSAgcHVibGljIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBnZXREZWxlZ2F0ZURlc2NyaXB0b3IoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuZ2V0RGVsZWdhdGVEZXNjcmlwdG9yKHZtZCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdXBlci5nZXREZWxlZ2F0ZURlc2NyaXB0b3Iodm1kKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc3RvcmUoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldFJlc291cmNlKCk7Ci0JCWZpbmFsIFByZWZlcmVuY2VzV3JhcHBlciBwcmVmID0gUHJlZmVyZW5jZXNXcmFwcGVyLmdldFByZWZlcmVuY2VzKHByb2plY3QsIG51bGwpOwotCQlpZiAocHJlZiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXByZWYucHV0KFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVzZXJQcmVmZXJlbmNlLCBzZXJpYWxpemUoKSk7Ci0JCQkJcHJlZi5wdXQoVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uVXNlck1hbnVhbFByZWZlcmVuY2UsIHNlcmlhbGl6ZU1hbnVhbFNldHRpbmcoKSk7Ci0JCQkJcHJlZi5wdXQoVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uVXNlckJ1aWxkUHJlZmVyZW5jZSwgc2VyaWFsaXplQnVpbGRTZXR0aW5nKCkpOwotCQkJCXByZWYucHV0KFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkRlbGVnYXRlc1ByZWZlcmVuY2UsIHNlcmlhbGl6ZURlbGVnYXRlc1NldHRpbmcoKSk7Ci0JCQkJcHJlZi5mbHVzaCgpOwotCQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBBIGNvbW1vbiBlcnJvciBpcyB0aGF0IHRoZSBwcm9qZWN0IGhhcyBiZWVuIGNsb3NlZCwgaW4gd2hpY2ggY2FzZSB0aGVyZQotCQkJCS8vIGlzIG5vdGhpbmcgdGhhdCB3ZSBjYW4gZG8uCi0JCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBsb2FkUHJlZmVyZW5jZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0UmVzb3VyY2UoKTsKLQkJZmluYWwgUHJlZmVyZW5jZXNXcmFwcGVyIHByZWZzID0gUHJlZmVyZW5jZXNXcmFwcGVyLmdldFByZWZlcmVuY2VzKHByb2plY3QsIG51bGwpOwotCQlpZiAocHJlZnMubm9kZUV4aXN0cygpKSB7IAotCQkJU3RyaW5nIHN0b3JlZENvbmZpZyA9IHByZWZzLmdldChWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5Vc2VyUHJlZmVyZW5jZSwgRGVmYXVsdFZhbHVlKTsKLQkJCWRlc2VyaWFsaXplKHN0b3JlZENvbmZpZyk7Ci0JCQlTdHJpbmcgc3RvcmVkTWFudWFsQ29uZmlnID0gcHJlZnMuZ2V0KFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVzZXJNYW51YWxQcmVmZXJlbmNlLCBEZWZhdWx0VmFsdWUpOwotCQkJZGVzZXJpYWxpemVNYW51YWwoc3RvcmVkTWFudWFsQ29uZmlnKTsKLQkJCVN0cmluZyBzdG9yZWRCdWlsZENvbmZpZyA9IHByZWZzLmdldChWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5Vc2VyQnVpbGRQcmVmZXJlbmNlLCBEZWZhdWx0VmFsdWUpOwotCQkJZGVzZXJpYWxpemVCdWlsZChzdG9yZWRCdWlsZENvbmZpZyk7Ci0JCQlTdHJpbmcgc3RvcmVkRGVsZWdhdGVzQ29uZmlndXJhdGlvbiA9IHByZWZzLmdldChWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5EZWxlZ2F0ZXNQcmVmZXJlbmNlLCBEZWZhdWx0VmFsdWUpOwotCQkJZGVzZXJpYWxpemVEZWxlZ2F0ZXMoc3RvcmVkRGVsZWdhdGVzQ29uZmlndXJhdGlvbik7Ci0JCX0KLQl9Ci0gIAotICAvKioKLSAgICogQW5zd2VyIHRoZSB2YWxpZGF0b3IgaWQncyB0aGF0IGhhdmUgYmVlbiBlbmFibGVkIGZvciBtYW51YWwgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybiBudWxsIGlmIHRoZXkgYXJlIGFsbCBlbmFibGVkCi0gICAqLwotICBTZXQ8U3RyaW5nPiBnZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycygpewotCSAgcmV0dXJuIGdldElkcyhWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5Vc2VyTWFudWFsUHJlZmVyZW5jZSwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFuc3dlciB0aGUgdmFsaWRhdG9yIGlkJ3MgdGhhdCBoYXZlIGJlZW4gZW5hYmxlZCBmb3IgYnVpbGQgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybiBudWxsIGlmIHRoZXkgYXJlIGFsbCBlbmFibGVkCi0gICAqLwotICBTZXQ8U3RyaW5nPiBnZXRFbmFibGVkQnVpbGRsVmFsaWRhdG9ycygpewotCSAgcmV0dXJuIGdldElkcyhWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5Vc2VyQnVpbGRQcmVmZXJlbmNlLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfQlVJTERfVkFMSURBVE9SUyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBIGhlbHBlciBtZXRob2QgdG8gZXh0cmFjdCBzb21lIHZhbGlkYXRvciBpZCdzIGZyb20gYSBwcmVmZXJlbmNlIHN0b3JlIGZpZWxkLgotICAgKiAKLSAgICogQHJldHVybiBudWxsIGlmIGFsbCB0aGUgdmFsaWRhdG9ycyBhcmUgZW5hYmxlZC4KLSAgICovCi0gIHByaXZhdGUgU2V0PFN0cmluZz4gZ2V0SWRzKFN0cmluZyBwcmVmS2V5LCBTdHJpbmcgZW5hYmxlZFBocmFzZSl7Ci0JSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0UmVzb3VyY2UoKTsKLQlmaW5hbCBQcmVmZXJlbmNlc1dyYXBwZXIgcHJlZnMgPSBQcmVmZXJlbmNlc1dyYXBwZXIuZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwgbnVsbCk7Ci0JaWYgKHByZWZzID09IG51bGwpcmV0dXJuIG51bGw7Ci0JCi0JU3RyaW5nIHN0b3JlZENvbmZpZyA9IHByZWZzLmdldChwcmVmS2V5LCBEZWZhdWx0VmFsdWUpOwotCWlmIChzdG9yZWRDb25maWcgPT0gbnVsbCB8fCBzdG9yZWRDb25maWcubGVuZ3RoKCkgPT0gMCB8fCBzdG9yZWRDb25maWcuZXF1YWxzKERlZmF1bHRWYWx1ZSkpcmV0dXJuIG51bGw7Ci0JaW50IHZhbGlkYXRpb25JbmRleCA9IHN0b3JlZENvbmZpZy5pbmRleE9mKGVuYWJsZWRQaHJhc2UpOwotCi0JU3RyaW5nIGlkcyA9IHN0b3JlZENvbmZpZy5zdWJzdHJpbmcodmFsaWRhdGlvbkluZGV4ICsgZW5hYmxlZFBocmFzZS5sZW5ndGgoKSxzdG9yZWRDb25maWcubGVuZ3RoKCkpOwotCi0JU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaWRzLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfU0VQQVJBVE9SKTsKLQlTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDIwKTsKLQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSlzZXQuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JaWYgKHNldC5zaXplKCkgPT0gMClyZXR1cm4gbnVsbDsKLQkgIAotCXJldHVybiBzZXQ7Ci0JICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzhkMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24gewotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQlwcml2YXRlIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciBpbnN0YW5jZTsKLQlwcml2YXRlIGJvb2xlYW4gZXJyb3JDb25kaXRpb24gPSBmYWxzZTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCQotCS8qKiByZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfRklMRV9WQUxJREFUT1JfRVhURU5TSU9OID0gInJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogcnVuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOID0gInJ1biI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogaWQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGNsYXNzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIGdldEluc3RhbmNlKCkgewotCQl0cnkgewotCQkJaWYgKGluc3RhbmNlID09IG51bGwgJiYgIWVycm9yQ29uZGl0aW9uKQotCQkJCWluc3RhbmNlID0gKFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFJVTik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWVycm9yQ29uZGl0aW9uID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZighUkVGX0ZJTEVfVkFMSURBVE9SX0VYVEVOU0lPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXh0ZW5zaW9ucyBtdXN0IGJlIG9mIHRoZSB0eXBlIFwiIiArIFJFRl9GSUxFX1ZBTElEQVRPUl9FWFRFTlNJT04gKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXRoaXMuaWQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTIzM2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvclJlZ2lzdHJ5UmVhZGVyIHsKLQlzdGF0aWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXIgaW5zdGFuY2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElkID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFeHRlbnNpb25Qb2ludCA9ICJyZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIExpc3Q8UmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uPiByZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9uczsKLQotCXB1YmxpYyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogUmVhZCB0aGUgZXh0ZW5zaW9uIHBvaW50IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSWQsIEV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ID09IG51bGwpcmV0dXJuOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnRlcm5hbFJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlib29sZWFuIHJlY29nbml6ZWQgPSB0aGlzLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotCQlpZiAoIXJlY29nbml6ZWQpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJFcnJvciBwcm9jZXNzaW5nIGV4dGVuc2lvbjogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSBkZXNrdG9wIGxvZyB1c2luZyB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiUGx1Z2luICIgKyBleHRlbnNpb24uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKyAiLCBleHRlbnNpb24gIiArIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uLlJFRl9GSUxFX1ZBTElEQVRPUl9FWFRFTlNJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJYWRkRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0ZW5zaW9uCi0JICogICAgICAgICAgICBUaGUgZXh0ZW5zaW9ucyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IG5ld0V4dGVuc2lvbikgewotCi0gICAgCS8vYWRkIHRvIHRoZSBsaXN0IG9mIHBvc3QgdmFsaWRhdG9yIGV4dGVuc2lvbnMgb25seSBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBhZGRlZCB5ZXQKLSAgICAJYm9vbGVhbiBjb250YWluc0V4dCA9IHRydWU7Ci0gICAgCWZvcihSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24gZXh0IDogZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMoKSkgewotICAgIAkJaWYoIWV4dC5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKElkKS5lcXVhbHMobmV3RXh0ZW5zaW9uLmdldEF0dHJpYnV0ZShJZCkpKWNvbnRhaW5zRXh0ID0gZmFsc2U7Ci0gICAgCX0KLSAgICAJaWYoIWNvbnRhaW5zRXh0IHx8Z2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMoKS5pc0VtcHR5KCkpCi0gICAgCQlnZXRSZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucygpLmFkZChuZXcgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uKG5ld0V4dGVuc2lvbikpOwotICAgIAotCQlnZXRSZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucygpLmFkZChuZXcgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uKG5ld0V4dGVuc2lvbikpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0ZW5zaW9uCi0JICogICAgICAgICAgICBUaGUgZXh0ZW5zaW9ucyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb25Qb2ludChSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24gbmV3RXh0ZW5zaW9uKSB7Ci0JCWlmIChyZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJcmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbj4oKTsKLQkJcmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMuYWRkKG5ld0V4dGVuc2lvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIHByb2plY3QgYmFzZWQgb24gcHJpb3JpdGllcyBvZiB0aG9zZSB3aGljaCBhcmUKLQkgKiAgICAgICAgIGF2YWlsYWJsZSBhbmQgZW5hYmxlZAotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yKCkgewotCQlmb3IgKFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbiByZWZGaWxlVmFsRXh0OiBnZXRSZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucygpKSB7Ci0JCQlyZXR1cm4gcmVmRmlsZVZhbEV4dC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvclJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXIoKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJFeHRlbnNpb25zLgotCSAqLwotCXByb3RlY3RlZCBMaXN0PFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbj4gZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMoKSB7Ci0JCWlmIChyZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJcmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbj4oKTsKLQkJcmV0dXJuIHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWdpc3RyeUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWdpc3RyeUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE3OGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVnaXN0cnlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JUnVsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogVmFsaWRhdGlvbiBjb25zdGFudHMgbmVlZGVkIHRvIGRlY2xhcmUgYW4gZXh0ZW5zaW9uIHBvaW50LCBhbmQgdG8gaW1wbGVtZW50IGFuIGV4dGVuc2lvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWdpc3RyeUNvbnN0YW50cyB7Ci0JU3RyaW5nIFBMVUdJTl9JRCA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEOwotCQotCS8qKiB2YWxpZGF0b3IgLSBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIHZhbGlkYXRvciAqLwotCVN0cmluZyBWQUxJREFUT1JfRVhUX1BUX0lEID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBydW4gLSBpZGVudGlmaWVzIHRoZSBWYWxpZGF0b3IgY2xhc3MgKi8KLQlTdHJpbmcgVEFHX1JVTl9DTEFTUyA9ICJydW4iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIGZpbHRlciAtIGlkZW50aWZpZXMgYSBmaWx0ZXIgLS0gdHlwZSBhbmQvb3IgbmFtZSAtLSB1c2VkIHRvIGZpbHRlciBvdXQgcmVzb3VyY2VzIHdoaWNoIGFyZQotCSAqIG5vdCB0byBiZSB2YWxpZGF0ZWQuIChpLmUuLCBpZiB0aGUgcmVzb3VyY2UgZG9lc24ndCBwYXNzIHRoaXMgZmlsdGVyIHRlc3QsIGRvbid0IHZhbGlkYXRlIGl0LikgCi0JICovIAotCVN0cmluZyBUQUdfRklMVEVSID0gImZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBpZGVudGlmaWVzIGEgZmlsdGVyIC0tIHR5cGUgYW5kL29yIG5hbWUgLS0gdXNlZCB0byBmaWx0ZXIgb3V0IHJlc291cmNlcyB3aGljaCBhcmUgbm90IHRvIGJlIHZhbGlkYXRlZC4gKGkuZS4sIGlmIHRoZSByZXNvdXJjZSBkb2Vzbid0IHBhc3MgdGhpcyBmaWx0ZXIgdGVzdCwgZG9uJ3QgdmFsaWRhdGUgaXQuKQotCSAqLwotCVN0cmluZyBUQUdfQ09OVEVOVFRZUEUgPSAiY29udGVudFR5cGVCaW5kaW5nIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkvKioKLQkgKiAgaWRlbnRpZmllcyBhIHR5cGUKLQkgKi8KLQlTdHJpbmcgQVRUX0NPTlRFTlRUWVBFSUQgPSAiY29udGVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQgCi0JLyoqIGhlbHBlciAtIElWYWxpZGF0aW9uQ29udGV4dCB3aGljaCBsb2FkcyB0aGUgTU9GIG1vZGVsIGZvciB0aGUgSVZhbGlkYXRvciAqLyAKLQlTdHJpbmcgVEFHX0hFTFBFUl9DTEFTUyA9ICJoZWxwZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHByb2plY3ROYXR1cmUgLSBpZGVudGlmaWVzIHRoZSBwcm9qZWN0cyB3aGljaCB0aGUgdmFsaWRhdG9yIHNob3VsZCBydW4gb24gKi8KLQlTdHJpbmcgVEFHX1BST0pFQ1RfTkFUVVJFID0gInByb2plY3ROYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIGFnZ3JlZ2F0ZVZhbGlkYXRvciAtIGlkZW50aWZpZXMgYSB2YWxpZGF0b3Iocykgd2hpY2ggdGhpcyB2YWxpZGF0b3IgYWdncmVnYXRlcy4gVGhpcyB2YWx1ZSBpcyB1c2VkIAotCSAqIHRvIHJlbW92ZSBhbGwgbWVzc2FnZXMgb3duZWQgYnkgYSBwYXJ0aWN1bGFyIHZhbGlkYXRvci4gQWdncmVnYXRlIHZhbGlkYXRvcnMgY2Fubm90IGJlIHNoYXJlZC4gCi0JICogb25seSBvbmUgdmFsaWRhdG9yIG1heSB1c2UgYW4gYWdncmVnYXRlIG9mIHRoYXQgdHlwZS4gKi8KLQlTdHJpbmcgVEFHX0FHR1JFR0FURV9WQUxJREFUT1JTID0gImFnZ3JlZ2F0ZVZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvKiogb2JqZWN0Q2xhc3MgLSBpZGVudGlmaWVzIGEgdHlwZSAqLyAKLQlTdHJpbmcgQVRUX09CSkVDVF9DTEFTUyA9ICJvYmplY3RDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogbmFtZUZpbHRlciAtIGlkZW50aWZpZXMgYSBuYW1lIChtYXkgaW5jbHVkZSB0aGUgJyonIHdpbGRjYXJkIGFueXdoZXJlIGluIHRoZSBuYW1lKSAqLwotCVN0cmluZyBBVFRfTkFNRV9GSUxURVIgPSAibmFtZUZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogaWQgLSBpZGVudGlmaWVzIGEgdW5pcXVlIGlkIHRvIGZpbHRlciBvbiAqLwotCVN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGNsYXNzIC0gaWRlbnRpZmllcyBhIGNsYXNzIG5hbWUgb2YgYSB0YWcsIGUuZy4gImhlbHBlciBjbGFzcyIsIG9yICJydW4gY2xhc3MiICovCi0JU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogYWN0aW9uIC0gaWRlbnRpZmllcyB0aGUgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiBhY3Rpb25zIGZvciB3aGljaCBhIHJlc291cmNlIHNob3VsZCBiZSBmaWx0ZXJlZCBpbiAqLyAKLQlTdHJpbmcgQVRUX0FDVElPTl9GSUxURVIgPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAKLQkgKiBpbmNyZW1lbnRhbCAtIGlkZW50aWZpZXMgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBzdXBwb3J0cyBpbmNyZW1lbnRhbCBidWlsZCB2YWxpZGF0aW9uLiAKLQkgKiBEZWZhdWx0IGlzIHRydWUgKGkuZS4sIGluY3JlbWVudGFsIGJ1aWxkcyBhcmUgc3VwcG9ydGVkKS4gCi0JICovCi0JU3RyaW5nIEFUVF9JTkNSRU1FTlRBTCA9ICJpbmNyZW1lbnRhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdHJ1ZSAtIFRoZSBpbmNyZW1lbnRhbCBkZWZhdWx0LiAqLwotCWJvb2xlYW4gQVRUX0lOQ1JFTUVOVEFMX0RFRkFVTFQgPSB0cnVlOwotCQotCS8qKiAKLQkgKiBmdWxsQnVpbGQgLSBpZGVudGlmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3Igc3VwcG9ydHMgZnVsbCBidWlsZCB2YWxpZGF0aW9uLiAKLQkgKiBEZWZhdWx0IGlzIHRydWUgKGkuZS4sIGZ1bGwgYnVpbGQgdmFsaWRhdGlvbiBpcyBzdXBwb3J0ZWQpLgotCSAqLyAKLQlTdHJpbmcgQVRUX0ZVTExCVUlMRCA9ICJmdWxsQnVpbGQiOyAvLyROT04tTkxTLTEkIAotCQotCS8qKiB0cnVlIC0gVGhlIGJ1aWxkIGRlZmF1bHQuICovCi0JYm9vbGVhbiBBVFRfRlVMTEJVSUxEX0RFRkFVTFQgPSB0cnVlOwotCQotCS8qKiBlbmFibGVkIC0gaWRlbnRpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gRGVmYXVsdCBpcyAidHJ1ZSIgKGVuYWJsZWQpLiAqLyAKLQlTdHJpbmcgQVRUX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdHJ1ZSAtIFRoZSAiZW5hYmxlZCIgZGVmYXVsdC4gKi8KLQlib29sZWFuIEFUVF9FTkFCTEVEX0RFRkFVTFQgPSB0cnVlOwotCQotCS8qKiBpbmNsdWRlIC0gSW5jbHVkZSBwcm9qZWN0cyB3aXRoIHRoaXMgbmF0dXJlICovCi0JU3RyaW5nIEFUVF9JTkNMVURFID0gImluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIHRydWUgLSBCeSBkZWZhdWx0LCBpZiAiaW5jbHVkZSIgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgcHJvamVjdE5hdHVyZSBlbGVtZW50LCAKLQkgKiB0aGVuIGFzc3VtZSB0aGF0IHRoZSBuYXR1cmUgaXMgaW5jbHVkZWQuICovCi0JYm9vbGVhbiBBVFRfSU5DTFVERV9ERUZBVUxUID0gdHJ1ZTsKLQkKLQkvKiogCi0JICogcnVsZUdyb3VwIC0gaWRlbnRpZmllcyB0aGUgZGlmZmVyZW50IHZhbGlkYXRpb24gcGFzc2VzIHdoaWNoIHRoaXMgdmFsaWRhdG9yIHJlY29nbml6ZXMuIAotCSAqIFRoZSB2YWx1ZXMgYXJlIGlkZW50aWZpZWQgaW4gSVJ1bGVHcm91cC4KLQkgKi8KLQlTdHJpbmcgQVRUX1JVTEVfR1JPVVAgPSAicnVsZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiB0aGUgZGVmYXVsdCBwYXNzIGluY2x1ZGVzIG9ubHkgdGhlIEZBU1QgUEFTUy4gRlVMTCBjYW4gYmUgaW52b2tlZCBvbmx5IGV4cGxpY2l0bHkgYnkgYW4gb3BlcmF0aW9uLiAqLwotCWludCBBVFRfUlVMRV9HUk9VUF9ERUZBVUxUID0gSVJ1bGVHcm91cC5QQVNTX0ZBU1Q7Ci0JCi0JLyoqIGNhc2VTZW5zaXRpdmUgKi8KLQlTdHJpbmcgQVRUX0NBU0VfU0VOU0lUSVZFID0gImNhc2VTZW5zaXRpdmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGFzeW5jIC0gSXMgdGhlIHZhbGlkYXRvciB0aHJlYWQtc2FmZT8gKi8KLQlTdHJpbmcgQVRUX0FTWU5DID0gImFzeW5jIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBmYWxzZSAtIFRoZSAiY2FuIHZhbGlkYXRvciBydW4gYXN5bmNocm9ub3VzbHkiIGRlZmF1bHQuIEluIHRoZSBmdXR1cmUgdGhpcyBtYXkgYmUgY2hhbmdlZCB0byB0cnVlLiAqLwotCWJvb2xlYW4gQVRUX0FTWU5DX0RFRkFVTFQgPSBmYWxzZTsKLQotCS8qKiBtaWdyYXRlIC0gdGhlICJtaWdyYXRlIiBzZWN0aW9uIG9mIHRoZSB2YWxpZGF0b3IgKi8KLQlTdHJpbmcgVEFHX01JR1JBVEUgPSAibWlncmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdmFsaWRhdG9yIC0gdGhlICJ2YWxpZGF0b3IiIGVsZW1lbnQgb2YgdGhlICJtaWdyYXRlIiBzZWN0aW9uICovCi0JU3RyaW5nIFRBR19WQUxJREFUT1IgPSAidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBmcm9tIC0gdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBmb3JtZXIgdmFsaWRhdG9yIGNsYXNzICovCi0JU3RyaW5nIEFUVF9GUk9NID0gImZyb20iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRvIC0gdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjdXJyZW50IHZhbGlkYXRvciBjbGFzcyAqLwotCVN0cmluZyBBVFRfVE8gPSAidG8iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFUF9WQUxJREFUT1IgPSAiZGVwZW5kZW50VmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERVBfVkFMX1ZBTFVFID0gImRlcFZhbFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNQVJLRVJfSUQgPSAibWFya2VySWQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BUktFUl9JRF9WQUxVRSA9ICJtYXJrZXJJZFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWJvb2xlYW4gREVQX1ZBTF9WQUxVRV9ERUZBVUxUID0gZmFsc2U7Ci0JU3RyaW5nIEZBQ0VUID0gImZhY2V0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGQUNFVF9JRCA9ImZhY2V0SWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Jlc291cmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Jlc291cmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZjhhMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCB0byBhY2Nlc3MgdGhlIHN0cmluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbHVnLWluLgotICogCi0gKiBTZWUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUsIGluIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnksIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZ3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VDb25zdGFudHMgewotCS8vIEEgbWFya2VyIGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotCVN0cmluZyBWQkZfRVhDX0NBTk5PVF9BRERfTUFSS0VSID0gIlZCRl9FWENfQ0FOTk9UX0FERF9NQVJLRVIiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gQSBtYXJrZXIgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgdGFzayBsaXN0LgotCVN0cmluZyBWQkZfRVhDX0NBTk5PVF9SRU1PVkVfTUFSS0VSID0gIlZCRl9FWENfQ0FOTk9UX1JFTU9WRV9NQVJLRVIiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gSW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotCVN0cmluZyBWQkZfRVhDX0lOVEVSTkFMID0gIlZCRl9FWENfSU5URVJOQUwiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gSWYgdGhlIHZhbGlkYXRvciBjYW5ub3QgYmUgbG9hZGVkIGJlY2F1c2UgaXQgZGlkbid0IHNwZWNpZnkgYSBoZWxwZXIKLQlTdHJpbmcgVkJGX0VYQ19IRUxQRVJfTUlTU0lORyA9ICJWQkZfRVhDX0hFTFBFUl9NSVNTSU5HIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSB2YWxpZGF0b3IgY2Fubm90IGJlIGxvYWRlZCBiZWNhdXNlIGl0cyBoZWxwZXIgY2Fubm90IGJlIGxvYWRlZAotCVN0cmluZyBWQkZfRVhDX0hFTFBFUl9DQU5OT1RMT0FEID0gIlZCRl9FWENfSEVMUEVSX0NBTk5PVExPQUQiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gQSBqYXZhLmxhbmcuUnVudGltZSBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIHRoZSBidWlsZC4KLQlTdHJpbmcgVkJGX0VYQ19SVU5USU1FID0gIlZCRl9FWENfUlVOVElNRSI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBJZiB0aGUgIlZhbGlkYXRvciIgZXh0ZW5zaW9uIHBvaW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGx1Z2luLnhtbCBmaWxlLgotCVN0cmluZyBWQkZfRVhDX01JU1NJTkdfVkFMSURBVE9SX0VQID0gIlZCRl9FWENfTUlTU0lOR19WQUxJREFUT1JfRVAiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhbiBpbnZhbGlkIHR5cGUgZmlsdGVyIGluIHRoZWlyIHBsdWdpbi54bWwgZmlsZS4KLQkvLyBpLmUuLCBpdCBpc24ndCBhbiBpbnN0YW5jZSBvZiBJUmVzb3VyY2UuCi0JU3RyaW5nIFZCRl9FWENfSU5WQUxJRF9UWVBFX0ZJTFRFUiA9ICJWQkZfRVhDX0lOVkFMSURfVFlQRV9GSUxURVIiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gVGhlIHZhbGlkYXRvciBleHRlbnNpb24gaGFzIG1hZGUgYSBtaXN0YWtlIGluIGl0cyBwbHVnaW4ueG1sJ3MgcHJvamVjdE5hdHVyZSB0YWcKLQlTdHJpbmcgVkJGX0VYQ19NSVNTSU5HX1BST0pFQ1ROQVRVUkVfSUQgPSAiVkJGX0VYQ19NSVNTSU5HX1BST0pFQ1ROQVRVUkVfSUQiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gVGhlIHZhbGlkYXRvciBleHRlbnNpb24gaGFzIG1hZGUgYSBtaXN0YWtlIGluIGl0cyBwbHVnaW4ueG1sJ3Mgc3ludGF4LgotCVN0cmluZyBWQkZfRVhDX1ZBTElEQVRPUk5BTUVfSVNfTlVMTCA9ICJWQkZfRVhDX1ZBTElEQVRPUk5BTUVfSVNfTlVMTCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBUaXRsZSBmb3IgdGhlIElQcm9ncmVzc01vbml0b3IuCi0JU3RyaW5nIFZCRl9TVEFUVVNfUFJPR1JFU1NNT05JVE9SX1RJVExFID0gIlZCRl9TVEFUVVNfUFJPR1JFU1NNT05JVE9SX1RJVExFIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIFN0YXR1cyBsaW5lIGZvciB0aGUgSVByb2dyZXNzTW9uaXRvcgotCVN0cmluZyBWQkZfU1RBVFVTX0lOSVRJQUxJWklORyA9ICJWQkZfU1RBVFVTX0lOSVRJQUxJWklORyI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBJZiB0aGUgdXNlciBoYXMgY2FuY2VsbGVkIHZhbGlkYXRpb24sIGVhY2ggdmFsaWRhdG9yIG1pZ2h0IGhhdmUgY2xlYW51cCB0byBkby4gVGhpcyBtZXNzYWdlCi0JLy8gaXMgc2hvd24gdG8gdGVsbCB0aGUgdXNlciB3aGljaCB2YWxpZGF0b3IgaXMgYmVpbmcgY2xlYW5lZCB1cCBhdCB0aGUgbW9tZW50LgotCVN0cmluZyBWQkZfU1RBVFVTX1ZBTElEQVRPUl9DTEVBTlVQID0gIlZCRl9TVEFUVVNfVkFMSURBVE9SX0NMRUFOVVAiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gSWYgdGhlIHVzZXIgY2FuY2VsbGVkIHZhbGlkYXRpb24sIHJlbW92ZSBhbGwgb2YgdGhlIHZhbGlkYXRvcidzIHRhc2tzIGZyb20gdGhlIHRhc2sgbGlzdCwgYW5kCi0JLy8gcHV0IGFuIGVudHJ5IHNheWluZyB0aGF0IHZhbGlkYXRpb24gb24ge3Byb2plY3R9IHVzaW5nIHt2YWxpZGF0b3J9IHdhcyBjYW5jZWxsZWQuCi0JU3RyaW5nIFZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQgPSAiVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBCZWZvcmUgYSB2YWxpZGF0b3IgaXMgYmVndW4sIHRoaXMgbWVzc2FnZSBpbmZvcm1zIHRoZSB1c2VyIHRoYXQgdmFsaWRhdGlvbiwgdXNpbmcgYQotCS8vIHBhcnRpY3VsYXIgdmFsaWRhdG9yLCBoYXMgYmVndW4KLQlTdHJpbmcgVkJGX1NUQVRVU19TVEFSVElOR19WQUxJREFUSU9OID0gIlZCRl9TVEFUVVNfU1RBUlRJTkdfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBBZnRlciBhIHZhbGlkYXRvciBpcyBmaW5pc2hlZCwgdGhpcyBtZXNzYWdlIGluZm9ybXMgdGhlIHVzZXIgdGhhdCB2YWxpZGF0aW9uLCB1c2luZyBhCi0JLy8gcGFydGljdWxhciB2YWxpZGF0b3IsIGhhcyBjb21wbGV0ZWQuCi0JU3RyaW5nIFZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT04gPSAiVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBJZiBhIHZhbGlkYXRvciB0aHJvd3MgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiwgdGhpcyBtZXNzYWdlIGlzIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLQlTdHJpbmcgVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZID0gIlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBJZiB0aGUgYnVpbGQncyBnZXREZWx0YShnZXRQcm9qZWN0KCkpIG1ldGhvZCByZXR1cm5zIG51bGwsIGxldCB0aGUgdXNlciBrbm93IHRoYXQgYSBmdWxsCi0JLy8gdmFsaWRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZXJlJ3Mgbm8gZGVsdGEgaW5mb3JtYXRpb24uCi0JU3RyaW5nIFZCRl9TVEFUVVNfTlVMTF9ERUxUQSA9ICJWQkZfU1RBVFVTX05VTExfREVMVEEiOyAvLyROT04tTkxTLTEkIAotCi0JU3RyaW5nIFZCRl9FWENfU1lOVEFYX05PX0hFTFBFUiA9ICJWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVIiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVJfQ0xBU1MgPSAiVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX0NMQVNTIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX1RIUk9XQUJMRSA9ICJWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVJfVEhST1dBQkxFIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTk9fVkFMX1RIUk9XQUJMRSA9ICJWQkZfRVhDX1NZTlRBWF9OT19WQUxfVEhST1dBQkxFIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19JTlZBTElEX1JFU09VUkNFID0gIlZCRl9FWENfSU5WQUxJRF9SRVNPVVJDRSI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX0VYQ19OVUxMQ1JFQVRFID0gIlZCRl9FWENfTlVMTENSRUFURSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfTlVMTFNBVkUgPSAiVkJGX0VYQ19OVUxMU0FWRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfU0FWRSA9ICJWQkZfRVhDX1NBVkUiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX05VTExSRVRSSUVWRSA9ICJWQkZfRVhDX05VTExSRVRSSUVWRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfUkVUUklFVkUgPSAiVkJGX0VYQ19SRVRSSUVWRSI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX0VYQ19CQURWTUQgPSAiVkJGX0VYQ19CQURWTUQiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX09QRU5QUkogPSAiVkJGX0VYQ19PUEVOUFJKIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19FWElTVFBSSiA9ICJWQkZfRVhDX0VYSVNUUFJKIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19CQURQUkogPSAiVkJGX0VYQ19CQURQUkoiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX01VTFRJUFJKID0gIlZCRl9FWENfTVVMVElQUkoiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX0JBRFZBTCA9ICJWQkZfRVhDX0JBRFZBTCI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX1NUQVRVU19TVEFSVF9SRU1PVklOR19PTERfTUVTU0FHRVMgPSAiVkJGX1NUQVRVU19TVEFSVF9SRU1PVklOR19PTERfTUVTU0FHRVMiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX0ZJTklTSF9SRU1PVklOR19PTERfTUVTU0FHRVMgPSAiVkJGX1NUQVRVU19GSU5JU0hfUkVNT1ZJTkdfT0xEX01FU1NBR0VTIjsgLy8kTk9OLU5MUy0xJCAKLQotCVN0cmluZyBWQkZfVEFTS19XQVJOX01FU1NBR0VfTElNSVRfVkFMID0gIlZCRl9UQVNLX1dBUk5fTUVTU0FHRV9MSU1JVF9WQUwiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFZCRl9WQUxJREFUSU9OX0pPQl9NU0cgPSAiVkJGX1ZBTElEQVRJT05fSk9CX01TRyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBWQkZfRVhDX0RJU0FCTEVWID0gIlZCRl9FWENfRElTQUJMRVYiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX0RJU0FCTEVIID0gIlZCRl9FWENfRElTQUJMRUgiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX09SUEhBTl9JVkFMSURBVE9SID0gIlZCRl9FWENfT1JQSEFOX0lWQUxJREFUT1IiOyAvLyROT04tTkxTLTEkIAotCi0JU3RyaW5nIFZCRl9TVEFUVVNfTE9PS0lORyA9ICJWQkZfU1RBVFVTX0xPT0tJTkciOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX0xPT0tJTkdET05FID0gIlZCRl9TVEFUVVNfTE9PS0lOR0RPTkUiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX1JFTU9WSU5HID0gIlZCRl9TVEFUVVNfUkVNT1ZJTkciOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX1JFTU9WSU5HRE9ORSA9ICJWQkZfU1RBVFVTX1JFTU9WSU5HRE9ORSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0JU3RyaW5nIFZCRl9XUk9OR19DT05URVhUX0ZPUl9ERUxFR0FURSA9ICJWQkZfV1JPTkdfQ09OVEVYVF9GT1JfREVMRUdBVEUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZCRl9OT19ERUxFR0FURSA9ICJWQkZfTk9fREVMRUdBVEUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZCRl9DQU5OT1RfSU5TVEFOVElBVEVfREVMRUdBVEUgPSAiVkJGX0NBTk5PVF9JTlNUQU5USUFURV9ERUxFR0FURSI7IC8vJE5PTi1OTFMtMSQgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDJmN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHRoZSBTdHJpbmdzIGZyb20gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBtYWNoaW5lJ3MgTG9jYWxlLgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VIYW5kbGVyIHsKLQkvL1RPRE8gTWFrZSB0aGlzIGNsYXNzIGZpbmFsIG9uY2UgdGhlIHB1YmxpYyBSZXNvdXJjZUhhbmRsZXIgaGFzIGJlZW4gZGVsZXRlZC4KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBfYnVuZGxlID0gbnVsbDsKLQotCXByb3RlY3RlZCBSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vVE9ETyBNYWtlIHRoaXMgbWV0aG9kIHByaXZhdGUgb25jZSB0aGUgcHVibGljIFJlc291cmNlSGFuZGxlciBoYXMgYmVlbiBkZWxldGVkLgotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlcywgYXMgaWRlbnRpZmllZCBieQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlpZiAoX2J1bmRsZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCV9idW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVmFsaWRhdGlvblBsdWdpbi5nZXRCdW5kbGVQcm9wZXJ0eUZpbGVOYW1lKCkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4YykgewotCQkJCV9idW5kbGUgPSBudWxsOwotCQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJCVRyYWNpbmcubG9nKCJSZXNvdXJjZUhhbmRsZXItMDEiLCAiQ2Fubm90IGZpbmQgYnVuZGxlICIgKyBWYWxpZGF0aW9uUGx1Z2luLmdldEJ1bmRsZVByb3BlcnR5RmlsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gX2J1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJVHJhY2luZy5sb2coIlJlc291cmNlSGFuZGxlci0wMjogIiwgIlJlc291cmNlIGJ1bmRsZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBrZXk7Ci0JCQl9Ci0KLQkJCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJVHJhY2luZy5sb2coIlJlc291cmNlSGFuZGxlci0wMzogIiwgIkNhbm5vdCBmaW5kIG1lc3NhZ2UgaWQgIiwga2V5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIHBhcm1zKSB7Ci0JCVN0cmluZyByZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmVzID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEV4dGVybmFsaXplZE1lc3NhZ2Uoa2V5KSwgKE9iamVjdFtdKXBhcm1zKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4YykgewotCQkJVHJhY2luZy5sb2coIlJlc291cmNlSGFuZGxlci0wNDogIiwgIkNhbm5vdCBmaW5kIG1lc3NhZ2UgaWQgIiwga2V5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQlUcmFjaW5nLmxvZygiUmVzb3VyY2VIYW5kbGVyLTA1OiBDYW5ub3QgZm9ybWF0IG1lc3NhZ2UgaWQgIiArIGtleSArICIgd2l0aCAiICsgcGFybXMubGVuZ3RoICsgIiBwYXJhbWV0ZXJzLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkICAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Rhc2tMaXN0VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9UYXNrTGlzdFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhZTNjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Rhc2tMaXN0VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBjYWxsZWQgb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIFRoaXMgc2luZ2xldG9uIGludGVyYWN0cyB3aXRoIHRoZSBlY2xpcHNlIHdvcmtiZW5jaCdzIFRhc2sgbGlzdC4gVGFza0xpc3RVdGlsaXR5IGFkZHMgYW5kIHJlbW92ZXMKLSAqIHRhc2tzIGZyb20gdGhlIGxpc3QuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgYW4gSVdvcmtzcGFjZVJ1bm5hYmxlIG9yIElSdW5uYWJsZVdpdGhQcm9ncmVzcy4gTWFueQotICogcmVzb3VyY2UgZGVsdGFzIGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tMaXN0VXRpbGl0eSBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFUFRIX0lORklOSVRFID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFUFRIX1pFUk8gPSBJUmVzb3VyY2UuREVQVEhfWkVSTzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QgPSAidGFyZ2V0T2JqZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIElNYXJrZXJbXSBOT19NQVJLRVJTID0gbmV3IElNYXJrZXJbMF07Ci0KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2VSb290IGdldFJvb3QoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBoZXJlIGZvciB1c2UgYnkgdGhlIFNBQkVSIHZhbGlkYXRvcidzIHJlcG9ydGVyIGluc3RhbmNlIE9OTFkuIERvIG5vdCB1c2UuIFNlZQotCSAqIGRlZmVjdCAyNjAxNDQgZm9yIGRldGFpbHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyBJTWFya2VyIHNldFByaW9yaXR5KElNYXJrZXIgaXRlbSwgaW50IHByaW9yaXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1hcCBhdHRyaWIgPSBpdGVtLmdldEF0dHJpYnV0ZXMoKTsKLQkJYXR0cmliLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihwcmlvcml0eSkpOwotCQlpdGVtLnNldEF0dHJpYnV0ZXMoYXR0cmliKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBtZXNzYWdlIHRvIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNYXJrZXIgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCAKLQkJU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBtYXJrZXJUeXBlLCBTdHJpbmcgbWFya2VyTmFtZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIAotCQlTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlpZiAoKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpIHx8ICghcmVzb3VyY2UuZXhpc3RzKCkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IGdldFNldmVyaXR5KG1hcmtlclR5cGUpOwotCi0JCS8vIEFsbG93IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSB0YXNrIGxpc3QuCi0JCS8vIFByaW9yIHRvIGEgZnVsbCB2YWxpZGF0aW9uLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgd2lsbCByZW1vdmUgYWxsIG1lc3NhZ2VzIG93bmVkCi0JCS8vIGJ5IGEgdmFsaWRhdG9yIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLQkJLy8gUHJpb3IgdG8gYW4gaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHdpbGwgcmVtb3ZlIGFsbCBtZXNzYWdlcywKLQkJLy8gb24gZWFjaCBvZiB0aGUgY2hhbmdlZCByZXNvdXJjZXMsIG93bmVkIGJ5IGEgdmFsaWRhdG9yIGJlZm9yZSBpdCBpcyBpbnZva2VkLgotCQkvLyAKLQkJLy8gSXQgaXMgdXAgdG8gdGhlIHZhbGlkYXRvciB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgYWRkaW5nIHRoZSBzYW1lIG1lc3NhZ2UKLQkJLy8gaW4gbW9yZSB0aGFuIG9uZSBwbGFjZSwgYW5kIGFsc28gdG8gY2xlYXIgb3V0IGFueSBvbGQgbWVzc2FnZXMgd2hpY2ggYXJlIG5vdCBjbGVhcmVkCi0JCS8vIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkJSU1hcmtlciBpdGVtID0gbnVsbDsKLQkJTWFya2VyTWFuYWdlci5nZXREZWZhdWx0KCkuaG9vayhyZXNvdXJjZSk7Ci0JCWlmKG1hcmtlck5hbWUgIT0gbnVsbCAmJiBtYXJrZXJOYW1lLmxlbmd0aCgpID4wICkKLQkJCSBpdGVtID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKG1hcmtlck5hbWUpOyAvLyBhZGQgYSB2YWxpZGF0aW9uIG1hcmtlcgotCQllbHNlCi0JCSAgICAgaXRlbSA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihWQUxJREFUSU9OX01BUktFUik7IC8vIGFkZCBhIHZhbGlkYXRpb24gbWFya2VyCi0KLQkJLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHJlcGxhY2UgdGhlIG11bHRpcGxlIHNldEF0dHJpYnV0ZQotCQkvLyBjYWxscyBhYm92ZSB3aXRoIGEgc2luZ2xlIHNldEF0dHJpYnV0ZXMgY2FsbC4KLQkJYm9vbGVhbiBvZmZzZXRTZXQgPSAoKG9mZnNldCAhPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQpICYmIChsZW5ndGggIT0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKSk7Ci0JCWludCBzaXplID0gKG9mZnNldFNldCkgPyAxMCA6IDg7IC8vIGFkZCBDSEFSX1NUQVJULCBDSEFSX0VORCBvbmx5IGlmIHRoZSBvZmZzZXQgaXMgc2V0LiBJZgotCQkvLyB0aGUgb2Zmc2V0IGlzIHNldCwgaXQgdGFrZXMgcHJlY2VuZGVuY2Ugb3ZlciB0aGUgbGluZQotCQkvLyBudW1iZXIuIChlY2xpcHNlJ3MgcnVsZSwgbm90IG1pbmUuKQotCQlTdHJpbmdbXSBhdHRyaWJOYW1lcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCU9iamVjdFtdIGF0dHJpYlZhbHVlcyA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0KLQkJLy8gVmVyeSBmaXJzdCB0aGluZywgYWRkIHRoZSBvd25lci4gVGhhdCB3YXksIGlmIHRoZSBjb2RlIGRpZXMKLQkJLy8gYmVmb3JlIHRoaW5ncyBhcmUgcGVyc2lzdGVkLCBob3BlZnVsbHkgdGhpcyBtYXJrZXIgd2lsbCBiZSBwZXJzaXN0ZWQuCi0JCS8vIEhvcGVmdWxseSwgZWNsaXBzZSBXSUxMIHBlcnNpc3QgdGhpcyBmaWVsZCwgYXMgcmVxdWVzdGVkLgotCQlhdHRyaWJOYW1lc1swXSA9IFZBTElEQVRJT05fTUFSS0VSX09XTkVSOwotCQlhdHRyaWJWYWx1ZXNbMF0gPSBwbHVnaW5JZDsKLQkJYXR0cmliTmFtZXNbMV0gPSBWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWTsgLy8gdGhpcyB2YWxpZGF0aW9uIHNldmVyaXR5IGlzIHN0b3JlZCwgaW4KLQkJLy8gYWRkaXRpb24gdG8gdGhlIG1hcmtlciBzZXZlcml0eSwgdG8gZW5hYmxlCi0JCS8vIG1vcmUgdGhhbiBvbmUgc2V2ZXJpdHkgb2YgbWVzc2FnZSB0byBiZQotCQkvLyBkaXNwbGF5ZWQuIGUuZy4gRVJST1IgfCBXQVJOSU5HICh1c2luZwotCQkvLyBiaW5hcnkgT1IpLiBUaGUgSU1hcmtlciBjb25zdGFudHMgYXJlCi0JCS8vIHJlZ3VsYXIgZGVjaW1hbCBjb25zdGFudHMuCi0JCWF0dHJpYlZhbHVlc1sxXSA9IG5ldyBJbnRlZ2VyKG1hcmtlclR5cGUpOwotCQlhdHRyaWJOYW1lc1syXSA9IFZBTElEQVRJT05fTUFSS0VSX1RBUkdFVE9CSkVDVDsgLy8gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtZXNzYWdlcyB3aGljaAotCQkvLyBhcmUgcmVnaXN0ZXJlZCBvbiBhbiBJUmVzb3VyY2UsIGJ1dAotCQkvLyBhZ2FpbnN0IGRpZmZlcmVudCB0YXJnZXQgb2JqZWN0cwotCQlhdHRyaWJWYWx1ZXNbMl0gPSAoKHRhcmdldE9iamVjdE5hbWUgPT0gbnVsbCkgPyAiIiA6IHRhcmdldE9iamVjdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYk5hbWVzWzNdID0gVkFMSURBVElPTl9NQVJLRVJfR1JPVVA7Ci0JCWF0dHJpYlZhbHVlc1szXSA9ICgoZ3JvdXBOYW1lID09IG51bGwpID8gIiIgOiBncm91cE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYk5hbWVzWzRdID0gSU1hcmtlci5NRVNTQUdFOwotCQlhdHRyaWJWYWx1ZXNbNF0gPSBtZXNzYWdlOwotCQlhdHRyaWJOYW1lc1s1XSA9IFZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRDsKLQkJYXR0cmliVmFsdWVzWzVdID0gbWVzc2FnZUlkOwotCi0JCWF0dHJpYk5hbWVzWzZdID0gSU1hcmtlci5TRVZFUklUWTsgLy8gSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLAotCQkvLyBJTWFya2VyLlNFVkVSSVRZX0lORk8KLQkJYXR0cmliVmFsdWVzWzZdID0gbmV3IEludGVnZXIoc2V2ZXJpdHkpOwotCQl0cnkgewotCQkJLy8gSWYgdGhlIGxvY2F0aW9uIGlzIGEgbGluZSBudW1iZXIsIHN0b3JlIGl0IGFzIGEgbGluZSBudW1iZXIKLQkJCUludGVnZXIgbGluZU51bWJlciA9IEludGVnZXIudmFsdWVPZihsb2NhdGlvbik7Ci0JCQlhdHRyaWJOYW1lc1s3XSA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0JCQlhdHRyaWJWYWx1ZXNbN10gPSBsaW5lTnVtYmVyOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBPdGhlcndpc2UsIHN0b3JlIGl0IGFzIGEgdGV4dCBsb2NhdGlvbgotCQkJYXR0cmliTmFtZXNbN10gPSBJTWFya2VyLkxPQ0FUSU9OOwotCQkJYXR0cmliVmFsdWVzWzddID0gbG9jYXRpb247Ci0JCX0KLQotCQlpZiAob2Zmc2V0U2V0KSB7Ci0JCQlhdHRyaWJOYW1lc1s4XSA9IElNYXJrZXIuQ0hBUl9TVEFSVDsKLQkJCWF0dHJpYlZhbHVlc1s4XSA9IG5ldyBJbnRlZ2VyKG9mZnNldCk7Ci0JCQlhdHRyaWJOYW1lc1s5XSA9IElNYXJrZXIuQ0hBUl9FTkQ7Ci0JCQlhdHRyaWJWYWx1ZXNbOV0gPSBuZXcgSW50ZWdlcihvZmZzZXQgKyBsZW5ndGgpOwotCQl9Ci0KLQkJaXRlbS5zZXRBdHRyaWJ1dGVzKGF0dHJpYk5hbWVzLCBhdHRyaWJWYWx1ZXMpOwotCi0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBtZXNzYWdlIHRvIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNYXJrZXIgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCAKLQkJU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBtYXJrZXJUeXBlLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgCi0JCVN0cmluZyBncm91cE5hbWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiBhZGRUYXNrKHBsdWdpbklkLCByZXNvdXJjZSwgbG9jYXRpb24sIG1lc3NhZ2VJZCwgCi0JCQkJbWVzc2FnZSwgbWFya2VyVHlwZSwgbnVsbCwgdGFyZ2V0T2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gb25lIG9mIHRoZSBTZXZlcml0eUVudW0gc2V2ZXJpdGllcywgcmV0dXJuIHRoZSBJTWFya2VyIHNldmVyaXR5IGludCB0aGF0IGlzIGl0cwotCSAqIGVxdWl2YWxlbnQuCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2FzIG1hZGUgcHVibGljIGZvciB0aGUgU2FiZXJSZXBvcnRlci4gTm8gb25lIG90aGVyIHRoYW4gVGFza0xpc3RVdGlsaXR5LCBvciB0aGUKLQkgKiBTYWJlclJlcG9ydGVyLCBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIQotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5RW51bVZhbHVlKSB7Ci0JCXN3aXRjaCAoc2V2ZXJpdHlFbnVtVmFsdWUpIHsKLQkJCWNhc2UgKElNZXNzYWdlLkhJR0hfU0VWRVJJVFkpIDogewotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOwotCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5MT1dfU0VWRVJJVFkpIDogewotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0JCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJCX0KLQotCQkJY2FzZSAoSU1lc3NhZ2UuQUxMX01FU1NBR0VTKSA6Ci0JCQljYXNlIChJTWVzc2FnZS5FUlJPUl9BTkRfV0FSTklORykgOgotCQkJZGVmYXVsdCA6IHsKLQkJCQkvLyBhc3N1bWUgaXQncyBhIHdhcm5pbmcuCi0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXREZXB0aChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiBERVBUSF9JTkZJTklURTsgLy8gREVQVEhfSU5GSU5JVEUgbWVhbnMgZ2V0IHRoaXMgcHJvamVjdCdzIG1hcmtlcnMsIGFuZCB0aGUKLQkJCS8vIG1hcmtlcnMgYmVsb25naW5nIHRvIHRoZSBwcm9qZWN0J3MgY2hpbGRyZW4uCi0JCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkgewotCQkJLy8gTmVlZGVkIGZvciB0aGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdoZW4gaXQgY2hlY2tzIGZvciBvcnBoYW4gdGFza3MuCi0JCQlyZXR1cm4gREVQVEhfSU5GSU5JVEU7IC8vIERFUFRIX0lORklOSVRFIG1lYW5zIGdldCBhbGwgb2YgdGhlIG1hcmtlcnMgaW4gdGhlIHdvcmtzcGFjZQotCQl9Ci0KLQkJcmV0dXJuIERFUFRIX1pFUk87IC8vIERFUFRIX1pFUk8gbWVhbnMganVzdCB0aGlzIHJlc291cmNlLCBub3QgaXRzIGNoaWxkcmVuCi0JfQotCi0JcHVibGljIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKGludCBzZXZlcml0eSwgSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBERVBUSF9JTkZJTklURSBtZWFucyBnZXQgdGhpcyBwcm9qZWN0J3MgbWFya2VycywgYW5kIHRoZSBtYXJrZXJzCi0JCS8vIGJlbG9uZ2luZyB0byB0aGUgcHJvamVjdCdzIGNoaWxkcmVuLgotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIHNldmVyaXR5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc2V2ZXJpdHkpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgc2V2ZXJpdHksIGdldERlcHRoKHJlc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1hcmtlciBpcyBvd25lZCBieSB0aGUgb3duZXJJZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPd25lcihJTWFya2VyIG1hcmtlciwgU3RyaW5nIG93bmVySWQpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvd25lciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJaWYgKChvd25lciA9PSBudWxsKSB8fCAhKG93bmVyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCS8vIFRoZSBWYWxpZGF0aW9uTWlncmF0b3Igd2lsbCByZW1vdmUgYW55ICJ1bm93bmVkIiB2YWxpZGF0aW9uIG1hcmtlcnMuCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gKChTdHJpbmcpIG93bmVyKS5lcXVhbHMob3duZXJJZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5LCBpbnQgZGVwdGgpIHsKLQkJSU1hcmtlcltdIHRlbXBNYXJrZXJzID0gbnVsbDsKLQkJaW50IHZhbGlkQ291bnQgPSAwOwotCQlJTWFya2VyW10gYWxsTWFya2VycyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoVkFMSURBVElPTl9NQVJLRVIsIHRydWUsIGRlcHRoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJLy8gTm93IGZpbHRlciBpbiB0aGUgbWFya2VycywgYmFzZWQgb24gc2V2ZXJpdHkgdHlwZS4KLQkJaWYgKGFsbE1hcmtlcnMubGVuZ3RoICE9IDApIHsKLQkJCXRlbXBNYXJrZXJzID0gbmV3IElNYXJrZXJbYWxsTWFya2Vycy5sZW5ndGhdOwotCQkJZm9yIChJTWFya2VyIG1hcmtlciA6IGFsbE1hcmtlcnMpIHsKLQkJCQlJbnRlZ2VyIGZpbHRlclNldmVyaXR5ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlmaWx0ZXJTZXZlcml0eSA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX1NFVkVSSVRZKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkJCS8vIFNvbWVvbmUgbWF5IGhhdmUgZGVsZXRlZCB0aGUgbWFya2VyIG9uIHVzLiBBbGwgd2UgY2FuIGRvIGlzIHNraXAgaXQuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoZmlsdGVyU2V2ZXJpdHkgPT0gbnVsbCkgewotCQkJCQkvLyBvZGQuLi5tYXJrZXIgd2Fzbid0IGNyZWF0ZWQgY29ycmVjdGx5LiBIb3cgY291bGQgdGhpcyBoYXBwZW4/Ci0JCQkJCS8vIERlZmF1bHQgdG8gdGhlIGN1cnJlbnQgc2V2ZXJpdHkgYW5kIGFkZCBpdCB0byB0aGUgbGlzdC4KLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIDIyNjU0MSAtIEkgd2FzIHNlZWluZyBtYXJrZXJzIHdpdGggdmFsaWQgc2V2ZXJpdGllcyBiZWluZyByZXNldCwgc28gSSBhZGRlZCB0aGlzCi0JCQkJCQkvLyBhZGRpdGlvbmFsIHRlc3QuCi0JCQkJCQlpZiAobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCAtMSkgPT0gLTEpCi0JCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBnZXRTZXZlcml0eShzZXZlcml0eSkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoKHNldmVyaXR5ICYgZmlsdGVyU2V2ZXJpdHkuaW50VmFsdWUoKSkgPT0gMCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdGVtcE1hcmtlcnNbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCX0KLQkJfQotCi0JCWlmICh2YWxpZENvdW50ID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHZhbGlkTWFya2VycyA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXBNYXJrZXJzLCAwLCB2YWxpZE1hcmtlcnMsIDAsIHZhbGlkQ291bnQpOwotCQlyZXR1cm4gdmFsaWRNYXJrZXJzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlT3duZXIpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgbmV3IFN0cmluZ1tde21lc3NhZ2VPd25lcn0sIGdldERlcHRoKHJlc291cmNlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVycykgewotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBtZXNzYWdlT3duZXJzLCBnZXREZXB0aChyZXNvdXJjZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBtZXNzYWdlT3duZXJzLCBpbnQgZGVwdGgpIHsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIElNZXNzYWdlLkFMTF9NRVNTQUdFUywgZGVwdGgpOwotCQlpZiAobWFya2Vycy5sZW5ndGggPT0gMClyZXR1cm4gTk9fTUFSS0VSUzsKLQotCQlJTWFya2VyW10gdGVtcCA9IG5ldyBJTWFya2VyW21hcmtlcnMubGVuZ3RoXTsKLQkJaW50IHZhbGlkQ291bnQgPSAwOwotCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2VycykgewotCQkJT2JqZWN0IG93bmVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJb3duZXIgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX09XTkVSKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGVhdCBpdCAtLSBpZiBpdCBubyBsb25nZXIgZXhpc3RzIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0Ci0JCQl9Ci0JCQkKLQkJCWlmICgob3duZXIgPT0gbnVsbCkgfHwgIShvd25lciBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkvLyBUaGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdpbGwgcmVtb3ZlIGFueSAidW5vd25lZCIgdmFsaWRhdGlvbiBtYXJrZXJzLgotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKFN0cmluZyBtZXNzYWdlT3duZXIgOiBtZXNzYWdlT3duZXJzKSB7Ci0JCQkJaWYgKCgoU3RyaW5nKSBvd25lcikuZXF1YWxzKG1lc3NhZ2VPd25lcikpIHsKLQkJCQkJdGVtcFt2YWxpZENvdW50KytdID0gbWFya2VyOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICh2YWxpZENvdW50ID09IDApcmV0dXJuIE5PX01BUktFUlM7Ci0KLQkJSU1hcmtlcltdIHJlc3VsdCA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgdmFsaWRDb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCB2YWxpZGF0aW9uIHRhc2tzIGZyb20gdGhlIHJlc291cmNlLiBJZiBkZXB0aCBpcyBJTkZJTklURSwgY2hpbGQKLQkgKiB0YXNrcyBhcmUgcmV0dXJuZWQgYXMgd2VsbC4gT25seSB0aGUgdGFza3Mgd2hpY2ggYXJlIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgbWVzc2FnZU93bmVyLCBhbmQKLQkgKiBhcHBseSB0byB0aGUgbmFtZWQgSU1lc3NhZ2UncyB0YXJnZXQgb2JqZWN0IChvYmplY3ROYW1lKSB3aWxsIGJlIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBtZXNzYWdlT3duZXIsIFN0cmluZyBvYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChtZXNzYWdlT3duZXIgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJSU1hcmtlcltdIHZhbGlkTGlzdCA9IG51bGw7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBtZXNzYWdlT3duZXIsIGRlcHRoKTsKLQkJaWYgKG1hcmtlcnMgIT0gbnVsbCkgewotCQkJdmFsaWRMaXN0ID0gbmV3IElNYXJrZXJbbWFya2Vycy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCi0JCQkJLy8gSWYgbW9yZSB0aGFuIG9uZSB0YXJnZXQgb2JqZWN0IHJlc29sdmVzIHRvIHRoZSBzYW1lIHJlc291cmNlLCByZW1vdmluZyBvbmUKLQkJCQkvLyB0YXJnZXQncwotCQkJCS8vIG1lc3NhZ2VzIHNob3VsZCBub3QgcmVtb3ZlIHRoZSBvdGhlciB0YXJnZXQgb2JqZWN0J3MgbWVzc2FnZXMuCi0JCQkJaWYgKG9iamVjdE5hbWUgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgdGFyZ2V0T2JqZWN0ID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QpOwotCQkJCQlpZiAoKHRhcmdldE9iamVjdCA9PSBudWxsKSB8fCAhKHRhcmdldE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgfHwgISgoKFN0cmluZykgdGFyZ2V0T2JqZWN0KS5lcXVhbHMob2JqZWN0TmFtZSkpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChncm91cE5hbWUgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgZ3JvdXAgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX0dST1VQKTsKLQkJCQkJaWYgKChncm91cCA9PSBudWxsKSB8fCAhKGdyb3VwIGluc3RhbmNlb2YgU3RyaW5nKSB8fCAhKCgoU3RyaW5nKSBncm91cCkuZXF1YWxzKGdyb3VwTmFtZSkpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXZhbGlkTGlzdFt2YWxpZENvdW50KytdID0gbWFya2VyOwotCQkJfQotCQl9Ci0KLQkJaWYgKHZhbGlkQ291bnQgPT0gMCkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlJTWFya2VyW10gcmVzdWx0ID0gbmV3IElNYXJrZXJbdmFsaWRDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodmFsaWRMaXN0LCAwLCByZXN1bHQsIDAsIHZhbGlkQ291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSByZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5kZWxldGVNYXJrZXJzKG1hcmtlcnMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgdGFza3MgZnJvbSB0aGUgcmVzb3VyY2UuIElmIHRoZSByZXNvdXJjZSBpcyBhbiBJUHJvamVjdCwgYWxsIHRhc2tzCi0JICogYXJlIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBwcm9qZWN0J3MgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMsIG51bGwpOyAvLyBudWxsIG1lYW5zIHJlbW92ZSBtZXNzYWdlcyBmcm9tIGFsbCB0YXJnZXQKLQkJLy8gb2JqZWN0cwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIG1lc3NhZ2VzIGZyb20gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBvd25lciwgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXtvd25lcn0sIG9iamVjdE5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ2V0RGVwdGgocmVzb3VyY2UpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlVGFza1N1YnNldChyZXNvdXJjZSwgb3duZXJzLCBvYmplY3ROYW1lLCBudWxsLCBkZXB0aCk7IC8vIG51bGwgbWVhbnMgbm8gZ3JvdXAgbmFtZQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYSBzdWJzZXQgb2YgdGFza3MgZnJvbSB0aGUgcHJvamVjdCwgaW5jbHVkaW5nIGNoaWxkIHRhc2tzLiBFdmVyeSB0YXNrCi0JICogd2hpY2ggYmVsb25ncyB0byB0aGUgZ3JvdXAsIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLCB3aWxsIGJlIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVRhc2tTdWJzZXQoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBnZXREZXB0aChyZXNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYSBzdWJzZXQgb2YgdGFza3MgZnJvbSB0aGUgcHJvamVjdCwgaW5jbHVkaW5nIGNoaWxkIHRhc2tzLiBFdmVyeSB0YXNrCi0JICogd2hpY2ggYmVsb25ncyB0byB0aGUgZ3JvdXAsIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLCB3aWxsIGJlIHJlbW92ZWQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbW92ZVRhc2tTdWJzZXQoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChvd25lcnMgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJTWFya2VyW10gYWxsVGFza3MgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBkZXB0aCk7Ci0JCWlmIChhbGxUYXNrcy5sZW5ndGggPiAwKSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhhbGxUYXNrcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIGFsbCB2YWxpZGF0b3IgbWFya2VycyB3aGljaCBhcmUgb3duZWQgYnkgImZyb20iIHRvIG1ha2UgdGhlaXIgb3duZXIgInRvIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlT3duZXIoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl1cGRhdGVPd25lcihmcm9tLCB0bywgZ2V0Um9vdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIGFsbCB2YWxpZGF0b3IgbWFya2VycyBvbiB0aGUgSVJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4uIEFsbCBtYXJrZXJzCi0JICogb3duZWQgYnkgImZyb20iIGhhdmUgdGhlaXIgb3duZXIgcmVhc3NpZ25lZCB0byAidG8iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVPd25lcihTdHJpbmcgZnJvbSwgU3RyaW5nIHRvLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1hcmtlcltdIG93bmVkTWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgZnJvbSk7Ci0JCWlmIChvd25lZE1hcmtlcnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvd25lZE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlNYXJrZXIgbWFya2VyID0gb3duZWRNYXJrZXJzW2ldOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9PV05FUiwgdG8pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WVGhyZWFkTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WVGhyZWFkTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ5YjdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVlRocmVhZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIChxdWV1ZSwgaW52b2tlLCBldGMuKSB0aGUgUnVubmFibGVzIHRoYXQgcGVyZm9ybSB0aGUgdmFsaWRhdGlvbiBmb3IgYQotICogcGFydGljdWxhciB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBWVGhyZWFkTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgVlRocmVhZE1hbmFnZXIgX21hbmFnZXIgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNX09GX1JFU1RBUlQgPSA1OyAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgdGhyZWFkCi0JLy8gc2hvdWxkIGF0dGVtcHQgdG8gaWdub3JlIGEgVGhyb3dhYmxlIGFuZAotCS8vIGNhcnJ5IG9uCi0KLQlwcml2YXRlIFRocmVhZCBfdmFsaWRhdGlvblRocmVhZCA9IG51bGw7IC8vIFRoaXMgdGhyZWFkIGNoZWNrcyBpZiB0aGUgY3VycmVudCBSdW5uYWJsZSBpcwotCS8vIGZpbmlzaGVkLCBhbmQgaWYgc28sIGxvYWRzIHRoZSBmaXJzdCBSdW5uYWJsZSBvZmYgb2YKLQkvLyB0aGUgcXVldWUgYW5kIHN0YXJ0cyBpdC4KLQl2b2xhdGlsZSBpbnQgcmVzdGFydCA9IDA7IC8vIGhvdyBtYW55IHRpbWVzIGhhcyB0aGUgdGhyZWFkIGJlZW4gcmVzdGFydGVkPwotCXZvbGF0aWxlIEpvYnMgX2pvYnMgPSBudWxsOwotCi0JcHJpdmF0ZSBWVGhyZWFkTWFuYWdlcigpIHsKLQkJX2pvYnMgPSBuZXcgSm9icygpOwotCi0JCS8vIFN0YXJ0IHRoZSB2YWxpZGF0aW9uIHRocmVhZCB0byBjaGVjayBmb3IgcXVldWVkIFZhbGlkYXRpb25PcGVyYXRpb24KLQkJUnVubmFibGUgdmFsaWRhdGlvblJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAocmVzdGFydCA+IE1BWF9OVU1fT0ZfUkVTVEFSVCkgewotCQkJCQkJCS8vIHNvbWV0aGluZyBoYXMgZ29uZSBzZXJpb3VzbHksIHNlcmlvdXNseSB3cm9uZwotCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gInJlc3RhcnQgPSAiICsgcmVzdGFydDsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQotCQkJCQkJUnVubmFibGUgam9iID0gZ2V0Sm9icygpLmRlcXVldWUoKTsgLy8gSWYgY3VycmVudFJ1bm5hYmxlIGlzIG51bGwsIHRoZXJlJ3MKLQkJCQkJCS8vIG5vdGhpbmcgb24gdGhlIHF1ZXVlLiBTaG91bGRuJ3QKLQkJCQkJCS8vIGhhcHBlbiB3aXRoIGEgc2VtYXBob3JlLgotCQkJCQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQkJCQkJZ2V0Sm9icygpLnNldEFjdGl2ZSh0cnVlKTsKLQkJCQkJCQlqb2IucnVuKCk7Ci0JCQkJCQkJZ2V0Sm9icygpLnNldEFjdGl2ZShmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXN0YXJ0Kys7Ci0JCQkJCQlnZXRKb2JzKCkuc2V0QWN0aXZlKGZhbHNlKTsKLQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJX3ZhbGlkYXRpb25UaHJlYWQgPSBuZXcgVGhyZWFkKHZhbGlkYXRpb25SdW5uYWJsZSwgIlZhbGlkYXRpb25UaHJlYWQiKTsgLy8kTk9OLU5MUy0xJAotCQlfdmFsaWRhdGlvblRocmVhZC5zdGFydCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVlRocmVhZE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKF9tYW5hZ2VyID09IG51bGwpIHsKLQkJCV9tYW5hZ2VyID0gbmV3IFZUaHJlYWRNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIF9tYW5hZ2VyOwotCX0KLQotCUpvYnMgZ2V0Sm9icygpIHsKLQkJcmV0dXJuIF9qb2JzOwotCX0KLQotCXB1YmxpYyB2b2lkIHF1ZXVlKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWdldEpvYnMoKS5xdWV1ZShydW5uYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBSdW5uYWJsZXMgaGF2ZSBiZWVuIHJ1bi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKSB7Ci0JCXJldHVybiBnZXRKb2JzKCkuaXNEb25lKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKb2JzIHsKLQkJcHJpdmF0ZSBWZWN0b3I8UnVubmFibGU+IF9xdWV1ZWRKb2JzOyAvLyBUaGUgcXVldWVkIFJ1bm5hYmxlcyB0aGF0IG5lZWQgdG8gYmUgcnVuLgotCQlwcml2YXRlIGJvb2xlYW4gX2lzQWN0aXZlOyAvLyBJcyBhIGpvYiBiZWluZyBydW4gaW4gdGhlIHZhbGlkYXRpb24gdGhyZWFkPwotCi0JCXB1YmxpYyBKb2JzKCkgewotCQkJX3F1ZXVlZEpvYnMgPSBuZXcgVmVjdG9yPFJ1bm5hYmxlPigpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHF1ZXVlKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCQkvLyBJZiB0aGVyZSBpcyBhIHRocmVhZCBydW5uaW5nIGFscmVhZHksIHRoZW4gaXQgbXVzdCBmaW5pc2ggYmVmb3JlIGFub3RoZXIgdmFsaWRhdGlvbgotCQkJLy8gdGhyZWFkIGlzIGxhdW5jaGVkLCBvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcyBjb3VsZCByZWZsZWN0IHRoZSBsYXN0IHRocmVhZAotCQkJLy8gZmluaXNoZWQsCi0JCQkvLyBpbnN0ZWFkIG9mIHRoZSBsYXN0IHN0YXRlIG9mIGNoYW5nZXMuCi0KLQkJCS8vIEhhdmUgdG8gd2FpdCBmb3IgdGhlIGN1cnJlbnQgUnVubmFibGUgdG8gZmluaXNoLCBzbyBhZGQgdGhpcyB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZQotCQkJX3F1ZXVlZEpvYnMuYWRkKHJ1bm5hYmxlKTsKLQkJCW5vdGlmeUFsbCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFBvcCB0aGUgUnVubmFibGUgb2ZmIG9mIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KLQkJICovCi0JCXN5bmNocm9uaXplZCBSdW5uYWJsZSBkZXF1ZXVlKCkgewotCQkJd2hpbGUgKF9xdWV1ZWRKb2JzLnNpemUoKSA9PSAwKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd2FpdCgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4YykgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0gLy8gQmxvY2sgb24gdGhlIHNlbWFwaG9yZTsgYnJlYWsgd2hlbiBhIGpvYiBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcXVldWUuCi0KLQkJCVJ1bm5hYmxlIGpvYiA9IG51bGw7Ci0JCQlpZiAoX3F1ZXVlZEpvYnMuc2l6ZSgpID4gMCkgewotCQkJCWpvYiA9IF9xdWV1ZWRKb2JzLmdldCgwKTsKLQkJCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCQkJX3F1ZXVlZEpvYnMucmVtb3ZlKDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBqb2I7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCQlyZXR1cm4gX2lzQWN0aXZlOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEFjdGl2ZShib29sZWFuIGFjdGl2ZSkgewotCQkJX2lzQWN0aXZlID0gYWN0aXZlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgUnVubmFibGVzIGhhdmUgYmVlbiBydW4uCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNEb25lKCkgewotCQkJcmV0dXJuICgoX3F1ZXVlZEpvYnMuc2l6ZSgpID09IDApICYmICFpc0FjdGl2ZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkYjA4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLlZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgdXNlcidzIHByZWZlcmVuY2Ugb3IgcHJvamVjdCBzZXR0aW5ncy4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBwb3B1bGF0ZWQgZnJvbSB0aGUgbXVsdGlwbGUgcGVyc2lzdGVudCBwcm9wZXJ0aWVzLCBhbmQgaXMga2VwdCBhcyBhIHNlc3Npb24KLSAqIHByb3BlcnR5IHdoaWxlIHRoZSByZXNvdXJjZSBpcyBvcGVuLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2UgCV9yZXNvdXJjZTsKLQlwcml2YXRlIGJvb2xlYW4gCWRpc2FibGVBbGxWYWxpZGF0aW9uID0gZ2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oKTsKLQlwcml2YXRlIFN0cmluZyAJCV92ZXJzaW9uOwotCQotCS8qKgotCSAqIE1hcCBvZiBhbGwgdmFsaWRhdG9ycyBjb25maWd1cmVkIG9uIHRoZSBwcm9qZWN0IG9yIGluc3RhbGxlZCBnbG9iYWxseS4gVGhlIHZhbHVlIG9mIHRydWUKLQkgKiBtZWFucyB0aGF0IHRoZSBWTUQgaXMgZW5hYmxlZCwgYW5kIGEgdmFsdWUgb2YgZmFsc2UgbWVhbnMgdGhhdCB0aGUgVk1EIGlzIGRpc2FibGVkLgotCSAqLwotCXByaXZhdGUgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPgkJX3ZhbGlkYXRvcnMgPSBuZXcgSGFzaE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgQm9vbGVhbj4oKTsKLQlwcm90ZWN0ZWQgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPiAJbWFudWFsVmFsaWRhdG9yczsKLQlwcm90ZWN0ZWQgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPiAJYnVpbGRWYWxpZGF0b3JzOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVzZXJQcmVmZXJlbmNlID0gIlVTRVJfUFJFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVc2VyQnVpbGRQcmVmZXJlbmNlID0gIlVTRVJfQlVJTERfUFJFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVc2VyTWFudWFsUHJlZmVyZW5jZSA9ICJVU0VSX01BTlVBTF9QUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERlbGVnYXRlc1ByZWZlcmVuY2UgPSAiREVMRUdBVEVTX1BSRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gR1JLIC0gSSBhbSBrZWVwaW5nIHRoZXNlICJjb25zdGFudHMiIGluIHRoZSBvZmYgY2hhbmNlIHRoYXQgdGhleSB3ZXJlIHVzZWQgc29tZXdoZXJlIG91dHNpZGUgdGhlIGZyYW1ld29yawotCXByb3RlY3RlZCBTdHJpbmcgVVNFUl9QUkVGRVJFTkNFIAkJPSBVc2VyUHJlZmVyZW5jZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIFVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UgPSBVc2VyTWFudWFsUHJlZmVyZW5jZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIFVTRVJfQlVJTERfUFJFRkVSRU5DRSAJPSBVc2VyQnVpbGRQcmVmZXJlbmNlOwotCXByb3RlY3RlZCBTdHJpbmcgREVMRUdBVEVTX1BSRUZFUkVOQ0UgCT0gRGVsZWdhdGVzUHJlZmVyZW5jZTsKLQkKLQkvKioKLQkgKiBUaGUga2V5IGlzIHRoZSB0YXJnZXQgaWQsIHRoYXQgaXMgdGhlIGlkIG9mIHRoZSBwbGFjZSBob2xkZXIgdmFsaWRhdG9yLiBUaGUgdmFsdWUgaXMgdGhlIGlkIAotCSAqIG9mIHRoZSByZWFsIHZhbGlkYXRvci4gCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IF9kZWxlZ2F0ZXNCeVRhcmdldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEZWZhdWx0VmFsdWUgPSAiZGVmYXVsdF92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVuYWJsZWRFbGVtZW50c0FzU3RyaW5nKFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBlbGVtZW50cykgewotCQkJYnVmZmVyLmFwcGVuZCh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTEVNRU5UX1NFUEFSQVRPUik7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVuYWJsZWRFbGVtZW50c0FzU3RyaW5nKFZhbGlkYXRvck1ldGFEYXRhW10gZWxlbWVudHMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBlbGVtZW50cykgewotCQkJYnVmZmVyLmFwcGVuZCh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTEVNRU5UX1NFUEFSQVRPUik7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50cyhTdHJpbmcgZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpcmV0dXJuIG51bGw7Ci0KLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiByZXN1bHQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWxlbWVudHMsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRUxFTUVOVF9TRVBBUkFUT1IpOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGVsZW0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoZWxlbSk7Ci0JCQlpZiAodm1kICE9IG51bGwpcmVzdWx0LmFkZCh2bWQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoU3RyaW5nIGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKXJldHVybiBudWxsOwotCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnRzLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfU0VQQVJBVE9SKTsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbdG9rZW5pemVyLmNvdW50VG9rZW5zKCldOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGVsZW0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoZWxlbSk7Ci0JCQlpZiAodm1kICE9IG51bGwpcmVzdWx0W2NvdW50KytdID0gdm1kOwotCQl9Ci0KLQkJaWYgKGNvdW50ICE9IHJlc3VsdC5sZW5ndGgpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdHJpbVJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgdHJpbVJlc3VsdCwgMCwgY291bnQpOwotCQkJcmV0dXJuIHRyaW1SZXN1bHQ7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHZhbGlkYXRvcnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRWYWxpZGF0b3JJZHNNYW51YWwoKXsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWZzID0gUHJlZmVyZW5jZXNXcmFwcGVyLmdldFByZWZlcmVuY2VzKG51bGwsIG51bGwpOwotCQlTdHJpbmcgY29uZmlnID0gcHJlZnMuZ2V0KFVzZXJNYW51YWxQcmVmZXJlbmNlLCBudWxsKTsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcklkcyhjb25maWcpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldFZhbGlkYXRvcklkc0J1aWxkKCl7Ci0JCVByZWZlcmVuY2VzV3JhcHBlciBwcmVmcyA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhudWxsLCBudWxsKTsKLQkJU3RyaW5nIGNvbmZpZyA9IHByZWZzLmdldChVc2VyQnVpbGRQcmVmZXJlbmNlLCBudWxsKTsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcklkcyhjb25maWcpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRWYWxpZGF0b3JJZHMoU3RyaW5nIGVsZW1lbnRzKXsKLQkJU2V0PFN0cmluZz4gc2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPig1MCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKXsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnRzLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfU0VQQVJBVE9SKTsKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKXNldC5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JfQotCQotCXByb3RlY3RlZCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbihJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlfcmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oSVJlc291cmNlIHJlc291cmNlLCBWYWxpZGF0b3JNZXRhRGF0YVtdIHZhbGlkYXRvcnMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG51bGwsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfTlVMTENSRUFURSkpOwotCQl9Ci0KLQkJX3Jlc291cmNlID0gcmVzb3VyY2U7Ci0JCXNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZUFsbFZhbGlkYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkaXNhYmxlQWxsVmFsaWRhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihib29sZWFuIGFsbFZhbGlkYXRpb24pIHsKLQkJZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBhbGxWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9ycyh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgImluY3JlbWVudGFsIiBpcyB0cnVlLCByZXR1cm4gdGhlIGVuYWJsZWQgaW5jcmVtZW50YWwgdmFsaWRhdG9ycy4gSWYgImluY3JlbWVudGFsIiBpcwotCSAqIGZhbHNlLCByZXR1cm4gdGhlIGVuYWJsZWQgbm9uLWluY3JlbWVudGFsIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhib29sZWFuIGluY3JlbWVudGFsKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyghaW5jcmVtZW50YWwpOwotCX0KLQotCS8qKgotCSAqIElmICJmdWxsQnVpbGQiIGlzIHRydWUsIHJldHVybiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIHRoYXQgc3VwcG9ydCBmdWxsIGJ1aWxkcy4gSWYKLQkgKiAiZnVsbEJ1aWxkIiBpcyBmYWxzZSwgcmV0dXJuIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBmdWxsIGJ1aWxkcy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhib29sZWFuIGZ1bGxCdWlsZCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoZnVsbEJ1aWxkLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoYm9vbGVhbiBmdWxsQnVpbGQsIGJvb2xlYW4gb25seVJlZmVyZW5jZWQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQotCQlpbnQgY291bnQgPSAwOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG51bGw7Ci0JCSAKLQkJaWYoICFpc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkgKXsKLQkJCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gc2V0ID0gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLmtleVNldCgpOwotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB0ZW1wID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW3NldC5zaXplKCldOwotCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBzZXQpIHsKLQkJCQlCb29sZWFuIGJ2YWx1ZSA9IGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5nZXQodm1kKTsKLQkJCQlpZiAoYnZhbHVlKSB7Ci0JCQkJCS8vIElmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZAotCQkJCQlpZiAodm1kID09IG51bGwpY29udGludWU7Ci0JCQkJCWlmICggdm1kLmlzQnVpbGRWYWxpZGF0aW9uKCkgKSB7Ci0JCQkJCQlpZiAoIW9ubHlSZWZlcmVuY2VkIHx8IHZtZC5pc0RlcGVuZGVudFZhbGlkYXRvcigpKQotCQkJCQkJCXRlbXBbY291bnQrK10gPSB2bWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJfQotCQllbHNlIHsKLQkJCSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbMF07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMpIHsKLQkJLy8gRmlyc3QsICJkaXNhYmxlIiBhbGwgdmFsaWRhdG9ycwotCQlNYXA8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+IGFsbCA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogYWxsLmtleVNldCgpKSB7Ci0JCQlhbGwucHV0KHZtZCwgQm9vbGVhbi5GQUxTRSk7Ci0JCX0KLQotCQkvLyBUaGVuIGVuYWJsZSBvbmx5IHRoZSB2YWxpZGF0b3JzIGluIHRoZSBhcnJheQotCQlpZiAoKHZtZHMgPT0gbnVsbCkgfHwgKHZtZHMubGVuZ3RoID09IDApKXJldHVybjsKLQkJCi0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdm1kcykgewotCQkJYWxsLnB1dCh2bWQsIEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gbWFudWFsRW5hYmxlZFZNRHMgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4odm1kcy5sZW5ndGgpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpbWFudWFsRW5hYmxlZFZNRHMuYWRkKHZtZCk7Ci0JCQotCQlmb3IoVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA6IGdldFZhbGlkYXRvcnMoKSkgewotCQkJaWYobWFudWFsRW5hYmxlZFZNRHMuY29udGFpbnMoZGF0YSkpCi0JCQkJZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgQm9vbGVhbi5UUlVFKTsKLQkJCWVsc2UKLQkJCQlnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dChkYXRhLCBCb29sZWFuLkZBTFNFKTsJCQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyB0aGF0IGhhdmUgYmVlbiBlbmFibGVkIGZvciBtYW51YWwgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdm1kcyB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciBtYW51YWwgdmFsaWRhdGlvbi4KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycyhTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZtZHMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJZm9yKFZhbGlkYXRvck1ldGFEYXRhIGRhdGEgOiBnZXRWYWxpZGF0b3JzKCkpIHsKLQkJCWlmKHZtZHMuY29udGFpbnMoZGF0YSkpZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgQm9vbGVhbi5UUlVFKTsKLQkJCWVsc2UgZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgQm9vbGVhbi5GQUxTRSk7CQkJCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBidWlsZEVuYWJsZWRWTURzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KHZtZHMubGVuZ3RoKTsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKWJ1aWxkRW5hYmxlZFZNRHMuYWRkKHZtZCk7Ci0JCWZvcihWYWxpZGF0b3JNZXRhRGF0YSBkYXRhIDogZ2V0VmFsaWRhdG9ycygpKSB7Ci0JCQlpZihidWlsZEVuYWJsZWRWTURzLmNvbnRhaW5zKGRhdGEpKQotCQkJCWdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgQm9vbGVhbi5UUlVFKTsKLQkJCWVsc2UKLQkJCQlnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkucHV0KGRhdGEsIEJvb2xlYW4uRkFMU0UpOwkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIGVuYWJsZWQgZm9yIGJ1aWxkIHZhbGlkYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZtZHMgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgZW5hYmxlZCBmb3IgYnVpbGQgdmFsaWRhdGlvbi4KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kcykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlmb3IoVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA6IGdldFZhbGlkYXRvcnMoKSkgewotCQkJaWYodm1kcy5jb250YWlucyhkYXRhKSlnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkucHV0KGRhdGEsIEJvb2xlYW4uVFJVRSk7Ci0JCQllbHNlIGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgQm9vbGVhbi5GQUxTRSk7CQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgQm9vbGVhbj4gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yczsKLQl9Ci0JCi0KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXREaXNhYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3JzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgVmFsaWRhdG9yTWV0YURhdGEgLSBpZiB2YWx1ZSBpcyBmYWxzZSwgcmV0dXJuIHRoZSBkaXNhYmxlZCB2YWxpZGF0b3JzOyBpZgotCSAqIHZhbHVlIGlzIHRydWUsIHJldHVybiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzLgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JzKGJvb2xlYW4gdmFsdWUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB0ZW1wID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW251bWJlck9mVmFsaWRhdG9ycygpXTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmtleVNldCgpKSB7Ci0JCQlCb29sZWFuIGJ2YWx1ZSA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0KHZtZCk7Ci0JCQlpZiAoYnZhbHVlLmJvb2xlYW5WYWx1ZSgpID09IHZhbHVlKSB7Ci0JCQkJdGVtcFtjb3VudCsrXSA9IHZtZDsKLQkJCX0KLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCU1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgQm9vbGVhbj4gbWFwID0gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKTsKLQkJaWYgKCFtYXAuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0PFZhbGlkYXRvck1ldGFEYXRhPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCQlmb3IgKE1hcC5FbnRyeTxWYWxpZGF0b3JNZXRhRGF0YSwgQm9vbGVhbj4gbWUgOiBtYXAuZW50cnlTZXQoKSkgewotCQkJCUJvb2xlYW4gb2JqID0gbWUuZ2V0VmFsdWUoKTsKLQkJCQlpZiAob2JqICE9IG51bGwgJiYgb2JqKWxpc3QuYWRkKG1lLmdldEtleSgpKTsKLQkJCX0KLQkJCXJldHVybiAoVmFsaWRhdG9yTWV0YURhdGFbXSkgbGlzdC50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsaXN0LnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBnZXRFbmFibGVkVmFsaWRhdG9ycygpOwotCX0JCi0JCi0JcHVibGljICBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCU1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgQm9vbGVhbj4gbWFwID0gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpOwotCQlMaXN0PFZhbGlkYXRvck1ldGFEYXRhPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWlmICghbWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChNYXAuRW50cnk8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+IG1lIDogbWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlCb29sZWFuIG9iaiA9IG1lLmdldFZhbHVlKCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iailsaXN0LmFkZChtZS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pIGxpc3QudG9BcnJheShuZXcgVmFsaWRhdG9yTWV0YURhdGFbbGlzdC5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBtYXAgb2YgdGhlIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGJlZW4gZW5hYmxlZCBmb3IgYnVpbGQgdmFsaWRhdGlvbiwgCi0JICogY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXByb3RlY3RlZCAgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPiBnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkgewotCQlpZihidWlsZFZhbGlkYXRvcnMgPT0gbnVsbClidWlsZFZhbGlkYXRvcnMgPSBuZXcgSGFzaE1hcDxWYWxpZGF0b3JNZXRhRGF0YSwgQm9vbGVhbj4oKTsKLQkJcmV0dXJuIGJ1aWxkVmFsaWRhdG9yczsKLQl9CQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgbWFwIG9mIHRoZSB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIGVuYWJsZWQgZm9yIG1hbnVhbCB2YWxpZGF0aW9uLCAKLQkgKiBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkICBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIEJvb2xlYW4+IGdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkgewotCQlpZihtYW51YWxWYWxpZGF0b3JzID09IG51bGwpbWFudWFsVmFsaWRhdG9ycyA9IG5ldyBIYXNoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPigpOwotCQlyZXR1cm4gbWFudWFsVmFsaWRhdG9yczsKLQl9CQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIGZvciB0aGlzIHByZWZlcmVuY2U7IGVpdGhlciBldmVyeSBpbnN0YWxsZWQgdmFsaWRhdG9yCi0JICogKGdsb2JhbCkgb3IgZXZlcnkgdmFsaWRhdG9yIGNvbmZpZ3VyZWQgb24gdGhlIHByb2plY3QgKHByb2plY3QpLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEluY3JlbWVudGFsVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB0ZW1wID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW251bWJlck9mVmFsaWRhdG9ycygpXTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmtleVNldCgpKSB7Ci0JCQlCb29sZWFuIGJ2YWx1ZSA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0KHZtZCk7Ci0JCQlpZiAoYnZhbHVlICYmIHZtZC5pc0luY3JlbWVudGFsKCkpdGVtcFtjb3VudCsrXSA9IHZtZDsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHZhbGlkYXRvcnMgZm9yIHRoaXMgcHJlZmVyZW5jZTsgZWl0aGVyIGV2ZXJ5IGluc3RhbGxlZCB2YWxpZGF0b3IgKGdsb2JhbCkgb3IgZXZlcnkKLQkgKiB2YWxpZGF0b3IgY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdCAocHJvamVjdCkuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0VmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5KF92YWxpZGF0b3JzLmtleVNldCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMpIHsKLQkJX3ZhbGlkYXRvcnMuY2xlYXIoKTsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKSB7Ci0JCQlpZiAodm1kID09IG51bGwpY29udGludWU7Ci0JCQlfdmFsaWRhdG9ycy5wdXQodm1kLCAodm1kLmlzRW5hYmxlZEJ5RGVmYXVsdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSkpOwotCQl9Ci0JfQotCQotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RGVsZWdhdGVzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgIF9kZWxlZ2F0ZXNCeVRhcmdldC5jbGVhcigpOwotICAgIGZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdm1kcykgewotICAgICAgaWYgKHZtZCA9PSBudWxsKWNvbnRpbnVlOwotICAgICAgCi0gICAgICBTdHJpbmcgdGFyZ2V0SUQgPSB2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotICAgICAgU3RyaW5nIGRlbGVnYXRlSUQgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHREZWxlZ2F0ZSh0YXJnZXRJRCk7Ci0gICAgICBpZiAoZGVsZWdhdGVJRCA9PSBudWxsKWNvbnRpbnVlOwotICAgICAgX2RlbGVnYXRlc0J5VGFyZ2V0LnB1dCh0YXJnZXRJRCwgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RGVsZWdhdGUodGFyZ2V0SUQpKTsKLSAgICB9Ci0gIH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb25maWd1cmVkIHZhbGlkYXRvcnMgb24gdGhlIGdpdmVuIHByb2plY3Qgb3IgaW5zdGFsbGVkIHZhbGlkYXRvcnMgaW4KLQkgKiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gX3ZhbGlkYXRvcnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgbnVtYmVyT2ZFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gbnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JfQotCi0JcHVibGljIGludCBudW1iZXJPZkluY3JlbWVudGFsVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bWJlck9mSW5jcmVtZW50YWxWYWxpZGF0b3JzKGdldFZhbGlkYXRvcnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG51bWJlck9mSW5jcmVtZW50YWxWYWxpZGF0b3JzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgewotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCWlmICh2bWQuaXNJbmNyZW1lbnRhbCgpKWNvdW50Kys7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbmFibGVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuYWJsZWRWYWxpZGF0b3JzKCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0IG9yIHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgaW50IG51bWJlck9mRGlzYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RGlzYWJsZWRWYWxpZGF0b3JzKCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLW51bGwuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRWZXJzaW9uKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAoX3ZlcnNpb24gPT0gbnVsbClsb2FkVmVyc2lvbigpOwotCQlyZXR1cm4gX3ZlcnNpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJX3ZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcHJlZmVyZW5jZSBoYXMgYmVlbiBtaWdyYXRlZDsgY2hhbmdlIHRoZSB2ZXJzaW9uIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uCi0JICogQGRlcHJlY2F0ZWQgZGVhZCBjb2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtWZXJzaW9uQ3VycmVudCgpIHsKLQkJLy8gVGhlIHZlcnNpb24gc2hvdWxkIG5vdCBiZSBtYXJrZWQgY3VycmVudCB1bnRpbCB0aGUgbWlncmF0aW9uIGlzIGNvbXBsZXRlCi0JCS8vIChpLmUuLCBWYWxpZGF0aW9uTWlncmF0b3IgaGFzIGJlZW4gaW52b2tlZC4pIE1pZ3JhdGluZyB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24KLQkJLy8gaXMgb25seSB0aGUgZmlyc3Qgc3RlcCBvZiB0aGUgbWlncmF0aW9uLgotCQlzZXRWZXJzaW9uKENvbmZpZ3VyYXRpb25Db25zdGFudHMuQ1VSUkVOVF9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25DdXJyZW50KCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VmVyc2lvbigpLmVxdWFscyhDb25maWd1cmF0aW9uQ29uc3RhbnRzLkNVUlJFTlRfVkVSU0lPTik7Ci0JfQotCi0JLy8gSVJlc291cmNlIGNvdWxkIGJlIGFuIElQcm9qZWN0IG9yIGFuIElXb3Jrc3BhY2VSb290Ci0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIF9yZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgb24gdGhpcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh2YWxpZGF0b3JDbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCXJldHVybiBpc0VuYWJsZWQodm1kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgb24gdGhpcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHZtZCA9PSBudWxsKXJldHVybiBmYWxzZTsKLQotCQlCb29sZWFuIHZhbHVlID0gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXQodm1kKTsKLQkJaWYgKHZhbHVlID09IG51bGwpcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmNlIGFsbCBvZiB0aGUgZmllbGRzIGhhdmUgYmVlbiB1cGRhdGVkIG9uIHRoaXMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gaW5zdGFuY2UsIHRoaXMKLQkgKiBwcmVmZXJlbmNlIHNob3VsZCBiZSBzdG9yZWQgYmFjayBvbiB0aGUgSVJlc291cmNlIGZvciBsYXRlciB1c2UuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkCi0JICogbWFudWFsbHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9uY2UgdGhlIGZpZWxkcyBvZiB0aGlzIHR5cGUgaGF2ZSBiZWVuIHVwZGF0ZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcGFzc2l2YXRlKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGdldFJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG51bGwsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfTlVMTFNBVkUpKTsKLQkJCX0KLQkJCWdldFJlc291cmNlKCkuc2V0U2Vzc2lvblByb3BlcnR5KENvbmZpZ3VyYXRpb25Db25zdGFudHMuVVNFUl9QUkVGRVJFTkNFLCB0aGlzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19TQVZFLCBuZXcgU3RyaW5nW117Z2V0UmVzb3VyY2UoKS5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNldCB0aGUgdmFsdWVzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXNldFRvRGVmYXVsdCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gY29udmVydFRvQm9vbGVhbihib29sZWFuIHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgPT0gdHJ1ZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGNvbnZlcnRUb0ludGVnZXIoaW50IHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlcih2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udmVydFRvQm9vbGVhbihTdHJpbmcgdmFsdWUpIHsKLQkJQm9vbGVhbiBiID0gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKTsKLQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0VG9JbnQoU3RyaW5nIHZhbHVlKSB7Ci0JCUludGVnZXIgdCA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0JCXJldHVybiB0LmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGNvbnZlcnRUb0FycmF5KENvbGxlY3Rpb248VmFsaWRhdG9yTWV0YURhdGE+IGMpIHsKLQkJaW50IGxlbmd0aCA9IChjID09IG51bGwpID8gMCA6IGMuc2l6ZSgpOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsZW5ndGhdOwotCQlpZiAobGVuZ3RoID09IDApcmV0dXJuIHJlc3VsdDsKLQotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGMpcmVzdWx0W2NvdW50KytdID0gdm1kOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGNvbnZlcnRUb0FycmF5KE9iamVjdFtdIGMpIHsKLQkJaW50IGxlbmd0aCA9IChjID09IG51bGwpID8gMCA6IGMubGVuZ3RoOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsZW5ndGhdOwotCQlpZiAobGVuZ3RoID09IDApcmV0dXJuIHJlc3VsdDsKLQotCQlTeXN0ZW0uYXJyYXljb3B5KGMsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGUgdmFsdWVzIG9mIHRoZXNlIGZpZWxkcyBiZWZvcmUgdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlIGlzIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3RvcmUobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgdmFsdWVzIG9mIHRoZXNlIGZpZWxkcyBiZWZvcmUgdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlIGlzIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZShCb29sZWFuIHBlcnNpc3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWYgPSBQcmVmZXJlbmNlc1dyYXBwZXIuZ2V0UHJlZmVyZW5jZXMobnVsbCwgcGVyc2lzdCk7Ci0JCXByZWYucHV0KFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVzZXJQcmVmZXJlbmNlLCBzZXJpYWxpemUoKSk7Ci0JCXByZWYucHV0KFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVzZXJNYW51YWxQcmVmZXJlbmNlLCBzZXJpYWxpemVNYW51YWxTZXR0aW5nKCkpOwotCQlwcmVmLnB1dChWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5Vc2VyQnVpbGRQcmVmZXJlbmNlLCBzZXJpYWxpemVCdWlsZFNldHRpbmcoKSk7Ci0JCXByZWYucHV0KFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkRlbGVnYXRlc1ByZWZlcmVuY2UsIHNlcmlhbGl6ZURlbGVnYXRlc1NldHRpbmcoKSk7Ci0JCXRyeSB7Ci0JCQlwcmVmLmZsdXNoKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKXsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCBhbmQgc3RvcmUgdGhlIHZlcnNpb24gbnVtYmVyLCBidXQgbm90aGluZyBlbHNlLiBUaGUgdmVyc2lvbiBpc24ndCBhIHByZWZlcmVuY2UsIGJ1dCBpdCdzCi0JICogc3RvcmVkIGFuZCBsb2FkZWQgYXMgaWYgaXQgaXMuIEJlY2F1c2UgdGhlIGxvYWQgbWVjaGFuaXNtIGlzIGRpZmZlcmVudCBiZXR3ZWVuIGFuIElQcm9qZWN0Ci0JICogYW5kIHRoZSBJV29ya3NwYWNlUm9vdCwga2VlcCB0aGUgbG9hZCBtZWNoYW5pc20gaW5zaWRlIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbgotCSAqIGltcGxlbWVudGF0aW9uLCBidXQgaW5pdGlhbGl6ZSBvbmx5IHRoZSBtaW5pbXVtIGF0IGZpcnN0LiBBZnRlciB0aGUgcHJvamVjdCBoYXMgYmVlbgotCSAqIG1pZ3JhdGVkLCBsb2FkIHRoZSBvdGhlciBmaWVsZHMgKGxvYWRpbmcgdGhlIG90aGVyIGZpZWxkcyBiZWZvcmUgdGhlIG1pZ3JhdGlvbiBtYXkgb3ZlcndyaXRlCi0JICogdGhlIHZhbHVlcyBvZiB0aG9zZSBmaWVsZHMpLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGxvYWRWZXJzaW9uKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAoZ2V0UmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihudWxsLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX05VTExSRVRSSUVWRSkpOwotCQl9Ci0KLQkJSU1hcmtlcltdIG1hcmtlciA9IGdldE1hcmtlcigpOwotCQlTdHJpbmcgdmVyc2lvbiA9IG51bGw7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJLy8gZWl0aGVyIGEgbmV3IHdvcmtzcGFjZSBvciBhbHJlYWR5IG1pZ3JhdGVkOyBwcm9jZWVkIGFzIG5vcm1hbAotCQkJdmVyc2lvbiA9IGxvYWRWZXJzaW9uKGdldFJlc291cmNlKCkpOwotCQl9IGVsc2UgewotCQkJLy8gbWlncmF0ZQotCQkJdmVyc2lvbiA9IGxvYWRWZXJzaW9uKG1hcmtlcik7Ci0JCX0KLQkJc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGxvYWRWZXJzaW9uKElNYXJrZXJbXSBtYXJrZXIpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSBnZXRWYWx1ZShtYXJrZXJbMF0sIENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkVSU0lPTik7Ci0JCWlmICh2ZXJzaW9uID09IG51bGwpCXJldHVybiBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT040XzAzOwotCi0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbG9hZFZlcnNpb24oSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBpbiBvbmUgb2YgdHdvIHNpdHVhdGlvbnM6Ci0JCQkvLyAgICAxLiBUaGlzIGlzIGEgbmV3IHdvcmtzcGFjZSBhbmQgbm8gcHJlZmVyZW5jZXMgZXhpc3QuCi0JCQkvLyAgICAyLiBUaGlzIGlzIGEgbWlncmF0ZWQgd29ya3NwYWNlIGFuZCB0aGUgb2xkIHByZWZlcmVuY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYXMKLQkJCS8vIHBlcnNpc3RlbnQgcHJvcGVydGllcy4KLQkJCVN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uID0gcmVzb3VyY2UuZ2V0UGVyc2lzdGVudFByb3BlcnR5KENvbmZpZ3VyYXRpb25Db25zdGFudHMuVVNFUl9QUkVGRVJFTkNFKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQkJCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCQl2ZXJzaW9uID0gZ2V0VmVyc2lvbkRlZmF1bHQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHZlcnNpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04pOwotCQkJCWlmICh2ZXJzaW9uSW5kZXggIT0gLTEpCi0JCQkJCXZlcnNpb24gPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyh2ZXJzaW9uSW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04ubGVuZ3RoKCkpOwotCQkJfQotCi0JCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFZlcnNpb25EZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCXJldHVybiB2ZXJzaW9uOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JFVFJJRVZFLCBuZXcgU3RyaW5nW117Z2V0UmVzb3VyY2UoKS5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzIHdoZW4gdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlIGlzIG9wZW5lZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBsb2FkKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGdldFJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG51bGwsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfTlVMTFJFVFJJRVZFKSk7Ci0JCQl9Ci0KLQkJCUlNYXJrZXJbXSBtYXJrZXIgPSBnZXRNYXJrZXIoKTsKLQkJCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJCS8vIGVpdGhlciBhIG5ldyB3b3Jrc3BhY2Ugb3IgYWxyZWFkeSBtaWdyYXRlZDsgcHJvY2VlZCBhcyBub3JtYWwKLQkJCQlsb2FkUHJlZmVyZW5jZSgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBtaWdyYXRlCi0JCQkJbG9hZChtYXJrZXIpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgZXhjOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gKGdldFJlc291cmNlKCkgPT0gbnVsbCkgPyAibnVsbCIgOiBnZXRSZXNvdXJjZSgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JFVFJJRVZFLCBuZXcgU3RyaW5nW117cmVzb3VyY2VOYW1lfSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJTWFya2VyIHRoYXQgdXNlZCB0byBzdG9yZSB0aGUgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiwgaWYgdGhlIG1hcmtlciBleGlzdHMuIChJZgotCSAqIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gaXQncyBhbHJlYWR5IGJlZW4gbWlncmF0ZWQuKQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJTWFya2VyW10gZ2V0TWFya2VyKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2FkKElNYXJrZXJbXSBtYXJrZXIpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHJpYk5hbWUpIHsKLQkJaWYgKG1hcmtlciA9PSBudWxsKXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyaWJOYW1lKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VmFsdWUoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBhdHRyaWJOYW1lLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZ2V0VmFsdWUobWFya2VyLCBhdHRyaWJOYW1lKTsKLQkJaWYgKGJvb2wgPT0gbnVsbClyZXR1cm4gZGVmYXVsdFZhbHVlOwotCi0JCXJldHVybiBib29sLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VmFsdWUoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBhdHRyaWJOYW1lLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCUludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKSBnZXRWYWx1ZShtYXJrZXIsIGF0dHJpYk5hbWUpOwotCQlpZiAoaW50ZWdlciA9PSBudWxsKXJldHVybiBkZWZhdWx0VmFsdWU7Ci0KLQkJcmV0dXJuIGludGVnZXIuaW50VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKElNYXJrZXIgbWFya2VyLCBTdHJpbmcgYXR0cmliTmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgc3RyaW5nID0gKFN0cmluZykgZ2V0VmFsdWUobWFya2VyLCBhdHRyaWJOYW1lKTsKLQkJaWYgKHN0cmluZyA9PSBudWxsKXJldHVybiBkZWZhdWx0VmFsdWU7Ci0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkUHJlZmVyZW5jZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgaW4gb25lIG9mIHR3byBzaXR1YXRpb25zOgotCQkvLyAxLiBUaGlzIGlzIGEgbmV3IHdvcmtzcGFjZSBhbmQgbm8gcHJlZmVyZW5jZXMgZXhpc3QuCi0JCS8vIDIuIFRoaXMgaXMgYSBtaWdyYXRlZCB3b3Jrc3BhY2UgYW5kIHRoZSBvbGQgcHJlZmVyZW5jZXMgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhcwotCQkvLyBwZXJzaXN0ZW50IHByb3BlcnRpZXMuCi0JCVByZWZlcmVuY2VzV3JhcHBlciBwcmVmcyA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhudWxsLCBudWxsKTsKLQkJZGVzZXJpYWxpemVBbGxQcmVmcyhwcmVmcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByZWZzCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlc2VyaWFsaXplQWxsUHJlZnMoUHJlZmVyZW5jZXNXcmFwcGVyIHByZWZzKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdG9yZWRDb25maWcgPSBwcmVmcy5nZXQoVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uVXNlclByZWZlcmVuY2UsIG51bGwpOwotCQlkZXNlcmlhbGl6ZShzdG9yZWRDb25maWcpOwotCQlTdHJpbmcgc3RvcmVkTWFudWFsQ29uZmlnID0gcHJlZnMuZ2V0KFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVzZXJNYW51YWxQcmVmZXJlbmNlLCBudWxsKTsKLQkJZGVzZXJpYWxpemVNYW51YWwoc3RvcmVkTWFudWFsQ29uZmlnKTsKLQkJU3RyaW5nIHN0b3JlZEJ1aWxkQ29uZmlnID0gcHJlZnMuZ2V0KFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVzZXJCdWlsZFByZWZlcmVuY2UsIG51bGwpOwotCQlkZXNlcmlhbGl6ZUJ1aWxkKHN0b3JlZEJ1aWxkQ29uZmlnKTsKLQkJU3RyaW5nIHN0b3JlZERlbGVnYXRlc0NvbmZpZ3VyYXRpb24gPSBwcmVmcy5nZXQoVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uRGVsZWdhdGVzUHJlZmVyZW5jZSwgbnVsbCk7Ci0JCWRlc2VyaWFsaXplRGVsZWdhdGVzKHN0b3JlZERlbGVnYXRlc0NvbmZpZ3VyYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gKFByZWZlcmVuY2VzKSBldmVudC5nZXRTb3VyY2UoKTsKLQkJaWYgKHByZWZzICE9IG51bGwgJiYgIWV2ZW50LmdldE9sZFZhbHVlKCkuZXF1YWxzKGV2ZW50LmdldE5ld1ZhbHVlKCkpKSB7Ci0JCQl0cnkgewotCQkJCWRlc2VyaWFsaXplQWxsUHJlZnMoZXZlbnQpOwotCQkJCXBhc3NpdmF0ZSgpOwotCQkJIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkZXNlcmlhbGl6ZUFsbFByZWZzKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0b3JlZENvbmZpZyA9IChTdHJpbmcpZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYoIGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVzZXJQcmVmZXJlbmNlKSApewotCQkJZGVzZXJpYWxpemUoc3RvcmVkQ29uZmlnKTsKLQkJfWVsc2UgaWYoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uVXNlck1hbnVhbFByZWZlcmVuY2UpKXsKLQkJCWRlc2VyaWFsaXplTWFudWFsKHN0b3JlZENvbmZpZyk7Ci0JCX1lbHNlIGlmKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKFZhbGlkYXRpb25Db25maWd1cmF0aW9uLlVzZXJCdWlsZFByZWZlcmVuY2UpKXsKLQkJCWRlc2VyaWFsaXplQnVpbGQoc3RvcmVkQ29uZmlnKTsKLQkJfWVsc2UgaWYoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uRGVsZWdhdGVzUHJlZmVyZW5jZSkpewotCQkJZGVzZXJpYWxpemVEZWxlZ2F0ZXMoc3RvcmVkQ29uZmlnKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZXNlcmlhbGl6ZUJ1aWxkKFN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKERlZmF1bHRWYWx1ZSkpIHsKLQkJCS8vIEFzc3VtZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGhhcyBuZXZlciBiZWVuIHNldCAobmV3IHdvcmtzcGFjZSkuCi0JCQlyZXNldFRvRGVmYXVsdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBidWlsZFZhbGlkYXRpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfQlVJTERfVkFMSURBVE9SUyk7Ci0KLQkJU3RyaW5nIG1hbnVhbFZhbGlkYXRpb24gPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyhidWlsZFZhbGlkYXRpb25JbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9CVUlMRF9WQUxJREFUT1JTLmxlbmd0aCgpLHN0b3JlZENvbmZpZ3VyYXRpb24ubGVuZ3RoKCkpOwotCQlzZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkobWFudWFsVmFsaWRhdGlvbikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlc2VyaWFsaXplTWFudWFsKFN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKERlZmF1bHRWYWx1ZSkpIHsKLQkJCS8vIEFzc3VtZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGhhcyBuZXZlciBiZWVuIHNldCAobmV3IHdvcmtzcGFjZSkuCi0JCQlyZXNldFRvRGVmYXVsdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBtYW51YWxWYWxpZGF0aW9uSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTKTsKLQotCQlTdHJpbmcgbWFudWFsVmFsaWRhdGlvbiA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKG1hbnVhbFZhbGlkYXRpb25JbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9NQU5VQUxfVkFMSURBVE9SUy5sZW5ndGgoKSxzdG9yZWRDb25maWd1cmF0aW9uLmxlbmd0aCgpKTsKLQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0U3RyaW5nQXNFbmFibGVkRWxlbWVudHNBcnJheShtYW51YWxWYWxpZGF0aW9uKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVzZXJpYWxpemVEZWxlZ2F0ZXMoU3RyaW5nIHN0b3JlZENvbmZpZ3VyYXRpb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQotICAgIGlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKERlZmF1bHRWYWx1ZSkpIHsKLQkgICAgLy8gQXNzdW1lIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIG5ldmVyIGJlZW4gc2V0IChuZXcgd29ya3NwYWNlKS4KLQkgICAgcmVzZXRUb0RlZmF1bHQoKTsKLQkgICAgcmV0dXJuOwotCSAgfQotCi0JICBpbnQgZGVsZWdhdGVzSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURV9WQUxJREFUT1JTKTsKLQotCSAgU3RyaW5nIGRlbGVnYXRlcyA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKGRlbGVnYXRlc0luZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURV9WQUxJREFUT1JTLmxlbmd0aCgpLHN0b3JlZENvbmZpZ3VyYXRpb24ubGVuZ3RoKCkpOwotCi0JICBpZiAoZGVsZWdhdGVzID09IG51bGwpIHsKLQkgICAgcmV0dXJuOwotCSAgfQotCi0JICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkZWxlZ2F0ZXMsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRUxFTUVOVF9TRVBBUkFUT1IpOwotCSAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkgICAgU3RyaW5nIGRlbGVnYXRlQ29uZmlndXJhdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkgICAgaW50IHNlcGFyYXRvckluZGV4ID0gZGVsZWdhdGVDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURVNfU0VQQVJBVE9SKTsKLQkgICAgU3RyaW5nIHRhcmdldElEID0gZGVsZWdhdGVDb25maWd1cmF0aW9uLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7Ci0JICAgIFN0cmluZyBkZWxlZ2F0ZUlEID0gZGVsZWdhdGVDb25maWd1cmF0aW9uLnN1YnN0cmluZyhzZXBhcmF0b3JJbmRleCArIDEpOwotICAgICAgX2RlbGVnYXRlc0J5VGFyZ2V0LnB1dCh0YXJnZXRJRCwgZGVsZWdhdGVJRCk7Ci0JICB9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weVRvKFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHVwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXVwLnNldFZlcnNpb24oZ2V0VmVyc2lvbigpKTsKLQkJdXAuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JzKCkpOwotCQl1cC5zZXREaXNhYmxlQWxsVmFsaWRhdGlvbihpc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkpOwotCQl1cC5zZXRFbmFibGVkVmFsaWRhdG9ycyhnZXRFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJdXAuc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXVwLnNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKTsKLSAgICB1cC5zZXREZWxlZ2F0aW5nVmFsaWRhdG9ycyhnZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5IGlzIHRoZSBpZCBvZiB0aGUgcGxhY2UgaG9sZGVyIHZhbGlkYXRvciwgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgaWQgb2YgdmFsaWRhdG9yCi0JICogdGhhdCB3aWxsIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24uIAotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldERlbGVnYXRpbmdWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gX2RlbGVnYXRlc0J5VGFyZ2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlbGVnYXRpbmdWYWxpZGF0b3JzKE1hcDxTdHJpbmcsIFN0cmluZz4gc291cmNlKQotCXsKLQkJLy8gSXQgaXMgc2FmZSB0byBjb3B5IHRoaXMgbWFwIGFzIGl0IGNvbnRhaW5zIG9ubHkgaW1tdXRhYmxlIHN0cmluZ3MuCi0JCV9kZWxlZ2F0ZXNCeVRhcmdldC5wdXRBbGwoc291cmNlKTsKLQl9Ci0KLSAgLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBoYXZlIG5vdCBjaGFuZ2VkIHNpbmNlIHRoaXMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gd2FzCi0JICogY29uc3RydWN0ZWQsIGZhbHNlIG90aGVyd2lzZS4gKFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBmb3IgdGhlIFByb3BlcnRpZXMgYW5kIFByZWZlcmVuY2UgcGFnZXM7Ci0JICogaWYgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyBoYXNuJ3QgY2hhbmdlZCwgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgdGFzayBsaXN0OwotCSAqIHVwZGF0aW5nIHRoZSB0YXNrIGxpc3QgaXMgYSBjb3N0bHkgb3BlcmF0aW9uLikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNFbmFibGVkVmFsaWRhdG9yc0NoYW5nZWQoVmFsaWRhdG9yTWV0YURhdGFbXSBvbGRFbmFibGVkVm1kKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8vIEZpcnN0IGNoZWNrIHRoZSBvYnZpb3VzOiBpcyBldmVyeSBlbmFibGVkIHZhbGlkYXRvciBzdGlsbCBlbmFibGVkLCBhbmQgaXMKLQkJLy8gdGhlIG51bWJlciBvZiBlbmFibGVkIHZhbGlkYXRvcnMgdGhlIHNhbWUgYXMgaXQgd2FzIGJlZm9yZT8gSWYgbm90LCByZXR1cm4gdHJ1ZS4KLQkJaWYgKG9sZEVuYWJsZWRWbWQgPT0gbnVsbCkgewotCQkJLy8gU29tZXRoaW5nJ3MgZ29uZSB3cm9uZy4uLgotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEVuYWJsZWRWbWQubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IG9sZEVuYWJsZWRWbWRbaV07Ci0JCQlpZiAoIWlzRW5hYmxlZCh2bWQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBFdmVyeXRoaW5nIHRoYXQgd2FzIGVuYWJsZWQgaXMgc3RpbGwgZW5hYmxlZDsgaGF2ZSBhbnkgYWRkaXRpb25hbAotCQkvLyB2YWxpZGF0b3JzIGJlZW4gZW5hYmxlZD8KLQkJaWYgKG51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKSAhPSBvbGRFbmFibGVkVm1kLmxlbmd0aCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotICAKLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIGxpc3Qgb2YgZGVsZWdhdGUgdmFsaWRhdG9ycy4KLSAgICogQHBhcmFtIG9sZERlbGVnYXRlcyBhIE1hcCB3aXRoIHRoZSBvbGQgZGVsZWdhdGVzIElEIGJ5IHRhcmdldCBJRC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGhhcyBiZWVuIGEgY2hhbmdlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGF2ZURlbGVnYXRlc0NoYW5nZWQoTWFwPFN0cmluZywgU3RyaW5nPiBvbGREZWxlZ2F0ZXMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAKLSAgICBpZiAob2xkRGVsZWdhdGVzID09IG51bGwpcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgZm9yIChTdHJpbmcgdGFyZ2V0SUQgOiBvbGREZWxlZ2F0ZXMua2V5U2V0KCkpIHsKLSAgICAgIFN0cmluZyBvbGREZWxlZ2F0ZUlEID0gb2xkRGVsZWdhdGVzLmdldCh0YXJnZXRJRCk7Ci0gICAgICBTdHJpbmcgbmV3RGVsZWdhdGVJRCA9IF9kZWxlZ2F0ZXNCeVRhcmdldC5nZXQodGFyZ2V0SUQpOwotICAgICAgCi0gICAgICBpZiAob2xkRGVsZWdhdGVJRCA9PSBudWxsIHx8IG5ld0RlbGVnYXRlSUQgPT0gbnVsbClyZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICBpZiAoIW5ld0RlbGVnYXRlSUQuZXF1YWxzKG9sZERlbGVnYXRlSUQpKXJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBpZiAob2xkRGVsZWdhdGVzLnNpemUoKSAhPSBfZGVsZWdhdGVzQnlUYXJnZXQuc2l6ZSgpKXJldHVybiB0cnVlOwotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJpYWxpemUoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcpOwotCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGlzRGlzYWJsZUFsbFZhbGlkYXRpb24oKSkpOwotCQlidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkVSU0lPTik7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0VmVyc2lvbigpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcmlhbGl6ZU1hbnVhbFNldHRpbmcoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRFbmFibGVkRWxlbWVudHNBc1N0cmluZyhnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJpYWxpemVCdWlsZFNldHRpbmcoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX0JVSUxEX1ZBTElEQVRPUlMpOwotCQlidWZmZXIuYXBwZW5kKGdldEVuYWJsZWRFbGVtZW50c0FzU3RyaW5nKGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgc2VyaWFsaXplRGVsZWdhdGVzU2V0dGluZygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURV9WQUxJREFUT1JTKTsKLSAgICBidWZmZXIuYXBwZW5kKGdldERlbGVnYXRlc0FzU3RyaW5nKGdldFZhbGlkYXRvck1ldGFEYXRhKCkpKTsKLSAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgYSBTdHJpbmcgd2hpY2ggY29udGFpbnMgcGFpcnMgb2YgdGFyZ2V0SUQ9ZGVsZWdhdGVJRCBzZXBhcmF0ZWQgYnkgYSBzZW1pY29sb24uCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JNZXRhRGF0YSBhIE1hcCB3aXRoIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCB2YWxpZGF0b3JzLgotICAgKiBAcmV0dXJuIGEgU3RyaW5nLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVsZWdhdGVzQXNTdHJpbmcoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBCb29sZWFuPiB2YWxpZGF0b3JNZXRhRGF0YSkgewotICAgIAotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2YWxpZGF0b3JNZXRhRGF0YS5rZXlTZXQoKSkgeyAgICAKLSAgICAgIFN0cmluZyB0YXJnZXRJRCA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0gICAgICBTdHJpbmcgZGVsZWdhdGVJRCA9IGdldERlbGVnYXRlVW5pcXVlTmFtZSh2bWQpOwotICAgICAgCi0gICAgICBpZiAoZGVsZWdhdGVJRCA9PSBudWxsKWNvbnRpbnVlOwotCi0gICAgICAvLyBXcml0ZSBvdXQgcGFpcnMgdGFyZ2V0SUQ9ZGVsZWdhdGVJRAotCi0gICAgICBidWZmZXIuYXBwZW5kKHRhcmdldElEKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURVNfU0VQQVJBVE9SKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoZGVsZWdhdGVJRCk7Ci0gICAgICBidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRUxFTUVOVF9TRVBBUkFUT1IpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgZGVsZWdhdGUncyBJRCBvZiB0aGUgdmFsaWRhdG9yIGRlbGVnYXRlIGNvbmZpZ3VyZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIGZvciAKLSAgICogYSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvci4gVGhhdCBpcyBhbnN3ZXIgdGhlIGlkIG9mIHZhbGlkYXRvciB0aGF0IGlzIGdvaW5nIHRvIGRvIHRoZSByZWFsIHdvcmsuCi0gICAqIAotICAgKiBAcGFyYW0gdm1kIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIG1ldGEgZGF0YS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yIGRlbGVnYXRlLCBudWxsIGlmIHRoZXJlIGlzbid0IG9uZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVsZWdhdGVVbmlxdWVOYW1lKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotICAgIFN0cmluZyB0YXJnZXRJRCA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7ICAgIAotICAgIHJldHVybiBfZGVsZWdhdGVzQnlUYXJnZXQuZ2V0KHRhcmdldElEKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBkZWxlZ2F0ZSdzIElEIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgY29uZmlndXJlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZm9yIAotICAgKiBhIGdpdmVuIGRlbGVnYXRpbmcgdmFsaWRhdG9yLiBUaGF0IGlzIGFuc3dlciB0aGUgaWQgb2YgdmFsaWRhdG9yIHRoYXQgaXMgZ29pbmcgdG8gZG8gdGhlIHJlYWwgd29yay4KLSAgICogCi0gICAqIEBwYXJhbSB0YXJnZXRJZCB0aGUgaWQgb2YgdGhlIHRhcmdldCAob3IgcGxhY2UgaG9sZGVyKSB2YWxpZGF0b3IuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgaWQgb2YgdGhlIHZhbGlkYXRvciBkZWxlZ2F0ZSwgbnVsbCBpZiB0aGVyZSBpc24ndCBvbmUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlbGVnYXRlRm9yVGFyZ2V0KFN0cmluZyB0YXJnZXRJZCl7Ci0JICByZXR1cm4gX2RlbGVnYXRlc0J5VGFyZ2V0LmdldCh0YXJnZXRJZCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVsZWdhdGUncyBJRCBvZiB0aGUgdmFsaWRhdG9yIGRlbGVnYXRlIHRvIGJlIHVzZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIGZvciB0aGUKLSAgICogZ2l2ZW4gZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdm1kIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIG1ldGFkYXRhLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gZGVsZWdhdGVJRCBhIFN0cmluZyB3aXRoIHRoZSB1bmlxdWUgbmFtZSAoSUQpIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZVVuaXF1ZU5hbWUoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgZGVsZWdhdGVJRCkgewotICAgIFN0cmluZyB0YXJnZXRJRCA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7ICAgIAotICAgIF9kZWxlZ2F0ZXNCeVRhcmdldC5wdXQodGFyZ2V0SUQsIGRlbGVnYXRlSUQpOwotICB9Ci0KLSAgLyoqCi0JICogRGVzZXJpYWxpemUgZXZlcnl0aGluZyBleGNlcHQgdGhlIHZlcnNpb24gbnVtYmVyOyB0aGUgdmVyc2lvbiBpcyBkZXNlcmlhbGl6ZWQgZmlyc3QsIGluIHRoZQotCSAqIGxvYWRWZXJzaW9uKCkgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlc2VyaWFsaXplKFN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKERlZmF1bHRWYWx1ZSkpIHsKLQkJCS8vIEFzc3VtZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGhhcyBuZXZlciBiZWVuIHNldCAobmV3IHdvcmtzcGFjZSkuCi0JCQlyZXNldFRvRGVmYXVsdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRElTQUJMRV9BTExfVkFMSURBVElPTl9TRVRUSU5HKTsKLQkJaW50IHZlcnNpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04pOwotCQlpZihkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGRpc2FibGVBbGxWYWxpZGF0aW9uID0gc3RvcmVkQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcoZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRElTQUJMRV9BTExfVkFMSURBVElPTl9TRVRUSU5HLmxlbmd0aCgpLHZlcnNpb25JbmRleCk7Ci0JCQkJc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oQm9vbGVhbi52YWx1ZU9mKGRpc2FibGVBbGxWYWxpZGF0aW9uKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkJc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oZmFsc2UpOwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXNhYmxlVmFsaWRhdGlvbkRlZmF1bHQoKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRElTQUJMRV9WQUxJREFUSU9OX1NFVFRJTkc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRWYWxpZGF0b3JzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVGQVVMVF9FTkFCTEVEX1ZBTElEQVRPUlM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXNEZWZhdWx0KCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUZBVUxUX01BWE5VTU1FU1NBR0VTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZlcnNpb25EZWZhdWx0KCkgewotCQkvLyBJZiB0aGUgdmVyc2lvbiBjYW4ndCBiZSByZXRyaWV2ZWQsIGFzc3VtZSB0aGF0IGl0J3MgYSBuZXcgd29ya3NwYWNlLiAoQSBudWxsIHZlcnNpb24KLQkJLy8gY291bGQgYWxzbyBtZWFuIGEgNC4wMyB3b3Jrc3BhY2UsIGJ1dCB0aGF0J3MgdGFrZW4gY2FyZSBvZiBpbiB0aGUgbG9hZChJTWFya2VyW10pCi0JCS8vIG1ldGhvZC4pCi0JCXJldHVybiBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkNVUlJFTlRfVkVSU0lPTjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYW51YWxFbmFibGVkKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlpZiAodm1kID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlCb29sZWFuIHZhbHVlID0gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5nZXQodm1kKTsKLQkJaWYgKHZhbHVlID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCdWlsZEVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCWlmICh2bWQgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCUJvb2xlYW4gdmFsdWUgPSBnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkuZ2V0KHZtZCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgaW50IG51bWJlck9mTWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpLmxlbmd0aDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZW5hYmxlU2luZ2xlVmFsaWRhdG9yKFZhbGlkYXRvck1ldGFEYXRhICB2bWQpewotCQlnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLnB1dCh2bWQsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGRpc2FibGVTaW5nbGVWYWxpZGF0b3IoVmFsaWRhdG9yTWV0YURhdGEgIHZtZCl7Ci0JCWdldFZhbGlkYXRvck1ldGFEYXRhKCkucHV0KHZtZCwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVuYWJsZVNpbmdsZU1hbnVhbFZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSAgdm1kKXsKLQkJZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQodm1kLCBCb29sZWFuLlRSVUUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNhYmxlU2luZ2xlTWFudWFsVmFsaWRhdG9yKFZhbGlkYXRvck1ldGFEYXRhICB2bWQpewotCQlnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dCh2bWQsIEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGVuYWJsZVNpbmdsZUJ1aWxkVmFsaWRhdG9yKFZhbGlkYXRvck1ldGFEYXRhICB2bWQpewotCQlnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkucHV0KHZtZCwgQm9vbGVhbi5UUlVFKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZGlzYWJsZVNpbmdsZUJ1aWxkVmFsaWRhdG9yKFZhbGlkYXRvck1ldGFEYXRhICB2bWQpewotCQlnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkucHV0KHZtZCwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGRlbGVnYXRlIHZhbGlkYXRvciBkZXNjcmlwdG9yIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgY29uZmlndXJlZCAKLSAgICogZm9yIHRoZSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvciBpbiB0aGUgY29udGV4dCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uIAotICAgKiBAcGFyYW0gdm1kIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIG1ldGEgZGF0YS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBhIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGRlbGVnYXRpbmcgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBnZXREZWxlZ2F0ZURlc2NyaXB0b3IoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgIFN0cmluZyB0YXJnZXRJRCA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0gICAgU3RyaW5nIGRlbGVnYXRlSUQgPSBnZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kKTsKLSAgCi0gICAgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlc2NyaXB0b3IodGFyZ2V0SUQsIGRlbGVnYXRlSUQpOyAKLSAgICByZXR1cm4gZGVzY3JpcHRvcjsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmEyZWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLlZhbGlkYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25GYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFZhbGlkYXRpb25GYWN0b3J5IHsKLQlzdGF0aWMgVmFsaWRhdGlvbkZhY3RvcnkgaW5zdCA9IG51bGw7Ci0JCi0JcHVibGljIFZhbGlkYXRpb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZihpbnN0ID09IG51bGwpCi0JCQlpbnN0ID0gbmV3IFZhbGlkYXRpb25GYWN0b3J5SW1wbCgpOwotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQotCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JVbmlxdWVJZCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQlyZXR1cm4gcmVhZGVyLmdldFZhbGlkYXRvcih2YWxpZGF0b3JVbmlxdWVJZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2NjA0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvblRhZ05hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklSdWxlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgaXMgYSBzaW5nbGV0b24gd2hvIHJlYWRzIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIFZhbGlkYXRvciBleHRlbnNpb25zLgotICogVGhlIHJlYWQgaXMgZG9uZSBvbmNlIChpbiB0aGUgY29uc3RydWN0b3IpLCBhbmQgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyBjYW4gYmUgYWNjZXNzZWQgYnkgY2FsbGluZwotICogImdldFZhbGlkYXRvck1ldGFEYXRhKFN0cmluZykiIG9uIHRoaXMgY2xhc3MuIFRoZSByZWFkIGlzIHRyaWdnZXJlZCBieSBhIGNhbGwgZnJvbQotICogVmFsaWRhdG9yTWFuYWdlcidzIGxvYWRWYWxpZGF0b3JNZXRhRGF0YShJUHJvamVjdCkgbWV0aG9kLiBWYWxpZGF0b3JNYW5hZ2VyIGRlbGVnYXRlcyB0aGUgbG9hZAotICogY2FsbCB0byB0aGlzIGNsYXNzLCBhbmQgaWYgdGhpcyBjbGFzcyBpcyBudWxsLCB0aGUgc2luZ2xldG9uIGlzIG5ldydlZCB1cCwgYW5kIHRoZSByZWdpc3RyeSBpcwotICogcmVhZC4KLSAqIDxwPgotICogTm8gVmFsaWRhdG9yIHNob3VsZCBuZWVkIHRvIGtub3cgYWJvdXQgdGhpcyBjbGFzcy4gVGhlIG9ubHkgY2xhc3Mgd2hpY2ggc2hvdWxkIGNhbGwKLSAqIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBpcyBWYWxpZGF0b3JNYW5hZ2VyLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgVmFsaWRhdG9yIGl0c2VsZiBpcyBpbml0aWFsaXplZCBpbiB0aGUgImluaXRpYWxpemVWYWxpZGF0b3IiIG1ldGhvZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBpbXBsZW1lbnRzIFJlZ2lzdHJ5Q29uc3RhbnRzIHsKLQkKLQkgLyogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLnZhbGlkYXRvciIgaWQ9IkVKQlZhbGlkYXRvciIgbmFtZT0iRUpCCi0JCSAqIFZhbGlkYXRvciI+IDx2YWxpZGF0b3I+PHByb2plY3ROYXR1cmUgaWQ9ImNvbS5pYm0uZXRvb2xzLmoyZWUuRUpCTmF0dXJlIiBpbmNsdWRlPSJmYWxzZSIvPgotCQkgKiA8ZmlsdGVyIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgbmFtZUZpbHRlciA9ICJlamItamFyLnhtbCIvPiA8ZmlsdGVyCi0JCSAqIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgbmFtZUZpbHRlciA9ICIqLmphdmEiLz4gPGhlbHBlcgotCQkgKiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLmVqYi53b3JrYmVuY2hpbXBsLkVKQkhlbHBlciIvPiA8cnVuCi0JCSAqIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLmNvcmUuZWpiLkVKQlZhbGlkYXRvciIgaW5jcmVtZW50YWw9ImZhbHNlIiBlbmFibGVkPSJmYWxzZSIKLQkJICogcGFzcz0iZmFzdCxmdWxsIiBhc3luYz0iZmFsc2UiLz4gPGFnZ3JlZ2F0ZVZhbGlkYXRvciBjbGFzcz0ibXkuYWdncmVnYXRlLlZhbGlkYXRvckNsYXNzIi8+Ci0JCSAqIDxtaWdyYXRlPjx2YWxpZGF0b3IgZnJvbT0ib2xkLmNsYXNzLm5hbWUiIHRvPSJuZXcuY2xhc3MubmFtZSIvPiA8L21pZ3JhdGU+IDwvdmFsaWRhdG9yPgotCQkgKiA8L2V4dGVuc2lvbj4KLQkJICovCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIF9pbnN0ID0gbmV3IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcigpOwotCQotCS8qKiBsaXN0IG9mIGFsbCB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQsIHdpdGggdGhlaXIgYXNzb2NpYXRlZCBWYWxpZGF0b3JNZXRhRGF0YSwgaW5kZXhlZCBieSBwcm9qZWN0IG5hdHVyZSBpZCAqLwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxTZXQ8VmFsaWRhdG9yTWV0YURhdGE+PiBfdmFsaWRhdG9yczsKLQkKLQkvLyBsaXN0IG9mIGFsbCB2YWxpZGF0b3JzLCBpbmRleGVkIGJ5IHZhbGlkYXRvciBjbGFzcyBuYW1lLAotCS8vIHdpdGggdGhlIHZhbGlkYXRvcidzIFZhbGlkYXRvck1ldGFEYXRhIGFzIHRoZSB2YWx1ZS4KLQkvLyBOZWVkZWQgYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUKLQkvLyBJVmFsaWRhdG9yIGlzIG5vdCBlbm91Z2ggdG8gcmVtb3ZlIGFsbCBtZXNzYWdlcyBmcm9tIHRoZQotCS8vIHRhc2sgbGlzdC4KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFZhbGlkYXRvck1ldGFEYXRhPiBfaW5kZXhlZFZhbGlkYXRvcnM7IAotCQotCXByaXZhdGUgZmluYWwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBfZGVmYXVsdEVuYWJsZWRWYWxpZGF0b3JzOwotCQotCS8vIFNpbmNlIElQcm9qZWN0J3MgY29udGVudHMgYXJlIGFsbCBpbnN0YW5jZXMgb2YgSVJlc291cmNlLCBldmVyeSB0eXBlIGZpbHRlciBmb3IgYSB2YWxpZGF0b3IKLQkvLyBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIElSZXNvdXJjZS4gVGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIHJlYnVpbGRDYWNoZSBwYXNzIGFuZCB0byB0aGUKLQkvLyB2YWxpZGF0aW9uIHBhc3MuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElSRVNPVVJDRSA9ICJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9QUk9KRUNUID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkIC8vIFRoaXMgJ3Byb2plY3QgbmF0dXJlIGlkJyBpcyB1c2VkIGFzIGEga2V5IHRvIGdldCB0aGUgdmFsaWRhdG9ycyB3aGljaCBjYW4gcnVuIG9uIGEgcHJvamVjdCB0eXBlIHdoaWNoIGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgZmlsdGVyZWQgaW4gb3Igb3V0IGJ5IGFueSB2YWxpZGF0b3IuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREVEX1BST0pFQ1QgPSAiRVhDTFVERUQiOyAvLyROT04tTkxTLTEkIC8vIFRoaXMgJ3Byb2plY3QgbmF0dXJlIGlkJyBpcyB1c2VkIGFzIGEga2V5IHRvIGdldCB0aGUgdmFsaWRhdG9ycyB3aGljaCBhcmUgZXhjbHVkZWQgb24gY2VydGFpbiBwcm9qZWN0cy4KLQkKLQkvKiogQGRlcHJlY2F0ZWQgdGhpcyBpbnN0YW5jZSB2YXJpYWJsZSBzaG91bGQgbm90IGJlIHB1YmxpYy4gKi8KLQlwdWJsaWMgSGFzaE1hcDxJUHJvamVjdCwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPj4gcHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YSA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+PigpOwotCi0JLyoqCi0JICogVGhlIHJlZ2lzdHJ5IGlzIHJlYWQgb25jZSAtIHdoZW4gdGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIoKSB7Ci0KLQkJX3ZhbGlkYXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU2V0PFZhbGlkYXRvck1ldGFEYXRhPj4oKTsKLQkJX2luZGV4ZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJX2RlZmF1bHRFbmFibGVkVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQl0cnkgewotCi0JCQkvLyBSZWFkIHRoZSByZWdpc3RyeSBhbmQgYnVpbGQgYSBtYXAgb2YgdmFsaWRhdG9ycy4gVGhlIGtleSBpbnRvCi0JCQkvLyB0aGUgbWFwIGlzIHRoZSBJVmFsaWRhdG9yIGluc3RhbmNlIGFuZCB0aGUgdmFsdWUgaXMgdGhlIFZhbGlkYXRvck1ldGFEYXRhCi0JCQkvLyB3aGljaCBkZXNjcmliZXMgdGhlIElWYWxpZGF0b3IuCi0JCQlyZWFkUmVnaXN0cnkoKTsKLQotCQkJLy8gT25jZSBhbGwgb2YgdGhlIHZhbGlkYXRvcnMgaGF2ZSBiZWVuIHJlYWQsIHRoZSBjYWNoZXMgb2YgdGhlCi0JCQkvLyB2YWxpZGF0b3JzIG5lZWQgdG8gYmUgdXBkYXRlZC4KLQkJCWJ1aWxkQ2FjaGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJhdmVyc2Ugb3ZlciB0aGUgbGlzdCBvZiBWTURzIHdoaWNoIGhhdmUgYmVlbiBhZGRlZCBhbmQgY3JlYXRlIGNvcGllcyBvZiBpdC4gVGhlIGNvcGllcyBhcmUKLQkgKiBjcmVhdGVkIHRvIGluY3JlYXNlIHJ1bnRpbWUgcGVyZm9ybWFuY2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2FjaGUoKSB7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogX2luZGV4ZWRWYWxpZGF0b3JzLnZhbHVlcygpKSB7Ci0JCQlidWlsZFByb2plY3ROYXR1cmVDYWNoZSh2bWQpOwotCQkJYnVpbGREZWZhdWx0RW5hYmxlZENhY2hlKHZtZCk7Ci0JCX0KLQotCQkvLyBOb3cgYWRkIHRoZSB2YWxpZGF0b3JzIHdoaWNoIGFyZSBjb25maWd1cmVkIG9uIGFsbCBwcm9qZWN0cywKLQkJLy8gYW5kIGFsbCBwcm9qZWN0cyBidXQgWC4KLQkJYWRkUmVtYWluZGVyKCk7Ci0KLQkJLy8gdGhpcyB0ZW1wb3JhcnkgbGlzdCBpc24ndCBuZWVkZWQgYW55IG1vcmUuIEFsbCBvZiB0aGUgZXhjbHVkZWQKLQkJLy8gcHJvamVjdHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBwcm9qZWN0IG5hdHVyZXMgd2hpY2ggdGhleSBkb24ndCBleGNsdWRlLgotCQlfdmFsaWRhdG9ycy5yZW1vdmUoRVhDTFVERURfUFJPSkVDVCk7Ci0KLQkJaWYgKFRyYWNpbmcuaXNUcmFjZVYxKCkpIHsKLQkJCVRyYWNpbmcubG9nKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXItMDE6ICIsIGRlYnVnKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgY2FjaGUgb2YgVk1EcyB3aGljaCBpcyBpbmRleGVkIGJ5IHByb2plY3QgbmF0dXJlIGlkcy4gSWYgdGhlIHZhbGlkYXRvciBpcwotCSAqIHJlZ2lzdGVyZWQgb24gYWxsIHByb2plY3QgdHlwZXMsIHRoZSB2bWQncyBwcm9qZWN0IG5hdHVyZSBmaWx0ZXJzIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0TmF0dXJlQ2FjaGUoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCS8vIEJ1aWxkIHRoZSBjYWNoZSB3aXRoIHRoZSBpZGVudGlmaWVkIHByb2plY3QgbmF0dXJlcyBpbiB2YWxpZGF0b3JzJwotCQkvLyBleHRlbnNpb25zLgotCQlWYWxpZGF0b3JOYW1lRmlsdGVyW10gcHJvak5hdHVyZUlkcyA9IHZtZC5nZXRQcm9qZWN0TmF0dXJlRmlsdGVycygpOwotCQlTdHJpbmdbXSBmYWNldEZpbHRlcnMgPSB2bWQuZ2V0RmFjZXRGaWx0ZXJzKCk7Ci0JCWlmIChwcm9qTmF0dXJlSWRzID09IG51bGwpIHsKLQkJCWlmIChmYWNldEZpbHRlcnMgPT0gbnVsbCAmJiB2bWQuZ2V0RW5hYmxlbWVudEV4cHJlc2lvbigpID09IG51bGwpIHsKLQkJCQlhZGQoVU5LTk9XTl9QUk9KRUNULCB2bWQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBub25lSW5jbHVkZWQgPSB0cnVlOyAvLyBhc3N1bWUgdGhhdCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHByb2plY3QKLQkJCS8vIG5hdHVyZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvak5hdHVyZUlkcy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvck5hbWVGaWx0ZXIgcG4gPSBwcm9qTmF0dXJlSWRzW2ldOwotCQkJCWlmIChwbi5pc0luY2x1ZGUoKSkgewotCQkJCQlub25lSW5jbHVkZWQgPSBmYWxzZTsKLQkJCQkJYWRkKHBuLmdldE5hbWVGaWx0ZXIoKSwgdm1kKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChub25lSW5jbHVkZWQpIHsKLQkJCQkvLyBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgRVhDTFVERUQgcHJvamVjdHMKLQkJCQkvLyAodGhhdCBpcywgYSB2YWxpZGF0b3Igd2hpY2ggZXhjbHVkZXMgcHJvamVjdCBuYXR1cmVzIGJ1dCBkb2Vzbid0Ci0JCQkJLy8gZXhwbGljaXRseSBpbmNsdWRlIGFueS4gVGhpcyB0eXBlIG9mIHZhbGlkYXRvciBydW5zIG9uIGFueSB1bnJlY29nbml6ZWQgKFVOS05PV04pCi0JCQkJLy8gcHJvamVjdHMsIGJ1dCB0aGUgcmVzdCBvZiB0aGUgY2FjaGUgbmVlZHMgdG8gYmUgYnVpbHQgYmVmb3JlIHRoaXMgaXMgYWRkZWQKLQkJCQkvLyB0byB0aGUgVU5LTk9XTiBsaXN0LiBTZWUgYWRkRXhjbHVkZWRSZW1haW5kZXIoKS4KLQkJCQlhZGQoRVhDTFVERURfUFJPSkVDVCwgdm1kKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBCdWlsZCB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIHdoaWNoIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRGVmYXVsdEVuYWJsZWRDYWNoZShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJaWYgKHZtZCA9PSBudWxsKXJldHVybjsKLQotCQlpZiAodm1kLmlzRW5hYmxlZEJ5RGVmYXVsdCgpKV9kZWZhdWx0RW5hYmxlZFZhbGlkYXRvcnMuYWRkKHZtZCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHZtZCB0byB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzLCBpbmRleGVkIGJ5IHZhbGlkYXRvciBjbGFzcyBuYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZChWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlfaW5kZXhlZFZhbGlkYXRvcnMucHV0KHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIHZtZCk7Ci0JfQotCi0JLyoKLQkgKiBTb21lIHZhbGlkYXRvcnMgY2FuIHJ1biBvbiBhbnkgdHlwZSBvZiBwcm9qZWN0LiBJbiBvcmRlciB0byBoYXZlIGEgc3RhdGljIGxpc3QsIGFkZCB0aGUgImFueQotCSAqIHByb2plY3QiIHZhbGlkYXRvcnMgdG8gZWFjaCAicHJvamVjdCBuYXR1cmUiIHZhbGlkYXRvcnMnIGxpc3QuIFRoaXMgYXZvaWRzIGFkZGluZyB0aGUgImFueQotCSAqIHByb2plY3QiIHZhbGlkYXRvcnMgdG8gdGhlICJwcm9qZWN0IG5hdHVyZSIgdmFsaWRhdG9ycyBhdCBydW50aW1lLCB3aGljaCByZXN1bHRzIGluCi0JICogcGVyZm9ybWFuY2Ugc2F2aW5ncy4KLQkgKiAKLQkgKiBTb21lIHZhbGlkYXRvcnMgcnVuIG9uIGFueSB0eXBlIG9mIHByb2plY3QgYnV0IFgsIHdoZXJlIFggaXMgYW4gZXhjbHVkZWQgcHJvamVjdCBuYXR1cmUuCi0JICogVGhvc2UgdmFsaWRhdG9ycyBzaG91bGQgYWxzbyBiZSBhZGRlZCB2aWEgdGhpcyBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJlbWFpbmRlcigpIHsKLQkJLy8gRmlyc3QsIGFkZCBhbGwgImNhbi1ydW4tb24tYW55LXByb2plY3QtdHlwZSIgdG8gZXZlcnkgcmVnaXN0ZXJlZCBwcm9qZWN0IG5hdHVyZSB0eXBlIGluCi0JCS8vIHRoZSBjYWNoZS4KLQkJYWRkQW55UmVtYWluZGVyKCk7Ci0KLQkJLy8gVGhlbiBhZGQgdGhlICJjYW4tcnVuLW9uLWFueS1wcm9qZWN0LXR5cGUtYnV0LVgiIHRvIGV2ZXJ5IG5vbi1YIHJlZ2lzdGVyZWQgcHJvamVjdCBuYXR1cmUKLQkJLy8gdHlwZSBpbiB0aGUgY2FjaGUuCi0JCWFkZEV4Y2x1ZGVkUmVtYWluZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEV4Y2x1ZGVkUmVtYWluZGVyKCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGV4Y2x1ZGVkUHJvalZtZHMgPSBfdmFsaWRhdG9ycy5nZXQoRVhDTFVERURfUFJPSkVDVCk7Ci0JCWlmIChleGNsdWRlZFByb2pWbWRzID09IG51bGwpIHsKLQkJCS8vIG5vIGV4Y2x1ZGVkIHByb2plY3QgbmF0dXJlcwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBleGNsdWRlZFByb2pWbWRzKSB7Ci0KLQkJCS8vIGFzc3VtZSB0aGF0LCBieSBkZWZhdWx0LCBpZiBzb21lb25lIGV4cGxpY2l0bHkgZXhjbHVkZXMKLQkJCS8vIGEgcHJvamVjdCBuYXR1cmUgdGhlbiB0aGV5IGRvbid0IGluY2x1ZGUgYW55IHByb2plY3QgbmF0dXJlcwotCQkJYm9vbGVhbiBub25lSW5jbHVkZWQgPSB0cnVlOwotCQkJCi0JCQkvLyBhIHByb2plY3QgbmF0dXJlIHRoZW4gdGhleSBkb24ndCBpbmNsdWRlIGFueSBwcm9qZWN0IG5hdHVyZXMKLQkJCWZvciAoU3RyaW5nIHByb2pJZCA6IF92YWxpZGF0b3JzLmtleVNldCgpKSB7Ci0JCQkJaWYgKHByb2pJZC5lcXVhbHMoVU5LTk9XTl9QUk9KRUNUKSB8fCBwcm9qSWQuZXF1YWxzKEVYQ0xVREVEX1BST0pFQ1QpKSB7Ci0JCQkJCS8vIERvbid0IGFkZCBsaXN0IHRvIGEgcHJvamVjdCBuYXR1cmUgd2hpY2ggaXMgZXhjbHVkZWQgb3IgYXBwbGljYWJsZSB0byBhbGwuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVZhbGlkYXRvck5hbWVGaWx0ZXIgZmlsdGVyID0gdm1kLmZpbmRQcm9qZWN0TmF0dXJlKHByb2pJZCk7Ci0JCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCS8vIERvbid0IGFkZCBsaXN0IHRvIGl0c2VsZiAoZmlsdGVyLmlzSW5jbHVkZWQoKSA9PSB0cnVlKSBvcgotCQkJCQkvLyB0byBhIGxpc3QgZnJvbSB3aGljaCBpdCdzIGV4Y2x1ZGVkIChmaWx0ZXIuaXNJbmNsdWRlZCgpID09IGZhbHNlKQotCQkJCQlpZiAoZmlsdGVyLmlzSW5jbHVkZSgpKSB7Ci0JCQkJCQlub25lSW5jbHVkZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlhZGQocHJvaklkLCB2bWQpOwotCQkJfQotCi0JCQlpZiAobm9uZUluY2x1ZGVkKSB7Ci0JCQkJLy8gQXQgdGhpcyBwb2ludCwgdGhlICJjYW4tcnVuLW9uLWFueS1wcm9qZWN0IiBiZWNvbWVzCi0JCQkJLy8gIm5vdC1leGNsdWRlZC1vbi10aGVzZS1wcm9qZWN0cyIuIFRoYXQgaXMsIGlmIHRoZSBwcm9qZWN0Ci0JCQkJLy8gbmF0dXJlIGlkIGlzbid0IGluIHRoZSBsaXN0IG9mIF92YWxpZGF0b3JzLCB0aGVuIGl0IGlzbid0Ci0JCQkJLy8gaW5jbHVkZWQgb3IgZXhjbHVkZWQgYnkgYW55IHZhbGlkYXRvcnMsIHNvIGFsbCB2YWxpZGF0b3JzCi0JCQkJLy8gd2hpY2ggY2FuIHJ1biBvbiBhbnkgcHJvamVjdCBBTkQgYWxsIHZhbGlkYXRvcnMgd2hpY2ggY2FuCi0JCQkJLy8gcnVuIG9uIGFueSBidXQgY2VydGFpbiBleGNsdWRlZCBwcm9qZWN0cyBjYW4gcnVuIG9uIHRoZQotCQkJCS8vIGdpdmVuIElQcm9qZWN0LgotCQkJCWFkZChVTktOT1dOX1BST0pFQ1QsIHZtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQW55UmVtYWluZGVyKCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGFueVByb2pWbWRzID0gX3ZhbGlkYXRvcnMuZ2V0KFVOS05PV05fUFJPSkVDVCk7Ci0JCWlmIChhbnlQcm9qVm1kcyA9PSBudWxsKSB7Ci0JCQkvLyBubyB2YWxpZGF0b3JzIHJ1biBvbiBhbGwgcHJvamVjdHMKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoU3RyaW5nIHByb2pJZCA6IF92YWxpZGF0b3JzLmtleVNldCgpKSB7Ci0JCQlpZiAocHJvaklkLmVxdWFscyhVTktOT1dOX1BST0pFQ1QpIHx8IHByb2pJZC5lcXVhbHMoRVhDTFVERURfUFJPSkVDVCkpIHsKLQkJCQkvLyBEb24ndCBhZGQgbGlzdCB0byBpdHNlbGYgb3IgdG8gYSBwcm9qZWN0IG5hdHVyZSB3aGljaCBpcyBleGNsdWRlZC4KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYWRkKHByb2pJZCwgYW55UHJvalZtZHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChTdHJpbmcgcHJvamVjdE5hdHVyZUlkLCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZtZExpc3QpIHsKLQkJaWYgKCh2bWRMaXN0ID09IG51bGwpIHx8ICh2bWRMaXN0LnNpemUoKSA9PSAwKSlyZXR1cm47Ci0KLQkJLy8gd2hldGhlciB0aGUgdmFsaWRhdG9yIGluY2x1ZGVzIG9yIGV4Y2x1ZGVzIHRoaXMKLQkJLy8gcHJvamVjdCBuYXR1cmUgaWQsIG1ha2Ugc3VyZSB0aGF0IGFuIGVudHJ5IGlzIGNyZWF0ZWQgZm9yIGl0IGluIHRoZSB0YWJsZQotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHBuVmFsID0gY3JlYXRlU2V0KHByb2plY3ROYXR1cmVJZCk7IAotCQlwblZhbC5hZGRBbGwodm1kTGlzdCk7Ci0JCV92YWxpZGF0b3JzLnB1dChwcm9qZWN0TmF0dXJlSWQsIHBuVmFsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKFN0cmluZyBwcm9qZWN0TmF0dXJlSWQsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlpZiAodm1kID09IG51bGwpcmV0dXJuOwotCi0JCS8vIHdoZXRoZXIgdGhlIHZhbGlkYXRvciBpbmNsdWRlcyBvciBleGNsdWRlcyB0aGlzCi0JCS8vIHByb2plY3QgbmF0dXJlIGlkLCBtYWtlIHN1cmUgdGhhdCBhbiBlbnRyeSBpcyBjcmVhdGVkIGZvciBpdCBpbiB0aGUgdGFibGUKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBwblZhbCA9IGNyZWF0ZVNldChwcm9qZWN0TmF0dXJlSWQpOyAKLQkJcG5WYWwuYWRkKHZtZCk7Ci0JCV92YWxpZGF0b3JzLnB1dChwcm9qZWN0TmF0dXJlSWQsIHBuVmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGEgdmFsaWRhdG9yJ3MgY2xhc3Mgb3IgaGVscGVyIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQsIHRoZSB2bWQgY2FsbHMgdGhpcyBtZXRob2QgdG8KLQkgKiBkaXNhYmxlIHRoZSB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3Igd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHByZWZlcmVuY2UgcGFnZSwgcHJvcGVydGllcwotCSAqIHBhZ2UsIGFuZCBlbmFibGVkIGxpc3Qgb2YgYW55IHByb2plY3QgdGhlcmVhZnRlciB2YWxpZGF0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJX2luZGV4ZWRWYWxpZGF0b3JzLnJlbW92ZSh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJX2RlZmF1bHRFbmFibGVkVmFsaWRhdG9ycy5yZW1vdmUodm1kKTsKLQotCQkvLyBUaGUgd2hvbGUgIm9uLWFueS1wcm9qZWN0IiBhbmQgImV4Y2x1ZGUtdGhpcy1wcm9qZWN0LW5hdHVyZSIgd291bGQgdGFrZQotCQkvLyBhIGxvdCBvZiBwcm9jZXNzaW5nIHRpbWUuLi4gSW5zdGVhZCwgdHJhdmVyc2UgdGhlIGxpc3Qgb2YgcHJvaiBuYXR1cmUgaWRzLAotCQkvLyBhbmQgc2VhcmNoIHRoZSBTZXQgb2YgdGhhdCBwcm9qIG5hdHVyZSBpZCwgYW5kIHJlbW92ZSB0aGUgdm1kIGlmIGl0J3MgaW4gdGhlCi0JCS8vIFNldC4KLQkJZm9yIChTdHJpbmcgcHJvaklkIDogX3ZhbGlkYXRvcnMua2V5U2V0KCkpIHsKLQkJCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdmFsdWUgPSBfdmFsaWRhdG9ycy5nZXQocHJvaklkKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKWNvbnRpbnVlOwotCi0JCQlpZiAodmFsdWUuY29udGFpbnModm1kKSkgewotCQkJCXZhbHVlLnJlbW92ZSh2bWQpOwotCQkJCV92YWxpZGF0b3JzLnB1dChwcm9qSWQsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBjcmVhdGVTZXQoU3RyaW5nIHByb2pOYXR1cmUpIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2ID0gX3ZhbGlkYXRvcnMuZ2V0KHByb2pOYXR1cmUpOwotCQlpZiAodiA9PSBudWxsKSB7Ci0JCQl2ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBpZiBpdCBoYXMgYSBwcm9qZWN0IG5hdHVyZShzKSBzcGVjaWZpZWQsIHJldHVybiB0aGUKLQkgKiBWYWxpZGF0b3JOYW1lRmlsdGVycyB3aGljaCByZXByZXNlbnQgdGhvc2UgbmF0dXJlcy4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIEEgcHJvamVjdCBuYXR1cmUgY2FuIGJlIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIHRvIGluZGljYXRlIHdoYXQgdHlwZXMgb2YgSVByb2plY3RzIGEKLQkgKiB2YWxpZGF0b3IgY2FuIHJ1biBvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGdldEFnZ3JlZ2F0ZVZhbGlkYXRvcnNOYW1lcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmaWx0ZXJzID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfQUdHUkVHQVRFX1ZBTElEQVRPUlMpOwotCQlpZiAoZmlsdGVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tmaWx0ZXJzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIEluIG9yZGVyIHRvIHNwZWVkIHVwIG91ciBTdHJpbmcgY29tcGFyaXNvbnMsIGxvYWQgdGhlc2UKLQkJCS8vIG5hbWVzIGludG8gSmF2YSdzIGNvbnN0YW50cyBzcGFjZS4gVGhpcyB3YXksIHdlJ2xsIGJlIGFibGUgdG8KLQkJCS8vIHVzZSBwb2ludGVyIGNvbXBhcmlzb24gaW5zdGVhZCBvZiB0aGUgdHJhZGl0aW9uYWwKLQkJCS8vIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgY29tcGFyaXNvbi4gU2luY2UgdGhlc2UgbmFtZXMgc2hvdWxkCi0JCQkvLyBuZXZlciBiZSBzZXQgYnkgYW55b25lIG90aGVyIHRoYW4gdGhpcyBjbGFzcywgYW5kIHRoaXMgY2xhc3MKLQkJCS8vIHNldHMgdGhlbSBvbmx5IG9uY2UsIGl0IGlzIHNhZmUgdG8gZGVjbGFyZSB0aGVzZSBTdHJpbmdzCi0JCQkvLyBjb25zdGFudHMuCi0JCQkvLwotCQkJLy8gVG8gbG9hZCBhIFN0cmluZyBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UsIGNhbGwgaW50ZXJuKCkgb24gdGhlIFN0cmluZy4KLQkJCS8vCi0JCQlTdHJpbmcgbmFtZUZpbHRlciA9IGZpbHRlcnNbaV0uZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQlpZiAobmFtZUZpbHRlciAhPSBudWxsKSB7Ci0JCQkJbmFtZUZpbHRlciA9IG5hbWVGaWx0ZXIuaW50ZXJuKCk7Ci0JCQl9Ci0JCQluYW1lc1tpXSA9IG5hbWVGaWx0ZXI7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlQmluZGluZ3MoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBiaW5kaW5ncyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0NPTlRFTlRUWVBFKTsKLQkJaWYoYmluZGluZ3MubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nW10gY1R5cGVJRHMgPSBuZXcgU3RyaW5nW2JpbmRpbmdzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpICsrKXsKLQkJCQotCQkJY1R5cGVJRHNbaV0gPSBiaW5kaW5nc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRUWVBFSUQpOwotCQl9Ci0JCQotCQlyZXR1cm4gY1R5cGVJRHM7Ci0JCQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCBmcm9tIHBsdWdpbi54bWwsIGlmIGl0IGhhcyBhbnkgZmlsdGVyIHRhZ3MsIGNvbnN0cnVjdCB0aGUKLQkgKiBhcHByb3ByaWF0ZSBWYWxpZGF0b3JGaWx0ZXJzIHRvIHJlcHJlc2VudCB0aG9zZSB0YWdzOyBlbHNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIEEgZmlsdGVyIGNhbiBiZSBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbCB0byBmaWx0ZXIgb3V0IGNlcnRhaW4gcmVzb3VyY2VzLgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yRmlsdGVyW10gZ2V0RmlsdGVycyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmaWx0ZXJzID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfRklMVEVSKTsKLQkJaWYgKGZpbHRlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlWYWxpZGF0b3JGaWx0ZXJbXSB2ZiA9IG5ldyBWYWxpZGF0b3JGaWx0ZXJbZmlsdGVycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXZmW2ldID0gbmV3IFZhbGlkYXRvckZpbHRlcihJUkVTT1VSQ0UpOwotCi0JCQkvLyBJbiBvcmRlciB0byBzcGVlZCB1cCBvdXIgU3RyaW5nIGNvbXBhcmlzb25zLCBsb2FkIHRoZXNlCi0JCQkvLyBuYW1lcyBpbnRvIEphdmEncyBjb25zdGFudHMgc3BhY2UuIFRoaXMgd2F5LCB3ZSdsbCBiZSBhYmxlIHRvCi0JCQkvLyB1c2UgcG9pbnRlciBjb21wYXJpc29uIGluc3RlYWQgb2YgdGhlIHRyYWRpdGlvbmFsCi0JCQkvLyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIGNvbXBhcmlzb24uIFNpbmNlIHRoZXNlIG5hbWVzIHNob3VsZAotCQkJLy8gbmV2ZXIgYmUgc2V0IGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoaXMgY2xhc3MsIGFuZCB0aGlzIGNsYXNzCi0JCQkvLyBzZXRzIHRoZW0gb25seSBvbmNlLCBpdCBpcyBzYWZlIHRvIGRlY2xhcmUgdGhlc2UgU3RyaW5ncwotCQkJLy8gY29uc3RhbnRzLgotCQkJLy8KLQkJCS8vIFRvIGxvYWQgYSBTdHJpbmcgaW50byB0aGUgY29uc3RhbnRzIHNwYWNlLCBjYWxsIGludGVybigpIG9uIHRoZSBTdHJpbmcuCi0JCQkvLwotCQkJU3RyaW5nIG5hbWVGaWx0ZXIgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfTkFNRV9GSUxURVIpOwotCQkJaWYgKG5hbWVGaWx0ZXIgIT0gbnVsbCkgewotCQkJCW5hbWVGaWx0ZXIgPSBuYW1lRmlsdGVyLmludGVybigpOwotCQkJfQotCQkJU3RyaW5nIGlzQ2FzZVNlbnNpdGl2ZSA9IGZpbHRlcnNbaV0uZ2V0QXR0cmlidXRlKEFUVF9DQVNFX1NFTlNJVElWRSk7Ci0JCQl2ZltpXS5zZXROYW1lRmlsdGVyKG5hbWVGaWx0ZXIsIGlzQ2FzZVNlbnNpdGl2ZSk7Ci0KLQkJCVN0cmluZyBvYmplY3RDbGFzcyA9IGZpbHRlcnNbaV0uZ2V0QXR0cmlidXRlKEFUVF9PQkpFQ1RfQ0xBU1MpOwotCQkJaWYgKG9iamVjdENsYXNzICE9IG51bGwpIHsKLQkJCQlvYmplY3RDbGFzcyA9IG9iamVjdENsYXNzLmludGVybigpOwotCQkJfQotCQkJdmZbaV0uc2V0VHlwZUZpbHRlcihvYmplY3RDbGFzcyk7Ci0KLQkJCVN0cmluZyBhY3Rpb25GaWx0ZXIgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfQUNUSU9OX0ZJTFRFUik7Ci0JCQlpZiAoYWN0aW9uRmlsdGVyICE9IG51bGwpIHsKLQkJCQlhY3Rpb25GaWx0ZXIgPSBhY3Rpb25GaWx0ZXIuaW50ZXJuKCk7Ci0JCQl9Ci0JCQl2ZltpXS5zZXRBY3Rpb25GaWx0ZXIoYWN0aW9uRmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gdmY7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVwZW5kZW50VmFsaWRhdG9yVmFsdWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZGVwVmFsaWRhdG9yRWxlbWVudCA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oREVQX1ZBTElEQVRPUik7Ci0JCWlmIChkZXBWYWxpZGF0b3JFbGVtZW50Lmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgZGVwVmFsdWUgPSBkZXBWYWxpZGF0b3JFbGVtZW50WzBdLmdldEF0dHJpYnV0ZShERVBfVkFMX1ZBTFVFKTsKLQkJYm9vbGVhbiBkZXBCb29sVmFsdWUgPSAobmV3IEJvb2xlYW4oZGVwVmFsdWUpKS5ib29sZWFuVmFsdWUoKTsKLQkJcmV0dXJuIGRlcEJvb2xWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1hcmtlciBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIElWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldE1hcmtlcklkc1ZhbHVlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1hcmtlcklkID0gZWxlbWVudC5nZXRDaGlsZHJlbihNQVJLRVJfSUQpOwotCQlpZiAobWFya2VySWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG1hcmtlcklkc1tdID0gbmV3IFN0cmluZ1ttYXJrZXJJZC5sZW5ndGhdOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgbWFya2VySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQltYXJrZXJJZHNbaV0gPSBtYXJrZXJJZFtpXS5nZXRBdHRyaWJ1dGUoTUFSS0VSX0lEX1ZBTFVFKTsKLQkJfQotCQlyZXR1cm4gbWFya2VySWRzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmFjZXRJZHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmFjZXRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihGQUNFVCk7Ci0JCWlmIChmYWNldHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nW10gZmFjZXRJZHMgPSBuZXcgU3RyaW5nW2ZhY2V0cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0cy5sZW5ndGg7IGkrKykgewotCQkJZmFjZXRJZHNbaV0gPSBmYWNldHNbaV0uZ2V0QXR0cmlidXRlKEZBQ0VUX0lEKTsKLQkJfQotCQlyZXR1cm4gZmFjZXRJZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBoZWxwZXIgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBJVmFsaWRhdG9yLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEhlbHBlck5hbWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaGVscGVycyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0hFTFBFUl9DTEFTUyk7Ci0JCWlmIChoZWxwZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGhlbHBlcnNbMF0uZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JfQotCi0Jc3RhdGljIElXb3JrYmVuY2hDb250ZXh0IGNyZWF0ZUhlbHBlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGhlbHBlckNsYXNzTmFtZSkgewotCQlJV29ya2JlbmNoQ29udGV4dCB3aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3aCA9IChJV29ya2JlbmNoQ29udGV4dCkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFRBR19IRUxQRVJfQ0xBU1MpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCVJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05PX0hFTFBFUl9USFJPV0FCTEUpLCAKLQkJCQluZXcgT2JqZWN0W117aGVscGVyQ2xhc3NOYW1lfSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgcmVzdWx0KTsJCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gd2g7Ci0JfQotCi0Jc3RhdGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKSB7Ci0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZhbGlkYXRvciA9IChJVmFsaWRhdG9yKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1NZTlRBWF9OT19WQUxfVEhST1dBQkxFKSwgCi0JCQkJbmV3IE9iamVjdFtde3ZhbGlkYXRvckNsYXNzTmFtZX0pOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIHJlc3VsdCk7CQotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQkJVHJhY2luZy5sb2coIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci0wMjogIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkJTkxTLmJpbmQoVmFsTWVzc2FnZXMuVmJmRXhjU3ludGF4Tm9WYWxOdWxsLCB2YWxpZGF0b3JDbGFzc05hbWUpKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZnJvbSBwbHVnaW4ueG1sLCByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBpcwotCSAqIGVuYWJsZWQgYnkgZGVmYXVsdC4KLQkgKiAKLQkgKiBJZiBubyBlbmFibGVkIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0LCB0cnVlIChpLmUuLCBlbmFibGVkKSBpcyByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RW5hYmxlZEJ5RGVmYXVsdChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW5DaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1JVTl9DTEFTUyk7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgcnVuQ2hpbGRyZW4gaXMgbnVsbCBvciBlbXB0eSwgYmVjYXVzZSB0aGF0IHdhcyBjaGVja2VkIGluIHRoZQotCQkvLyBpbml0aWFsaXplVmFsaWRhdG9yIG1ldGhvZC4KLQotCQlTdHJpbmcgaW5jID0gcnVuQ2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKEFUVF9FTkFCTEVEKTsKLQkJaWYgKGluYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gUmVnaXN0cnlDb25zdGFudHMuQVRUX0VOQUJMRURfREVGQVVMVDsKLQkJfQotCi0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoaW5jLnRyaW0oKS50b0xvd2VyQ2FzZSgpKS5ib29sZWFuVmFsdWUoKTsgLy8gdGhpcyB3aWxsIHJldHVybiB0cnVlCi0JCS8vIGlmLCBhbmQgb25seSBpZiwgdGhlCi0JCS8vIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCQkvLyAidHJ1ZSIuIEZvciBleGFtcGxlLAotCQkvLyAieWVzIiB3aWxsIGJlIGNvbnNpZGVyZWQKLQkJLy8gImZhbHNlIi4KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZnJvbSBwbHVnaW4ueG1sLCByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBzdXBwb3J0cwotCSAqIGluY3JlbWVudGFsIHZhbGlkYXRpb24uCi0JICogCi0JICogSWYgbm8gaW5jcmVtZW50YWwgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQsIHRydWUgKGkuZS4sIGluY3JlbWVudGFsIGlzIHN1cHBvcnRlZCkKLQkgKiBpcyByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0SW5jcmVtZW50YWwoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcnVuQ2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19SVU5fQ0xBU1MpOwotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHJ1bkNoaWxkcmVuIGlzIG51bGwgb3IgZW1wdHksIGJlY2F1c2UgdGhhdCB3YXMgY2hlY2tlZCBpbiB0aGUKLQkJLy8gaW5pdGlhbGl6ZVZhbGlkYXRvciBtZXRob2QuCi0KLQkJU3RyaW5nIGluYyA9IHJ1bkNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZShBVFRfSU5DUkVNRU5UQUwpOwotCQlpZiAoaW5jID09IG51bGwpIHsKLQkJCXJldHVybiBSZWdpc3RyeUNvbnN0YW50cy5BVFRfSU5DUkVNRU5UQUxfREVGQVVMVDsKLQkJfQotCi0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoaW5jLnRyaW0oKS50b0xvd2VyQ2FzZSgpKS5ib29sZWFuVmFsdWUoKTsgLy8gdGhpcyB3aWxsIHJldHVybiB0cnVlCi0JCS8vIGlmLCBhbmQgb25seSBpZiwgdGhlCi0JCS8vIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCQkvLyAidHJ1ZSIuIEZvciBleGFtcGxlLAotCQkvLyAieWVzIiB3aWxsIGJlIGNvbnNpZGVyZWQKLQkJLy8gImZhbHNlIi4KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZnJvbSBwbHVnaW4ueG1sLCByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBzdXBwb3J0cwotCSAqIGZ1bGwgYnVpbGQgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBJZiBubyBpbmNyZW1lbnRhbCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCwgdHJ1ZSAoaS5lLiwgaW5jcmVtZW50YWwgaXMgc3VwcG9ydGVkKQotCSAqIGlzIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRGdWxsQnVpbGQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcnVuQ2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19SVU5fQ0xBU1MpOwotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHJ1bkNoaWxkcmVuIGlzIG51bGwgb3IgZW1wdHksIGJlY2F1c2UgdGhhdCB3YXMgY2hlY2tlZCBpbiB0aGUKLQkJLy8gaW5pdGlhbGl6ZVZhbGlkYXRvciBtZXRob2QuCi0KLQkJU3RyaW5nIGZiID0gcnVuQ2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKEFUVF9GVUxMQlVJTEQpOwotCQlpZiAoZmIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9GVUxMQlVJTERfREVGQVVMVDsKLQkJfQotCi0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoZmIudHJpbSgpLnRvTG93ZXJDYXNlKCkpLmJvb2xlYW5WYWx1ZSgpOyAvLyB0aGlzIHdpbGwgcmV0dXJuIHRydWUgaWYsCi0JCS8vIGFuZCBvbmx5IGlmLCB0aGUKLQkJLy8gYXR0cmlidXRlIHZhbHVlIGlzCi0JCS8vICJ0cnVlIi4gRm9yIGV4YW1wbGUsCi0JCS8vICJ5ZXMiIHdpbGwgYmUgY29uc2lkZXJlZAotCQkvLyAiZmFsc2UiLgotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCBmcm9tIHBsdWdpbi54bWwsIHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsaWRhdG9yIHN1cHBvcnRzCi0JICogYXN5bmNocm9ub3VzIHZhbGlkYXRpb24uCi0JICogCi0JICogSWYgbm8gYXN5bmMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQsIHRydWUgKGkuZS4sIHRoZSB2YWxpZGF0b3IgaXMgdGhyZWFkLXNhZmUpIGlzCi0JICogcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldEFzeW5jKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bkNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUlVOX0NMQVNTKTsKLQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBpZiBydW5DaGlsZHJlbiBpcyBudWxsIG9yIGVtcHR5LCBiZWNhdXNlIHRoYXQgd2FzIGNoZWNrZWQgaW4gdGhlCi0JCS8vIGluaXRpYWxpemVWYWxpZGF0b3IgbWV0aG9kLgotCi0JCVN0cmluZyBhc3luYyA9IHJ1bkNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZShBVFRfQVNZTkMpOwotCQlpZiAoYXN5bmMgPT0gbnVsbCkgewotCQkJcmV0dXJuIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9BU1lOQ19ERUZBVUxUOwotCQl9Ci0KLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihhc3luYy50cmltKCkudG9Mb3dlckNhc2UoKSkuYm9vbGVhblZhbHVlKCk7IC8vIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZQotCQkvLyBpZiwgYW5kIG9ubHkgaWYsIHRoZQotCQkvLyBhdHRyaWJ1dGUgdmFsdWUgaXMKLQkJLy8gInRydWUiLiBGb3IgZXhhbXBsZSwKLQkJLy8gInllcyIgd2lsbCBiZQotCQkvLyBjb25zaWRlcmVkICJmYWxzZSIuCi0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZyb20gcGx1Z2luLnhtbCwgcmV0dXJuIHRoZSB0eXBlcyBvZiB2YWxpZGF0aW9uIHBhc3NlcywgYXMKLQkgKiBkZWZpbmVkIGluIElSdWxlR3JvdXAsIHRoYXQgdGhlIHZhbGlkYXRvciBwZXJmb3Jtcy4KLQkgKiAKLQkgKiBJZiBubyBwYXNzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0LCBJUnVsZUdyb3VwLlBBU1NfRlVMTCwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0UnVsZUdyb3VwKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bkNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUlVOX0NMQVNTKTsKLQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBpZiBydW5DaGlsZHJlbiBpcyBudWxsIG9yIGVtcHR5LCBiZWNhdXNlIHRoYXQgd2FzIGNoZWNrZWQgaW4gdGhlCi0JCS8vIGluaXRpYWxpemVWYWxpZGF0b3IgbWV0aG9kLgotCi0JCVN0cmluZyBwYXNzID0gcnVuQ2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKEFUVF9SVUxFX0dST1VQKTsKLQkJaWYgKHBhc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQ7Ci0JCX0KLQotCQlmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGFzcywgQ09NTUEsIGZhbHNlKTsgLy8gZmFsc2UgbWVhbnMgZG9uJ3QKLQkJLy8gcmV0dXJuIHRoZSBjb21tYSBhcwotCQkvLyBwYXJ0IG9mIHRoZSBzdHJpbmcKLQkJaW50IHJlc3VsdCA9IDA7IC8vIG5vIHBhc3NlcyBpZGVudGlmaWVkCi0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgbmV4dEFjdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAobmV4dEFjdGlvbi5lcXVhbHMoSVJ1bGVHcm91cC5QQVNTX0ZBU1RfTkFNRSkpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQgfCBJUnVsZUdyb3VwLlBBU1NfRkFTVDsKLQkJCX0gZWxzZSBpZiAobmV4dEFjdGlvbi5lcXVhbHMoSVJ1bGVHcm91cC5QQVNTX0ZVTExfTkFNRSkpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQgfCBJUnVsZUdyb3VwLlBBU1NfRlVMTDsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gMCkgewotCQkJLy8gTm8gcmVjb2duaXplZCBwYXNzZXMuIFJldHVybiB0aGUgZGVmYXVsdC4KLQkJCXJldHVybiBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxUOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhLk1pZ3JhdGlvbk1ldGFEYXRhIGdldE1pZ3JhdGlvbk1ldGFEYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bkNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfTUlHUkFURSk7Ci0JCWlmICgocnVuQ2hpbGRyZW4gPT0gbnVsbCkgfHwgKHJ1bkNoaWxkcmVuLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBPbmx5IHN1cHBvc2VkIHRvIGJlIG9uZSAibWlncmF0ZSIgc2VjdGlvbiBpbiBhIHZhbGlkYXRvciwgc28gaWdub3JlIHRoZSByZXN0Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBtaWdyYXRlID0gcnVuQ2hpbGRyZW5bMF07Ci0KLQkJLy8gTm93IGxvb2sgZm9yIHRoZSAidmFsaWRhdG9yIiBlbGVtZW50cy4gWmVybyBvciBtb3JlIGNhbiBiZSBzcGVjaWZpZWQuCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1pZ3JhdGVDaGlsZHJlbiA9IG1pZ3JhdGUuZ2V0Q2hpbGRyZW4oVEFHX1ZBTElEQVRPUik7Ci0JCWlmICgobWlncmF0ZUNoaWxkcmVuID09IG51bGwpIHx8IChtaWdyYXRlQ2hpbGRyZW4ubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhLk1pZ3JhdGlvbk1ldGFEYXRhIG1tZCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YS5NaWdyYXRpb25NZXRhRGF0YSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pZ3JhdGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1pZ3JhdGVDaGlsZCA9IG1pZ3JhdGVDaGlsZHJlbltpXTsKLQkJCVN0cmluZyBmcm9tID0gbWlncmF0ZUNoaWxkLmdldEF0dHJpYnV0ZShBVFRfRlJPTSk7Ci0JCQlpZiAoZnJvbSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCVN0cmluZyB0byA9IG1pZ3JhdGVDaGlsZC5nZXRBdHRyaWJ1dGUoQVRUX1RPKTsKLQkJCWlmICh0byA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQltbWQuYWRkSWQoZnJvbSwgdG8pOwotCQl9Ci0JCXJldHVybiBtbWQ7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBpZiBpdCBoYXMgYSBwcm9qZWN0IG5hdHVyZShzKSBzcGVjaWZpZWQsIHJldHVybiB0aGUKLQkgKiBWYWxpZGF0b3JOYW1lRmlsdGVycyB3aGljaCByZXByZXNlbnQgdGhvc2UgbmF0dXJlcy4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIEEgcHJvamVjdCBuYXR1cmUgY2FuIGJlIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIHRvIGluZGljYXRlIHdoYXQgdHlwZXMgb2YgSVByb2plY3RzIGEKLQkgKiB2YWxpZGF0b3IgY2FuIHJ1biBvbi4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvck5hbWVGaWx0ZXJbXSBnZXRQcm9qZWN0TmF0dXJlRmlsdGVycyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmaWx0ZXJzID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUFJPSkVDVF9OQVRVUkUpOwotCQlpZiAoZmlsdGVycy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlWYWxpZGF0b3JOYW1lRmlsdGVyW10gdmYgPSBuZXcgVmFsaWRhdG9yTmFtZUZpbHRlcltmaWx0ZXJzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJdmZbaV0gPSBuZXcgVmFsaWRhdG9yTmFtZUZpbHRlcigpOwotCQkJLy8gSW4gb3JkZXIgdG8gc3BlZWQgdXAgb3VyIFN0cmluZyBjb21wYXJpc29ucywgbG9hZCB0aGVzZQotCQkJLy8gbmFtZXMgaW50byBKYXZhJ3MgY29uc3RhbnRzIHNwYWNlLiBUaGlzIHdheSwgd2UnbGwgYmUgYWJsZSB0bwotCQkJLy8gdXNlIHBvaW50ZXIgY29tcGFyaXNvbiBpbnN0ZWFkIG9mIHRoZSB0cmFkaXRpb25hbAotCQkJLy8gY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjb21wYXJpc29uLiBTaW5jZSB0aGVzZSBuYW1lcyBzaG91bGQKLQkJCS8vIG5ldmVyIGJlIHNldCBieSBhbnlvbmUgb3RoZXIgdGhhbiB0aGlzIGNsYXNzLCBhbmQgdGhpcyBjbGFzcwotCQkJLy8gc2V0cyB0aGVtIG9ubHkgb25jZSwgaXQgaXMgc2FmZSB0byBkZWNsYXJlIHRoZXNlIFN0cmluZ3MKLQkJCS8vIGNvbnN0YW50cy4KLQkJCS8vCi0JCQkvLyBUbyBsb2FkIGEgU3RyaW5nIGludG8gdGhlIGNvbnN0YW50cyBzcGFjZSwgY2FsbCBpbnRlcm4oKSBvbiB0aGUgU3RyaW5nLgotCQkJLy8KLQkJCVN0cmluZyBuYW1lRmlsdGVyID0gZmlsdGVyc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCWlmIChuYW1lRmlsdGVyICE9IG51bGwpIHsKLQkJCQluYW1lRmlsdGVyID0gbmFtZUZpbHRlci5pbnRlcm4oKTsKLQkJCX0KLQkJCXZmW2ldLnNldE5hbWVGaWx0ZXIobmFtZUZpbHRlcik7Ci0KLQkJCVN0cmluZyBpbmNsdWRlID0gZmlsdGVyc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX0lOQ0xVREUpOwotCQkJdmZbaV0uc2V0SW5jbHVkZShpbmNsdWRlKTsKLQkJfQotCQlyZXR1cm4gdmY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBnZXRSZWFkZXIoKSB7Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7Ci0JCS8vIFdoZXRoZXIgdGhlIHJlZ2lzdHJ5IGhhcyBiZWVuIHJlYWQgb3Igbm90IGlzIGtlcHQgaW4gdGhlIEV2ZW50TWFuYWdlcgotCQkvLyBjbGFzcyBpbnN0ZWFkIG9mIHRoaXMgY2xhc3MgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgYSBzaHV0ZG93biBwcm9ibGVtLgotCQkvLyBTZWUgdGhlIGNvbW1lbnQgaW4gdGhlIGlzQWN0aXZlKCkgbWV0aG9kIG9mIHRoZSBFdmVudE1hbmFnZXIgY2xhc3MKLQkJLy8gZm9yIGRldGFpbHMuCi0JCXJldHVybiBFdmVudE1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzQWN0aXZlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVmFsaWRhdG9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXByaXZhdGUgSUV4dGVuc2lvblBvaW50IGdldFZhbGlkYXRvckV4dGVuc2lvblBvaW50KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCwgVkFMSURBVE9SX0VYVF9QVF9JRCk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBJZiB0aGlzIGhhcHBlbnMgaXQgbWVhbnMgdGhhdCBzb21lb25lIHJlbW92ZWQgdGhlICJ2YWxpZGF0b3IiIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gZGVjbGFyYXRpb24gZnJvbSBvdXIgcGx1Z2luLnhtbCBmaWxlLgotCQkJaWYgKFRyYWNpbmcuaXNUcmFjZVYxKCkpIHsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19NSVNTSU5HX1ZBTElEQVRPUl9FUCksCi0JCQkJCQluZXcgT2JqZWN0W117VmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQgKyAiLiIgKyBWQUxJREFUT1JfRVhUX1BUX0lEfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlUcmFjaW5nLmxvZygiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLTAzOiAiLCByZXN1bHQpOwkJIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXh0ZW5zaW9uUG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogSXQncyBva2F5IHRvIHJldHVybiBhIGhhbmRsZSB0byB0aGUgVmFsaWRhdG9yTWV0YURhdGEgYmVjYXVzZSB0aGUgdm1kIGNhbid0IGJlIG1vZGlmaWVkIGJ5Ci0JICogYW55IGNvZGUgbm90IGluIHRoaXMgcGFja2FnZS4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJLy8gcmV0cmlldmFsIHdpbGwgYmUgaW4gbG9nKG4pIHRpbWUKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZSgKLQkJCQkJUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19PUlBIQU5fSVZBTElEQVRPUiwgbmV3IFN0cmluZ1tdeyJudWxsIn0pOyAvLyROT04tTkxTLTEkCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lID0gdmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBnZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzc05hbWUpOwotCQlpZiAodm1kICE9IG51bGwpIHsKLQkJCXJldHVybiB2bWQ7Ci0JCX0KLQotCQkvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiB2bWQgaXMgbmVpdGhlciBhIHJvb3Qgbm9yIGFuIGFnZ3JlZ2F0ZSB2YWxpZGF0b3IsCi0JCS8vIHlldCB0aGUgSVZhbGlkYXRvciBleGlzdHMuIEludGVybmFsIGVycm9yLgotCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKAotCQkJCVJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfT1JQSEFOX0lWQUxJREFUT1IsIG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JDbGFzc05hbWV9KTsKLQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRWYWxpZGF0b3JNZXRhRGF0YShJV29ya3NwYWNlUm9vdCByb290KSB7Ci0JCS8vIEV2ZXJ5IHZhbGlkYXRvciBvbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSBtdXN0IGJlIHJldHVybmVkCi0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gY29weSA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQljbG9uZShfaW5kZXhlZFZhbGlkYXRvcnMudmFsdWVzKCksIGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIFZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiBhIGNlcnRhaW4gdHlwZSBvZiBJUHJvamVjdCAoZS5nLiBFSkIgUHJvamVjdAotCSAqIHZzLiBXZWIgUHJvamVjdCkuCi0JICogCi0JICogVGhpcyBpcyBhIGxvbmctcnVubmluZyBwcm9jZXNzLiBJZiB5b3UgY2FuLCBjYWNoZSB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldFZhbGlkYXRvck1ldGFEYXRhKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBjb3B5ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWdldFZhbGlkYXRvck1ldGFEYXRhKHByb2plY3QsIGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSBzZXQgb2YgY29uZmlndXJlZCB2YWxpZGF0b3IgbWV0YWRhdGEgaW50byB0aGUgU2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGdldFZhbGlkYXRvck1ldGFEYXRhKElQcm9qZWN0IHByb2plY3QsIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kcykgewotCQlpZiAodm1kcyA9PSBudWxsKXJldHVybjsKLQkJdm1kcy5jbGVhcigpOwotCQlpbnQgZXhlY3V0aW9uTWFwID0gMHgwOwotCQl0cnkgewotCQkJaWYgKFRyYWNpbmcuaXNUcmFjZVYxKCkpIHsKLQkJCQlUcmFjaW5nLmxvZygiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLTA0OiBJUHJvamVjdCBpcyAiICsgU3RyaW5nLnZhbHVlT2YocHJvamVjdCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MTsKLQkJCQkvLyB2bWRzIGlzIGFscmVhZHkgY2xlYXIKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmdbXSBwcm9qZWN0TmF0dXJlcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXByb2plY3ROYXR1cmVzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldE5hdHVyZUlkcygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjsKLQkJCQkvLyB2bWRzIGlzIGFscmVhZHkgY2xlYXIKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBJZiB0aGVyZSBhcmUgbm8gcHJvamVjdCBuYXR1cmVzIG9uIGEgcGFydGljdWxhciBwcm9qZWN0LAotCQkJLy8gb3IgaWYgdGhpcyBwcm9qZWN0IG5hdHVyZSBoYXMgbm8gdmFsaWRhdG9ycyBjb25maWd1cmVkCi0JCQkvLyBvbiBpdCwgcmV0dXJuIHRoZSB2YWxpZGF0b3JzIHdoaWNoIGFyZSBjb25maWd1cmVkIG9uIGFsbAotCQkJLy8gcHJvamVjdHMuCi0JCQlpZiAoKHByb2plY3ROYXR1cmVzID09IG51bGwpIHx8IChwcm9qZWN0TmF0dXJlcy5sZW5ndGggPT0gMCkpIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHg0OwotCQkJCQotCQkJCS8vIEFsc28gaW5jbHVkZSB0aGUgdmFsaWRhdG9ycyB3aGljaCBhcmUgZW5hYmxlZCB0aHJvdWdoIGVuYWJsZW1lbnQKLQkJCQkvLyBleHByZXNzaW9uIGZvciB0aGlzIHByb2plY3QuCi0JCQkJLy8gTm90ZSB0aGF0IHRoZSBBUEkgaXNGYWNldEVuYWJsZWQodm1kLCBwcm9qZWN0KSB3b3JrcyBwcm9wZXJseSAKLQkJCQkvLyBvbmx5IHdoZW4gdGhlIHBsdWdpbiBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSB0ZXN0ZXIgaXMgYWN0aXZhdGVkLgotCQkJCS8vIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIgbWF5IGJlIG5lZWRlZCBpbiB0aGUgZGVjbGFyYXRpb24gb2YgCi0JCQkJLy8gdGhlIGVuYWJsZW1lbnQgaW4gdGhlIHZhbGlkYXRvciBleHRlbnNpb24gcG9pbnQuCi0JCSAgICAgICAgLy8gPGVuYWJsZW1lbnQ+Ci0JCSAgICAgICAgLy8gIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIgcHJvcGVydHk9ImZvby50ZXN0UHJvcGVydHkiLz4KLQkJICAgICAgICAvLyA8L2VuYWJsZW1lbnQ+IAotCQkJCQotCQkJCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdmFsaWRhdG9yc1dpdGhFbmFibGVtZW50RXhwcmVzc2lvbiA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogZ2V0QWxsVmFsaWRhdG9ycygpKSB7Ci0JCQkJCWlmIChpc0ZhY2V0RW5hYmxlZCh2bWQsIHByb2plY3QpKSB7Ci0JCQkJCQl2YWxpZGF0b3JzV2l0aEVuYWJsZW1lbnRFeHByZXNzaW9uLmFkZCh2bWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKHZhbGlkYXRvcnNXaXRoRW5hYmxlbWVudEV4cHJlc3Npb24uc2l6ZSgpID4gMCApewotCQkJCQl2YWxpZGF0b3JzV2l0aEVuYWJsZW1lbnRFeHByZXNzaW9uLmFkZEFsbCggZ2V0VmFsaWRhdG9yTWV0YURhdGFVbmtub3duUHJvamVjdCgpKTsKLQkJCQkJY2xvbmUodmFsaWRhdG9yc1dpdGhFbmFibGVtZW50RXhwcmVzc2lvbiwgdm1kcyk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJY2xvbmUoZ2V0VmFsaWRhdG9yTWV0YURhdGFVbmtub3duUHJvamVjdCgpLCB2bWRzKTsKLQotCi0JCQl9IGVsc2UgewotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDg7Ci0JCQkJaWYgKFRyYWNpbmcuaXNUcmFjZVYxKCkpIHsKLQkJCQkJVHJhY2luZy5sb2coIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci0wNTogIiwgcHJvamVjdE5hdHVyZXMudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2FsY3VsYXRlVm1kc0Zvck5hdHVyZUFuZEZhY2V0cyh2bWRzLCBwcm9qZWN0TmF0dXJlcyxwcm9qZWN0KTsKLQkJCQkvLyBOb3cgZmlsdGVyIG91dCB0aGUgdmFsaWRhdG9ycyB3aGljaCBtdXN0IG5vdCBydW4gb24gdGhpcyBwcm9qZWN0Ci0JCQkJcmVtb3ZlRXhjbHVkZWRQcm9qZWN0cyhwcm9qZWN0LCB2bWRzKTsKLQkJCQlpZiAodm1kcy5zaXplKCkgPT0gMCkgewotCQkJCQlleGVjdXRpb25NYXAgfD0gMHgyMDsKLQkJCQkJY2xvbmUoZ2V0VmFsaWRhdG9yTWV0YURhdGFVbmtub3duUHJvamVjdCgpLCB2bWRzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoVHJhY2luZy5pc1RyYWNlVjEoKSkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJVHJhY2luZy5sb2coIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci0wNjogIiwgYnVmZmVyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB2bWRzCi0JICogQHBhcmFtIHByb2plY3ROYXR1cmVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVZtZHNGb3JOYXR1cmVBbmRGYWNldHMoU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2bWRzLCBTdHJpbmdbXSBwcm9qZWN0TmF0dXJlcywgSVByb2plY3QgcHJvamVjdCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHByb2pWbWRzOwotCQlTdHJpbmdbXSBwcm9qZWN0RmFjZXRJZHMgPSBnZXRQcm9qZWN0RmFjZXRJZHMocHJvamVjdCk7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogZ2V0QWxsVmFsaWRhdG9ycygpKSB7Ci0JCQlpZiAoY29udGFpbnNQcm9qZWN0RmFjZXQodm1kLCBwcm9qZWN0RmFjZXRJZHMpIHx8IGlzRmFjZXRFbmFibGVkKHZtZCwgcHJvamVjdCkpIHsKLQkJCQl2bWRzLmFkZCh2bWQpOwotCQkJfQotCQl9Ci0JCWZvciAoU3RyaW5nIHByb2plY3ROYXR1cmVJZCA6IHByb2plY3ROYXR1cmVzKSB7Ci0JCQlwcm9qVm1kcyA9IF92YWxpZGF0b3JzLmdldChwcm9qZWN0TmF0dXJlSWQpOwotCQkJaWYgKHByb2pWbWRzID09IG51bGwpY29udGludWU7Ci0KLQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogcHJvalZtZHMpIHsKLQkJCQlpZiAoIXZtZHMuY29udGFpbnModm1kKSAmJiAodm1kLmdldEZhY2V0RmlsdGVycygpID09IG51bGwgfHwgdm1kLmdldEZhY2V0RmlsdGVycygpLmxlbmd0aCA9PSAwKSkgewotCQkJCQlpZiAodm1kLmdldEVuYWJsZW1lbnRFeHByZXNpb24oKSA9PSBudWxsKXZtZHMuYWRkKHZtZCk7Ci0JCQkJCWVsc2UgaWYgKGlzRmFjZXRFbmFibGVkKHZtZCwgcHJvamVjdCkpdm1kcy5hZGQodm1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNQcm9qZWN0RmFjZXQoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmdbXSBwcm9qZWN0RmFjZXRJZHMpIHsKLQkJU3RyaW5nW10gdmFsaWRhdG9yRmFjZXRzID0gdm1kLmdldEZhY2V0RmlsdGVycygpOwotCQlpZiAodmFsaWRhdG9yRmFjZXRzICE9IG51bGwgJiYgdmFsaWRhdG9yRmFjZXRzLmxlbmd0aCA+IDApIHsKLQkJCWlmIChwcm9qZWN0RmFjZXRJZHMgIT0gbnVsbCAmJiBwcm9qZWN0RmFjZXRJZHMubGVuZ3RoID4gMCkgewotCQkJCWlmIChBcnJheXMuYXNMaXN0KHByb2plY3RGYWNldElkcykuY29udGFpbnNBbGwoQXJyYXlzLmFzTGlzdCh2YWxpZGF0b3JGYWNldHMpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNGYWNldEVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2bWQuZ2V0RW5hYmxlbWVudEV4cHJlc2lvbigpOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewotCQkJCUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgcHJvamVjdCk7Ci0JCQkJY29udGV4dC5zZXRBbGxvd1BsdWdpbkFjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSBleHByZXNzaW9uLmV2YWx1YXRlKGNvbnRleHQpOwotCQkJCXJldHVybiByZXN1bHQgPT0gRXZhbHVhdGlvblJlc3VsdC5UUlVFOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0UHJvamVjdEZhY2V0SWRzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChmUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gcHJvamVjdEZhY2V0cyA9IGZQcm9qZWN0LmdldFByb2plY3RGYWNldHMoKS50b0FycmF5KCk7Ci0JCQkJU3RyaW5nW10gcHJvamVjdEZhY2V0SWRzID0gbmV3IFN0cmluZ1twcm9qZWN0RmFjZXRzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RmFjZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gKChJUHJvamVjdEZhY2V0VmVyc2lvbikgcHJvamVjdEZhY2V0c1tpXSkuZ2V0UHJvamVjdEZhY2V0KCk7Ci0JCQkJCXByb2plY3RGYWNldElkc1tpXSA9IHByb2plY3RGYWNldC5nZXRJZCgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcHJvamVjdEZhY2V0SWRzOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIElmIG9uZSBwcm9qZWN0IG5hdHVyZSBvbiB0aGUgcHJvamVjdCBpbmNsdWRlcyBhIHBhcnRpY3VsYXIgdmFsaWRhdG9yLCBidXQgYW5vdGhlciBwcm9qZWN0Ci0JICogbmF0dXJlIGV4Y2x1ZGVzIHRoYXQgdmFsaWRhdG9yLCB0aGVuIHRoZSB2YWxpZGF0b3IgbmVlZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB2bWQgc2V0LgotCSAqIAotCSAqIEZvciBleGFtcGxlLCBpZiBBVmFsaWRhdG9yIGNhbiBydW4gb24gYW55IGphdmEgcHJvamVjdCBidXQgbm90IG9uIGEgSjJFRSBwcm9qZWN0LCB3aGljaCBpcyBhbgotCSAqIGluc3RhbmNlIG9mIGEgamF2YSBwcm9qZWN0LCB0aGVuIHRoZSBBVmFsaWRhdG9yIGlzIGluY2x1ZGVkIGJ5IHRoZSBqYXZhIG5hdHVyZSBhbmQgZXhjbHVkZWQKLQkgKiBieSB0aGUgSjJFRSBuYXR1cmUuIFRoZSBBVmFsaWRhdG9yIHdvdWxkIGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4Y2x1ZGVkUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2bWRzKSB7Ci0JCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiXG5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXItMTI6IGJlZm9yZTpcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVRyYWNpbmcubG9nKGJ1ZmZlcik7Ci0JCX0KLQotCQlTdHJpbmdbXSBwcm9qZWN0TmF0dXJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9qZWN0TmF0dXJlcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKHByb2plY3ROYXR1cmVzID09IG51bGwpIHx8IChwcm9qZWN0TmF0dXJlcy5sZW5ndGggPT0gMCkpIHsKLQkJCS8vIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hdHVyZSA9IHByb2plY3ROYXR1cmVzW2ldOwotCQkJSXRlcmF0b3I8VmFsaWRhdG9yTWV0YURhdGE+IGl0ZXJhdG9yID0gdm1kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlWYWxpZGF0b3JOYW1lRmlsdGVyW10gbmF0dXJlRmlsdGVycyA9IHZtZC5nZXRQcm9qZWN0TmF0dXJlRmlsdGVycygpOwotCQkJCWlmIChuYXR1cmVGaWx0ZXJzID09IG51bGwpIHsKLQkJCQkJLy8gQ2FuIHJ1biBvbiBhbnkgcHJvamVjdAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlmb3IgKFZhbGlkYXRvck5hbWVGaWx0ZXIgcG4gOiBuYXR1cmVGaWx0ZXJzKSB7Ci0JCQkJCWlmIChuYXR1cmUuZXF1YWxzKHBuLmdldE5hbWVGaWx0ZXIoKSkgJiYgIXBuLmlzSW5jbHVkZSgpKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKFRyYWNpbmcuaXNUcmFjZVYxKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJcblZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci0xMzogYWZ0ZXI6XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2bWRzKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlUcmFjaW5nLmxvZyhidWZmZXIpOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNsb25lKENvbGxlY3Rpb24gaW5wdXQsIENvbGxlY3Rpb24gY29weSkgewotCQlpZiAoaW5wdXQgPT0gbnVsbCB8fCBjb3B5ID09IG51bGwpcmV0dXJuIG51bGw7Ci0JCWNvcHkuY2xlYXIoKTsKLQkJY29weS5hZGRBbGwoaW5wdXQpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlYnVnKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJQcm9qZWN0IG5hdHVyZSA9PiB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoU3RyaW5nIHByb2pJZCA6IF92YWxpZGF0b3JzLmtleVNldCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJwcm9qSWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHByb2pJZCk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZhbGlkYXRvcnMgPSBfdmFsaWRhdG9ycy5nZXQocHJvaklkKTsKLQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdmFsaWRhdG9ycykgewotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJYnVmZmVyLmFwcGVuZCgiRW5hYmxlL2Rpc2FibGUgdmFsaWRhdG9yIGJ5IGRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogX2luZGV4ZWRWYWxpZGF0b3JzLnZhbHVlcygpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiIGVuYWJsZWQ/ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHZtZC5pc0VuYWJsZWRCeURlZmF1bHQoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkT25Qcm9qZWN0KFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZtZHMgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQocHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YSl7Ci0JCQl2bWRzID0gcHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YS5nZXQocHJvamVjdCk7Ci0JCX0KLQkJaWYgKHZtZHMgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZtZHMuY29udGFpbnModm1kKTsKLQkJfSBlbHNlIHsKLQkJCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gcHJqVm1kcyA9IGdldFZhbGlkYXRvck1ldGFEYXRhKHByb2plY3QpOwotCQkJaWYgKHByalZtZHMgPT0gbnVsbCB8fCBwcmpWbWRzLnNpemUoKSA9PSAwKXJldHVybiBmYWxzZTsKLQkJCXN5bmNocm9uaXplZChwcm9qZWN0VmFsaWRhdGlvbk1ldGFEYXRhKXsKLQkJCQlwcm9qZWN0VmFsaWRhdGlvbk1ldGFEYXRhLnB1dChwcm9qZWN0LCBwcmpWbWRzKTsKLQkJCX0KLQkJCXJldHVybiBwcmpWbWRzLmNvbnRhaW5zKHZtZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXJDYWNoZWRNYXBzKCl7Ci0JCXN5bmNocm9uaXplZChwcm9qZWN0VmFsaWRhdGlvbk1ldGFEYXRhKXsKLQkJCXByb2plY3RWYWxpZGF0aW9uTWV0YURhdGEuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBvZiBWYWxpZGF0b3JNZXRhRGF0YSB3aGljaCBhcmUgY29uZmlndXJlZCBvbiBhbGwgcHJvamVjdHMgb3Igd2hpY2ggcnVuIG9uIGFueQotCSAqIHByb2plY3RzIGV4Y2VwdCBjZXJ0YWluIHByb2plY3QgdHlwZXMuCi0JICogCi0JICogVW5saWtlIG90aGVyIGdldCBtZXRob2RzLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIHByaXZhdGUgaXQgZG9lc24ndCByZXR1cm4gYSBjbG9uZS4KLQkgKiAKLQkgKiBAc2VlIGFkZEV4Y2x1ZGVkUmVtYWluZGVyKCkKLQkgKi8KLQlwcml2YXRlIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0VmFsaWRhdG9yTWV0YURhdGFVbmtub3duUHJvamVjdCgpIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBwcm9qVm1kcyA9IF92YWxpZGF0b3JzLmdldChVTktOT1dOX1BST0pFQ1QpOwotCQlpZiAocHJvalZtZHMgPT0gbnVsbCkgewotCQkJcHJvalZtZHMgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJfQotCQlyZXR1cm4gcHJvalZtZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIFZhbGlkYXRvck1ldGFEYXRhIHdoaWNoIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0JICovCi0JcHVibGljIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0VmFsaWRhdG9yTWV0YURhdGFFbmFibGVkQnlEZWZhdWx0KCkgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGNvcHkgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJY2xvbmUoX2RlZmF1bHRFbmFibGVkVmFsaWRhdG9ycywgY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFZhbGlkYXRvck1ldGFEYXRhQXJyYXlFbmFibGVkQnlEZWZhdWx0KCkgewotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtfZGVmYXVsdEVuYWJsZWRWYWxpZGF0b3JzLnNpemUoKV07Ci0JCV9kZWZhdWx0RW5hYmxlZFZhbGlkYXRvcnMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgT05MWSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIFVJLCBvciBUVlQgcGx1Z2luLiBJbiBnZW5lcmFsLAotCSAqIG9ubHkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFuZCB0aGUgdmFsaWRhdGlvbiBUVlQgc2hvdWxkIGhhbmRsZSBWYWxpZGF0b3JNZXRhRGF0YSBvYmplY3RzLgotCSAqIAotCSAqIEdpdmVuIGEgc3RyaW5nIHdoaWNoIGlkZW50aWZpZXMgYSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIHZhbGlkYXRvciwgcmV0dXJuIHRoZQotCSAqIFZhbGlkYXRvck1ldGFEYXRhIHRoYXQgdXNlcyBhIHZhbGlkYXRvciBvZiB0aGF0IG5hbWUsIGlmIGl0IGV4aXN0cy4KLQkgKiAKLQkgKiBJdCdzIG9rYXkgdG8gcmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBWYWxpZGF0b3JNZXRhRGF0YSBiZWNhdXNlIHRoZSB2bWQgY2FuJ3QgYmUgbW9kaWZpZWQgYnkKLQkgKiBhbnkgY29kZSBub3QgaW4gdGhpcyBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YShTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKSB7Ci0JCWlmICh2YWxpZGF0b3JDbGFzc05hbWUgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQyID0gX2luZGV4ZWRWYWxpZGF0b3JzLmdldCh2YWxpZGF0b3JDbGFzc05hbWUpOwotCQlpZiAodm1kMiAhPSBudWxsKXJldHVybiB2bWQyOwotCi0JCS8vIENoZWNrIGZvciBhbiBhZ2dyZWdhdGUgdmFsaWRhdG9yCi0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogX2luZGV4ZWRWYWxpZGF0b3JzLnZhbHVlcygpKSB7Ci0JCQlpZiAodm1kID09IG51bGwpY29udGludWU7Ci0KLQkJCWlmICh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpLmVxdWFscyh2YWxpZGF0b3JDbGFzc05hbWUpKXJldHVybiB2bWQ7Ci0KLQkJCVN0cmluZ1tdIGFnZ3JlZ2F0ZU5hbWVzID0gdm1kLmdldEFnZ3JlZ2F0ZWRWYWxpZGF0b3JOYW1lcygpOwotCQkJaWYgKGFnZ3JlZ2F0ZU5hbWVzICE9IG51bGwpIHsKLQkJCQlmb3IgKFN0cmluZyBhZ2dyZWdhdGVOYW1lIDogYWdncmVnYXRlTmFtZXMpIHsKLQkJCQkJaWYgKHZhbGlkYXRvckNsYXNzTmFtZS5lcXVhbHMoYWdncmVnYXRlTmFtZSkpcmV0dXJuIHZtZDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIEN1cnJlbnQgbmFtZSBvZiB2YWxpZGF0b3IgZG9lc24ndCBtYXRjaDsgaGFzIHRoaXMgdmFsaWRhdG9yIGJlZW4KLQkJCS8vIG1pZ3JhdGVkIGZyb20gYW5vdGhlciBwYWNrYWdlPwotCQkJVmFsaWRhdG9yTWV0YURhdGEuTWlncmF0aW9uTWV0YURhdGEgbW1kID0gdm1kLmdldE1pZ3JhdGlvbk1ldGFEYXRhKCk7Ci0JCQlpZiAobW1kID09IG51bGwpIHsKLQkJCQkvLyBWYWxpZGF0b3IgY2xhc3MgbmFtZSBoYXNuJ3QgYmVlbiBtaWdyYXRlZAotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTZXQ8U3RyaW5nW10+IGlkTGlzdCA9IG1tZC5nZXRJZHMoKTsKLQkJCWlmIChpZExpc3QgPT0gbnVsbCkgewotCQkJCS8vIEludmFsaWQgPG1pZ3JhdGU+IGVsZW1lbnQuCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoU3RyaW5nW10gaWRzIDogaWRMaXN0KSB7Ci0JCQkJaWYgKGlkcy5sZW5ndGggIT0gMikgewotCQkJCQkvLyBsb2cKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIGZyb20gPSBpZHNbMF07Ci0JCQkJaWYgKGZyb20gPT0gbnVsbCkgewotCQkJCQkvLyBsb2cKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGZyb20uZXF1YWxzKHZhbGlkYXRvckNsYXNzTmFtZSkpIHsKLQkJCQkJcmV0dXJuIHZtZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBJZiB3ZSBnb3QgdG8gdGhpcyBwb2ludCwgbm8gdmFsaWRhdG9yIHVzaW5nIHRoYXQgY2xhc3MgbmFtZSBpcyBsb2FkZWQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBuYW1lZCB2YWxpZGF0b3IgaXMgaW5zdGFsbGVkLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGlzdGluZ1ZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKSB7Ci0JCXJldHVybiAoZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9yQ2xhc3NOYW1lKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSB2YWxpZGF0b3Igd2l0aCB0aGUgc3RhdGljIG1ldGFkYXRhIChydW50aW1lIG1ldGFkYXRhIGlzIGluaXRpYWxpemVkIGluIHRoZQotCSAqIFZhbGlkYXRpb25PcGVyYXRpb24gY2xhc3MpLgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgaW5pdGlhbGl6ZVZhbGlkYXRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHZhbGlkYXRvck5hbWUsIFN0cmluZyBwbHVnaW5JZCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW5DaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1JVTl9DTEFTUyk7Ci0JCWlmICgocnVuQ2hpbGRyZW4gPT0gbnVsbCkgfHwgKHJ1bkNoaWxkcmVuLmxlbmd0aCA8IDEpKSB7Ci0JCQkvLyBIb3cgY2FuIGFuIElWYWxpZGF0b3JJbXBsIGJlIGNyZWF0ZWQgd2hlbiB0aGVyZSBubyBjbGFzcyBuYW1lIHRvIGluc3RhbnRpYXRlPwotCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQlUcmFjaW5nLmxvZygiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLTA3OiAiLCBOTFMuYmluZChWYWxNZXNzYWdlcy5WYmZFeGNTeW50YXhOb1ZhbFJ1biwgdmFsaWRhdG9yTmFtZSkpOwkJCQkgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvL1dUUCBCdWd6aWxsYSBkZWZlY3Q6IDgyMzM4Ci0JCS8vVXNpbmcgdGhlIFVuaXF1ZSBJZGVudGlmaWVyIGdpdmUgdGhlIGZsZXhpYmlsaXR5IG9mIHRoZSBzYW1lIHZhbGlkYXRvciBjbGFzcyB1c2VkIGJ5IG90aGVyIHZhbGlkYXRvciBleHRlbnNpb25zIHdpdGhvdXQgd3JpdGluZyBhIG5ldyB2YWxpZGF0aW9uIGNsYXNzCi0JCS8vUmV2ZXJ0aW5nIHRoZSBmaXggYmFjayBhcyB0aGUgY2xhc3MgbmFtZSBkZWZpbmVkIGluIHRoZSBleHQgaXMgdW5pcXVlIHRvIHRoaXMgdmFsaWRhdG9yIGFuZCBoYXMgdG8gYmUgdXNlZCBmb3IgdGhlIHVuaXF1ZSBpZCBpbiB0aGUgdmFsaWRhdGlvbiBtZXRhZGF0YQotCQlTdHJpbmcgdmFsaWRhdG9ySW1wbE5hbWUgPSBydW5DaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJCi0JCWlmICh2YWxpZGF0b3JJbXBsTmFtZSA9PSBudWxsKSB7Ci0JCQkvLyBTYW1lIGFzIGJlZm9yZTsgaG93IGNhbiB3ZSBpbnN0YW50aWF0ZSB3aGVuLi4uCi0JCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSkgewotCQkJCVRyYWNpbmcubG9nKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXItMDg6ICIsIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLlZiZkV4Y1N5bnRheE5vVmFsQ2xhc3MsIHZhbGlkYXRvck5hbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgaGVscGVySW1wbE5hbWUgPSBnZXRIZWxwZXJOYW1lKGVsZW1lbnQpOwotCQlpZiAoaGVscGVySW1wbE5hbWUgPT0gbnVsbCkgewotCQkJLy8gU2FtZSBhcyBiZWZvcmU7IGhvdyBjYW4gd2UgaW5zdGFudGlhdGUgd2hlbi4uLgotCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQlUcmFjaW5nLmxvZygiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLTA5OiAiLCBOTFMuYmluZChWYWxNZXNzYWdlcy5WYmZFeGNTeW50YXhOb1ZhbFJ1biwgdmFsaWRhdG9ySW1wbE5hbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBJbiBvcmRlciB0byBzcGVlZCB1cCBvdXIgU3RyaW5nIGNvbXBhcmlzb25zLCBsb2FkIHRoZXNlCi0JCS8vIG5hbWVzIGludG8gSmF2YSdzIGNvbnN0YW50cyBzcGFjZS4gVGhpcyB3YXksIHdlJ2xsIGJlIGFibGUgdG8KLQkJLy8gdXNlIHBvaW50ZXIgY29tcGFyaXNvbiBpbnN0ZWFkIG9mIHRoZSB0cmFkaXRpb25hbAotCQkvLyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIGNvbXBhcmlzb24uIFNpbmNlIHRoZXNlIG5hbWVzIHNob3VsZAotCQkvLyBuZXZlciBiZSBzZXQgYnkgYW55b25lIG90aGVyIHRoYW4gdGhpcyBjbGFzcywgYW5kIHRoaXMgY2xhc3MKLQkJLy8gc2V0cyB0aGVtIG9ubHkgb25jZSwgaXQgaXMgc2FmZSB0byBkZWNsYXJlIHRoZXNlIFN0cmluZ3MKLQkJLy8gY29uc3RhbnRzLgotCQkvLwotCQkvLyBUbyBsb2FkIGEgU3RyaW5nIGludG8gdGhlIGNvbnN0YW50cyBzcGFjZSwgY2FsbCBpbnRlcm4oKSBvbiB0aGUgU3RyaW5nLgotCQkvLwotCQkKLQkJYm9vbGVhbiBhc3luYyA9IGdldEFzeW5jKGVsZW1lbnQpOwotCQlTdHJpbmdbXSBtYXJrZXJJZHMgPSBpbml0aWFsaXplVmFsaWRhdG9yQ3VzdG9tTWFya2VycyhlbGVtZW50LCBwbHVnaW5JZCk7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YShhc3luYywgZ2V0QWdncmVnYXRlVmFsaWRhdG9yc05hbWVzKGVsZW1lbnQpLCBnZXRFbmFibGVkQnlEZWZhdWx0KGVsZW1lbnQpLAotCQkJCWdldEluY3JlbWVudGFsKGVsZW1lbnQpLCBnZXRGdWxsQnVpbGQoZWxlbWVudCksIGVsZW1lbnQsIGhlbHBlckltcGxOYW1lLCBnZXRNaWdyYXRpb25NZXRhRGF0YShlbGVtZW50KSwKLQkJCQlwbHVnaW5JZCwgZ2V0UnVsZUdyb3VwKGVsZW1lbnQpLCBydW5DaGlsZHJlblswXSwgdmFsaWRhdG9yTmFtZS5pbnRlcm4oKSwgdmFsaWRhdG9ySW1wbE5hbWUuaW50ZXJuKCksCi0JCQkJZ2V0Q29udGVudFR5cGVCaW5kaW5ncyhlbGVtZW50KSwgZ2V0RGVwZW5kZW50VmFsaWRhdG9yVmFsdWUoZWxlbWVudCksIGdldEVuYWJsZW1lbnRFbGVtZW50KGVsZW1lbnQpLAotCQkJCWdldEZhY2V0SWRzKGVsZW1lbnQpLCBnZXRGaWx0ZXJzKGVsZW1lbnQpLCBnZXRQcm9qZWN0TmF0dXJlRmlsdGVycyhlbGVtZW50KSwgbWFya2VySWRzKTsKLQkJCi0JCQotCQlpZiAoVHJhY2luZy5pc1RyYWNlVjEoKSkgewotCQkJVHJhY2luZy5sb2coIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci0xMDogdmFsaWRhdG9yIGxvYWRlZDogIiArIHZhbGlkYXRvckltcGxOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHZtZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEBwYXJhbSB2bWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGluaXRpYWxpemVWYWxpZGF0b3JDdXN0b21NYXJrZXJzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcGx1Z2luSWQpIHsKLQkJU3RyaW5nW10gcXVhbGlmaWVkTWFya2VySWRzID0gbnVsbDsKLQkJU3RyaW5nW10gY3VzdG9tTWFya2VySWRzID0gZ2V0TWFya2VySWRzVmFsdWUoZWxlbWVudCk7Ci0JCWlmIChjdXN0b21NYXJrZXJJZHMgIT0gbnVsbCAmJiBjdXN0b21NYXJrZXJJZHMubGVuZ3RoID4gMCkgewotCQkJcXVhbGlmaWVkTWFya2VySWRzID0gbmV3IFN0cmluZ1tjdXN0b21NYXJrZXJJZHMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tTWFya2VySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG1hcmtlcmlkID0gY3VzdG9tTWFya2VySWRzW2ldOwotCQkJCWlmIChtYXJrZXJpZC5sYXN0SW5kZXhPZigiLiIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHBsdWdpbklEID0gbWFya2VyaWQuc3Vic3RyaW5nKDAsIG1hcmtlcmlkLmxhc3RJbmRleE9mKCIuIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOwotCQkJCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQkJCQlxdWFsaWZpZWRNYXJrZXJJZHNbaV0gPSBwbHVnaW5JZCArICIuIiArIGN1c3RvbU1hcmtlcklkc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbHNlCi0JCQkJCQlxdWFsaWZpZWRNYXJrZXJJZHNbaV0gPSBjdXN0b21NYXJrZXJJZHNbaV07Ci0JCQkJfSBlbHNlCi0JCQkJCXF1YWxpZmllZE1hcmtlcklkc1tpXSA9IHBsdWdpbklkICsgIi4iICsgY3VzdG9tTWFya2VySWRzW2ldOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHF1YWxpZmllZE1hcmtlcklkczsKLQl9Ci0KLQlwcml2YXRlIEV4cHJlc3Npb24gZ2V0RW5hYmxlbWVudEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZW5hYmxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkcmVuKEV4cHJlc3Npb25UYWdOYW1lcy5FTkFCTEVNRU5UKTsKLQkJaWYgKGVuYWJsZW1lbnRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShlbmFibGVtZW50c1swXSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBPTkxZIEJZIFRIRSBWQUxJREFUSU9OIEZSQU1FV09SSyEgVGhlIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaXMKLQkgKiB1c2VkIHRvIHBvcHVsYXRlIHRoZSB2YWxpZGF0aW9uIHByZWZlcmVuY2UgcGFnZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0QWxsVmFsaWRhdG9ycygpIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2YWxpZGF0b3JzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KDUwKTsKLQkJY2xvbmUoX2luZGV4ZWRWYWxpZGF0b3JzLnZhbHVlcygpLCB2YWxpZGF0b3JzKTsKLQkJcmV0dXJuIHZhbGlkYXRvcnM7Ci0JfQotCi0JcHVibGljIGludCBudW1iZXJPZlZhbGlkYXRvcnMoKSB7Ci0JCXJldHVybiBfaW5kZXhlZFZhbGlkYXRvcnMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cyBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJCVN0cmluZyBsYWJlbCA9IGV4dGVuc2lvbi5nZXRMYWJlbCgpOwotCQkJaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKFRyYWNpbmcuaXNUcmFjZVYxKCkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleHRlbnNpb24uZ2V0VW5pcXVlSWRlbnRpZmllcigpfTsKLQkJCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfVkFMSURBVE9STkFNRV9JU19OVUxMKSwKLQkJCQkJCQkoT2JqZWN0W10pbXNnUGFybSk7Ci0JCQkJCVRyYWNpbmcubG9nKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXItMTE6ICIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIElmIGdldExhYmVsKCkgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHRoaXMgaXMgYW4gaWxsZWdhbCB2YWxpZGF0b3IuCi0JCQkJLy8gVGhlIFByb3BlcnR5UGFnZSwgYW5kIG90aGVyIHN0YXR1cyBtZXNzYWdlcywgbmVlZCB0byBoYXZlIGEgZGlzcGxheWFibGUgbmFtZSBmb3IKLQkJCQkvLyB0aGUgdmFsaWRhdG9yLgotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJCQlpZiAoVHJhY2luZy5pc0VuYWJsZWQoZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSkpewotCQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBpbml0aWFsaXplVmFsaWRhdG9yKGVsZW1lbnQsIGxhYmVsLCBwbHVnaW5JZCk7Ci0JCi0JCQkJCWlmICh2bWQgIT0gbnVsbCkgewotCQkJCQkJLy8gQWRkIHRoaXMgdmFsaWRhdG9yIHRvIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnM7IGlmIHZtZCBpcyBudWxsLCB0aGUgdmFsaWRhdG9yCi0JCQkJCQkvLyBjb3VsZG4ndCBiZSBjcmVhdGVkLgotCQkJCQkJYWRkKHZtZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgVmFsaWRhdG9ycyB3aGljaCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJX3ZhbGlkYXRvcnMuY2xlYXIoKTsKLQotCQkvLyBHZXQgdGhlIGV4dGVuc2lvbnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KLQkJSUV4dGVuc2lvblBvaW50IHZhbGlkYXRvckVQID0gZ2V0VmFsaWRhdG9yRXh0ZW5zaW9uUG9pbnQoKTsKLQkJaWYgKHZhbGlkYXRvckVQID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHZhbGlkYXRvckVQLmdldEV4dGVuc2lvbnMoKTsKLQotCQkvLyBmaW5kIGFsbCBydW50aW1lIGltcGxlbWVudGF0aW9ucwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLSAgICAKLSAgICAvLyBGb3JjZSB0aGUgZGVsZWdhdGUgdmFsaWRhdG9ycyByZWdpc3RyeSB0byBiZSByZWFkIGVhcmx5IHRvIGF2b2lkCi0gICAgLy8gdGhlIG5vbi1zeW5jaHJvbml6ZWQgc2luZ2xldG9uIGlzc3VlIHdoaWNoIG9jY3VycyB3aGVuIHR3byBkZWxlZ2F0aW5nCi0gICAgLy8gdmFsaWRhdG9ycyByYWNlIHRvIGxvYWQgdGhlIHJlZ2lzdHJ5LgotICAgIAotICAgIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gX2luZGV4ZWRWYWxpZGF0b3JzLmdldCh2YWxpZGF0b3JDbGFzc05hbWUpOwotCQlpZih2bWQgIT0gbnVsbCkKLQkJCXJldHVybiB2bWQuZ2V0VmFsaWRhdG9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzY2U5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1NFTEVDVElPTl9IQU5ETEVSID0gInZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkvKiogaGFuZGxlckNsYXNzIC0gKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IQU5ETEVSX0NMQVNTID0gImhhbmRsZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TRUxFQ1RJT05fVFlQRSA9ICJzZWxlY3Rpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIgSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBMaXN0PElWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcj4gX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyczsKLQkKLQlwdWJsaWMgVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlclJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlcigpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFJlYWQgdGhlIGV4dGVuc2lvbiBwb2ludCBhbmQgcGFyc2UgaXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0JCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQsIFZBTElEQVRJT05fU0VMRUNUSU9OX0hBTkRMRVIpOwotCQlpZiAocG9pbnQgPT0gbnVsbClyZXR1cm47Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWludGVybmFsUmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gcmVjb2duaXplZCA9IHRoaXMucmVhZEVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmICghcmVjb2duaXplZCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIkVycm9yIHByb2Nlc3NpbmcgZXh0ZW5zaW9uOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogTG9ncyB0aGUgZXJyb3IgaW4gdGhlIGRlc2t0b3AgbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCBidWYudG9TdHJpbmcoKSk7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhWQUxJREFUSU9OX1NFTEVDVElPTl9IQU5ETEVSKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0vLwkJU3RyaW5nIGhhbmRsZXJDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9IQU5ETEVSX0NMQVNTKTsKLQkJU3RyaW5nIHNlbGVjdGlvblR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU0VMRUNUSU9OX1RZUEUpOyAKLQkJCi0JCUlWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWhhbmRsZXIgPSAoSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0hBTkRMRVJfQ0xBU1MpOwotCQkJaGFuZGxlci5zZXRWYWxpZGF0aW9uVHlwZVN0cmluZyhzZWxlY3Rpb25UeXBlKTsKLQkJCWdldFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVycygpLmFkZChoYW5kbGVyKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCSAgIHJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PElWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcj4gZ2V0VmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJzKCkgewotCQlpZiAoX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVycyA9PSBudWxsKQotCQkJX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyPigpOwotCQlyZXR1cm4gX3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyczsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRFeHRlbmRlZFR5cGUoT2JqZWN0IHNlbGVjdGlvbikgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIgaGFuZGxlciA6IGdldFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVycygpKSB7Ci0JCQlyZXN1bHQgPSBoYW5kbGVyLmdldEJhc2VWYWxpZGF0aW9uVHlwZShzZWxlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JBY3Rpb25GaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yQWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjQxYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JBY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlICJhY3Rpb24iIGF0dHJpYnV0ZSBpbiB0aGUgdmFsaWRhdG9yJ3MgcGx1Z2luLnhtbCBjb250cmlidXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JBY3Rpb25GaWx0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOyAvLyROT04tTkxTLTEkIC8vIGlmIHRoZSByZXNvdXJjZSBkZWx0YSBpcyBhbiBhZGRpdGlvbjsgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHBsdWdpbi54bWwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsgLy8kTk9OLU5MUy0xJCAvLyBpZiB0aGUgcmVzb3VyY2UgZGVsdGEgaXMgYSBjaGFuZ2U7IHRoaXMgdmFsdWUgaXMgdXNlZCBpbiBwbHVnaW4ueG1sCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gImRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQgLy8gaWYgdGhlIHJlc291cmNlIGRlbHRhIGlzIGEgcmVtb3ZhbDsgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHBsdWdpbi54bWwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfQUNUSU9OUyA9IChJUmVzb3VyY2VEZWx0YS5BRERFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgfCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKTsKLQotCXByaXZhdGUgaW50IF9hY3Rpb25UeXBlID0gMDsgLy8gRGVmYXVsdCB0byAwLCBzbyB0aGF0IGlmIGFuIGludmFsaWQgZmlsdGVyIGlzIHNwZWNpZmllZCwgdGhlbiBubwotCi0JLy8gbWF0dGVyIHdoYXQgdGhlIElSZXNvdXJjZURlbHRhIGlzLCB0aGUgZGVsdGEgJiBfYWN0aW9uVHlwZSB3aWxsCi0JLy8gYWx3YXlzID09IDAuIChpLmUuLCB0aGUgcmVzb3VyY2Ugd2lsbCBuZXZlciBiZSBmaWx0ZXJlZCBpbikKLQotCXB1YmxpYyBWYWxpZGF0b3JBY3Rpb25GaWx0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBoZXhhZGVjaW1hbCBudW1iZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgdHlwZShzKSBvZiBhY3Rpb25zIHdoaWNoIHRoaXMgZmlsdGVyCi0JICogYWxsb3dzIGluLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWN0aW9uVHlwZSgpIHsKLQkJLy8gU2luY2UgSVJlc291cmNlRGVsdGEncyBjb25zdGFudHMgYXJlIGhleGFkZWNpbWFsIG51bWJlcnMsCi0JCS8vIGl0J3MgbmljZXIgdG8gcmV0dXJuIGEgY29ycmVzcG9uZGluZyBoZXhhZGVjaW1hbCwgZm9yIGJpdHdpc2UgT1IsCi0JCS8vIHRoYW4gaXQgaXMgdG8gaGF2ZSB0aHJlZSBib29sZWFuIG1ldGhvZHMgb24gdGhpcyBjbGFzcywgaS5lLiwKLQkJLy8gaXNBZGQsIGlzQ2hhbmdlLCBpc0RlbGV0ZS4KLQkJcmV0dXJuIF9hY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFBhcnNlIHRoZSBpbmNvbWluZyBzdHJpbmcsIHdoaWNoIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHRvIGRldGVybWluZSB0aGUKLQkgKiB2YWx1ZSBvZiB0aGUgYWN0aW9uVHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgc3RyaW5nIGNhbiBjb250YWluIG9uZSwgdHdvLCBvciB0aHJlZSBjb25zdGFudHMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY29uc3RhbnQsIHRoZQotCSAqIGNvbnN0YW50cyBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCi0JICogPHA+Ci0JICogVGhlc2UgYXJlIHRoZSB0aHJlZSBjb25zdGFudHM6IGFkZCwgY2hhbmdlLCBkZWxldGUuIFRoZSBvcmRlciB0aGF0IHRoZSBjb25zdGFudHMgYXJlCi0JICogc3BlY2lmaWVkIGluIGRvZXMgbm90IG1hdHRlci4gVGhlIGNvbnN0YW50cyBhcmUgY2FzZS1zZW5zaXRpdmU7IGkuZS4sIEFERCBpcyBub3QgY29uc2lkZXJlZAotCSAqIHRoZSBzYW1lIGFzIGFkZC4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGZpbHRlciBpbiBhbGwgdHlwZXMgb2YKLQkgKiBhY3Rpb25zOiBhZGQsIGNoYW5nZSwgZGVsZXRlLiAoaS5lLiwgdGhlIHNhbWUgYmVoYXZpb3VyIGNhbiBiZSBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nICJhZGQsCi0JICogY2hhbmdlLCBkZWxldGUiIGFzIHRoZSBhY3Rpb24gYXR0cmlidXRlJ3MgdmFsdWUuCi0JICogPHA+Ci0JICogSWYgdGhlIGFjdGlvbiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYW5kIG5vbmUgb2YgdGhlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCwgdGhlbiB0aGUgZmlsdGVyIGlzCi0JICogaW52YWxpZCwgYW5kIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsuIChJZiBub25lIG9mIHRoZSBhY3Rpb25zIHNob3VsZCBiZQotCSAqIGZpbHRlcmVkIGluLCB0aGVuIHRoZSBmaWx0ZXIgaXRzZWxmIHNob3VsZCBub3QgZXhpc3QuKQotCSAqIDxwPgotCSAqIElmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIGRlZmluZWQsIGFuZCBvbmUgb2YgdGhlIGNvbnN0YW50cyBpcyBkZWZpbmVkLCB0aGVuIHRoZSBmb3JtIG9mIHRoZQotCSAqIGFjdGlvbiBzaG91bGQgYmUgbGlrZSB0aGlzOiA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJhZGQiLz4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBhbmQgbW9yZSB0aGFuIG9uZSBjb25zdGFudCBpcyBkZWZpbmVkLCB0aGVuIHRoZSBmb3JtIG9mCi0JICogdGhlIGFjdGlvbiBzaG91bGQgYmUgbGlrZSB0aGlzOiA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJhZGQsIGRlbGV0ZSIvPgotCSAqIDxwPgotCSAqIElmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIGRlZmluZWQsIGFuZCBhbiB1bmtub3duIGNvbnN0YW50IGlzIGRlZmluZWQsIHRoZW4gdGhlIHVua25vd24KLQkgKiBjb25zdGFudCB3aWxsIGJlIGlnbm9yZWQuIEZvciBleGFtcGxlLCA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJBREQsIGRlbGV0ZSIvPiA8YnI+Ci0JICogaXMgdGhlIHNhbWUgYXMgc3BlY2lmeWluZyA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJkZWxldGUiLz4gPGJyPgotCSAqIGFuZCBpZiBhbGwgb2YgdGhlIGNvbnN0YW50cyBhcmUgdW5rbm93biwgdGhlIGZpbHRlciBpcyBpbnZhbGlkLCBhbmQgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZQotCSAqIFZhbGlkYXRpb24gRnJhbWV3b3JrLiBlLmcuLCA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJBREQsIERFTEVURSIvPiA8YnI+Ci0JICogaXMgdGhlIHNhbWUgYXMgbm90IHNwZWNpZnlpbmcgYSBmaWx0ZXIuCi0JICogPHA+Ci0JICogSWYgdGhlIGFjdGlvbiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYW5kIGEgY29uc3RhbnQgaXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSwgdGhlIGV4dHJhCi0JICogY29uc3RhbnQgaXMgaWdub3JlZC4gRm9yIGV4YW1wbGUsIDxicj4KLQkgKiAmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7ZmlsdGVyIC4uLiBhY3Rpb249ImFkZCwgY2hhbmdlLCBhZGQiLz4gPGJyPgotCSAqIGlzIHRoZSBzYW1lIGFzIHNwZWNpZnlpbmcgPGJyPgotCSAqICZuYnNwOyZuYnNwOyZuYnNwOyZsdDtmaWx0ZXIgLi4uIGFjdGlvbj0iYWRkLCBjaGFuZ2UiLz4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25UeXBlcyhTdHJpbmcgYWN0aW9ucykgewotCQlpZiAoYWN0aW9ucyA9PSBudWxsKSB7Ci0JCQkvLyB1c2VyIGhhcyBub3QgZGVmaW5lZCB0aGUgImFjdGlvbiIgZWxlbWVudCwgc28gZGVmYXVsdCB0byBldmVyeXRoaW5nCi0JCQlfYWN0aW9uVHlwZSA9IEFMTF9BQ1RJT05TOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFjdGlvbnMsIENPTU1BLCBmYWxzZSk7IC8vIGZhbHNlIG1lYW5zIGRvbid0Ci0JCS8vIHJldHVybiB0aGUgY29tbWEKLQkJLy8gYXMgcGFydCBvZiB0aGUKLQkJLy8gc3RyaW5nCi0JCWludCBpc0FkZCA9IDA7Ci0JCWludCBpc0NoYW5nZSA9IDA7Ci0JCWludCBpc0RlbGV0ZSA9IDA7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgbmV4dEFjdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAobmV4dEFjdGlvbi5lcXVhbHMoQUREKSkgewotCQkJCWlzQWRkID0gSVJlc291cmNlRGVsdGEuQURERUQ7Ci0JCQl9IGVsc2UgaWYgKG5leHRBY3Rpb24uZXF1YWxzKENIQU5HRSkpIHsKLQkJCQlpc0NoYW5nZSA9IElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQl9IGVsc2UgaWYgKG5leHRBY3Rpb24uZXF1YWxzKERFTEVURSkpIHsKLQkJCQlpc0RlbGV0ZSA9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQl9Ci0JCX0KLQkJX2FjdGlvblR5cGUgPSBpc0FkZCB8IGlzQ2hhbmdlIHwgaXNEZWxldGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJZmluYWwgU3RyaW5nIE9OID0gIm9uIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgT0ZGID0gIm9mZiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiICAgICBBY3Rpb25GaWx0ZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiICAgICAgICAgIGFkZDogIiArICgoKGdldEFjdGlvblR5cGUoKSAmIElSZXNvdXJjZURlbHRhLkFEREVEKSAhPSAwKSA/IE9OIDogT0ZGKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiICAgICAgICAgIGNoYW5nZTogIiArICgoKGdldEFjdGlvblR5cGUoKSAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpICE9IDApID8gT04gOiBPRkYpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCIgICAgICAgICAgZGVsZXRlOiAiICsgKCgoZ2V0QWN0aW9uVHlwZSgpICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgPyBPTiA6IE9GRikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MWEyMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHBsdWdpbi54bWwgdGFncywgZm9yIGEgdmFsaWRhdG9yLCBmb3IgYm90aCBuYW1lIGZpbHRlcnMgYW5kIHR5cGUKLSAqIGZpbHRlcnMuIGkuZS4sIGlmIGFuIG9iamVjdCBoYXMgbmFtZSBmaWx0ZXIgYW5kIHR5cGUgZmlsdGVyIHNwZWNpZmllZCwgdGhlIGZpbHRlciBmaWx0ZXJzIG91dAotICogb2JqZWN0cyB3aGljaCBhcmUgbm90IGJvdGggb2YgdGhhdCB0eXBlIGFuZCBuYW1lZCBsaWtlIHRoZSBmaWx0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JGaWx0ZXIgewotCXByaXZhdGUgVmFsaWRhdG9yTmFtZUZpbHRlciBfbmFtZUZpbHRlcjsKLQlwcml2YXRlIFZhbGlkYXRvclR5cGVGaWx0ZXIgX3R5cGVGaWx0ZXI7Ci0JcHJpdmF0ZSBWYWxpZGF0b3JBY3Rpb25GaWx0ZXIgX2FjdGlvbkZpbHRlcjsKLQotCVZhbGlkYXRvckZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJX25hbWVGaWx0ZXIgPSBuZXcgVmFsaWRhdG9yTmFtZUZpbHRlcigpOwotCQlfdHlwZUZpbHRlciA9IG5ldyBWYWxpZGF0b3JUeXBlRmlsdGVyKCk7Ci0JCV9hY3Rpb25GaWx0ZXIgPSBuZXcgVmFsaWRhdG9yQWN0aW9uRmlsdGVyKCk7Ci0JfQotCi0JVmFsaWRhdG9yRmlsdGVyKFN0cmluZyBtdXN0SW1wbGVtZW50Q2xhc3MpIHsKLQkJdGhpcygpOwotCQlfbmFtZUZpbHRlciA9IG5ldyBWYWxpZGF0b3JOYW1lRmlsdGVyKCk7Ci0JCV90eXBlRmlsdGVyLnNldE11c3RJbXBsZW1lbnRDbGFzcyhtdXN0SW1wbGVtZW50Q2xhc3MpOwotCQlfYWN0aW9uRmlsdGVyID0gbmV3IFZhbGlkYXRvckFjdGlvbkZpbHRlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZUFjdGlvbihpbnQgcmVzb3VyY2VEZWx0YSkgewotCQlyZXR1cm4gKChyZXNvdXJjZURlbHRhICYgX2FjdGlvbkZpbHRlci5nZXRBY3Rpb25UeXBlKCkpICE9IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UncyBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgZmlsdGVyLgotCSAqIAotCSAqIGUuZy4gaWYgdGhlIG5hbWUgZmlsdGVyIGlzICIqLmphdmEiLCBhbmQgdGhpcyByZXNvdXJjZSBpcyAicmVhZG1lLnR4dCIsIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiByZXR1cm4gZmFsc2UuIElmIHRoZSByZXNvdXJjZSBpcyBuYW1lZCAicmVhZG1lLmphdmEiLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlLgotCSAqLwotCWJvb2xlYW4gaXNBcHBsaWNhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIF9uYW1lRmlsdGVyLmlzQXBwbGljYWJsZU5hbWUocmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UncyB0eXBlIG1hdGNoZXMgdGhlIHR5cGUgZmlsdGVyLgotCSAqIAotCSAqIGUuZy4gaWYgdGhlIHR5cGUgZmlsdGVyIGlzICJJRmlsZSIsIGFuZCB0aGlzIHJlc291cmNlIGlzICJJUHJvamVjdCIsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuCi0JICogZmFsc2UuIElmIHRoZSByZXNvdXJjZSBpcyBhbiBJRmlsZSwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlib29sZWFuIGlzQXBwbGljYWJsZVR5cGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBfdHlwZUZpbHRlci5pc0FwcGxpY2FibGVUeXBlKHJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25GaWx0ZXIoU3RyaW5nIGFjdGlvbnMpIHsKLQkJX2FjdGlvbkZpbHRlci5zZXRBY3Rpb25UeXBlcyhhY3Rpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIGZpbHRlci4KLQkgKi8KLQl2b2lkIHNldE5hbWVGaWx0ZXIoU3RyaW5nIGZpbHRlciwgU3RyaW5nIGlzQ2FzZVNlbnNpdGl2ZVN0cmluZykgewotCQlfbmFtZUZpbHRlci5zZXROYW1lRmlsdGVyKGZpbHRlcik7Ci0JCWlmKGZpbHRlciAhPSBudWxsKQotCQkJICBfbmFtZUZpbHRlci5zZXROYW1lRmlsdGVyRXh0ZW5zaW9uKGdldEZpbHRlckV4dChmaWx0ZXIpKTsKLQkJX25hbWVGaWx0ZXIuc2V0Q2FzZVNlbnNpdGl2ZShpc0Nhc2VTZW5zaXRpdmVTdHJpbmcpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRGaWx0ZXJFeHQoU3RyaW5nIGZpbHRlcikgewotCQlyZXR1cm4gZmlsdGVyLnN1YnN0cmluZyhmaWx0ZXIuaW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlIGZpbHRlci4KLQkgKi8KLQl2b2lkIHNldFR5cGVGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotCQlfdHlwZUZpbHRlci5zZXRUeXBlRmlsdGVyKGZpbHRlcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJZmluYWwgU3RyaW5nIGxpbmVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiVmFsaWRhdG9yRmlsdGVyOiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQobGluZVNlcCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAgICAgbmFtZUZpbHRlciA9ICIgKyBfbmFtZUZpbHRlcik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChsaW5lU2VwKTsKLQkJYnVmZmVyLmFwcGVuZCgiICAgICB0eXBlRmlsdGVyID0gIiArIF90eXBlRmlsdGVyKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGxpbmVTZXApOwotCQlidWZmZXIuYXBwZW5kKCIgICAgIGFjdGlvbkZpbHRlciA9ICIgKyBfYWN0aW9uRmlsdGVyKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGxpbmVTZXApOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBfbmFtZUZpbHRlci4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTmFtZUZpbHRlciBnZXRfbmFtZUZpbHRlcigpIHsKLQkJcmV0dXJuIF9uYW1lRmlsdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTWV0YURhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyNmJmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvck1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyBpbmZvcm1hdGlvbiwgYXMgc3BlY2lmaWVkIGJ5IGEgdmFsaWRhdG9yJ3MgcGx1Z2luLnhtbCB0YWdzLiBUaGVyZSBpcyBvbmUKLSAqIFZhbGlkYXRvck1ldGFEYXRhIGZvciBlYWNoIFZhbGlkYXRvci4gTm8gVmFsaWRhdG9yIHNob3VsZCBhdHRlbXB0IHRvIGFjY2VzcyBpdHMKLSAqIFZhbGlkYXRvck1ldGFEYXRhOyBpdCBpcyBmb3IgdXNlIGJ5IHRoZSBiYXNlIGZyYW1ld29yayBvbmx5LgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGEgewotCXByaXZhdGUgZmluYWwgVmFsaWRhdG9yRmlsdGVyW10gX2ZpbHRlcnM7Ci0JcHJpdmF0ZSBmaW5hbCBWYWxpZGF0b3JOYW1lRmlsdGVyW10gCV9wcm9qZWN0TmF0dXJlRmlsdGVyczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdCQkJX2ZhY2V0RmlsdGVyczsKLQlwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxJVmFsaWRhdG9yPglfdmFsaWRhdG9yID0gbmV3IEF0b21pY1JlZmVyZW5jZTxJVmFsaWRhdG9yPigpOwotCXByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPElXb3JrYmVuY2hDb250ZXh0PiAJCV9oZWxwZXIgPSBuZXcgQXRvbWljUmVmZXJlbmNlPElXb3JrYmVuY2hDb250ZXh0PigpOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIAkJCV92YWxpZGF0b3JEaXNwbGF5TmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyAJCQlfdmFsaWRhdG9yVW5pcXVlTmFtZTsKLQkKLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBjbGFzcyBuYW1lcyBvZiBldmVyeSB2YWxpZGF0b3Igd2hpY2ggdGhpcyB2YWxpZGF0b3IgYWdncmVnYXRlcy4gRm9yCi0JICogZXhhbXBsZSwgaWYgdGhlIEVKQiBWYWxpZGF0b3IgaW5zdGFudGlhdGVkIGFub3RoZXIgdmFsaWRhdG9yLCBhbmQgc3RhcnRlZCBpdHMgdmFsaWRhdGUKLQkgKiBtZXRob2QsIHRoZW4gdGhhdCBpbnN0YW50aWF0ZWQgY2xhc3MnIG5hbWUgc2hvdWxkIGJlIGluIHRoaXMgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIAlfYWdncmVnYXRlZFZhbGlkYXRvcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSAJX2NvbnRlbnRUeXBlSWRzOwotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gCV92YWxpZGF0b3JOYW1lczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyAJX3BsdWdpbklkOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbglfc3VwcG9ydHNJbmNyZW1lbnRhbDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gCV9zdXBwb3J0c0Z1bGxCdWlsZDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gCV9pc0VuYWJsZWRCeURlZmF1bHQ7Ci0JcHJpdmF0ZSBmaW5hbCBNaWdyYXRpb25NZXRhRGF0YSBfbWlncmF0aW9uTWV0YURhdGE7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgCQlfcnVsZUdyb3VwOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiAJX2FzeW5jOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiAJX2RlcGVuZGVudFZhbGlkYXRvcjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdCV9tYXJrZXJJZHM7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgCV9oZWxwZXJDbGFzc05hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgX2hlbHBlckNsYXNzRWxlbWVudDsKLQlwcml2YXRlIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBfdmFsaWRhdG9yQ2xhc3NFbGVtZW50OwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiAJX2Nhbm5vdExvYWQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIAlfbWFudWFsVmFsaWRhdGlvbiA9IHRydWU7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuCV9idWlsZFZhbGlkYXRpb24gPSB0cnVlOwotCXByaXZhdGUgZmluYWwgTWFwPElWYWxpZGF0b3JKb2IsIElXb3JrYmVuY2hDb250ZXh0PiBfaGVscGVycyA9IAotCQlDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIG5ldyBIYXNoTWFwPElWYWxpZGF0b3JKb2IsIElXb3JrYmVuY2hDb250ZXh0PigpICk7Ci0JcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uIAkJX2VuYWJsZW1lbnRFeHByZXNzaW9uOwotCi0JVmFsaWRhdG9yTWV0YURhdGEoYm9vbGVhbiBhc3luYywgU3RyaW5nW10gYWdncmVnYXRlZFZhbGlkYXRvcnMsIGJvb2xlYW4gaXNFbmFibGVkQnlEZWZhdWx0LCBib29sZWFuIHN1cHBvcnRzSW5jcmVtZW50YWwsCi0JCQlib29sZWFuIHN1cHBvcnRzRnVsbEJ1aWxkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgaGVscGVyQ2xhc3NFbGVtZW50LCBTdHJpbmcgaGVscGVyQ2xhc3NOYW1lLCAKLQkJCU1pZ3JhdGlvbk1ldGFEYXRhIG1pZ3JhdGlvbk1ldGFEYXRhLCBTdHJpbmcgcGx1Z2luSWQsIGludCBydWxlR3JvdXAsIElDb25maWd1cmF0aW9uRWxlbWVudCB2YWxpZGF0b3JDbGFzc0VsZW1lbnQsCi0JCQlTdHJpbmcgdmFsaWRhdG9yRGlzcGxheU5hbWUsIFN0cmluZyB2YWxpZGF0b3JVbmlxdWVOYW1lLCBTdHJpbmdbXSBjb250ZW50VHlwZUlkcywgYm9vbGVhbiBkZXBlbmRlbnRWYWxpZGF0b3IsCi0JCQlFeHByZXNzaW9uIGVuYWJsZW1lbnRFeHByZXNzaW9uLCBTdHJpbmdbXSBmYWNldEZpbHRlcnMsIFZhbGlkYXRvckZpbHRlcltdIGZpbHRlcnMsCi0JCQlWYWxpZGF0b3JOYW1lRmlsdGVyW10gcHJvamVjdE5hdHVyZUZpbHRlcnMsIFN0cmluZ1tdIG1hcmtlcklkcykgewotCQlfYXN5bmMgPSBhc3luYzsKLQkJX2FnZ3JlZ2F0ZWRWYWxpZGF0b3JzID0gYWdncmVnYXRlZFZhbGlkYXRvcnM7Ci0JCV9pc0VuYWJsZWRCeURlZmF1bHQgPSBpc0VuYWJsZWRCeURlZmF1bHQ7Ci0JCV9zdXBwb3J0c0luY3JlbWVudGFsID0gc3VwcG9ydHNJbmNyZW1lbnRhbDsKLQkJX3N1cHBvcnRzRnVsbEJ1aWxkID0gc3VwcG9ydHNGdWxsQnVpbGQ7Ci0JCV9oZWxwZXJDbGFzc0VsZW1lbnQgPSBoZWxwZXJDbGFzc0VsZW1lbnQ7Ci0JCV9oZWxwZXJDbGFzc05hbWUgPSBoZWxwZXJDbGFzc05hbWU7Ci0JCV9taWdyYXRpb25NZXRhRGF0YSA9IG1pZ3JhdGlvbk1ldGFEYXRhOwotCQlfcGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJX3J1bGVHcm91cCA9IHJ1bGVHcm91cDsKLQkJX3ZhbGlkYXRvckNsYXNzRWxlbWVudCA9IHZhbGlkYXRvckNsYXNzRWxlbWVudDsKLQkJX3ZhbGlkYXRvckRpc3BsYXlOYW1lID0gdmFsaWRhdG9yRGlzcGxheU5hbWU7Ci0JCV92YWxpZGF0b3JVbmlxdWVOYW1lID0gdmFsaWRhdG9yVW5pcXVlTmFtZTsKLQkJX2NvbnRlbnRUeXBlSWRzID0gY29udGVudFR5cGVJZHM7Ci0JCV9kZXBlbmRlbnRWYWxpZGF0b3IgPSBkZXBlbmRlbnRWYWxpZGF0b3I7Ci0JCV9lbmFibGVtZW50RXhwcmVzc2lvbiA9IGVuYWJsZW1lbnRFeHByZXNzaW9uOwotCQlfZmFjZXRGaWx0ZXJzID0gZmFjZXRGaWx0ZXJzOwotCQlfZmlsdGVycyA9IGZpbHRlcnM7Ci0JCV9wcm9qZWN0TmF0dXJlRmlsdGVycyA9IHByb2plY3ROYXR1cmVGaWx0ZXJzOwotCQlfbWFya2VySWRzID0gbWFya2VySWRzOwotCQlfdmFsaWRhdG9yTmFtZXMgPSBidWlsZFZhbGlkYXRvck5hbWVzKCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmFjZXRGaWx0ZXJzKCkgewotCQlyZXR1cm4gX2ZhY2V0RmlsdGVyczsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWVGaWx0ZXJzKCkgewotCQlMaXN0PFN0cmluZz4gbmFtZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKF9maWx0ZXJzICE9IG51bGwgJiYgX2ZpbHRlcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChWYWxpZGF0b3JGaWx0ZXIgZmlsdGVyIDogX2ZpbHRlcnMpIHsKLQkJCQlWYWxpZGF0b3JOYW1lRmlsdGVyIG5hbWVGaWx0ZXIgPSBmaWx0ZXIuZ2V0X25hbWVGaWx0ZXIoKTsKLQkJCQlpZiAobmFtZUZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCW5hbWVGaWx0ZXJzLmFkZChuYW1lRmlsdGVyLmdldE5hbWVGaWx0ZXIoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lRmlsdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgY2xhc3MgbmFtZXMgb2YgdGhlIHByaW1hcnkgdmFsaWRhdG9yIGFuZCBpdHMgYWdncmVnYXRlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdG9yTmFtZXMoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yTmFtZXM7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRWYWxpZGF0b3JOYW1lcygpIHsKLQkJaW50IGFMZW5ndGggPSAoX2FnZ3JlZ2F0ZWRWYWxpZGF0b3JzID09IG51bGwpID8gMCA6IF9hZ2dyZWdhdGVkVmFsaWRhdG9ycy5sZW5ndGg7Ci0JCVN0cmluZyBbXSB2YWxpZGF0b3JOYW1lcyA9IG5ldyBTdHJpbmdbYUxlbmd0aCArIDFdOyAvLyBhZGQgMSBmb3IgdGhlIHByaW1hcnkgdmFsaWRhdG9yIG5hbWUKLQkJdmFsaWRhdG9yTmFtZXNbMF0gPSBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JCWlmIChfYWdncmVnYXRlZFZhbGlkYXRvcnMgIT0gbnVsbCkgewotCQkJU3lzdGVtLmFycmF5Y29weShfYWdncmVnYXRlZFZhbGlkYXRvcnMsIDAsIHZhbGlkYXRvck5hbWVzLCAxLCBhTGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdG9yTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGNsYXNzIG5hbWVzIG9mIGV2ZXJ5IHZhbGlkYXRvciB3aGljaCB0aGlzIHZhbGlkYXRvciBhZ2dyZWdhdGVzLiBGb3IKLQkgKiBleGFtcGxlLCBpZiB0aGUgRUpCIFZhbGlkYXRvciBpbnN0YW50aWF0ZWQgYW5vdGhlciB2YWxpZGF0b3IsIGFuZCBzdGFydGVkIGl0cyB2YWxpZGF0ZQotCSAqIG1ldGhvZCwgdGhlbiB0aGF0IGluc3RhbnRpYXRlZCBjbGFzcycgbmFtZSBzaG91bGQgYmUgaW4gdGhpcyBsaXN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRBZ2dyZWdhdGVkVmFsaWRhdG9yTmFtZXMoKSB7Ci0JCXJldHVybiBfYWdncmVnYXRlZFZhbGlkYXRvcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lL3R5cGUgZmlsdGVyIHBhaXJzLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JGaWx0ZXJbXSBnZXRGaWx0ZXJzKCkgewotCQlyZXR1cm4gX2ZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyB2bWQncyBoZWxwZXIgYW5kIHZhbGlkYXRvciBoYXZlIGJlZW4gaW5zdGFudGlhdGVkLCBhbmQgYWxzbyBpZiB0aGlzCi0JICogdmFsaWRhdG9yJ3MgcGx1Z2luIGlzIGFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJaWYgKF9oZWxwZXJDbGFzc0VsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKF92YWxpZGF0b3JDbGFzc0VsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShfcGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlyZXR1cm4gYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlmIHRoZSBoZWxwZXIgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgZS5nLiwKLQkgKiBpZiB0aGUgaGVscGVyJ3MgcGx1Z2luIGlzIGRpc2FibGVkIGZvciBzb21lIHJlYXNvbi4gQmVmb3JlIHRoZSBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlzCi0JICogdGhyb3duLCB0aGlzIHZhbGlkYXRvciB3aWxsIGJlIGRpc2FibGVkLgotCSAqIAotCSAqIFRoZSBJV29ya2JlbmNoQ29udGV4dCBtdXN0IEFMV0FZUyBoYXZlIGl0cyBwcm9qZWN0IHNldCBiZWZvcmUgaXQgaXMgdXNlZDsgYnV0IGl0IGNhbid0IGJlCi0JICogY3JlYXRlZCB3aXRoIHRoZSBJUHJvamVjdC4gU28sIGJlZm9yZSB1c2luZyB0aGUgc2luZ2xlIGluc3RhbmNlLCBhbHdheXMgaW5pdGlhbGl6ZSB0aGF0Ci0JICogaW5zdGFuY2Ugd2l0aCB0aGUgSVByb2plY3QuCi0JICogCi0JICogSWYgdGhpcyB2YWxpZGF0b3Igc3VwcG9ydHMgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24sIHRoZW4gaW5zdGVhZCBvZiBtYWludGFpbmluZyBhIHNpbmdsZSB0aGUKLQkgKiBoZWxwZXIgaW5zdGFuY2UsIGNyZWF0ZSBhIG5ldyBJV29ya2JlbmNoQ29udGV4dCBpbnN0YW5jZSBldmVyeSB0aW1lIHRoYXQgdGhlIGhlbHBlciBpcyBuZWVkZWQuCi0JICogVGhpcyBmZWF0dXJlIGlzIHByb3ZpZGVkIGJlY2F1c2Ugc2V2ZXJhbCB2YWxpZGF0aW9uIFJ1bm5hYmxlcyBtYXkgYmUgcXVldWVkIHRvIHJ1biwgYW5kIGlmCi0JICogdGhvc2UgUnVubmFibGVzJ3MgcHJvamVjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCB2YWxpZGF0aW9uJ3MgcHJvamVjdCwgdGhlbiB0aGUKLQkgKiBjdXJyZW50IHZhbGlkYXRpb24gd2lsbCBzdWRkZW5seSBzdGFydCB2YWxpZGF0aW5nIGFub3RoZXIgcHJvamVjdC4KLQkgKi8KLQkvL1RPRE8ganVzdCB3YW50IHRvIHJlbWVtYmVyIHRvIGZpZ3VyZSBvdXQgdGhlIG1hbnktdGVtcG9yYXJ5LW9iamVjdHMgcHJvYmxlbSBpZiB0aGlzIG1ldGhvZAotCS8vIGNvbnRpbnVlcyB0byBuZXcgYW4gSVZhbGlkYXRpb25Db250ZXh0IGV2ZXJ5IHRpbWUgLSBSdXRoCi0JcHVibGljIElXb3JrYmVuY2hDb250ZXh0IGdldEhlbHBlcihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IF9oZWxwZXIuZ2V0KCk7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCl7Ci0JCQlJUHJvamVjdCBvbGRQcm9qZWN0ID0gaGVscGVyLmdldFByb2plY3QoKTsKLQkJCWlmICgob2xkUHJvamVjdCA9PSBudWxsKSB8fCAhKG9sZFByb2plY3QuZXF1YWxzKHByb2plY3QpKSloZWxwZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJCXJldHVybiBoZWxwZXI7Ci0JCX0KLQkJCi0JCWhlbHBlciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5jcmVhdGVIZWxwZXIoX2hlbHBlckNsYXNzRWxlbWVudCwgX2hlbHBlckNsYXNzTmFtZSk7Ci0JCWlmIChoZWxwZXIgPT0gbnVsbCloZWxwZXIgPSBuZXcgV29ya2JlbmNoQ29udGV4dCgpOwotCQkKLQkJaWYgKChoZWxwZXIuZ2V0UHJvamVjdCgpID09IG51bGwpIHx8ICEoaGVscGVyLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpKSB7Ci0JCQloZWxwZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJfQotCQlpZiAoX2hlbHBlci5jb21wYXJlQW5kU2V0KG51bGwsIGhlbHBlcikpcmV0dXJuIGhlbHBlcjsKLQkJcmV0dXJuIF9oZWxwZXIuZ2V0KCk7Ci0JfQotCi0JLyoqCi0JICogY2Fubm90TG9hZCBpcyBmYWxzZSBpZiBib3RoIHRoZSBJVmFsaWRhdG9yIGFuZCBJV29ya2JlbmNoQ29udGV4dCBpbnN0YW5jZSBjYW4gYmUgaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDYW5ub3RMb2FkKCkgewotCQlfY2Fubm90TG9hZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGZhbHNlIGlmIGJvdGggdGhlIElWYWxpZGF0b3IgYW5kIElXb3JrYmVuY2hDb250ZXh0IGluc3RhbmNlIGNhbiBiZSBpbnN0YW50aWF0ZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2Fubm90TG9hZCgpIHsKLQkJcmV0dXJuIF9jYW5ub3RMb2FkOwotCX0KLQotCXB1YmxpYyBNaWdyYXRpb25NZXRhRGF0YSBnZXRNaWdyYXRpb25NZXRhRGF0YSgpIHsKLQkJcmV0dXJuIF9taWdyYXRpb25NZXRhRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElSdWxlR3JvdXAgaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGdyb3VwcyBvZiBydWxlcyB0aGlzIHZhbGlkYXRvciByZWNvZ25pemVzLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UnVsZUdyb3VwKCkgewotCQlyZXR1cm4gX3J1bGVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbHRlcnMgd2hpY2ggaWRlbnRpZnkgd2hpY2ggcHJvamVjdChzKSB0aGlzIHZhbGlkYXRvciBtYXkgcnVuIG9uLgotCSAqLwotCVZhbGlkYXRvck5hbWVGaWx0ZXJbXSBnZXRQcm9qZWN0TmF0dXJlRmlsdGVycygpIHsKLQkJcmV0dXJuIF9wcm9qZWN0TmF0dXJlRmlsdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSB2YWxpZGF0b3IgaWYgaXQgY2FuIGJlIGxvYWRlZDsgaWYgdGhlIHZhbGlkYXRvciBjYW5ub3QgYmUgbG9hZGVkLAotCSAqIGUuZy4sIGlmIGl0cyBwbHVnaW4gaXMgZGlzYWJsZWQgZm9yIHNvbWUgcmVhc29uLCB0aGVuIHRoaXMgbWV0aG9kIHRocm93cyBhbgotCSAqIEluc3RhbnRpYXRpb25FeGNlcHRpb24uIEJlZm9yZSB0aGUgQ29yZUV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoaXMgdmFsaWRhdG9yIGlzIGRpc2FibGVkLgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJSVZhbGlkYXRvciB2YWwgPSBfdmFsaWRhdG9yLmdldCgpOwotCQlpZiAodmFsICE9IG51bGwpcmV0dXJuIHZhbDsKLQkJCi0JCXZhbCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5jcmVhdGVWYWxpZGF0b3IoX3ZhbGlkYXRvckNsYXNzRWxlbWVudCwgZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQotCQlpZiAodmFsID09IG51bGwpIHsKLQkJCXNldENhbm5vdExvYWQoKTsKLQkJCXRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfRElTQUJMRVYsIG5ldyBTdHJpbmdbXXtnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCl9KSk7Ci0JCX0KLQkJaWYgKF92YWxpZGF0b3IuY29tcGFyZUFuZFNldChudWxsLCB2YWwpKXJldHVybiB2YWw7Ci0JCXJldHVybiBfdmFsaWRhdG9yLmdldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yRGlzcGxheU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvclVuaXF1ZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHJlc291cmNlIGlzIGFwcGxpY2FibGUgdG8gdGhlIFZhbGlkYXRvciB3aGljaCB0aGlzIFZhbGlkYXRvck1ldGFEYXRhIGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoLCByZXR1cm4gdHJ1ZTsgZWxzZSByZXR1cm4gZmFsc2UuCi0JICogCi0JICogQSByZXNvdXJjZSBpcyBhcHBsaWNhYmxlIGlmIGl0IHBhc3NlcyB0aGUgbmFtZS90eXBlIGZpbHRlcnMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiB0aGVyZQotCSAqIGlzIG5vIHJlc291cmNlIGRlbHRhIChpLmUuLCBhIGZ1bGwgdmFsaWRhdGlvbikuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlVG8oSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBpc0FwcGxpY2FibGVUbyhyZXNvdXJjZSwgVmFsaWRhdG9yQWN0aW9uRmlsdGVyLkFMTF9BQ1RJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgcmVzb3VyY2UgaXMgYXBwbGljYWJsZSB0byB0aGUgVmFsaWRhdG9yIHdoaWNoIHRoaXMgVmFsaWRhdG9yTWV0YURhdGEgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgsIHJldHVybiB0cnVlOyBlbHNlIHJldHVybiBmYWxzZS4KLQkgKiAKLQkgKiBBIHJlc291cmNlIGlzIGFwcGxpY2FibGUgaWYgaXQgcGFzc2VzIHRoZSBuYW1lL3R5cGUgZmlsdGVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVUbyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZURlbHRhKSB7Ci0JCS8vIElmIG5vIGZpbHRlcnMgYXJlIHNwZWNpZmllZCwgdGhlbiBldmVyeSB0eXBlIG9mIHJlc291cmNlIHNob3VsZCBiZSB2YWxpZGF0ZWQvdHJpZ2dlciBhCi0JCS8vIHJlYnVpbGQgb2YgdGhlIG1vZGVsIGNhY2hlLgotCQkvLyBBbHNvIG1ha2Ugc3VyZSBubyBjb250ZW50IHR5cGUgaWQgaXMgc3BlY2lmaWVkIChCVUcgMTkzODE2KQotCQlpZiAoX2ZpbHRlcnMgPT0gbnVsbCAgJiYgZ2V0Q29udGVudFR5cGVJZHMoKSA9PSBudWxsKXJldHVybiB0cnVlOwotCi0JCXJldHVybiBpc0FwcGxpY2FibGVUbyhyZXNvdXJjZSwgcmVzb3VyY2VEZWx0YSwgX2ZpbHRlcnMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBwYXNzZXMgdGhlIG5hbWUvdHlwZSBmaWx0ZXJzIGZvciB0aGlzIHZhbGlkYXRvci4KLQkgKi8KLQlib29sZWFuIGlzQXBwbGljYWJsZVRvKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlc291cmNlRGVsdGEsIFZhbGlkYXRvckZpbHRlcltdIGZpbHRlcnMpIHsKLQkJLy8gQXJlIGFueSBvZiB0aGUgZmlsdGVycyBzYXRpc2ZpZWQ/IChpLmUuLCBPUiB0aGVtLCBub3QgQU5EIHRoZW0uKQotCQkvLyBtYWtlIHN1cmUgZmlsdGVycyBpcyBub3QgbnVsbCAoQlVHIDE5MzgxNikKLQkJaWYgKGZpbHRlcnMgIT0gbnVsbCAmJiBjaGVja0lmVmFsaWRTb3VyY2VGaWxlKHJlc291cmNlKSkgewotCQkJZm9yIChWYWxpZGF0b3JGaWx0ZXIgZmlsdGVyIDogZmlsdGVycykgewotCQkJCWlmIChmaWx0ZXIuaXNBcHBsaWNhYmxlVHlwZShyZXNvdXJjZSkKLQkJCQkJCSYmIGZpbHRlci5pc0FwcGxpY2FibGVOYW1lKHJlc291cmNlKQotCQkJCQkJJiYgZmlsdGVyLmlzQXBwbGljYWJsZUFjdGlvbihyZXNvdXJjZURlbHRhKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGdldENvbnRlbnRUeXBlSWRzKCkgIT0gbnVsbCkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQkJCWRlc2NyaXB0aW9uID0gKChJRmlsZSkgcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9SZXNvdXJjZSBleGNlcHRpb25zCi0JCQl9Ci0JCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoaXNBcHBsaWNhYmxlQ29udGVudFR5cGUoZGVzY3JpcHRpb24pKXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tJZlZhbGlkU291cmNlRmlsZShJUmVzb3VyY2UgZmlsZSkgewotCQlpZiAoZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCUlQcm9qZWN0VmFsaWRhdGlvbkhlbHBlciBoZWxwZXIgPSBWYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRWYWxpZGF0aW9uSGVscGVyKCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAoaGVscGVyID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJSUNvbnRhaW5lcltdIG91dHB1dENvbnRhaW5lcnMgPSBoZWxwZXIuZ2V0T3V0cHV0Q29udGFpbmVycyhwcm9qZWN0KTsKLQkJCUlDb250YWluZXJbXSBzb3VyY2VDb250YWluZXJzID0gaGVscGVyLmdldFNvdXJjZUNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCQlpZihvdXRwdXRDb250YWluZXJzICE9IG51bGwgJiYgc291cmNlQ29udGFpbmVycyAhPSBudWxsKXsKLQkJCWZvciAoaW50IGk9MDsgaTxvdXRwdXRDb250YWluZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG91dHB1dFBhdGggPSBvdXRwdXRDb250YWluZXJzW2ldLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgob3V0cHV0UGF0aCkpIHsKLQkJCQkJLy9UaGUgZmlsZSBpcyBpbiBhbiBvdXRwdXQgY29udGFpbmVyLgotCQkJCQkvL0lmIGl0IGlzIGEgc291cmNlIGNvbnRhaW5lciByZXR1cm4gdHJ1ZSBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotCQkJCQlmb3IgKGludCBqPTA7ajxzb3VyY2VDb250YWluZXJzLmxlbmd0aDsgaisrKSB7Ci0JICAgICAgICAgICAgICAgICAgICBpZihvdXRwdXRDb250YWluZXJzW2ldLmVxdWFscyhzb3VyY2VDb250YWluZXJzW2pdKSl7Ci0JICAgICAgICAgICAgICAgICAgICAJcmV0dXJuIHRydWU7Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQotCQkKLQkvKioKLQkgKiBJZiB0aGlzIHZhbGlkYXRvciByZWNvZ25pemVzIHRoZSBwcm9qZWN0IG5hdHVyZSwgd2hldGhlciBpbmNsdWRlZCBvciBleGNsdWRlZCwgcmV0dXJuIHRoZQotCSAqIG5hbWUgZmlsdGVyIHdoaWNoIGRlc2NyaWJlcyB0aGUgbmF0dXJlLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICovCi0JVmFsaWRhdG9yTmFtZUZpbHRlciBmaW5kUHJvamVjdE5hdHVyZShTdHJpbmcgcHJvaklkKSB7Ci0JCWlmIChwcm9qSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoX3Byb2plY3ROYXR1cmVGaWx0ZXJzID09IG51bGwpIHsKLQkJCS8vIElmIG5vIHRhZyBpcyBzcGVjaWZpZWQsIHRoaXMgdmFsaWRhdG9yIGlzIGNvbmZpZ3VyZWQgb24gYWxsIElQcm9qZWN0cwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IF9wcm9qZWN0TmF0dXJlRmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTmFtZUZpbHRlciBmaWx0ZXIgPSBfcHJvamVjdE5hdHVyZUZpbHRlcnNbaV07Ci0JCQkvLyBJbiB0aGlzIGNhc2UsIHdlJ3JlIG5vdCBjaGVja2luZyBpZiB0aGUgcHJvamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmlsdGVyIGNsYXNzLAotCQkJLy8gYnV0IGlmIGl0IGhhcyB0aGUgTmF0dXJlIHNwZWNpZmllZCBpbiB0aGUgZmlsdGVyIGNsYXNzLgotCQkJU3RyaW5nIHByb2plY3ROYXR1cmVJRCA9IGZpbHRlci5nZXROYW1lRmlsdGVyKCk7Ci0JCQlpZiAocHJvaklkLmVxdWFscyhwcm9qZWN0TmF0dXJlSUQpKSB7Ci0JCQkJcmV0dXJuIGZpbHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFJhdGhlciB0aGFuIHN0b3JlIHRoZSBpcy10aGlzLXZtZC1jb25maWd1cmVkLW9uLXRoaXMtSVByb2plY3QgYWxnb3JpdGhtCi0JICogaW4gdHdvIHBsYWNlcywgcmVmZXIgYmFjayB0byB0aGUgcmVhZGVyJ3MgY2FjaGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkT25Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5pc0NvbmZpZ3VyZWRPblByb2plY3QodGhpcywgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkQnlEZWZhdWx0KCkgewotCQlyZXR1cm4gX2lzRW5hYmxlZEJ5RGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luY3JlbWVudGFsKCkgewotCQlyZXR1cm4gX3N1cHBvcnRzSW5jcmVtZW50YWw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGdWxsQnVpbGQoKSB7Ci0JCXJldHVybiBfc3VwcG9ydHNGdWxsQnVpbGQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBpcyB0aHJlYWQtc2FmZSBhbmQgY2FuIGJlIHJ1biBhc3luY2hyb25vdXNseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FzeW5jKCkgewotCQlyZXR1cm4gX2FzeW5jOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBNaWdyYXRpb25NZXRhRGF0YSB7Ci0JCXByaXZhdGUgU2V0PFN0cmluZ1tdPiBfaWRzOwotCi0JCXB1YmxpYyBNaWdyYXRpb25NZXRhRGF0YSgpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZElkKFN0cmluZyBvbGRJZCwgU3RyaW5nIG5ld0lkKSB7Ci0JCQlpZiAob2xkSWQgPT0gbnVsbClyZXR1cm47Ci0JCQlpZiAobmV3SWQgPT0gbnVsbClyZXR1cm47Ci0KLQkJCVN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbXXtvbGRJZCwgbmV3SWR9OwotCQkJZ2V0SWRzKCkuYWRkKGlkcyk7Ci0JCX0KLQotCQlwdWJsaWMgU2V0PFN0cmluZ1tdPiBnZXRJZHMoKSB7Ci0JCQlpZiAoX2lkcyA9PSBudWxsKV9pZHMgPSBuZXcgSGFzaFNldDxTdHJpbmdbXT4oKTsKLQkJCXJldHVybiBfaWRzOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBlbmRlbnRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfZGVwZW5kZW50VmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWFya2VySWQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldE1hcmtlcklkcygpIHsKLQkJcmV0dXJuIF9tYXJrZXJJZHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCdWlsZFZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBfYnVpbGRWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuIGJ1aWxkVmFsaWRhdGlvbikgewotCQlfYnVpbGRWYWxpZGF0aW9uID0gYnVpbGRWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFudWFsVmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIF9tYW51YWxWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbiBtYW51YWxWYWxpZGF0aW9uKSB7Ci0JCV9tYW51YWxWYWxpZGF0aW9uID0gbWFudWFsVmFsaWRhdGlvbjsKLQl9Ci0gIAotCS8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB2YWxpZGF0b3IgZGVzY3JpYmVkIGJ5IHRoaXMgbWV0YWRhdGEgb2JqZWN0IGlzIGEgZGVsZWdhdGluZyB2YWxpZGF0b3IuIAotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBkZXNjcmliZWQgYnkgdGhpcyBtZXRhZGF0YSBvYmplY3QgaXMgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvciwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0RlbGVnYXRpbmcoKSB7Ci0gICAgU3RyaW5nIHRhcmdldElEID0gZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotICAgIHJldHVybiBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmhhc0RlbGVnYXRlcyh0YXJnZXRJRCk7Ci0gIH0KLSAgCi0KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiAgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmNyZWF0ZVZhbGlkYXRvcihfdmFsaWRhdG9yQ2xhc3NFbGVtZW50LCBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgSVdvcmtiZW5jaENvbnRleHQgY3JlYXRlSGVscGVyKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmNyZWF0ZUhlbHBlcihfaGVscGVyQ2xhc3NFbGVtZW50LCBfaGVscGVyQ2xhc3NOYW1lKTsKLQkJaWYgKGhlbHBlciA9PSBudWxsKSB7Ci0JCQloZWxwZXIgPSBuZXcgV29ya2JlbmNoQ29udGV4dCgpOwotCQl9Ci0JCWhlbHBlci5zZXRQcm9qZWN0KHByb2plY3QpOwotCQlyZXR1cm4gaGVscGVyOwotCX0JICAKLQkKLSAgIHB1YmxpYyB2b2lkIGFkZEhlbHBlciggSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IsIElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciApewotCSAgIF9oZWxwZXJzLnB1dCggdmFsaWRhdG9yLCBoZWxwZXIgKTsKLSAgIH0KLSAgIAotICAgcHVibGljIHZvaWQgcmVtb3ZlSGVscGVyKCBJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciApewotCSAgIF9oZWxwZXJzLnJlbW92ZSggdmFsaWRhdG9yICk7Ci0gICB9Ci0gICAKLSAgIHByaXZhdGUgSVdvcmtiZW5jaENvbnRleHQgZ2V0SGVscGVyKCBJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciApewotCSAgIHJldHVybiBfaGVscGVycy5nZXQoIHZhbGlkYXRvciApOwotICAgfSAgIAotICAgCi0gICBwdWJsaWMgSVdvcmtiZW5jaENvbnRleHQgZ2V0SGVscGVyKCBJUHJvamVjdCBwcm9qZWN0LCBJVmFsaWRhdG9yIHZhbGlkYXRvciApewotCSAgIAotCSAgIGlmKCB2YWxpZGF0b3IgaW5zdGFuY2VvZiBJVmFsaWRhdG9ySm9iICl7Ci0JCSAgIElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IGdldEhlbHBlciggKElWYWxpZGF0b3JKb2IpdmFsaWRhdG9yICk7Ci0JCSAgIGlmKCBoZWxwZXIgPT0gbnVsbCApewotCQkJICAgdHJ5ewotCQkJCWhlbHBlciA9ICBnZXRIZWxwZXIoIHByb2plY3QgKTsKLQkJCQlyZXR1cm4gaGVscGVyOwotCQkJICAgfWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9CQkJICAgCi0JCSAgIH0KLQkgICAJcmV0dXJuIGhlbHBlcjsKLQkgICB9Ci0JICAgZWxzZXsKLQkJICAgdHJ5IHsKLQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9ICBnZXRIZWxwZXIoIHByb2plY3QgKTsKLQkJCXJldHVybiBoZWxwZXI7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCSAgIH0KLQkgICAKLQkgICByZXR1cm4gbnVsbDsKLSAgIH0gICAKLSAgIAotICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RW5hYmxlbWVudEV4cHJlc2lvbigpIHsKLQkJcmV0dXJuIF9lbmFibGVtZW50RXhwcmVzc2lvbjsKLQl9Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50VHlwZUlkcygpIHsKLQlyZXR1cm4gX2NvbnRlbnRUeXBlSWRzOwotfQotCi0gCi1wcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlQ29udGVudFR5cGUoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjKXsKLQkKLQlJQ29udGVudFR5cGUgY3QgPSBkZXNjLmdldENvbnRlbnRUeXBlKCk7Ci0JU3RyaW5nW10gYXBwbGljYWJsZUNvbnRlbnRUeXBlcyA9IGdldENvbnRlbnRUeXBlSWRzKCk7Ci0JaWYgKGFwcGxpY2FibGVDb250ZW50VHlwZXMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFwcGxpY2FibGVDb250ZW50VHlwZXMubGVuZ3RoOyBpICsrKXsKLQkJCWlmKGFwcGxpY2FibGVDb250ZW50VHlwZXNbaV0uZXF1YWxzKGN0LmdldElkKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JOYW1lRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvck5hbWVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ2Y2ZiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvck5hbWVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbmFtZSBmaWx0ZXIgdGFnIGluIGEgdmFsaWRhdG9yJ3MgcGx1Z2luLnhtbCBmaWxlLiBlLmcuICZsdDtmaWx0ZXIgbmFtZT0iKi4qIj4gVGhlbgotICogdGhpcyBjbGFzcyB3b3VsZCBzdG9yZSB0aGUgIiouKiIsIGFuZCBwcm92aWRlIHRoZSB3aWxkY2FyZCBtYXRjaGluZyBmdW5jdGlvbmFsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTmFtZUZpbHRlciB7Ci0JcHJpdmF0ZSBTdHJpbmcgX25hbWVGaWx0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZUZpbHRlckV4dGVuc2lvbjsKLQlwcml2YXRlIGJvb2xlYW4gX2luY2x1ZGUgPSB0cnVlOyAvLyBieSBkZWZhdWx0LCBmaWx0ZXIgaW4gdGhlIElGaWxlIHNwZWNpZmllZAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXSUxEQ0FSRCA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBfaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZTsgLy8gYnkgZGVmYXVsdCwgdGhlIGZpbHRlciBuYW1lIGlzIGNhc2Utc2Vuc2l0aXZlCi0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi80LzAwIDExOjA4OjQxIEFNKQotCSAqLwotCVZhbGlkYXRvck5hbWVGaWx0ZXIoKSB7Ci0JCS8vZGVmYXVsdAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlsdGVyLCBhcyBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbAotCSAqLwotCVN0cmluZyBnZXROYW1lRmlsdGVyKCkgewotCQlyZXR1cm4gX25hbWVGaWx0ZXI7Ci0JfQotCi0JYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBfaXNDYXNlU2Vuc2l0aXZlOwotCX0KLQotCWJvb2xlYW4gaXNJbmNsdWRlKCkgewotCQlyZXR1cm4gX2luY2x1ZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIGJvdGggYXBwbGljYWJsZSBhbmQgaW5jbHVkZT0idHJ1ZSIuCi0JICovCi0JYm9vbGVhbiBpc0FwcGxpY2FibGVUbyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIChpc0FwcGxpY2FibGVOYW1lKHJlc291cmNlKSAmJiBpc0luY2x1ZGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVGaWx0ZXJFeHRlbnNpb24oU3RyaW5nIGZpbHRlckV4dCkgewotCQluYW1lRmlsdGVyRXh0ZW5zaW9uID0gZmlsdGVyRXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgbWF0Y2hlcyB0aGUgZmlsdGVyLCBvciBpZiB0aGVyZSBpcyBubyBmaWx0ZXIKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy8gSWYgbmFtZSBmaWx0ZXIgaXMgbnVsbCwgbWVhbnMgZmlsdGVyIG91dCBubyBuYW1lcy4KLQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBnaXZlbiBuYW1lIG1hdGNoZXMKLQkJLy8gdGhlIG5hbWUgZmlsdGVyLgotCQlpZiAoX25hbWVGaWx0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0vLwkJcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgbmFtZSBpcyBleGFjdCBtYXRjaCBvZiB0aGUgX25hbWVGaWx0ZXIKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShfbmFtZUZpbHRlcikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpbnQgaW5kZXhPZlN0YXJEb3QgPSBfbmFtZUZpbHRlci5pbmRleE9mKCIqLiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy9yZXR1cm4gdmFsdWUgaWYgdGhlIGZpbHRlciBuYW1lIGV4dGVuc2lvbiBtYXRjaGVzIHRoZSBleHRlbnNpb24KLQkJLy9vZiB0aGUgcmVzb3VyY2UgCi0JCWlmIChpbmRleE9mU3RhckRvdCAhPSAtMSkgewotCQkJU3RyaW5nIG5hbWVFeHRlbnNpb24gPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWVGaWx0ZXJFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShuYW1lRXh0ZW5zaW9uKTsKLQkJfQotCi0JCWlmICghaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gdmVyaWZ5TmFtZU1hdGNoKF9uYW1lRmlsdGVyLCBuYW1lKTsKLQl9Ci0KLQl2b2lkIHNldEluY2x1ZGUoU3RyaW5nIGluY2x1ZGVWYWx1ZSkgewotCQlpZiAoaW5jbHVkZVZhbHVlICE9IG51bGwpIHsKLQkJCXNldEluY2x1ZGUoQm9vbGVhbi52YWx1ZU9mKGluY2x1ZGVWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBzZXRJbmNsdWRlKGJvb2xlYW4gaW5jbHVkZUJvb2wpIHsKLQkJX2luY2x1ZGUgPSBpbmNsdWRlQm9vbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGZpbHRlciwgYXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwKLQkgKi8KLQl2b2lkIHNldE5hbWVGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotCQlfbmFtZUZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQl2b2lkIHNldENhc2VTZW5zaXRpdmUoU3RyaW5nIGlzQ2FzZVNlbnNpdGl2ZVN0cmluZykgewotCQlpZiAoaXNDYXNlU2Vuc2l0aXZlU3RyaW5nICE9IG51bGwpIHsKLQkJCS8vIG9ubHkgY2hhbmdlIHRoZSB2YWx1ZSBmcm9tIHRoZSBkZWZhdWx0IGlmIHRoZSBjYXNlLXNlbnNpdGl2ZSBhdHRyaWJ1dGUgaXMgZGVmaW5lZAotCQkJX2lzQ2FzZVNlbnNpdGl2ZSA9IEJvb2xlYW4udmFsdWVPZihpc0Nhc2VTZW5zaXRpdmVTdHJpbmcpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiTmFtZUZpbHRlcjpcblx0bmFtZUZpbHRlciA9ICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoX25hbWVGaWx0ZXIpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgbWF0Y2hlcyB0aGUgZ2l2ZW4gZmlsdGVyLgotCSAqIAotCSAqIFRoZSBvbmx5IGZpbHRlciB3aWxkY2FyZCBhbGxvd2VkIGlzICcqJy4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiB2ZXJpZnlOYW1lTWF0Y2goZmluYWwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG5hbWUpIHsKLQkJLyoKLQkJICogVGhlcmUgYXJlIGVpZ2h0IHBvc3NpYmxlIHdpbGRjYXJkIGNvbWJpbmF0aW9ucywgZ2l2ZW4gdGhhdCBhIHdpbGRjYXJkIG1heSwgaWYgcHJlc2VudCwgYmUKLQkJICogYXQgdGhlIGJlZ2lubmluZywgbWlkZGxlLCBvciBlbmQgb2YgYSBuYW1lOyBvciBhbnkgY29tYmluYXRpb24gb2YgdGhvc2UgcG9zaXRpb25zLiBpLmUuLAotCQkgKiAKLQkJICogYmVnaW5uaW5nIG1pZGRsZSBlbmQgMCAwIDAgMCAwIDEgMCAxIDAgMCAxIDEgMSAwIDAgMSAwIDEgMSAxIDAgMSAxIDEKLQkJICogIAotCQkgKi8KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZmlsdGVyLCBXSUxEQ0FSRCwgdHJ1ZSk7Ci0JCWJvb2xlYW4gd2lsZGNhcmRGbGFnID0gZmFsc2U7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAodG9rZW4uZXF1YWxzKFdJTERDQVJEKSkgewotCQkJCXdpbGRjYXJkRmxhZyA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3aWxkY2FyZEZsYWcpIHsKLQkJCQkJaW50IHRva2VuSW5kZXggPSBuYW1lLmluZGV4T2YodG9rZW4pOwotCQkJCQlpZiAodG9rZW5JbmRleCA+PSAwKSB7Ci0JCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcodG9rZW5JbmRleCArIHRva2VuLmxlbmd0aCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgodG9rZW4pKSB7Ci0JCQkJCQlpbnQgdG9rZW5JbmRleCA9IHRva2VuLmxlbmd0aCgpOwotCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKHRva2VuSW5kZXgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXdpbGRjYXJkRmxhZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICghbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghd2lsZGNhcmRGbGFnKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yVHlwZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JUeXBlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTVhYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JUeXBlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgdHlwZSBmaWx0ZXIgdGFnIGluIGEgdmFsaWRhdG9yJ3MgcGx1Z2luLnhtbCBmaWxlLiBlLmcuICZsdDtmaWx0ZXIKLSAqIG9iamVjdENsYXNzPSJjb20uaWJtLmZvby5NeUNsYXNzIj4gVGhlbiB0aGlzIGNsYXNzIHdvdWxkIHN0b3JlIHRoZSAiY29tLmlibS5mb28uTXlDbGFzcyIsIGFuZAotICogcHJvdmlkZSB0aGUgImluc3RhbmNlb2YiIG1hdGNoaW5nIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JUeXBlRmlsdGVyIHsKLQlwcml2YXRlIENsYXNzIF90eXBlRmlsdGVyQ2xhc3M7Ci0JcHJpdmF0ZSBTdHJpbmcgX211c3RJbXBsZW1lbnRDbGFzczsgLy8gdGhlIHR5cGUgc2V0IGluIHNldFR5cGVGaWx0ZXIgbXVzdCBpbXBsZW1lbnQgdGhlCi0KLQkvLyBjbGFzcy9pbnRlcmZhY2UgaWRlbnRpZmllZCBieSB0aGlzIGZ1bGx5LXF1YWxpZmllZAotCS8vIEphdmEgc3RyaW5nLgotCi0JVmFsaWRhdG9yVHlwZUZpbHRlcigpIHsKLQkJLy9kZWZhdWx0Ci0JfQotCi0JVmFsaWRhdG9yVHlwZUZpbHRlcihTdHJpbmcgbXVzdEltcGxlbWVudENsYXNzKSB7Ci0JCXNldE11c3RJbXBsZW1lbnRDbGFzcyhtdXN0SW1wbGVtZW50Q2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFR5cGUgZmlsdGVycyBhcmUgYWxsb3dlZCBvbmx5IGZvciBjZXJ0YWluIHR5cGVzIG9mIGNsYXNzZXMuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YKLQkgKiB0aGUgY2xhc3Mgd2hpY2ggdGhpcyB0eXBlIG11c3QgaW1wbGVtZW50IGJlZm9yZSBpdCBjYW4gYmUgYSBmaWx0ZXIuCi0JICovCi0JU3RyaW5nIGdldE11c3RJbXBsZW1lbnRDbGFzcygpIHsKLQkJcmV0dXJuIF9tdXN0SW1wbGVtZW50Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIGZpbHRlciBhcyBhIGphdmEubGFuZy5DbGFzcyBvYmplY3QuCi0JICovCi0JQ2xhc3MgZ2V0VHlwZUZpbHRlckNsYXNzKCkgewotCQlyZXR1cm4gX3R5cGVGaWx0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc291cmNlIHBhc3NlZCBpbiBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIHR5cGUgZmlsdGVyIGNsYXNzLCBvciBpZgotCSAqIHRoZXJlIGlzIG5vIHR5cGUgZmlsdGVyIGNsYXNzIGRlZmluZWQgaW4gcGx1Z2luLnhtbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVUeXBlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBJZiB0eXBlIGZpbHRlciBpcyBudWxsLCBtZWFucyBmaWx0ZXIgb3V0IG5vIHR5cGVzLgotCQkvLyBPdGhlcndpc2UsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIGdpdmVuIHR5cGUgaXMgYW4gaW5zdGFuY2Ugb2YKLQkJLy8gdGhlIHR5cGUgZmlsdGVyLgotCQlpZiAoX3R5cGVGaWx0ZXJDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gSWYgdGhlIHJlc291cmNlIGlzIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIGZpbHRlciBjbGFzcy4KLQkJcmV0dXJuIGlzSW5zdGFuY2UocmVzb3VyY2UuZ2V0Q2xhc3MoKSwgX3R5cGVGaWx0ZXJDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbHRlckNsYXNzIGlzIGEgcGFyZW50IChpbnRlcmZhY2Ugb3Igc3VwZXJjbGFzcykgb2Ygb2JqZWN0Q2xhc3MuCi0JICovCi0JYm9vbGVhbiBpc0luc3RhbmNlKENsYXNzIG9iamVjdENsYXNzLCBDbGFzcyBmaWx0ZXJDbGFzcykgewotCQkvLyBUaGUgamF2YS5sYW5nLkNsYXNzLmlzSW5zdGFuY2UgY2FsbCBkb2Vzbid0IGNoZWNrIGludGVyZmFjZXMgZnVsbHkuCi0JCS8vIGkuZS4sIGlmIEkgaGF2ZSB0d28gaW50ZXJmYWNlcywgQSBhbmQgQiwgYW5kIEIgZXh0ZW5kcyBBIGJ1dAotCQkvLyBkb2Vzbid0IGltcGxlbWVudCBBLCB0aGVuIHRoZSBpc0luc3RhbmNlIGNhbGwgd2lsbCByZXR1cm4gZmFsc2UuCi0JCS8vCi0JCS8vIFNvLCBpbnN0ZWFkIG9mIHVzaW5nIENsYXNzLmlzSW5zdGFuY2UsIGRvIHRoZSBjaGVja2luZyBteXNlbGYuCi0JCWZvciAoQ2xhc3MgY2wgPSBvYmplY3RDbGFzczsgY2wgIT0gbnVsbDsgY2wgPSBjbC5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCWlmIChjbC5nZXROYW1lKCkuZXF1YWxzKGZpbHRlckNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCUNsYXNzW10gY2xJbnRlcmZhY2VzID0gY2wuZ2V0SW50ZXJmYWNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbEludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2xJbnRlcmZhY2VzW2ldLmdldE5hbWUoKS5lcXVhbHMoZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlzSW5zdGFuY2UoY2xJbnRlcmZhY2VzW2ldLCBmaWx0ZXJDbGFzcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFR5cGUgZmlsdGVycyBhcmUgYWxsb3dlZCBvbmx5IGZvciBjZXJ0YWluIHR5cGVzIG9mIGNsYXNzZXMuIFRoaXMgbWV0aG9kIHNldHMgdGhlIG5hbWUgb2YgdGhlCi0JICogY2xhc3Mgd2hpY2ggdGhpcyB0eXBlIG11c3QgaW1wbGVtZW50IGJlZm9yZSBpdCBjYW4gYmUgYSBmaWx0ZXIuCi0JICovCi0Jdm9pZCBzZXRNdXN0SW1wbGVtZW50Q2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlfbXVzdEltcGxlbWVudENsYXNzID0gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBmaWx0ZXIgaW1wbGVtZW50cyB0aGUgbXVzdEltcGxlbWVudENsYXNzIChpbiBWYWxpZGF0b3JGaWx0ZXIncyBjYXNlLCBJUmVzb3VyY2UpLCB0aGVuCi0JICogdGhpcyBpcyBhIHZhbGlkIGZpbHRlciwgYW5kIHN0b3JlIHRoZSBmaWx0ZXIgdmFsdWUuCi0JICovCi0Jdm9pZCBzZXRUeXBlRmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLQkJQ2xhc3MgZmlsdGVyQ2xhc3MgPSBudWxsOwotCQlDbGFzcyBtdXN0SW1wbGVtZW50Q2xhc3MgPSBudWxsOwotCi0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJX3R5cGVGaWx0ZXJDbGFzcyA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJZmlsdGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGZpbHRlcik7Ci0JCQlpZiAoZ2V0TXVzdEltcGxlbWVudENsYXNzKCkgIT0gbnVsbCkgewotCQkJCW11c3RJbXBsZW1lbnRDbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0TXVzdEltcGxlbWVudENsYXNzKCkpOwotCi0JCQkJLy8gSWYgdGhlIGZpbHRlciBjbGFzcyBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgbXVzdEltcGxlbWVudENsYXNzCi0JCQkJaWYgKCFpc0luc3RhbmNlKGZpbHRlckNsYXNzLCBtdXN0SW1wbGVtZW50Q2xhc3MpKSB7Ci0JCQkJCV90eXBlRmlsdGVyQ2xhc3MgPSBudWxsOwotCQkJCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSkgewotCQkJCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5WQUxJRF9UWVBFX0ZJTFRFUiksIAotCQkJCQkJCW5ldyBPYmplY3RbXXtmaWx0ZXIsIGdldE11c3RJbXBsZW1lbnRDbGFzcygpfSk7Ci0JCQkJCQlUcmFjaW5nLmxvZygiVmFsaWRhdG9yVHlwZUZpbHRlci0wMTogIiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4YykgewotCQkJX3R5cGVGaWx0ZXJDbGFzcyA9IG51bGw7Ci0JCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSkgewotCQkJCVRyYWNpbmcubG9nKCJWYWxpZGF0b3JUeXBlRmlsdGVyLTAyOiBUaGUgY2xhc3MgbmFtZWQgIiArIGZpbHRlciArICAvLyROT04tTkxTLTEkCi0JCQkJCSIgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBiZWNhdXNlIGl0IGRvZXMgbm90IGV4aXN0LiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIG5hbWUsICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJpbiB0aGUgdmFsaWRhdG9yJ3MgcGx1Z2luLnhtbCBjb250cmlidXRpb24sIGFuZCB0cnkgcmVzdGFydGluZyBlY2xpcHNlIGFnYWluLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJX3R5cGVGaWx0ZXJDbGFzcyA9IGZpbHRlckNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlR5cGVGaWx0ZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiICAgICBfdHlwZUZpbHRlckNsYXNzID0gIiArIF90eXBlRmlsdGVyQ2xhc3MuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCIgICAgIF9tdXN0SW1wbGVtZW50Q2xhc3MgPSAiICsgX211c3RJbXBsZW1lbnRDbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL0RlbGVnYXRpbmdWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL0RlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0M2Y5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9EZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRvIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGJ5IGNsaWVudHMgd2hvIHdhbnQgdG8gcHJvdmlkZQotICogYWx0ZXJuYXRlIHZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbnMgZm9yIGEgZ2l2ZW4gdmFsaWRhdG9yIHR5cGUuCi0gKiAKLSAqIEl0IGxvY2F0ZXMgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGRlbGVnYXRlIGZvciB0aGlzIHZhbGlkYXRvciBhbmQgY2FsbHMgaXRzCi0gKiB2YWxpZGF0ZSBtZXRob2QuCi0gKiAKLSAqIEBzZWUgSVZhbGlkYXRvcgotICogQHNlZSBJRGVsZWdhdGluZ1ZhbGlkYXRvcgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElEZWxlZ2F0aW5nVmFsaWRhdG9yCi17Ci0gIHB1YmxpYyBEZWxlZ2F0aW5nVmFsaWRhdG9yKCkKLSAgewotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IjY2xlYW51cChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0gICAgLy8gW0lzc3VlXSBUaGlzIG1ldGhvZCBkb2VzIG5vdCBnZXQgcGFzc2VkIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQuIEhvdyBhcmUKLSAgICAvLyBnb2luZyB0byBrbm93IHRoZSBkZWxlZ2F0ZSBpbiBvcmRlciB0byBpbnZva2UgaXRzIGNsZWFudXAgbWV0aG9kPwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsCi0gICAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB2YWxpZGF0ZUluSm9iKGhlbHBlciwgcmVwb3J0ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyYXBzIHRoZSBvcmlnaW5hbCByZXBvcnRlciBpbnN0YW5jZSB0byBtYWtlIGl0IGxvb2sgbGlrZSB0aGlzIHZhbGlkYXRvciBpcwotICAgKiB0aGUgb25lIGdlbmVyYXRpbmcgbWVzc2FnZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGZyYW1ld29yayBpZ25vcmVzCi0gICAqIG1lc3NhZ2VzIGNvbWluZyBmcm9tIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3IgYmVjYXVzZSBpdCBpcyBub3QgcmVnaXN0ZXJlZAotICAgKiB3aXRoIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAgICovCi0gIHByaXZhdGUgY2xhc3MgRGVsZWdhdGluZ1JlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBUaGUgcmVwb3J0ZXIgcGFzc2VkIG9yaWdpbmFsbHkgdG8gdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yIGJ5IHRoZQotICAgICAqIGZyYW1ld29yay4KLSAgICAgKi8KLSAgICBJUmVwb3J0ZXIgZGVsZWdhdGluZ1JlcG9ydGVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yLgotICAgICAqLwotICAgIElWYWxpZGF0b3IgZGVsZWdhdGluZ1ZhbGlkYXRvcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpZGF0b3IKLSAgICAgKiAgICAgICAgICB0aGUgb3JpZ2luYWwgdmFsaWRhdG9yLgotICAgICAqIEBwYXJhbSByZXBvcnRlcgotICAgICAqICAgICAgICAgIHRoZSByZXBvcnRlciBvcmlnaW5hbGx5IHBhc3NlZCB0byB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gICAgICovCi0gICAgRGVsZWdhdGluZ1JlcG9ydGVyKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gICAgewotICAgICAgZGVsZWdhdGluZ1JlcG9ydGVyID0gcmVwb3J0ZXI7Ci0gICAgICBkZWxlZ2F0aW5nVmFsaWRhdG9yID0gdmFsaWRhdG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIjYWRkTWVzc2FnZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsCi0gICAgICogICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciBvcmlnaW4sIElNZXNzYWdlIG1lc3NhZ2UpCi0gICAgewotICAgICAgZGVsZWdhdGluZ1JlcG9ydGVyLmFkZE1lc3NhZ2UoZGVsZWdhdGluZ1ZhbGlkYXRvciwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlciNkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsCi0gICAgICogICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKQotICAgIHsKLSAgICAgIGRlbGVnYXRpbmdSZXBvcnRlci5kaXNwbGF5U3VidGFzayhkZWxlZ2F0aW5nVmFsaWRhdG9yLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyI2dldE1lc3NhZ2VzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpCi0gICAgewotICAgICAgcmV0dXJuIGRlbGVnYXRpbmdSZXBvcnRlci5nZXRNZXNzYWdlcygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIjaXNDYW5jZWxsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGluZ1JlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlciNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4pCi0gICAgewotICAgICAgZGVsZWdhdGluZ1JlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGRlbGVnYXRpbmdWYWxpZGF0b3IpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbiwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICBkZWxlZ2F0aW5nUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZGVsZWdhdGluZ1ZhbGlkYXRvciwgb2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyI3JlbW92ZU1lc3NhZ2VTdWJzZXQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKQotICAgIHsKLSAgICAgIGRlbGVnYXRpbmdSZXBvcnRlci5yZW1vdmVNZXNzYWdlU3Vic2V0KGRlbGVnYXRpbmdWYWxpZGF0b3IsIG9iaiwgZ3JvdXBOYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LAotICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotICAgKi8KLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodGhpcyk7Ci0gICAgU3RyaW5nIHZhbGlkYXRvck5hbWUgPSB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKTsKLQotICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgaXMgYW4gSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC4gVGhlCi0gICAgLy8gbGltaXRhdGlvbiBvZiB1c2luZyBhbiBJVmFsaWRhdGlvbkNvbnRleHQgaXMgdGhhdCBpdCBkb2VzIG5vdCByZWFkaWx5Ci0gICAgLy8gcHJvdmlkZSB0aGUgcHJvamVjdCB0aGUgdmFsaWRhdG9yIGlzIGJlaW5nIGludm9rZWQgdXBvbi4KLQotICAgIGlmICghKGhlbHBlciBpbnN0YW5jZW9mIElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9XUk9OR19DT05URVhUX0ZPUl9ERUxFR0FURSwgbmV3IFN0cmluZ1tdIHsgdmFsaWRhdG9yTmFtZSB9KSkpOwotICAgIH0KLQotICAgIElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQgcHJvamVjdENvbnRleHQgPSAoSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCkgaGVscGVyOwotICAgIElQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0Q29udGV4dC5nZXRQcm9qZWN0KCk7Ci0KLSAgICBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZGVsZWdhdGVEZXNjcmlwdG9yID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIFByb2plY3RDb25maWd1cmF0aW9uIHByb2plY3RDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0KLSAgICAgIGRlbGVnYXRlRGVzY3JpcHRvciA9IHByb2plY3RDb25maWcuZ2V0RGVsZWdhdGVEZXNjcmlwdG9yKHZtZCk7Ci0gICAgfQotICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gQWxyZWFkeSBkZWFsdCB3aXRoIGJ5IHRoZSBmcmFtZXdvcmsuCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBpZiAoZGVsZWdhdGVEZXNjcmlwdG9yID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9OT19ERUxFR0FURSwgbmV3IFN0cmluZ1tdIHsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgfSkpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBJVmFsaWRhdG9ySm9iIGRlbGVnYXRlID0gKElWYWxpZGF0b3JKb2IpZGVsZWdhdGVEZXNjcmlwdG9yLmdldFZhbGlkYXRvcigpOwotCi0gICAgLy8gV2UgbmVlZCB0byBtYWtlIGl0IGxvb2sgbGlrZSB0aGlzIHZhbGlkYXRvciBpcyB0aGUgb25lIGdlbmVyYXRpbmcKLSAgICAvLyBtZXNzYWdlcyBzbyB3ZSB3cmFwIHRoZSByZXBvcnRlciBhbmQgdXNlIHRoaXMgdmFsaWRhdG9yIGFzIHRoZSBzb3VyY2UuCi0gICAgLy8gVGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGRvZXMgbm90IHJlY29nbml6ZSBvdXIgdmFsaWRhdG9ycyBiZWNhdXNlIHRoZXkKLSAgICAvLyBhcmUgbm90IHJlZ2lzdGVyZWQgZGlyZWN0bHkgd2l0aCB0aGUgZnJhbWV3b3JrLgotICAgIC8vIFdlIGNvdWxkIG1ha2UgdGhlbSB3b3JrIGxpa2UgdGhlIGFnZ3JlZ2F0ZWQgdmFsaWRhdG9ycyBidXQgdGhhdCB3b3VsZAotICAgIC8vIGNyZWF0ZSBwcm9ibGVtcyB3aXRoIG1hcmtlcnMgbm90IGJlaW5nIGNsZWFuZWQgdXAgaWYgc29tZW9uZSBzd2l0Y2hlcwotICAgIC8vIHZhbGlkYXRvcnMuCi0gICAgLy8gVE9ETyA6IE1heWJlIHdlIGNvdWxkIGNsZWFyIGFsbCB0aGUgbWFya2VycyBnZW5lcmF0ZWQgYnkgYSBkZWxlZ2F0ZSB3aGVuCi0gICAgLy8gdGhlIHVzZXIgY2hvb3NlcyBhIGRpZmZlcmVudCBkZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbj8KLQotICAgIERlbGVnYXRpbmdSZXBvcnRlciBkZWxlZ2F0aW5nUmVwb3J0ZXIgPSBuZXcgRGVsZWdhdGluZ1JlcG9ydGVyKHRoaXMsIHJlcG9ydGVyKTsKLQotICAgIElTdGF0dXMgc3RhdHVzID0gZGVsZWdhdGUudmFsaWRhdGVJbkpvYihoZWxwZXIsIGRlbGVnYXRpbmdSZXBvcnRlcik7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IjZ2V0U2NoZWR1bGluZ1J1bGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi1AT3ZlcnJpZGUKLXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9JRGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvSURlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3OWVkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9JRGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLS8qKgotICogQSBkZWxlZ2F0aW5nIHZhbGlkYXRvciBkZWxlZ2F0ZXMgdGhlIGFjdHVhbCB2YWxpZGF0aW9uIHdvcmsgdG8gYSBkZWxlZ2F0ZQotICogdmFsaWRhdG9yLiBUaGlzIGlzIGEgbWFya2VyIGludGVyZmFjZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGZyYW1ld29yayB0bwotICogZGV0ZXJtaW5lIGlmIGEgZGVsZWdhdGUgaXMgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAqIAotICogW0lzc3VlXSBDb3VsZC9zaG91bGQgdGhpcyBpbnRlcmZhY2UgYmUgcmVwbGFjZWQgd2l0aCBhbiBhdHRyaWJ1dGUgb24gdGhlCi0gKiB2YWxpZGF0b3JzIGV4dGVuc2lvbiBkZWZpbml0aW9uPwotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVsZWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIElWYWxpZGF0b3JKb2IKLXsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOTEwZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3Igc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgZGVsZWdhdGUgdmFsaWRhdG9yLgotICogPHA+Ci0gKiBJdCBpcyBhbHNvIHVzZWQgdG8gc3RvcmUgdGhlIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IgaXQgZGVzY3JpYmVzLiBUbwotICogb2J0YWluIHRoZSBpbnN0YW5jZSBjYWxsIGdldFZhbGlkYXRvcigpLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBlbGVtZW50IGRlc2NyaWJpbmcgdGhpcyBkZWxlZ2F0ZS4KLQkgKi8KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBfZGVsZWdhdGVDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgSUQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgX2RlbGVnYXRpbmdWYWxpZGF0b3JJRDsKLQotCS8qKgotCSAqIFRoZSBkZWxlZ2F0ZSdzIElELgotCSAqLwotCXByaXZhdGUgU3RyaW5nIF9pZDsKLQotCS8qKgotCSAqIFRoZSBkZWxlZ2F0ZSdzIGRpc3BsYXkgbmFtZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBfbmFtZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIGRlbGVnYXRlJ3MgdW5pcXVlIGlkLiBNdXN0IGJlIHVuaXF1ZSBpbiB0aGUgY29udGV4dCBvZiBhCi0JICogICAgICAgICAgICBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLQkgKiBAcGFyYW0gZGVsZWdhdGVDb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBUaGUgZGVsZWdhdGVzIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqIEBwYXJhbSBkZWxlZ2F0ZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBkZWxlZ2F0ZSdzIGRpc3BsYXkgbmFtZS4KLQkgKiBAcGFyYW0gdGFyZ2V0VmFsaWRhdG9ySUQKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgdmFsaWRhdG9yJ3MgdW5pcXVlIGlkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IoU3RyaW5nIGlkLAotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlbGVnYXRlQ29uZmlndXJhdGlvbiwgU3RyaW5nIGRlbGVnYXRlTmFtZSwKLQkJCVN0cmluZyB0YXJnZXRWYWxpZGF0b3JJRCkgewotCi0JCWFzc2VydCBpZCAhPSBudWxsOwotCQlhc3NlcnQgZGVsZWdhdGVDb25maWd1cmF0aW9uICE9IG51bGw7Ci0JCWFzc2VydCB0YXJnZXRWYWxpZGF0b3JJRCAhPSBudWxsOwotCi0JCV9pZCA9IGlkOwotCQlfZGVsZWdhdGVDb25maWd1cmF0aW9uID0gZGVsZWdhdGVDb25maWd1cmF0aW9uOwotCQlfbmFtZSA9IGRlbGVnYXRlTmFtZTsKLQkJX2RlbGVnYXRpbmdWYWxpZGF0b3JJRCA9IHRhcmdldFZhbGlkYXRvcklEOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSBkZWxlZ2F0ZSdzIElELgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhpcyB2YWxpZGF0b3IKLQkgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBfaWQ7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIGRlbGVnYXRlJ3MgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHZhbGlkYXRvcidzIGRpc3BsYXkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBfbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHRhcmdldCB2YWxpZGF0b3IncyBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBkZWxlZ2F0aW5nCi0JICogICAgICAgICB2YWxpZGF0b3Igd2hvIHdpbGwgZGVsZWdhdGUgaXRzIGltcGxlbWVudGF0aW9uIHRvIHRoZSB2YWxpZGF0b3IKLQkgKiAgICAgICAgIGRlc2NyaWJlZCBieSB0aGlzIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRJRCgpIHsKLQkJcmV0dXJuIF9kZWxlZ2F0aW5nVmFsaWRhdG9ySUQ7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgcG9pbnRlZCB0byBieSB0aGlzIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHJldHVybiBhbiBJVmFsaWRhdG9yIGluc3RhbmNlLgotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlWYWxpZGF0b3IgZGVsZWdhdGUgPSAoSVZhbGlkYXRvcikgX2RlbGVnYXRlQ29uZmlndXJhdGlvbgotCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlci5DTEFTU19BVFRSSUJVVEUpOwotCQkJcmV0dXJuIGRlbGVnYXRlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYW4gQWJzdHJhY3RWYWxpZGF0b3IgaWYgb25lIGhhcyBiZWVuIGRlZmluZWQsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yMigpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvID0gX2RlbGVnYXRlQ29uZmlndXJhdGlvbgotCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlci5DTEFTU19BVFRSSUJVVEUpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBBYnN0cmFjdFZhbGlkYXRvcikKLQkJCQlyZXR1cm4gKEFic3RyYWN0VmFsaWRhdG9yKSBvOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKENvcmVFeGNlcHRpb24gZSkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJU3RyaW5nIGRlbGVnYXRpbmdWYWxpZGF0b3JOYW1lID0gZ2V0VGFyZ2V0SUQoKTsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpCi0JCQkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoZ2V0VGFyZ2V0SUQoKSk7Ci0JCWlmICh2bWQgIT0gbnVsbClkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSA9IHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpOwotCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihuZXcgTG9jYWxpemVkTWVzc2FnZSgKLQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKAotCQkJUmVzb3VyY2VDb25zdGFudHMuVkJGX0NBTk5PVF9JTlNUQU5USUFURV9ERUxFR0FURSwgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZSgpLCBkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSB9KSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWEwMzRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSBpcyBhIHNpbmdsZXRvbiB1c2VkIHRvIHN0b3JlIHZhbGlkYXRvciBkZWxlZ2F0ZQotICogZGVzY3JpcHRvcnMgZm9yIGVhY2ggZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSB7Ci0JCi0gIC8qKgotICAgKiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSBfaW5zdGFuY2U7Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICogCi0gICAqIFRoZSBhY3R1YWwgcGxhdGZvcm0gZXh0ZW5zaW9uIHJlZ2lzdHJ5IHJlYWRpbmcgaGFwcGVucyBhdCB0aGlzIHRpbWUuCi0gICAqIAotICAgKiBAc2VlIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGVzIHJlZ2lzdHJ5IHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgCVZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5IGluc3RhbmNlID0gbmV3IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5KCk7Ci0gICAgCVZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlcihpbnN0YW5jZSk7Ci0gICAgCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLSAgICAJaW5zdGFuY2UuaW5pdERlZmF1bHRzKCk7Ci0gICAgCV9pbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIHJldHVybiBfaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBwcm9kdWN0IGRlZmluZWQgYW55IGRlZmF1bHQgZGVsZWdhdGUgdmFsaWRhdG9ycywgYnkgc2V0dGluZyB0aGUgb2xkCi0gICAqIERFTEVHQVRFU19QUkVGRVJFTkNFIHByZWZlcmVuY2UgaW4gdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSBzY29wZS4gSWYgdGhleSBkaWQsIHdlIHJlbWVtYmVyCi0gICAqIHRoZW0sIHNvIHRoYXQgaWYgd2UgZXZlcnkgbmVlZCB0byByZXR1cm4gYSBkZWZhdWx0IGZvciB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IsIHdlIGNhbiByZXR1cm4gdGhlIG9uZQotICAgKiB0aGF0IHRoZSBwcm9kdWN0IHJlcXVlc3RlZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdHMoKSB7Ci0JICAJLy8gVGhpcyBjb2RlIHdhcyBjb3BpZWQgZnJvbSB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZGVzZXJpYWxpemVEZWxlZ2F0ZXMoKSBtZXRob2QuIFRoZSBjb2RlIHdhcyBjb3BpZWQgYmVjYXVzZSB0aGlzCi0JICAJLy8gY2hhbmdlIGlzIHBhcnQgb2YgYSBwYXRjaCBhbmQgSSBkaWRuJ3Qgd2FudCB0byBkaXN0dXJiIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjbGFzcy4KLQkgIAotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQpOwotCQlTdHJpbmcgZGVsZWdhdGVQcmVmID0gcHJlZnMuZ2V0KCJERUxFR0FURVNfUFJFRkVSRU5DRSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkZWxlZ2F0ZVByZWYgPT0gbnVsbClyZXR1cm47Ci0KLQkJaW50IGRlbGVnYXRlc0luZGV4ID0gZGVsZWdhdGVQcmVmLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURV9WQUxJREFUT1JTKTsKLQkJU3RyaW5nIGRlbGVnYXRlcyA9IGRlbGVnYXRlUHJlZi5zdWJzdHJpbmcoZGVsZWdhdGVzSW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFTEVHQVRFX1ZBTElEQVRPUlMubGVuZ3RoKCksIGRlbGVnYXRlUHJlZi5sZW5ndGgoKSk7Ci0KLQkJaWYgKGRlbGVnYXRlcyA9PSBudWxsKXJldHVybjsKLQotCQlfZGVmYXVsdERlbGVnYXRlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oMTApOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkZWxlZ2F0ZXMsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRUxFTUVOVF9TRVBBUkFUT1IpOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGRlbGVnYXRlQ29uZmlndXJhdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWludCBzZXBhcmF0b3JJbmRleCA9IGRlbGVnYXRlQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVMRUdBVEVTX1NFUEFSQVRPUik7Ci0vLwkJCVN0cmluZyB0YXJnZXRJRCA9IGRlbGVnYXRlQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpOwotCQkJU3RyaW5nIGRlbGVnYXRlSUQgPSBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7Ci0JCQlfZGVmYXVsdERlbGVnYXRlcy5hZGQoZGVsZWdhdGVJRCk7Ci0JCX0KLQotCX0KLQotLyoqCi0gICAqIFRoZSBtYXAgb2YgdGFyZ2V0IHZhbGlkYXRvciBpZCB0byBNYXAgb2YgZGVsZWdhdGVzIGJ5IGlkLgotICAgKi8KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4+IF9kZWxlZ2F0ZXNCeVRhcmdldCA9IAotCSAgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4+KCk7Ci0gIAotICAvKioKLSAgICogVmFsaWRhdG9yIGlkcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGJ5IHRoZSBwcm9kdWN0IHRvIGJlIHRoZSBkZWZhdWx0IHZhbGlkYXRvcnMsIGZvciBzb21lIG9mIHRoZSBkZWxlZ2F0aW5nIHZhbGlkdG9ycy4KLSAgICovCi0gIHByaXZhdGUgU2V0PFN0cmluZz4gX2RlZmF1bHREZWxlZ2F0ZXM7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBkZXNjcmlwdG9yIHRvIHRoZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAqICAgICAgICAgIFRoZSBkZXNjcmlwdG9yIHRvIGFkZC4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICovCi0gIHZvaWQgYWRkKFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbClyZXR1cm47Ci0KLSAgICBTdHJpbmcgdGFyZ2V0SUQgPSBkZXNjcmlwdG9yLmdldFRhcmdldElEKCk7Ci0KLSAgICBNYXA8U3RyaW5nLFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4gZGVsZWdhdGVzID0gX2RlbGVnYXRlc0J5VGFyZ2V0LmdldCh0YXJnZXRJRCk7Ci0KLSAgICBpZiAoZGVsZWdhdGVzID09IG51bGwpIHsKLSAgICAgIGRlbGVnYXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I+KCk7Ci0gICAgICBfZGVsZWdhdGVzQnlUYXJnZXQucHV0KHRhcmdldElELCBkZWxlZ2F0ZXMpOwotICAgIH0KLQotICAgIGRlbGVnYXRlcy5wdXQoZGVzY3JpcHRvci5nZXRJZCgpLCBkZXNjcmlwdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgZGVmYXVsdCBkZWxlZ2F0ZSBJRCBmb3IgdGhlIGdpdmVuIGRlbGVnYXRpbmcgdmFsaWRhdG9yIElELgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldElECi0gICAqICAgICAgICAgIFRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIElELgotICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIElEIG9mIHRoZSBkZWZhdWx0IGRlbGVnYXRlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0RGVsZWdhdGUoU3RyaW5nIHRhcmdldElEKQotICB7Ci0gICAgTWFwPFN0cmluZyxWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I+IGRlbGVnYXRlcyA9IGdldERlbGVnYXRlRGVzY3JpcHRvcnModGFyZ2V0SUQpOwotCi0gICAgaWYgKGRlbGVnYXRlcyA9PSBudWxsKXJldHVybiBudWxsOwotCi0gICAgaWYgKF9kZWZhdWx0RGVsZWdhdGVzICE9IG51bGwpewotICAgIAlmb3IgKFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciB2ZGQgOiBkZWxlZ2F0ZXMudmFsdWVzKCkpewotICAgIAkJU3RyaW5nIGlkID0gdmRkLmdldElkKCk7Ci0gICAgCQlpZiAoX2RlZmF1bHREZWxlZ2F0ZXMuY29udGFpbnMoaWQpKXJldHVybiBpZDsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgYSBkZWZhdWx0IGF0dHJpYnV0ZSBhbmQgdXNlIHRoYXQgdG8gZ2V0IHRoZSBkZWZhdWx0PwotICAgIC8vIFdoYXQgaGFwcGVucyBpZiB0d28gb3IgbW9yZSBkZWxlZ2F0ZXMgY2xhaW0gdG8gYmUgdGhlIGRlZmF1bHQgb25lPwotICAgIC8vIEZvciBub3csIGp1c3QgcGljayB0aGUgZmlyc3Qgb25lIGluIHRoZSBsaXN0LgotCi0gICAgSXRlcmF0b3I8VmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yPiBkZWxlZ2F0ZXNJdGVyYXRvciA9IGRlbGVnYXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAotICAgIGlmICghZGVsZWdhdGVzSXRlcmF0b3IuaGFzTmV4dCgpKXJldHVybiBudWxsOwotCi0gICAgcmV0dXJuIGRlbGVnYXRlc0l0ZXJhdG9yLm5leHQoKS5nZXRJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlcyBhIGRlbGVnYXRlIGluc3RhbmNlIGJhc2VkIG9uIHRoZSB0YXJnZXQgYW5kIGRlbGVnYXRlIElEcy4KLSAgICogCi0gICAqIEBwYXJhbSB0YXJnZXRJRAotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IncyBJRC4KLSAgICogQHBhcmFtIGRlbGVnYXRlSUQKLSAgICogICAgICAgICAgdGhlIGRlbGVnYXRlIHZhbGlkYXRvcidzIElELgotICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3Igb3IgbnVsbCBpZiBvbmUgY2Fubm90IGJlCi0gICAqICAgICAgICAgZm91bmQuCi0gICAqLwotICBwdWJsaWMgSVZhbGlkYXRvciBnZXREZWxlZ2F0ZShTdHJpbmcgdGFyZ2V0SUQsIFN0cmluZyBkZWxlZ2F0ZUlEKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKHRhcmdldElELCBkZWxlZ2F0ZUlEKTsKLQotICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpcmV0dXJuIG51bGw7Ci0KLSAgICBJVmFsaWRhdG9yIGRlbGVnYXRlID0gZGVzY3JpcHRvci5nZXRWYWxpZGF0b3IoKTsKLQotICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyBhIG1hcCB3aXRoIGFsbCBkZWxlZ2F0ZXMgZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbiB0YXJnZXQsIGtleWVkCi0gICAqIGJ5IHRoZWlyIElELgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldElECi0gICAqICAgICAgICAgIHRoZSB0YXJnZXQgKGRlbGVnYXRpbmcpIHZhbGlkYXRvciBpZC4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBhIE1hcCA8c3RyaW5nLCBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I+LiBNYXkgYmUgbnVsbCBpZiB0aGUgSUQKLSAgICogICAgICAgICBwYXNzZWQgaW4gaXMgbm90IGEgZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgTWFwPFN0cmluZyxWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I+IGdldERlbGVnYXRlRGVzY3JpcHRvcnMoU3RyaW5nIHRhcmdldElEKSB7Ci0gICAgcmV0dXJuIF9kZWxlZ2F0ZXNCeVRhcmdldC5nZXQodGFyZ2V0SUQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIGEgZGVsZWdhdGUgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgdGFyZ2V0IGlkIGFuZCBkZWxlZ2F0ZSBpZC4KLSAgICogCi0gICAqIEBwYXJhbSB0YXJnZXRJRAotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IncyBpZAotICAgKiBAcGFyYW0gZGVsZWdhdGVJRAotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGUgaWQKLSAgICogQHJldHVybiBhIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHRhcmdldCBhbmQgaWQgb3IgbnVsbAotICAgKiAgICAgICAgIGlmIG9uZSBjYW5ub3QgYmUgZm91bmQuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIHRhcmdldElELCBTdHJpbmcgZGVsZWdhdGVJRCkKLSAgewotICAgIE1hcDxTdHJpbmcsVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yPiBkZWxlZ2F0ZXMgPSBfZGVsZWdhdGVzQnlUYXJnZXQuZ2V0KHRhcmdldElEKTsKLQotICAgIGlmIChkZWxlZ2F0ZXMgPT0gbnVsbCB8fCBkZWxlZ2F0ZUlEID09IG51bGwpcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yKSBkZWxlZ2F0ZXMuZ2V0KGRlbGVnYXRlSUQpOwotCi0gICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIHZhbGlkYXRvciBoYXMgZGVsZWdhdGVzLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldElECi0gICAqICAgICAgICAgIHRoZSB0YXJnZXQgdmFsaWRhdG9yIGlkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBoYXMgcmVnaXN0ZXJlZCBkZWxlZ2F0ZXMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0RlbGVnYXRlcyhTdHJpbmcgdGFyZ2V0SUQpCi0gIHsKLSAgICBNYXA8U3RyaW5nLFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4gZGVsZWdhdGVzQnlJRCA9IF9kZWxlZ2F0ZXNCeVRhcmdldC5nZXQodGFyZ2V0SUQpOwotCi0gICAgYm9vbGVhbiBoYXNEZWxlZ2F0ZXMgPSAoZGVsZWdhdGVzQnlJRCAhPSBudWxsICYmICFkZWxlZ2F0ZXNCeUlELmlzRW1wdHkoKSk7Ci0gICAgcmV0dXJuIGhhc0RlbGVnYXRlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmFmZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Zy1pbiBleHRlbnNpb24gcmVnaXN0cnkgYW5kIHJlZ2lzdGVycyBlYWNoIGRlbGVnYXRpbmcKLSAqIHZhbGlkYXRvciBkZXNjcmlwdG9yIHdpdGggdGhlIGRlbGVnYXRlcyByZWdpc3RyeS4KLSAqIAotICogQHNlZSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeQotICovCi1jbGFzcyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlciB7Ci0JLyoqCi0JICogVGhlIGRlbGVnYXRlIGNsYXNzIGF0dHJpYnV0ZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQlVURSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkZWxlZ2F0ZSBlbGVtZW50IG5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVHQVRFX0VMRU1FTlQgPSAiZGVsZWdhdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdmFsaWRhdG9yIGRlbGVnYXRlcyBleHRlbnNpb24gcG9pbnQgaWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJ2YWxpZGF0b3JEZWxlZ2F0ZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVsZWdhdGUgbmFtZSBhdHRyaWJ1dGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHRhcmdldCBpZCBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0FUVFJJQlVURSA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdmFsaWRhdG9yIHJlZ2lzdHJ5IHdoZXJlIHRoZSBkZXNjcmlwdG9ycyBiZWluZyByZWFkIHdpbGwgYmUgcGxhY2VkLgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiAgICAgICAgICAgIFRoZSByZWdpc3RyeSB3aGVyZSB0aGUgZGVzY3JpcHRvcnMgYmVpbmcgcmVhZCB3aWxsIGJlIHBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIoVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGEgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBlbGVtZW50IGJlaW5nIHJlYWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVMRUdBVEVfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyBkZWxlZ2F0ZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUklCVVRFKTsKLQkJCVN0cmluZyBkZWxlZ2F0ZU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FX0FUVFJJQlVURSk7Ci0JCQlTdHJpbmcgdGFyZ2V0VmFsaWRhdG9ySUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShUQVJHRVRfQVRUUklCVVRFKTsKLQotCQkJVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yKAotCQkJCQlkZWxlZ2F0ZUlELCBlbGVtZW50LCBkZWxlZ2F0ZU5hbWUsIHRhcmdldFZhbGlkYXRvcklEKTsKLQotCQkJcmVnaXN0cnkuYWRkKGRlc2NyaXB0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZCBmcm9tIHRoZSBleHRlbnNpb25zIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQl2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELAotCQkJCUVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0KLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVhZEVsZW1lbnQoY29uZmlndXJhdGlvbkVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdlIGRvbid0IHdhbnQgYWxsIHRoZSB2YWxpZGF0b3JzIHRvIGJlIHJlbmRlcmVkIGhlbHBsZXNzCi0JCQkJCS8vIGJ5IHNvbWUKLQkJCQkJLy8gcm9ndWUgY29udHJpYnV0aW9uLCBzbywgd2UgY2F0Y2ggYW55IGV4Y2VwdGlvbiB0aGF0Ci0JCQkJCS8vIG9jY3VycyBkdXJpbmcKLQkJCQkJLy8gaW5pdGlhbGl6YXRpb24sIGxvZyBpdCwgYW5kIGNvbnRpbnVlIG9uLgotCQkJCQlJQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRDb250cmlidXRvcigpOwotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoVmFsTWVzc2FnZXMuUm9ndWVWYWxpZGF0b3IsIGNvbnRyaWJ1dG9yKTsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FsbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BbGxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODA5YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FsbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gaW5zdGFuY2VzIG9mCi0gKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWNhdXNlIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciwgYW5kIGhhbmRsaW5nIG9mIGVycm9yCi0gKiBjb25kaXRpb25zLCBpcyBkb25lIGluIHRoZSBvcGVyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSBzb21lIG9mIHRoZQotICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHZhbGlkYXRvciAoaS5lLiwgdGhlIHByb2plY3QpIGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIHJ1bnMgYWxsIHZhbGlkYXRvcnM6IGVuYWJsZWQgdmFsaWRhdG9ycywgZGlzYWJsZWQgdmFsaWRhdG9ycywgaW5jcmVtZW50YWwKLSAqIHZhbGlkYXRvcnMsIGZ1bGwgdmFsaWRhdG9ycy4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uIGV4dGVuZHMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIHsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcyhwcm9qZWN0LCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gYWxsIGNvbmZpZ3VyZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZAotCSAqIG9yIGRpc2FibGVkIGJ5IHRoZSB1c2VyLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuCi0JICogSWYgYXN5bmMgaXMgZmFsc2UsIG5vIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgQWxsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIHRydWUsIGFzeW5jKTsvLyBhbHdheXMgZm9yY2UgdmFsaWRhdGlvbiB0byBydW4KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0VmFsaWRhdG9ycygpKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9EZWZhdWx0UmVzb3VyY2VVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRGVmYXVsdFJlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIzMWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9EZWZhdWx0UmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBsaW5lIG51bWJlciBjYWxjdWxhdG9yIChhbHdheXMgcmV0dXJucyAiMCIpLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlc291cmNlVXRpbCBpbXBsZW1lbnRzIElSZXNvdXJjZVV0aWwgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklSZXNvdXJjZVV0aWwjZ2V0TGluZU5vKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVObyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAwOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZlNDhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkZpbHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlZ2lzdHJ5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIEltcGxlbWVudGVkIFZhbGlkYXRvcnMgbXVzdCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFueW9uZSBvdGhlciB0aGFuIGluc3RhbmNlcyBvZgotICogVmFsaWRhdGlvbk9wZXJhdGlvbiwgYmVjYXVzZSBzb21lIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWxpZGF0b3IsIGFuZCBoYW5kbGluZyBvZiBlcnJvcgotICogY29uZGl0aW9ucywgaXMgZG9uZSBpbiB0aGUgb3BlcmF0aW9uLiBUaGUgaW5pdGlhbGl6YXRpb24gaXMgc2VwYXJhdGVkIGJlY2F1c2Ugc29tZSBvZiB0aGUKLSAqIGluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIHRoZSB2YWxpZGF0b3IgKGkuZS4sIHRoZSBwcm9qZWN0KSBpc24ndCBrbm93biB1bnRpbCBydW50aW1lLgotICogCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBvcGVyYXRpb24gbG9hZCB0aGUgcHJvamVjdCdzIGNvbmZpZ3VyZWQgdmFsaWRhdG9ycywgYW5kIHJ1biB0aGUgdmFsaWRhdG9ycyBpZgotICogdGhleSBhcmUgYm90aCBlbmFibGVkIGFuZCBpbmNyZW1lbnRhbC4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIGV4dGVuZHMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gewotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlCi0JICogICAgICAgICAgICAgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCwgSVJlc291cmNlRGVsdGEsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJdGhpcyhwcm9qZWN0LCBkZWx0YSwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UKLQkgKiAgICAgICAgICAgICBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgcnVsZUdyb3VwKSB7Ci0JCXRoaXMocHJvamVjdCwgZGVsdGEsIHJ1bGVHcm91cCwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UKLQkgKiAgICAgICAgICAgICBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSwgaW50LCBib29sZWFuKQotCSAqICAgICAgICAgICAgIGluc3RlYWQuCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2YWxpZGF0b3JzLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IHJ1bGVHcm91cCkgewotCQl0aGlzKHByb2plY3QsIGRlbHRhLCBydWxlR3JvdXAsIERFRkFVTFRfQVNZTkMpOwotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyh2YWxpZGF0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGRlbHRhIGlzIG51bGwsIGEgZnVsbCB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IHVzaW5nIG9ubHkgdGhlIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgaXMKLQkgKiBwZXJmb3JtZWQuIElmIGRlbHRhIGlzIG5vdCBudWxsLCBhbGwgZW5hYmxlZCBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIHRoYXQgdmFsaWRhdGUgcmVzb3VyY2VzCi0JICogaW4gdGhlIGRlbHRhIHdpbGwgdmFsaWRhdGUgdGhvc2UgcmVzb3VyY2VzLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLAotCSAqIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwgdmFsaWRhdG9ycyB3aWxsCi0JICogcnVuIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsIGRlbHRhLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBhc3luYyk7Ci0JfQotCQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgZGVsdGEgaXMgbnVsbCwgYSBmdWxsIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QgdXNpbmcgb25seSB0aGUgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyBpcwotCSAqIHBlcmZvcm1lZC4gSWYgZGVsdGEgaXMgbm90IG51bGwsIGFsbCBlbmFibGVkIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgdGhhdCB2YWxpZGF0ZSByZXNvdXJjZXMKLQkgKiBpbiB0aGUgZGVsdGEgd2lsbCB2YWxpZGF0ZSB0aG9zZSByZXNvdXJjZXMuCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsCi0JICogYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbCB2YWxpZGF0b3JzIHdpbGwKLQkgKiBydW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBib29sZWFuIGFzeW5jKSB7Ci0JCXRoaXMocHJvamVjdCxjb250ZXh0LCBkZWx0YSwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgYXN5bmMpOwotCX0KLQkKLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGRlbHRhIGlzIG51bGwsIGEgZnVsbCB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IHVzaW5nIG9ubHkgdGhlIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgaXMKLQkgKiBwZXJmb3JtZWQuIElmIGRlbHRhIGlzIG5vdCBudWxsLCBhbGwgZW5hYmxlZCBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIHRoYXQgdmFsaWRhdGUgcmVzb3VyY2VzCi0JICogaW4gdGhlIGRlbHRhIHdpbGwgdmFsaWRhdGUgdGhvc2UgcmVzb3VyY2VzLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLAotCSAqIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwgdmFsaWRhdG9ycyB3aWxsCi0JICogcnVuIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LElXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIHJ1bGVHcm91cCwgc2hvdWxkRm9yY2UoZGVsdGEpLCBhc3luYyk7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnModHJ1ZSkpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0KLQkJfQotCQlzZXREZWx0YShkZWx0YSk7Ci0JCXNldENvbnRleHQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBkZWx0YSBpcyBudWxsLCBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCB1c2luZyBvbmx5IHRoZSBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIGlzCi0JICogcGVyZm9ybWVkLiBJZiBkZWx0YSBpcyBub3QgbnVsbCwgYWxsIGVuYWJsZWQgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyB0aGF0IHZhbGlkYXRlIHJlc291cmNlcwotCSAqIGluIHRoZSBkZWx0YSB3aWxsIHZhbGlkYXRlIHRob3NlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwKLQkgKiBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsIHZhbGlkYXRvcnMgd2lsbAotCSAqIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgcnVsZUdyb3VwLCBzaG91bGRGb3JjZShkZWx0YSksIGFzeW5jKTsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyh0cnVlKSkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQotCQl9Ci0JCXNldERlbHRhKGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0LCBiZSBvcGVuLCBhbmQgY29udGFpbiBhbGwgb2YgdGhlIHJlc291cmNlcyBpbiBjaGFuZ2VkUmVzb3VyY2VzLiBJZiBzb21lCi0JICogb2YgdGhlIHJlc291cmNlcyBpbiBjaGFuZ2VkUmVzb3VyY2VzIGJlbG9uZyB0byBkaWZmZXJlbnQgcHJvamVjdHMsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIElmIGNoYW5nZWRSZXNvdXJjZXMgaXMgbnVsbCwgYSBmdWxsIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QgdXNpbmcgb25seSB0aGUgaW5jcmVtZW50YWwKLQkgKiB2YWxpZGF0b3JzIGlzIHBlcmZvcm1lZC4gSWYgY2hhbmdlZFJlc291cmNlcyBpcyBub3QgbnVsbCwgYWxsIGVuYWJsZWQgaW5jcmVtZW50YWwgdmFsaWRhdG9ycwotCSAqIHRoYXQgdmFsaWRhdGUgcmVzb3VyY2VzIGluIHRoZSBjaGFuZ2VkUmVzb3VyY2VzIGFycmF5IHdpbGwgdmFsaWRhdGUgdGhvc2UgcmVzb3VyY2VzLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLAotCSAqIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwgdmFsaWRhdG9ycyB3aWxsCi0JICogcnVuIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLElXb3JrYmVuY2hDb250ZXh0IGFXb3JrYmVuY2hDb250ZXh0LCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIHNob3VsZEZvcmNlKGNoYW5nZWRSZXNvdXJjZXMpLCBhc3luYyk7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnModHJ1ZSkpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0KLQkJfQotCQkvL2NvbnN0cnVjdCBhbiBhcnJheSBvZiBJRmlsZURlbHRhW10gdG8gd3JhcCB0aGUgT2JqZWN0W107IG9uZSBJRmlsZURlbHRhIGZvciBlYWNoIE9iamVjdCBpbiB0aGUgYXJyYXkKLQkJc2V0RmlsZURlbHRhcyhGaWx0ZXJVdGlsLmdldEZpbGVEZWx0YXMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSwgY2hhbmdlZFJlc291cmNlcywgZmFsc2UpKTsKLQkJc2V0Q29udGV4dChhV29ya2JlbmNoQ29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QsIGJlIG9wZW4sIGFuZCBjb250YWluIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGluIGNoYW5nZWRSZXNvdXJjZXMuIElmIHNvbWUKLQkgKiBvZiB0aGUgcmVzb3VyY2VzIGluIGNoYW5nZWRSZXNvdXJjZXMgYmVsb25nIHRvIGRpZmZlcmVudCBwcm9qZWN0cywgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogSWYgY2hhbmdlZFJlc291cmNlcyBpcyBudWxsLCBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCB1c2luZyBvbmx5IHRoZSBpbmNyZW1lbnRhbAotCSAqIHZhbGlkYXRvcnMgaXMgcGVyZm9ybWVkLiBJZiBjaGFuZ2VkUmVzb3VyY2VzIGlzIG5vdCBudWxsLCBhbGwgZW5hYmxlZCBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzCi0JICogdGhhdCB2YWxpZGF0ZSByZXNvdXJjZXMgaW4gdGhlIGNoYW5nZWRSZXNvdXJjZXMgYXJyYXkgd2lsbCB2YWxpZGF0ZSB0aG9zZSByZXNvdXJjZXMuCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsCi0JICogYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbCB2YWxpZGF0b3JzIHdpbGwKLQkgKiBydW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMsSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBzaG91bGRGb3JjZShjaGFuZ2VkUmVzb3VyY2VzKSwgYXN5bmMpOwotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXNldEVuYWJsZWRWYWxpZGF0b3JzKEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKHRydWUpKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCi0JCX0KLQkJLy9jb25zdHJ1Y3QgYW4gYXJyYXkgb2YgSUZpbGVEZWx0YVtdIHRvIHdyYXAgdGhlIE9iamVjdFtdOyBvbmUgSUZpbGVEZWx0YSBmb3IgZWFjaCBPYmplY3QgaW4gdGhlIGFycmF5Ci0JCXNldEZpbGVEZWx0YXMoRmlsdGVyVXRpbC5nZXRGaWxlRGVsdGFzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCksIGNoYW5nZWRSZXNvdXJjZXMsIGZhbHNlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjhhZmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZWdpc3RyeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotCi0vKioKLSAqIEltcGxlbWVudGVkIFZhbGlkYXRvcnMgbXVzdCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFueW9uZSBvdGhlciB0aGFuIGluc3RhbmNlcyBvZgotICogVmFsaWRhdGlvbk9wZXJhdGlvbiwgYmVjYXVzZSBzb21lIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWxpZGF0b3IsIGFuZCBoYW5kbGluZyBvZiBlcnJvcgotICogY29uZGl0aW9ucywgaXMgZG9uZSBpbiB0aGUgb3BlcmF0aW9uLiBUaGUgaW5pdGlhbGl6YXRpb24gaXMgc2VwYXJhdGVkIGJlY2F1c2Ugc29tZSBvZiB0aGUKLSAqIGluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIHRoZSB2YWxpZGF0b3IgKGkuZS4sIHRoZSBwcm9qZWN0KSBpc24ndCBrbm93biB1bnRpbCBydW50aW1lLgotICogCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBvcGVyYXRpb24gcnVuIGV2ZXJ5IGVuYWJsZWQgdmFsaWRhdG9yIChib3RoIGZ1bGwgYW5kIGluY3JlbWVudGFsKSBvbiB0aGUKLSAqIHByb2plY3QuCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gZXh0ZW5kcyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gewotCQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcyhwcm9qZWN0LCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCwgaW50LAotCSAqICAgICAgICAgICAgIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGludCBydWxlR3JvdXApIHsKLQkJdGhpcyhwcm9qZWN0LCBydWxlR3JvdXAsIERFRkFVTFRfRk9SQ0UsIERFRkFVTFRfQVNZTkMpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBpbnQsCi0JICogICAgICAgICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSkgewotCQl0aGlzKHByb2plY3QsIHJ1bGVHcm91cCwgZm9yY2UsIERFRkFVTFRfQVNZTkMpOwotCX0KLQotCS8qKgotCSAqIFJ1biBhbGwgZW5hYmxlZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3JKb2IgaW50ZXJmYWNlIAotCSAqIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLCBpZiBhc3luYyBpcyBmYWxzZSwgaXQgd291bGQgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gCi0JICogQWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3IgaW50ZXJmYWNlIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZCByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZy4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIERFRkFVTFRfRk9SQ0UsIGFzeW5jKTsKLQl9Ci0JCi0JLyoqCi0JICogUnVuIGFsbCBlbmFibGVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3QuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UgCi0JICogaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGlmIGFzeW5jIGlzIGZhbHNlLCBpdCB3b3VsZCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiAKLQkgKiBBbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvciBpbnRlcmZhY2Ugd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBmbGFnLgotCSAqLwotCXB1YmxpYyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJV29ya2JlbmNoQ29udGV4dCBhV29ya2JlbmNoQ29udGV4dCwgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsIGFXb3JrYmVuY2hDb250ZXh0LCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBERUZBVUxUX0ZPUkNFLCBhc3luYyk7Ci0JfQotCQotCS8qKgotCSAqIFJ1biBhbGwgZW5hYmxlZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0IHdpdGggdGhlIGlkZW50aWZpZWQgcnVsZUdyb3VwLgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3JKb2IgaW50ZXJmYWNlIAotCSAqIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLCBpZiBhc3luYyBpcyBmYWxzZSwgaXQgd291bGQgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gCi0JICogQWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3IgaW50ZXJmYWNlIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZCByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZy4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVdvcmtiZW5jaENvbnRleHQgYVdvcmtiZW5jaENvbnRleHQsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBhV29ya2JlbmNoQ29udGV4dCwgVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0RW5hYmxlZFZhbGlkYXRvcnMocHJvamVjdCksIHJ1bGVHcm91cCwgZm9yY2UsIGFzeW5jKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSdW4gYWxsIGVuYWJsZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdCB3aXRoIHRoZSBpZGVudGlmaWVkIHJ1bGVHcm91cC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHVibGljIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRFbmFibGVkVmFsaWRhdG9ycyhwcm9qZWN0KSwgcnVsZUdyb3VwLCBmb3JjZSwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIFJ1biB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3JKb2IgaW50ZXJmYWNlIAotCSAqIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLCBpZiBhc3luYyBpcyBmYWxzZSwgaXQgd291bGQgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gCi0JICogQWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3IgaW50ZXJmYWNlIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZCByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZy4KLQkgKi8KLQlwcm90ZWN0ZWQgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkVmFsaWRhdG9ycywgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsIGVuYWJsZWRWYWxpZGF0b3JzLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBERUZBVUxUX0ZPUkNFLCBhc3luYyk7IAotCQkvLyB0cnVlID0gZm9yY2UgdmFsaWRhdGlvbiB0byBydW4gd2hldGhlciBvciBub3QgYXV0by12YWxpZGF0ZSBpcyBvbgotCX0KLQkKLQkvKioKLQkgKiBSdW4gdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHJvdGVjdGVkIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsSVdvcmtiZW5jaENvbnRleHQgYVdvcmtiZW5jaENvbnRleHQsIAotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzLCBib29sZWFuIGFzeW5jKSB7Ci0JCXRoaXMocHJvamVjdCxhV29ya2JlbmNoQ29udGV4dCwgZW5hYmxlZFZhbGlkYXRvcnMsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIERFRkFVTFRfRk9SQ0UsIGFzeW5jKTsgCi0JCS8vIHRydWUgPSBmb3JjZSB2YWxpZGF0aW9uIHRvIHJ1biB3aGV0aGVyIG9yIG5vdCBhdXRvLXZhbGlkYXRlIGlzIG9uCi0JfQotCi0JLyoqCi0JICogUnVuIHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3Qgd2l0aCB0aGUgcnVsZUdyb3VwLgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3JKb2IgaW50ZXJmYWNlIAotCSAqIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLCBpZiBhc3luYyBpcyBmYWxzZSwgaXQgd291bGQgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gCi0JICogQWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3IgaW50ZXJmYWNlIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZCByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZy4KLQkgKi8KLQlwcm90ZWN0ZWQgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkVmFsaWRhdG9ycywgCi0JCWludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJCi0JCXN1cGVyKHByb2plY3QsIGZvcmNlLCBydWxlR3JvdXAsIGFzeW5jKTsKLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdCB3aXRoIHRoZSBydWxlR3JvdXAuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UgCi0JICogaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGlmIGFzeW5jIGlzIGZhbHNlLCBpdCB3b3VsZCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiAKLQkgKiBBbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvciBpbnRlcmZhY2Ugd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBmbGFnLgotCSAqLwotCXByb3RlY3RlZCBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJV29ya2JlbmNoQ29udGV4dCBhV29ya2JlbmNoQ29udGV4dCwgCi0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZW5hYmxlZFZhbGlkYXRvcnMsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCxhV29ya2JlbmNoQ29udGV4dCxmb3JjZSwgcnVsZUdyb3VwLCBhc3luYyk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRWYWxpZGF0b3JzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVJlc291cmNlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lSZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMzRiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVJlc291cmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlVXRpbCB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgT2JqZWN0IGlzIGxvY2F0ZWQuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oT2JqZWN0IG9iaik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lSdWxlR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JUnVsZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMmFkMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lSdWxlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBncm91cCBvZiBydWxlcyB3aGljaCBhIHZhbGlkYXRvciBjaGVja3MuIEZvciBub3csIHRoZSBvbmx5IGdyb3VwaW5nIGlzIGJ5Ci0gKiBzcGVlZDogaWYgYSBzZXQgb2YgcnVsZXMgY2FuIGJlIGNoZWNrZWQgcXVpY2tseSwgaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgUEFTU19GQVNUIGdyb3VwLAotICogb3RoZXJ3aXNlLCBpdCBpcyBncm91cGVkIGluIHRoZSBQQVNTX0ZVTEwgZ3JvdXAuCi0gKiAKLSAqIEluIGZ1dHVyZSwgdGhpcyBjb3VsZCBiZSBleHRlbmRlZCB0byBpbmNsdWRlIHNldmVyaXRpZXMuIFRvIGJlIGFibGUgdG8gZ3JvdXAgYnkgc2V2ZXJpdHkgaGVscHMKLSAqIHdpdGggdGhlIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbi4gQSB2YWxpZGF0b3Igc2hvdWxkIHJlcG9ydCBlcnJvcnMgZmlyc3QsIGFuZCB0aGVuIHdhcm5pbmdzLCBhbmQKLSAqIHRoZW4gaW5mb3MsIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBtZXNzYWdlIGxpbWl0IGJlaW5nIHJlYWNoZWQgYmVmb3JlIHRoZSBtb3N0IHNldmVyZSBwcm9ibGVtcyBhcmUKLSAqIHJlcG9ydGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdWxlR3JvdXAgewotCS8vIFRoZSBmb2xsb3dpbmcgZmlsdGVycyBhcmUgdXNlZCB0byBpZGVudGlmeSBhIGdyb3VwIG9mIHZhbGlkYXRpb24gY2hlY2tzLgotCi0JLy8gcmV0cmlldmVzIHRoZSB0eXBlIG9mIHBhc3MsIGZyb20gdGhlIElWYWxpZGF0aW9uQ29udGV4dCwgd2hpY2ggdGhlIHZhbGlkYXRvciBzaG91bGQgZXhlY3V0ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NfTEVWRUwgPSAiUEFTU19MRVZFTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIE9uIHRoZSBGQVNUX1BBU1MsIHRoZSB2YWxpZGF0b3Igc2hvdWxkIGNoZWNrIHRoZSBydWxlcyB3aGljaCBkbyBub3QKLQkvLyB0YWtlIG11Y2ggdGltZSB0byBjaGVjaywgYW5kIGV4Y2x1ZGUgdGhlIHJ1bGVzIHdoaWNoIGFyZSB2YWxpZCBvbmx5Ci0JLy8gYmVmb3JlIHNvbWUgYWN0aW9uIChlLmcuIGV4cG9ydGluZyBvciBkZXBsb3lpbmcpLgotCS8vIAotCS8vIFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZXMgaXMgaXJyZWxldmFudC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTX0ZBU1QgPSAweDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU19GQVNUX05BTUUgPSAiZmFzdCI7IC8vJE5PTi1OTFMtMSQgLy8gSW4gcGx1Z2luLnhtbCwgaWRlbnRpZnkgdGhpcyBwYXNzIGJ5IHRoaXMgY29uc3RhbnQKLQotCS8vIE9uIHRoZSBGVUxMX1BBU1MsIHRoZSB2YWxpZGF0b3Igc2hvdWxkIGNoZWNrIGV2ZXJ5dGhpbmcuIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU19GVUxMID0gMHgyIHwgUEFTU19GQVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NfRlVMTF9OQU1FID0gImZ1bGwiOyAvLyROT04tTkxTLTEkIC8vIEluIHBsdWdpbi54bWwsIGlkZW50aWZ5IHRoaXMgcGFzcyBieSB0aGlzIGNvbnN0YW50Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JV29ya2JlbmNoQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lXb3JrYmVuY2hDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTRiNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lXb3JrYmVuY2hDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogSW4gdGhlIGVjbGlwc2UgZW52aXJvbm1lbnQsIG5vdCBvbmx5IGRvZXMgdGhlIElWYWxpZGF0aW9uQ29udGV4dCBuZWVkIHRvIGJlIGFibGUgdG8gbG9hZCB0aGUgTU9GIG1vZGVsLCBpdAotICogYWxzbyBuZWVkcyB0byBsb2FkIGl0ZW1zIGZyb20gdGhlIGVjbGlwc2Ugd29ya2JlbmNoLiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgZXh0ZW5kZWQgYnkKLSAqIHdvcmtiZW5jaCBJSGVscGVycywgc28gdGhhdCBpdGVtcyBjYW4gYmUgYWRkZWQgdG8sIGFuZCBmcm9tLCB0aGUgdGFzayBsaXN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXb3JrYmVuY2hDb250ZXh0IGV4dGVuZHMgSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCB7Ci0JLyoqCi0JICogV2hlbiB0aGUgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgc28gdGhhdCB0aGUgSVdvcmtiZW5jaENvbnRleHQgY2FuCi0JICogY2xlYW4gdXAgYW55IHJlc291cmNlcyBpdCBhbGxvY2F0ZWQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uLgotCSAqIAotCSAqIElmIHRoZSBjbGVhbnVwIGlzIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgc3VidGFzayBtZXNzYWdlcyBzaG91bGQgYmUgc2VudCB0byB0aGUgSVJlcG9ydGVyLgotCSAqLwotCXZvaWQgY2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcik7Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBJUHJvamVjdCBpcyBjbG9zaW5nLCBwZXJmb3JtIGFueSBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4gV2hlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGNhbGxlZCwgaWYgdGhlIGhlbHBlciBoYXMgY2FjaGVkIGFueSByZXNvdXJjZXMgZnJvbSB0aGUgSVByb2plY3QsIGl0IHNob3VsZCByZWxlYXNlIHRob3NlCi0JICogcmVzb3VyY2VzLiBJZiB5b3UgZG8gbm90IGFsbG9jYXRlIHJlc291cmNlcyBpbiB5b3VyIGhlbHBlciwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYQotCSAqIG5vLW9wLgotCSAqLwotCXZvaWQgY2xvc2luZygpOwotCi0JLyoqCi0JICogV2hlbiB0aGUgSVByb2plY3QgaXMgYmVpbmcgZGVsZXRlZCwgcGVyZm9ybSBhbnkgY2xlYW51cCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuIFdoZW4gdGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQsIGlmIHRoZSBoZWxwZXIgaGFzIGNhY2hlZCBhbnkgcmVzb3VyY2VzIGZyb20gdGhlIElQcm9qZWN0LCBpdCBzaG91bGQgcmVsZWFzZQotCSAqIHRob3NlIHJlc291cmNlcy4gSWYgeW91IGRvIG5vdCBhbGxvY2F0ZSByZXNvdXJjZXMgaW4geW91ciBoZWxwZXIsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0JICogYSBuby1vcC4KLQkgKi8KLQl2b2lkIGRlbGV0aW5nKCk7Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBPYmplY3QsIGlmIHRoZSBvYmplY3QgaGFzIGEgY29ycmVzcG9uZGluZyBJRmlsZSBpbiB0aGUgd29ya2JlbmNoLCByZXR1cm4gdGhlIElGaWxlLgotCSAqIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBXb3JrYmVuY2hSZXBvcnRlci4gSW4gZWNsaXBzZSwgaW4gb3JkZXIgdG8gYWRkIG9yIHJlbW92ZSBhIHRhc2sKLQkgKiBsaXN0IGVudHJ5LCB0aGUgSVJlc291cmNlLCB0byB3aGljaCB0aGUgZW50cnkgYXBwbGllcywgbXVzdCBiZSBpZGVudGlmaWVkLiBUaGUgSVJlcG9ydGVyCi0JICogaW50ZXJmYWNlIHBhc3NlcyBpbiBhbiBPYmplY3QgaW4gdGhlc2UgbWV0aG9kczoKLQkgKiAKLQkgKiBhZGRWYWxpZGF0aW9uTWVzc2FnZShJVmFsaWRhdG9yLCBJTWVzc2FnZSkgLy8gT2JqZWN0IGlzIGEgcGFydCBvZiBJTWVzc2FnZQotCSAqIAotCSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCksCi0JICogCi0JICogVGh1cywgdGhlIFdvcmtiZW5jaFJlcG9ydGVyIG5lZWRzIHRvIGtub3cgaG93LCBnaXZlbiB0aGUgT2JqZWN0LCB3aGljaCBJRmlsZSB0aGF0IHRoZSBPYmplY3QKLQkgKiByZXByZXNlbnRzIGluIHRoZSB3b3JrYmVuY2gsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gYWRkIHRoZSB0YXNrIGxpc3QgZW50cnkuCi0JICogCi0JICogSWYgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLCB0aGVuIHRoZSBXb3JrYmVuY2hSZXBvcnRlciB3aWxsIGFkZCB0aGUgbWVzc2FnZSB0byB0aGUgSVByb2plY3QKLQkgKiBpbnN0ZWFkIG9mIGFuIElGaWxlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEltcGxlbWVudCBnZXRSZXNvdXJjZShPYmplY3QpIGluc3RlYWQuCi0JICovCi0JSUZpbGUgZ2V0RmlsZShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIEdpdmVuIGFuIE9iamVjdCwgaWYgdGhlIG9iamVjdCBoYXMgYSBjb3JyZXNwb25kaW5nIElSZXNvdXJjZSBpbiB0aGUgd29ya2JlbmNoLCByZXR1cm4gdGhlCi0JICogSVJlc291cmNlZS4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLiBJbiBlY2xpcHNlLCBpbiBvcmRlciB0byBhZGQgb3IgcmVtb3ZlIGEgdGFzawotCSAqIGxpc3QgZW50cnksIHRoZSBJUmVzb3VyY2UsIHRvIHdoaWNoIHRoZSBlbnRyeSBhcHBsaWVzLCBtdXN0IGJlIGlkZW50aWZpZWQuIFRoZSBJUmVwb3J0ZXIKLQkgKiBpbnRlcmZhY2UgcGFzc2VzIGluIGFuIE9iamVjdCBpbiB0aGVzZSBtZXRob2RzOgotCSAqIAotCSAqIGFkZFZhbGlkYXRpb25NZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKSAvLyBPYmplY3QgaXMgYSBwYXJ0IG9mIElNZXNzYWdlCi0JICogCi0JICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KSwKLQkgKiAKLQkgKiBUaHVzLCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgbmVlZHMgdG8ga25vdyBob3csIGdpdmVuIHRoZSBPYmplY3QsIHdoaWNoIElGaWxlIHRoYXQgdGhlIE9iamVjdAotCSAqIHJlcHJlc2VudHMgaW4gdGhlIHdvcmtiZW5jaCwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBhZGQgdGhlIHRhc2sgbGlzdCBlbnRyeS4KLQkgKiAKLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwsIHRoZW4gdGhlIFdvcmtiZW5jaFJlcG9ydGVyIHdpbGwgYWRkIHRoZSBtZXNzYWdlIHRvIHRoZSBJUHJvamVjdAotCSAqIGluc3RlYWQgb2YgYW4gSVJlc291cmNlLgotCSAqLwotCUlSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIEdpdmVuIGFuIElNZXNzYWdlJ3MgdGFyZ2V0IG9iamVjdCwgcmV0dXJuIHRoZSBsaW5lIG51bWJlciwgb2YgdGhlIElGaWxlLCB3aGljaCB0aGUgdGFyZ2V0Ci0JICogb2JqZWN0IHJlcHJlc2VudHMsIGlmIHBvc3NpYmxlLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIG9yIGlmIGFjY2VzcyB0byBsaW5lIG51bWJlcnMgaXMgbm90Ci0JICogcG9zc2libGUsIHJldHVybiBhIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGxvY2F0aW9uLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZXRoZXIgb3Igbm90IHRoZSBJUmVzb3VyY2UgaXMgYW4gSUZpbGUsIElGb2xkZXIsIG9yIElQcm9qZWN0LgotCSAqIExpbmUgbnVtYmVycyBhcmUgdmFsaWQgb25seSBmb3IgSUZpbGUgdHlwZXM7IGlmIHRoZSByZXNvdXJjZSBpcyBub3QgYW4gSUZpbGUsIHRoZW4gYSB0ZXh0Ci0JICogZGVzY3JpcHRpb24gb2YgdGhlIGxvY2F0aW9uIG11c3QgYmUgcmV0dXJuZWQuCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSwgd2l0aG91dCB0aGUgcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpbiBmcm9udC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFZhbGlkYXRpb25PcGVyYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBub24tZW52aXJvbm1lbnQgc3BlY2lmaWMgbmFtZXMgb2YKLQkgKiB0aGUgZmlsZXMuIE9ubHkgdGhlIElXb3JrYmVuY2hDb250ZXh0IGltcGxlbWVudGF0aW9uIGtub3dzIGhvdyBtdWNoIGluZm9ybWF0aW9uIHRvIHN0cmlwIG9mZgotCSAqIG9mIHRoZSBJUmVzb3VyY2UgbmFtZS4gRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGFuIEVKQiBQcm9qZWN0IG5hbWVkICJNeUVKQlByb2plY3QiLCBhbmQgaXQKLQkgKiB1c2VzIHRoZSBkZWZhdWx0IG5hbWVzIGZvciB0aGUgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycywgInNvdXJjZSIgYW5kICJlamJNb2R1bGUiLAotCSAqIHJlc3BlY3RpdmVseSwgdGhlbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBFSkIgSGVscGVyIGtub3dzIGhvdyBtdWNoIG9mIHRoYXQgc3RydWN0dXJlCi0JICogaXMgZWNsaXBzZS1zcGVjaWZpYy4KLQkgKiA8L3A+PHA+Ci0JICogU2luY2UgdGhlICJzb3VyY2UiIGZvbGRlciBjb250YWlucyBKYXZhIHNvdXJjZSBmaWxlcywgYSBwb3J0YWJsZSBuYW1lIHdvdWxkIGJlIHRoZQotCSAqIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLCB3aXRob3V0IHRoZSBlY2xpcHNlLXNwZWNpZmljIHByb2plY3QgYW5kIGZvbGRlciBuYW1lcwotCSAqIGluIGZyb250IG9mIHRoZSBmaWxlIG5hbWUuIFRoZSBFSkJIZWxwZXIga25vd3MgdGhhdCBldmVyeXRoaW5nIHVwIHRvIHRoZSAic291cmNlIiBmb2xkZXIsIGZvcgotCSAqIGV4YW1wbGUsIGNhbiBiZSByZW1vdmVkLCBiZWNhdXNlLCBhY2NvcmRpbmcgdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIEVKQiBQcm9qZWN0LCBldmVyeXRoaW5nCi0JICogY29udGFpbmVkIGluIHRoZSBzb3VyY2UgZm9sZGVyIGlzIGphdmEgc291cmNlIGNvZGUuIFNvIGlmIHRoZXJlIGlzIGFuIElSZXNvdXJjZSBpbiBhbiBFSkIKLQkgKiBQcm9qZWN0IG5hbWVkICIvTXlFSkJQcm9qZWN0L3NvdXJjZS9jb20vaWJtL215Y2xhc3Nlcy9NeUphdmFGaWxlLmphdmEiLCB0aGlzIG1ldGhvZCB3b3VsZAotCSAqIG1ha2UgdGhpcyBuYW1lIHBvcnRhYmxlIGJ5IHN0cmlwcGluZyBvZmYgdGhlICIvTXlFSkJQcm9qZWN0L3NvdXJjZSIsIGFuZCByZXR1cm5pbmcKLQkgKiAiY29tL2libS9teWNsYXNzZXMvTXlKYXZhRmlsZS5qYXZhIi4KLQkgKiA8L3A+PHA+Ci0JICogVGhlIG91dHB1dCBvZiB0aGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBWYWxpZGF0aW9uT3BlcmF0aW9uLCB3aGVuIGl0IGlzIGNhbGN1bGF0aW5nIHRoZSBsaXN0Ci0JICogb2YgYWRkZWQvY2hhbmdlZC9kZWxldGVkIGZpbGUgbmFtZXMgZm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIElmIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UpCi0JICogcmV0dXJucyBudWxsLCB0aGF0IG1lYW5zIHRoYXQgdGhlIElXb3JrYmVuY2hDb250ZXh0J3MgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGF0Ci0JICogcGFydGljdWxhciB0eXBlIG9mIHJlc291cmNlLCBhbmQgdGhlIHJlc291cmNlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFycmF5IG9mCi0JICogSUZpbGVEZWx0YSBvYmplY3RzIGluIHRoZSBJVmFsaWRhdG9yJ3MgInZhbGlkYXRlIiBtZXRob2QuCi0JICogPC9wPgotCSAqLwotCVN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVByb2plY3Qgd2hpY2ggaXMgYWJvdXQgdG8gYmUgdmFsaWRhdGVkLiBFYWNoIElXb3JrYmVuY2hDb250ZXh0IGtub3dzIGhvdyB0bwotCSAqIHRyYXZlcnNlIGEgY2VydGFpbiB0eXBlIG9mIElQcm9qZWN0LCBmb3IgZXhhbXBsZSwgYW4gRUpCIHByb2plY3Qgb3IgYSB3ZWIgcHJvamVjdC4KLQkgKi8KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBXaGVuIGFuIElWYWxpZGF0b3IgYXNzb2NpYXRlcyBhIHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJTWVzc2FnZSwgdGhlIFdvcmtiZW5jaFJlcG9ydGVyCi0JICogZXZlbnR1YWxseSByZXNvbHZlcyB0aGF0IHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJUmVzb3VyY2UuIFNvbWV0aW1lcyBtb3JlIHRoYW4gb25lIHRhcmdldAotCSAqIG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZSBJUmVzb3VyY2UgKHVzdWFsbHkgdGhlIElQcm9qZWN0LCB3aGljaCBpcyB0aGUgZGVmYXVsdCBJUmVzb3VyY2UKLQkgKiB3aGVuIGFuIElGaWxlIGNhbm5vdCBiZSBmb3VuZCkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLCBzbyB0aGF0IHRoZQotCSAqIFdvcmtiZW5jaFJlcG9ydGVyIGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBJTWVzc2FnZXMgd2hpY2ggYXJlIG9uIHRoZSBzYW1lIElSZXNvdXJjZSwgYnV0Ci0JICogcmVmZXIgdG8gZGlmZmVyZW50IHRhcmdldCBvYmplY3RzLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsCi0JICogT2JqZWN0KSBtZXRob2QsIHNvIHRoYXQgd2hlbiBvbmUgdGFyZ2V0IG9iamVjdCByZW1vdmVzIGFsbCBvZiBpdHMgbWVzc2FnZXMsIHRoYXQgaXQgZG9lc24ndAotCSAqIHJlbW92ZSBhbm90aGVyIHRhcmdldCBvYmplY3QncyBtZXNzYWdlcy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgb25seSBpZiBvYmplY3QgaXMgbnVsbC4gT3RoZXJ3aXNlLCBhbiBpZCB3aGljaCBjYW4gdW5pcXVlbHkKLQkgKiBpZGVudGlmeSBhIHBhcnRpY3VsYXIgb2JqZWN0IG11c3QgYmUgcmV0dXJuZWQuIFRoZSBpZCBuZWVkcyB0byBiZSB1bmlxdWUgb25seSB3aXRoaW4gb25lCi0JICogcGFydGljdWxhciBJVmFsaWRhdG9yLgotCSAqLwotCVN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogV2hldGhlciBmdWxsIG9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24gaXMgcnVubmluZywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGJ5IHRoZQotCSAqIFZhbGlkYXRpb24gRnJhbWV3b3JrLCBmb3IgZXZlcnkgSVJlc291cmNlIHdoaWNoIGlzIGZpbHRlcmVkIGluIGJ5IHRoZSBJVmFsaWRhdG9yLCBzbyB0aGF0IHRoZQotCSAqIElWYWxpZGF0aW9uQ29udGV4dCBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCBvbmUgb2YgdGhlIHJlc291cmNlcywgd2hpY2ggdmFsaWRhdGlvbiB3aWxsIHJ1biBvbiwgaXMKLQkgKiBiZWluZyBmaWx0ZXJlZCBpbi4KLQkgKi8KLQl2b2lkIHJlZ2lzdGVyUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmssIHRvIGluaXRpYWxpemUgdGhlIElXb3JrYmVuY2hDb250ZXh0IHNvIHRoYXQKLQkgKiBpdCBjYW4gZ2F0aGVyIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdC4KLQkgKi8KLQl2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIElXb3JrYmVuY2hDb250ZXh0IHRoYXQgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrIGlzIHNodXR0aW5nIGRvd24uIFRoZXJlIHdpbGwgYmUKLQkgKiBjYWxscyB0byBjbG9zaW5nKElQcm9qZWN0KSBhbmQgcG9zc2libHkgZGVsZXRpbmcoSVByb2plY3QpIGZvbGxvd2luZyB0aGlzIGNhbGwsIGJ1dCB0aGUKLQkgKiByZXNvdXJjZXMgbWF5IGFscmVhZHkgYmUgY2xvc2VkIGJ5IHRoZSB0aW1lIHRoYXQgdGhvc2UgbWV0aG9kcyBhcmUgY2FsbGVkLCBzbyBFVkVSWVRISU5HCi0JICogc2hvdWxkIGJlIGNsZWFuZWQgdXAgaW4gdGhpcyBtZXRob2QuIFRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIHRoZSBwcm9qZWN0IHdoaWNoIGlzIGFib3V0IHRvCi0JICogc2h1dCBkb3duLiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbmNlIGZvciBldmVyeSBJUHJvamVjdCBpbiB0aGUgd29ya2JlbmNoLiBUaGUgSVByb2plY3QKLQkgKiBtYXksIG9yIG1heSBub3QsIGJlIGNsb3NlZC4KLQkgKi8KLQl2b2lkIHNodXRkb3duKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTG9jYWxpemVkTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0xvY2FsaXplZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwMzA1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTG9jYWxpemVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHZhbGlkYXRvcnMgd2hpY2ggcnVuIG9ubHkgaW4gVUkgYW5kIHdob3NlIG1lc3NhZ2VzLCBiZWNhdXNlIHRoZXkKLSAqIGNvbWUgZnJvbSBhbm90aGVyIHRvb2wsIGFyZSBhbHJlYWR5IGxvY2FsaXplZC4gTG9jYWxpemVkTWVzc2FnZSBjYW5ub3QgYmUgdXNlZCBieSBhbnkgdmFsaWRhdG9yCi0gKiB3aGljaCBuZWVkcyB0byBydW4gaW4gYm90aCBXZWJTcGhlcmUgYW5kIFdTQUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2U7Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQlyZXR1cm4gX21lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWFudWFsSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWFudWFsSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZDVmMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01hbnVhbEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRmlsdGVyVXRpbDsKLQotCi0vKioKLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW51YWxJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gZXh0ZW5kcyBNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBNYW51YWxJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlciggcHJvamVjdCApOwotCX0JCi0JcHVibGljIE1hbnVhbEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCXN1cGVyKCBwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzICk7Ci0JCXNldEZpbGVEZWx0YXMoIEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBmYWxzZSkgKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9NYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYTBiZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlZ2lzdHJ5Q29uc3RhbnRzOwotCi0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gaW5zdGFuY2VzIG9mCi0gKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWNhdXNlIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciwgYW5kIGhhbmRsaW5nIG9mIGVycm9yCi0gKiBjb25kaXRpb25zLCBpcyBkb25lIGluIHRoZSBvcGVyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSBzb21lIG9mIHRoZQotICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHZhbGlkYXRvciAoaS5lLiwgdGhlIHByb2plY3QpIGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiA8cD4KLSAqIEluc3RhbmNlcyBvZiB0aGlzIG9wZXJhdGlvbiBydW4gZXZlcnkgZW5hYmxlZCB2YWxpZGF0b3IgKGJvdGggZnVsbCBhbmQgaW5jcmVtZW50YWwpIG9uIHRoZQotICogcHJvamVjdC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uIGV4dGVuZHMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocHJvamVjdCwgREVGQVVMVF9GT1JDRSwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgdHJ1ZSk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKHByb2plY3QpKTsKLQl9CQotCXB1YmxpYyBNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIE9iamVjdFtdIGNoYW5nZWRSZXNvdXJjZXMpIHsKLQkJc3VwZXIocHJvamVjdCwgc2hvdWxkRm9yY2UoY2hhbmdlZFJlc291cmNlcyksIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIHRydWUpOwotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycyhwcm9qZWN0KSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9NZXNzYWdlSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01lc3NhZ2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjkzYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01lc3NhZ2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlSW5mbyB7Ci0KLQlwcml2YXRlIFN0cmluZwkJbWVzc2FnZU93bmVySWQ7CQotCXByaXZhdGUgSVJlc291cmNlCXJlc291cmNlOwotCXByaXZhdGUgU3RyaW5nCQlsb2NhdGlvbjsJCi0JcHJpdmF0ZSBTdHJpbmcJCXRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcJCXRhcmdldE9iamVjdE5hbWU7CQotCXByaXZhdGUgU3RyaW5nCQltYXJrZXJJZDsJCi0JcHJpdmF0ZSBJTWVzc2FnZQltc2c7Ci0JCi0JcHVibGljIE1lc3NhZ2VJbmZvKCl7CQkKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2VJbmZvKFN0cmluZyBtZXNzYWdlT3duZXJJZCwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbG9jYXRpb24sIAotCQlTdHJpbmcgdGV4dCwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBtYXJrZXJJZCwgSU1lc3NhZ2UgbXNnKXsKLQkJCi0JCXRoaXMubWVzc2FnZU93bmVySWQgPSBtZXNzYWdlT3duZXJJZDsJCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwkKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJdGhpcy50YXJnZXRPYmplY3ROYW1lID0gdGFyZ2V0T2JqZWN0TmFtZTsJCi0JCXRoaXMubWFya2VySWQgPSBtYXJrZXJJZDsJCi0JCXRoaXMubXNnID0gbXNnOwotCX0JCi0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmtlcklkKCkgewotCQlyZXR1cm4gbWFya2VySWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFya2VySWQoU3RyaW5nIG1hcmtlcklkKSB7Ci0JCXRoaXMubWFya2VySWQgPSBtYXJrZXJJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VPd25lcklkKCkgewotCQlyZXR1cm4gbWVzc2FnZU93bmVySWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZU93bmVySWQoU3RyaW5nIG1lc3NhZ2VPd25lcklkKSB7Ci0JCXRoaXMubWVzc2FnZU93bmVySWQgPSBtZXNzYWdlT3duZXJJZDsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TXNnKCkgewotCQlyZXR1cm4gbXNnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1zZyhJTWVzc2FnZSBtc2cpIHsKLQkJdGhpcy5tc2cgPSBtc2c7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKCkgewotCQlyZXR1cm4gdGFyZ2V0T2JqZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRPYmplY3ROYW1lKFN0cmluZyB0YXJnZXRPYmplY3ROYW1lKSB7Ci0JCXRoaXMudGFyZ2V0T2JqZWN0TmFtZSA9IHRhcmdldE9iamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh0ZXh0ICE9IG51bGwpcmV0dXJuICJNZXNzYWdlSW5mbzogIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL09uZVZhbGlkYXRvck9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL09uZVZhbGlkYXRvck9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQzNTliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9PbmVWYWxpZGF0b3JPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotCi0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gaW5zdGFuY2VzIG9mCi0gKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWNhdXNlIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciwgYW5kIGhhbmRsaW5nIG9mIGVycm9yCi0gKiBjb25kaXRpb25zLCBpcyBkb25lIGluIHRoZSBvcGVyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSBzb21lIG9mIHRoZQotICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHZhbGlkYXRvciAoaS5lLiwgdGhlIHByb2plY3QpIGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIHJ1bnMgYSBzaW5nbGUgdmFsaWRhdG9yIG9uIGEgcHJvamVjdC4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVWYWxpZGF0b3JPcGVyYXRpb24gZXh0ZW5kcyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gewotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlIE9uZVZhbGlkYXRvck9wZXJhdGlvbihwcm9qZWN0LCB2YWxpZGF0b3JJZCwKLQkgKiAgICAgICAgICAgICBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvcklkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0LCB2YWxpZGF0b3JJZCwgREVGQVVMVF9GT1JDRSwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgT25lVmFsaWRhdG9yT3BlcmF0aW9uKHByb2plY3QsIHZhbGlkYXRvcklkLAotCSAqICAgICAgICAgICAgIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIE9uZVZhbGlkYXRvck9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsaWRhdG9ySWQsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3QsIHZhbGlkYXRvcklkLCBmb3JjZSwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgT25lVmFsaWRhdG9yT3BlcmF0aW9uKElQcm9qZWN0LCBTdHJpbmcsCi0JICogICAgICAgICAgICAgYm9vbGVhbiwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvcklkLCBib29sZWFuIGZvcmNlLCBpbnQgcnVsZUdyb3VwKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0LCB2YWxpZGF0b3JJZCwgZm9yY2UsIHJ1bGVHcm91cCwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkYXRvcklkCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGlkIG9mIHRoZSB2YWxpZGF0b3Igd2hpY2ggeW91IHdpc2ggdG8gcnVuLgotCSAqIEBwYXJhbSBmb3JjZQotCSAqICAgICAgICAgICAgSWYgdGhlIHZhbHVlIGlzICJ0cnVlIiwgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgcnVuIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUKLQkgKiAgICAgICAgICAgIGVudmlyb25tZW50IHNldHRpbmdzIGFyZTsgaWYgdGhlIHZhbHVlIGlzICJmYWxzZSIsIHRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBydW4KLQkgKiAgICAgICAgICAgIG9ubHkgaWYgdGhlIHZhbGlkYXRpb24gYnVpbGRlciB3aWxsIG5vdCBydW4gdGhlIHZhbGlkYXRvci4KLQkgKiAKLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIG5hbWVkIHZhbGlkYXRvciBpcyBub3QgY29uZmlndXJlZCBvbiB0aGUKLQkgKiBwcm9qZWN0LgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvcklkLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGFzeW5jKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0LCB2YWxpZGF0b3JJZCwgZm9yY2UsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIGFzeW5jKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmVWYWxpZGF0b3JPcGVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QgdG8gYmUgdmFsaWRhdGVkLiBJdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIEBwYXJhbSB2YWxpZGF0b3JJZAotCSAqICAgICAgICAgICAgVGhlIHBsdWctaW4gaWQgb2YgdGhlIHZhbGlkYXRvciB3aGljaCB5b3Ugd2lzaCB0byBydW4uCi0JICogQHBhcmFtIGZvcmNlCi0JICogICAgICAgICAgICBJZiB0aGUgdmFsdWUgaXMgInRydWUiLCB0aGUgdmFsaWRhdG9yIHNob3VsZCBiZSBydW4gcmVnYXJkbGVzcwotCSAqICAgICAgICAgICAgb2Ygd2hhdCB0aGUgZW52aXJvbm1lbnQgc2V0dGluZ3MgYXJlOyBpZiB0aGUgdmFsdWUgaXMgImZhbHNlIiwKLQkgKiAgICAgICAgICAgIHRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBydW4gb25seSBpZiB0aGUgdmFsaWRhdGlvbiBidWlsZGVyCi0JICogICAgICAgICAgICB3aWxsIG5vdCBydW4gdGhlIHZhbGlkYXRvci4KLQkgKiBAcGFyYW0gcnVsZUdyb3VwCi0JICogICAgICAgICAgICBXaGV0aGVyIGEgRlVMTCBvciBGQVNUIHBhc3Mgc2hvdWxkIGJlIGludm9rZWQuCi0JICogQHBhcmFtIGFzeW5jCi0JICogICAgICAgICAgICBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogICAgICAgICAgICB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKiAKLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIG5hbWVkIHZhbGlkYXRvciBpcyBub3QKLQkgKiBjb25maWd1cmVkIG9uIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvcklkLCBib29sZWFuIGZvcmNlLCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGFzeW5jKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIocHJvamVjdCwgZm9yY2UsIHJ1bGVHcm91cCwgYXN5bmMpOwotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JJZCk7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJLy8gTm8gdmFsaWRhdG9yLCB3aXRoIHRoYXQgcGx1Zy1pbiBpZCwgY2FuIGJlIHJ1biBvbiB0aGF0IHByb2plY3QuCi0JCQkvLyBFaXRoZXIgdGhlIHZhbGlkYXRvciBpc24ndCBpbnN0YWxsZWQsIG9yIHRoZSBJUHJvamVjdCBwYXNzZWQgaW4KLQkJCS8vIGRvZXNuJ3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IG5hdHVyZS4KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odmFsaWRhdG9ySWQpOwotCQl9Ci0KLQkJaWYgKCF2bWQuaXNDb25maWd1cmVkT25Qcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkvLyBObyB2YWxpZGF0b3IsIHdpdGggdGhhdCBwbHVnLWluIGlkLCBjYW4gYmUgcnVuIG9uIHRoYXQgcHJvamVjdC4KLQkJCS8vIEVpdGhlciB0aGUgdmFsaWRhdG9yIGlzbid0IGluc3RhbGxlZCwgb3IgdGhlIElQcm9qZWN0IHBhc3NlZCBpbgotCQkJLy8gZG9lc24ndCBoYXZlIHRoZSBuZWNlc3NhcnkgbmF0dXJlLgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih2YWxpZGF0b3JJZCk7Ci0JCX0KLQotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJZW5hYmxlZC5hZGQodm1kKTsKLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTU2MDljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgewotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcmVmZXJlbmNlZCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRGaWxlcwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIElGaWxlJ3MuCi0JICovCi0JcHVibGljIExpc3Q8SUZpbGU+IGdldFJlZmVyZW5jZWRGaWxlKExpc3QgaW5wdXRGaWxlcyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9ySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZDY2ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JIZWxwZXIgewotCXB1YmxpYyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JIZWxwZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgZmlsZXMgY29udGFpbmVkIGluIHByb2plY3QgdG8gaW5maW5pdGUgZGVwdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8SUZpbGU+IGdldEFsbFByb2plY3RGaWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Q8SUZpbGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpcmV0dXJuIHJlc3VsdDsKLQkJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBjb2xsZWN0RmlsZXMocHJvamVjdC5tZW1iZXJzKCksIHJlc3VsdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8SUZpbGU+IGNvbGxlY3RGaWxlcyhJUmVzb3VyY2VbXSBtZW1iZXJzLCBMaXN0PElGaWxlPiByZXN1bHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcmVjdXJzaXZlbHkgY29sbGVjdCBmaWxlcyBmb3IgdGhlIGdpdmVuIG1lbWJlcnMKLQkJZm9yIChJUmVzb3VyY2UgcmVzIDogbWVtYmVycykgewotCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpY29sbGVjdEZpbGVzKCgoSUZvbGRlcikgcmVzKS5tZW1iZXJzKCksIHJlc3VsdCk7Ci0JCQllbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSlyZXN1bHQuYWRkKChJRmlsZSlyZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1Jlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTk0MmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LiBUaGlzIGNsYXNzIHJldHJpZXZlcyB0aGUgU3RyaW5ncyBmcm9tIHRoZQotICogICAgICAgICAgICAgLnByb3BlcnRpZXMgZmlsZSBhcHByb3ByaWF0ZSBmb3IgdGhlIG1hY2hpbmUncyBMb2NhbGUuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXIgewotCS8vRGVmYXVsdAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1Rhc2tMaXN0SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVGFza0xpc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzMmRjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVGFza0xpc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLQotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBUaGUKLSAqICAgICAgICAgICAgIFRhc2tMaXN0SGVscGVyIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgNC4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tMaXN0SGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBUYXNrTGlzdEhlbHBlciBfdGFza0xpc3RIZWxwZXIgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBUYXNrTGlzdEhlbHBlciBnZXRUYXNrTGlzdCgpIHsKLQkJaWYgKF90YXNrTGlzdEhlbHBlciA9PSBudWxsKSB7Ci0JCQlfdGFza0xpc3RIZWxwZXIgPSBuZXcgVGFza0xpc3RIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gX3Rhc2tMaXN0SGVscGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBtZXNzYWdlIHRvIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrKFN0cmluZyBwbHVnaW5JZCwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgbWFya2VyVHlwZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LmFkZFRhc2socGx1Z2luSWQsIHJlc291cmNlLCBsb2NhdGlvbiwgbWVzc2FnZUlkLCBtZXNzYWdlLCBtYXJrZXJUeXBlLCB0YXJnZXRPYmplY3ROYW1lLCBncm91cE5hbWUsIG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQotCXB1YmxpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKGludCBzZXZlcml0eSwgSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhzZXZlcml0eSwgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc2V2ZXJpdHkpIHsKLQkJcmV0dXJuIFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIHNldmVyaXR5KTsKLQl9Ci0KLQlwdWJsaWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlT3duZXIpIHsKLQkJcmV0dXJuIFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIG1lc3NhZ2VPd25lcik7Ci0JfQotCi0JcHVibGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBtZXNzYWdlT3duZXJzKSB7Ci0JCXJldHVybiBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBtZXNzYWdlT3duZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCB0YXNrcyBmcm9tIHRoZSByZXNvdXJjZS4gSWYgdGhlIHJlc291cmNlIGlzIGFuIElQcm9qZWN0LCBhbGwgdGFza3MKLQkgKiBhcmUgYWxzbyByZW1vdmVkIGZyb20gdGhlIHByb2plY3QncyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG93bmVycyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgbWVzc2FnZXMgZnJvbSBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgb3duZXIsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSwgb3duZXIsIG9iamVjdE5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhIHN1YnNldCBvZiB0YXNrcyBmcm9tIHRoZSBwcm9qZWN0LCBpbmNsdWRpbmcgY2hpbGQgdGFza3MuIEV2ZXJ5IHRhc2sKLQkgKiB3aGljaCBiZWxvbmdzIHRvIHRoZSBncm91cCwgaWRlbnRpZmllZCBieSBncm91cE5hbWUsIHdpbGwgYmUgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrU3Vic2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlVGFza1N1YnNldChyZXNvdXJjZSwgb3duZXJzLCBvYmplY3ROYW1lLCBncm91cE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNoYW5nZXMgYWxsIHZhbGlkYXRvciBtYXJrZXJzIHdoaWNoIGFyZSBvd25lZCBieSAiZnJvbSIgdG8gbWFrZSB0aGVpciBvd25lciAidG8iLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU93bmVyKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnVwZGF0ZU93bmVyKGZyb20sIHRvKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIGFsbCB2YWxpZGF0b3IgbWFya2VycyBvbiB0aGUgSVJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4uIEFsbCBtYXJrZXJzCi0JICogb3duZWQgYnkgImZyb20iIGhhdmUgdGhlaXIgb3duZXIgcmVhc3NpZ25lZCB0byAidG8iLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU93bmVyKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8sIElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXNrTGlzdFV0aWxpdHkudXBkYXRlT3duZXIoZnJvbSwgdG8sIHJlc291cmNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25CdWlsZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiMWMyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkludGVybmFsVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxCdWlsZGVySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVmFsaWRhdGlvbiBGcmFtZXdvcmsgQnVpbGRlci4KLSAqIDxwPgotICogVGhpcyBidWlsZGVyIGlzIGNvbmZpZ3VyZWQgb24gSjJFRSBJUHJvamVjdHMgYXV0b21hdGljYWxseSwgYW5kIGNhbiBiZSBhZGRlZCB0byBvdGhlciB0eXBlcyBvZgotICogcHJvamVjdHMgdGhyb3VnaCB0aGUgUHJvcGVydGllcyBwYWdlLiBJdCBsYXVuY2hlcyB2YWxpZGF0aW9uIG9uIHRoZSBwcm9qZWN0IGlmIHRoZSBwcm9qZWN0IGhhcwotICogYnVpbGQgdmFsaWRhdGlvbiBlbmFibGVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGxhdW5jaGVzIGEgSm9iIGZvciB0aGUgbmV3IFYyIHZhbGlkYXRvcnMgYW5kIGFsc28gYSBKb2IgZm9yIGVhY2ggb2YgdGhlIEpvYiBiYXNlZCBWMQotICogdmFsaWRhdG9ycy4gSWYgdGhlcmUgYXJlIGFueSAiaW4tbGluZSIgVjEgdmFsaWRhdGlvbnMgdGhleSBhcmUgZG9uZSBhcyBwYXJ0IG9mIHRoaXMgYnVpbGRlci4KLSAqIEJlY2F1c2Ugb2YgYWxsIHRoZSBqb2JzIHRoYXQgdGhpcyBidWlsZGVyIHNwYXducywgdGhlIGJ1aWxkIHdpbGwgdXN1YWxseSBiZSBmaW5pc2hlZCBsb25nIGJlZm9yZQotICogYWxsIHRoZSB2YWxpZGF0aW9uIGhhcyBmaW5pc2hlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25CdWlsZGVyIGV4dGVuZHMgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciB7Ci0JLyoKLQkgKiBHUksgLSBUaGlzIGNsYXNzIHNlcnZlcyBhcyBhIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGUgZnJhbWV3b3JrLiBUaGVyZSBpcyBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZXZlcnkKLQkgKiBwcm9qZWN0IHRoYXQgaGFzIGEgdmFsaWRhdGlvbiBidWlsZGVyIGNvbmZpZ3VyZWQgZm9yIGl0LiBUeXBpY2FsbHkgaWYgeW91IGhhZCB0ZW4gcHJvamVjdHMgaW4geW91ciB3b3Jrc3BhY2UgeW91IHdvdWxkIGhhdmUKLQkgKiB0ZW4gb2YgdGhlc2Ugb2JqZWN0cy4gVGhleSBhcmUgY3JlYXRlZCBlYXJseSBpbiB0aGUgbGlmZSBjeWNsZSBvZiB0aGUgd29ya2JlbmNoLCBhbmQgdGhlbiBhcmUgcmV1c2VkLiAKLQkgKiAKLQkgKiBNeSBvYnNlcnZhdGlvbiB3YXMgdGhhdCB0aGV5IGFyZSBydW4gc2VyaWFsbHkgYnkgdGhlIHNhbWUgdGhyZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0RFTFRBX0NIQU5HRSA9IC0xOwotCXByb3RlY3RlZCBMaXN0PElQcm9qZWN0PiByZWZlcmVuY2VkUHJvamVjdHM7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2hDb250ZXh0IHdvcmtiZW5jaENvbnRleHQgPSBudWxsOwotCQotCS8qKiAKLQkgKiBBbGwgdGhlIGpvYnMgdGhhdCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc3Bhd25zIHdpbGwgYmVsb25nIHRvIHRoaXMgZmFtaWx5LiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBGQU1JTFlfVkFMSURBVElPTl9KT0IgPSBuZXcgT2JqZWN0KCk7Ci0JCi0JcHVibGljIFZhbGlkYXRpb25CdWlsZGVyKCkgewotCX0KLQotCXByaXZhdGUgSVByb2plY3RbXSBnZXRBbGxSZWZlcmVuY2VkUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgU2V0PElQcm9qZWN0PiB2aXNpdGVkUHJvamVjdHMpIHsKLQkJaWYgKHZpc2l0ZWRQcm9qZWN0cyA9PSBudWxsKXZpc2l0ZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOwotCQllbHNlIGlmICh2aXNpdGVkUHJvamVjdHMuY29udGFpbnMocHJvamVjdCkpcmV0dXJuIGdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQllbHNlIHZpc2l0ZWRQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQotCQlpZiAocmVmZXJlbmNlZFByb2plY3RzID09IG51bGwpcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSVByb2plY3RbXSByZWZQcm9qQXJyYXkgPSBwcm9qZWN0LmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQkJCWNvbGxlY3RSZWZlcmVjZWRQcm9qZWN0KHJlZlByb2pBcnJheSk7Ci0JCQkJZm9yIChJUHJvamVjdCByZWZQcm9qZWN0IDogcmVmUHJvakFycmF5KSB7Ci0JCQkJCWdldEFsbFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0LCB2aXNpdGVkUHJvamVjdHMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBnZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElXb3JrYmVuY2hDb250ZXh0IGdldFdvcmtiZW5jaENvbnRleHQoKSB7Ci0JCWlmKHdvcmtiZW5jaENvbnRleHQgPT0gbnVsbCkgewotCQkJd29ya2JlbmNoQ29udGV4dCA9IG5ldyBXb3JrYmVuY2hDb250ZXh0KCk7Ci0JCQl3b3JrYmVuY2hDb250ZXh0LnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gd29ya2JlbmNoQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb2plY3RzIGZyb20gcmVmUHJvakFycmF5IHRvIHRoZSBsaXN0IG9mIHJlZmVyZW5jZWQgcHJvamVjdHMgKGlmIHRoZXkgYXJlIG5vdAotCSAqIGFscmVhZHkgaW4gdGhlIGxpc3QpLgotCSAqIEBwYXJhbSByZWZQcm9qQXJyYXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdFJlZmVyZWNlZFByb2plY3QoSVByb2plY3RbXSByZWZQcm9qQXJyYXkpIHsKLQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcmVmUHJvakFycmF5KSB7Ci0JCQlpZiAoIXJlZmVyZW5jZWRQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KSlyZWZlcmVuY2VkUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlUcmFjaW5nLmxvZygiVmFsaWRhdGlvbkJ1aWxkZXItMDIgY2xlYW4gIiwgY3VycmVudFByb2plY3QpOyAvLyROT04tTkxTLTEkCi0KLQkJbmV3Q2xlYW4obW9uaXRvcik7Ci0JCWlmIChjdXJyZW50UHJvamVjdCA9PSBudWxsIHx8ICFjdXJyZW50UHJvamVjdC5pc0FjY2Vzc2libGUoKSlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKGN1cnJlbnRQcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0VmFsaWRhdG9ycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdm1kc1tpXTsKLQkJCQkvLyBGb3IgdmFsaWRhdG9ycyB3aG8gYXJlbid0IGdvaW5nIHRvIHJ1biwgY2xlYXIgdGhlaXIgbWVzc2FnZXMgZnJvbSB0aGUgdGFzayBsaXN0LgotCQkJCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBlbnRyaWVzIGJlY2F1c2UgZWFjaCBWYWxpZGF0b3IgbXVzdCBiZSB1bmlxdWUuCi0JCQkJLy8gVGhlIHVuaXF1ZW5lc3Mgb2YgZWFjaCBWYWxpZGF0b3IgaXMgY2hlY2tlZCBieSB0aGUgcGx1Z2luIHJlZ2lzdHJ5LgotCQkJCVdvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGN1cnJlbnRQcm9qZWN0LCB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdFtdIGdldFJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJSVByb2plY3RbXSByZWZQcm9qQXJyYXkgPSBuZXcgSVByb2plY3RbcmVmZXJlbmNlZFByb2plY3RzLnNpemUoKV07Ci0JCXJldHVybiByZWZlcmVuY2VkUHJvamVjdHMudG9BcnJheShyZWZQcm9qQXJyYXkpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIHBhcmFtZXRlcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCVRyYWNpbmcubG9nKCJWYWxpZGF0aW9uQnVpbGRlci0wMSBidWlsZCAiLCBraW5kLCBwcm9qZWN0KTsgIC8vJE5PTi1OTFMtMSQKLQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKDEpKXsKLQkJCVRyYWNpbmcubG9nUmVzb3VyY2VEZWx0YXMoZ2V0RGVsdGEocHJvamVjdCksIDUwKTsKLQkJfQotCQkKLQkJLy8gR1JLIEkgd29uZGVyIHdoeSB0aGlzIGJ1aWxkZXIgbmVlZHMgdG8ga25vdyBhYm91dCBhbGwgdGhlIG90aGVyIHJlZmVyZW5jZWQgcHJvamVjdHM/Ci0JCS8vIHdvbid0IHRoZXkgaGF2ZSBidWlsZGVycyBvZiB0aGVpciBvd24uCi0JCUlQcm9qZWN0W10gcmVmZXJlbmNlZCA9IGdldEFsbFJlZmVyZW5jZWRQcm9qZWN0cyhwcm9qZWN0LCBudWxsKTsKLQkJaWYgKFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmlzU3VzcGVuZGVkKHByb2plY3QpIHx8IAotCQkJVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuaXNEaXNhYmxlZChwcm9qZWN0KSlyZXR1cm4gcmVmZXJlbmNlZDsKLQotCQl0cnkgewotCQkJbmV3QnVpbGQoa2luZCwgbW9uaXRvcik7Ci0KLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlkZWx0YSA9IGdldERlbHRhKHByb2plY3QpOwotCQkJYm9vbGVhbiBkb0Z1bGxCdWlsZCA9IChraW5kID09IEZVTExfQlVJTEQpOwotCQkJCi0JCQkvLyBJdCBpcyBwb3NzaWJsZSBmb3Iga2luZCB0byA9PSBBVVRPX0JVSUxEIHdoaWxlIGRlbHRhIGlzIG51bGwKLQkJCS8vIChzYXcgdGhpcyB3aGVuIGNyZWF0aW5nIGEgcHJvamVjdCBieSBjb3B5aW5nIGFub3RoZXIgcHJvamVjdC4pCi0JCQkvLyBIb3dldmVyLCBhICJSZWJ1aWxkIFByb2plY3QiIHdpbGwgaW52b2tlIHRoaXMgYnVpbGRlciB3aXRoCi0JCQkvLyBraW5kPT1GVUxMX0JVSUxEIGFuZCBhIG51bGwgZGVsdGEsIGFuZCB2YWxpZGF0aW9uIHNob3VsZCBydW4gaW4gdGhhdCBjYXNlLgotCQkJaWYgKCFkb0Z1bGxCdWlsZCAmJiBkZWx0YSA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzUmVmZXJlbmNlZFByb2plY3RJbkRlbHRhKHJlZmVyZW5jZWQpKSB7Ci0JCQkJCXBlcmZvcm1GdWxsQnVpbGRGb3JSZWZlcmVuY2VkUHJvamVjdENoYW5nZWQobW9uaXRvciwgcHJqcCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybXMgPSBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCl9OwotCQkJCQltb25pdG9yLnN1YlRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19OVUxMX0RFTFRBLCBtc2dQYXJtcykpOwotCQkJCQkvLyBBIG51bGwgZGVsdGEgbWVhbnMgdGhhdCBhIGZ1bGwgYnVpbGQgbXVzdCBiZSBwZXJmb3JtZWQsCi0JCQkJCS8vIGJ1dCB0aGlzIGJ1aWxkZXIgd2FzIGludm9rZWQgd2l0aCBhbiBpbmNyZW1lbnRhbCBvciBhdXRvbWF0aWMKLQkJCQkJLy8gYnVpbGQga2luZC4gUmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcgc28gdGhhdCB0aGUgdXNlcgotCQkJCQkvLyBkb2Vzbid0IGhhdmUgdG8gd2FpdCBmb3JldmVyLgotCQkJCX0KLQkJCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQkJCX0KLQkJCWlmIChkb0Z1bGxCdWlsZCkgewotCQkJCWNsZWFudXBSZWZlcmVuY2VkUHJvamVjdHNNYXJrZXJzKHByanAsIHJlZmVyZW5jZWQpOwotCQkJCXBlcmZvcm1GdWxsQnVpbGQobW9uaXRvciwgcHJqcCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJaWYgKGlzUmVmZXJlbmNlZFByb2plY3RJbkRlbHRhKHJlZmVyZW5jZWQpKXsKLQkJCQkJCWNsZWFudXBSZWZlcmVuY2VkUHJvamVjdHNNYXJrZXJzKHByanAsIHJlZmVyZW5jZWQpOwotCQkJCQkJcGVyZm9ybUZ1bGxCdWlsZEZvclJlZmVyZW5jZWRQcm9qZWN0Q2hhbmdlZChtb25pdG9yLCBwcmpwKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQkJCQl9Ci0JCQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihwcm9qZWN0LCBkZWx0YSwgdHJ1ZSk7Ci0JCQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsKLQkJCX0KLQkJCXJldHVybiByZWZlcmVuY2VkOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbGVhbnVwUmVmZXJlbmNlZFByb2plY3RzTWFya2VycyhmaW5hbCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwLCBJUHJvamVjdFtdIHJlZmVyZW5jZWQpewotCQkvL1doZW4gYSBwcm9qZWN0IHJlZmVyZW5jZXMgb25lIG9yIG1vcmUgcHJvamVjdCwgcGVyZm9ybWluZyBhIGNsZWFuIGJ1aWxkIG9uIHJlZmVyZW5jZWQKLQkJLy9jYXVzZXMgZGVsdGEgdG8gYmUgaW52b2tlZCBvbiByZWZlcmVuY2VlLCBha2EsIHBhcmVudC4gVGhpcyBjYXVzZXMgZm9sbG93aW5nIGNvZGUgdG8KLQkJLy9iZSBpbnZva2VkLgotCQkvL1RoZSBmb2xsb3dpbmcgY29kZSBpcyB0cnlpbmcgdG8gZml4IGEgY2FzZSB3aGVyZSBFamIgcHJvamVjdCByZWZlcmVuY2VzIGEgdXRpbGl0eSBwcm9qZWN0LAotCQkvL2FuZCB0aGUgY2xlYW4gYnVpbGQgb24gdXRpbGl0eSBwcm9qZWN0IGNhdXNlcyB0aGUgY29kZSB0byBjb21lIGhlcmUsIHRoZSBlamIgdmFsaWRhdG9yIHJ1bnMKLQkJLy9vbiB0aGUgZWpiICBwcm9qZWN0IGR1ZSB0byBwZXJmb3JtRnVsbEJ1aWxkRm9yUmVmZXJlbmNlZFByb2plY3RDaGFuZ2VkKCkgYmVsb3csIGJ1dCBpdCBhbHNvCi0JCS8vY2F1c2VzIG1hcmtlciB0byBiZSBnZW5lcmF0ZWQgZm9yIHRoZSB1dGlsIHByb2plY3QsIGJ1dCB0aGUgbWFya2VycyBmb3IgdXRpbCBwcm9qZWN0IGFyZSBub3QKLQkJLy9jbGVhbmVkIHVwLiAgIAotCQkKLQkJaWYoIHJlZmVyZW5jZWQgPT0gbnVsbCB8fCByZWZlcmVuY2VkLmxlbmd0aCA9PSAwIClyZXR1cm47Ci0JCQotCQl0cnl7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzID0gcHJqcC5nZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyh0cnVlLCBmYWxzZSk7Ci0gCi0JCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+ICBzZXQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJCXNldC5hZGRBbGwoIEFycmF5cy5hc0xpc3QoIGVuYWJsZWRWYWxpZGF0b3JzICkgKTsKLQkJCWZvciAoSVByb2plY3QgcCA6IHJlZmVyZW5jZWQpIHsKLQkJCQlpZiAoIXAuaXNBY2Nlc3NpYmxlKCkpY29udGludWU7Ci0JCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcmVmUHJvamVjdENmZyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwKTsKLQkJCi0JCQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZWZFbmFibGVkVmFsaWRhdG9ycyA9IHJlZlByb2plY3RDZmcuZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnModHJ1ZSwgZmFsc2UpOwotCQkJCQotCQkJCS8vcmVtb3ZlIGZyb20gdGhlIHNldCB0aGUgdmFsaWRhdG9ycyB3aGljaCBhcmUgYWxzbyBpbiBjaGlsZAotCQkJCWZvcihWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiByZWZFbmFibGVkVmFsaWRhdG9ycylzZXQucmVtb3ZlKHZtZCk7Ci0JCQkJCi0JCQkJZm9yKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHNldClXb3JrYmVuY2hSZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhwLCB2bWQuZ2V0VmFsaWRhdG9yKCkpOwkJCi0JCQl9CQotCQl9Y2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCBleGMudG9TdHJpbmcoKSk7Ci0JfQotfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVmZXJlbmNlZFByb2plY3RJbkRlbHRhKElQcm9qZWN0W10gcmVmZXJlbmNlZCkgewotCQlJUHJvamVjdCBwID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VkLmxlbmd0aDsgaSsrKSB7Ci0JCQlwID0gcmVmZXJlbmNlZFtpXTsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZ2V0RGVsdGEocCk7Ci0JCQlpZiAoZGVsdGEgIT0gbnVsbCAmJiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1GdWxsQnVpbGRGb3JSZWZlcmVuY2VkUHJvamVjdENoYW5nZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXBlcmZvcm1GdWxsQnVpbGQobW9uaXRvciwgcHJqcCwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1GdWxsQnVpbGQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXBlcmZvcm1GdWxsQnVpbGQobW9uaXRvciwgcHJqcCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRnVsbEJ1aWxkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCwgYm9vbGVhbiBvbmx5RGVwZW5kZW50VmFsaWRhdG9ycykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzID0gcHJqcC5nZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyh0cnVlLCBvbmx5RGVwZW5kZW50VmFsaWRhdG9ycyk7Ci0JCWlmICgoZW5hYmxlZFZhbGlkYXRvcnMgIT0gbnVsbCkgJiYgKGVuYWJsZWRWYWxpZGF0b3JzLmxlbmd0aCA+IDApKSB7Ci0JCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGVuYWJsZWRWYWxpZGF0b3JzU2V0ID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChlbmFibGVkVmFsaWRhdG9ycyk7Ci0JCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVuYWJsZWRWYWxpZGF0b3JzU2V0LCB0cnVlKTsKLQkJCW9wLnJ1bihtb25pdG9yKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSdW4gdGhlIG5ldyB2YWxpZGF0aW9uIGJ1aWxkZXIuIFRoaXMgaXMgYSB0cmFuc2l0aW9uIG1ldGhvZCwgd2hpbGUgd2UgY29udGludWUgdG8gaGF2ZQotCSAqIHRoZSBvbGQgYW5kIG5ldyB2YWxpZGF0aW9uIGJ1aWxkZXJzLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIGJ1aWxkCi0JICogCi0JICogQHNlZSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyI0FVVE9fQlVJTEQKLQkgKiBAc2VlIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjQ0xFQU5fQlVJTEQKLQkgKiBAc2VlIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjRlVMTF9CVUlMRAotCSAqIEBzZWUgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciNJTkNSRU1FTlRBTF9CVUlMRAotCSAqLwotCXByaXZhdGUgdm9pZCBuZXdCdWlsZChpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQkKLQkJc3dpdGNoIChraW5kKXsKLQkJCWNhc2UgQVVUT19CVUlMRDoKLQkJCWNhc2UgSU5DUkVNRU5UQUxfQlVJTEQ6Ci0JCQkJZGVsdGEgPSBnZXREZWx0YShwcm9qZWN0KTsKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJVmFsQnVpbGRlckpvYi52YWxpZGF0ZVByb2plY3QocHJvamVjdCwgZGVsdGEsIGtpbmQpOwkJCi0JfQotCQotCQotCS8qKgotCSAqIFJ1biB0aGUgbmV3IGNsZWFuIG1ldGhvZC4gVGhpcyBpcyBhIHRyYW5zaXRpb24gbWV0aG9kLCB3aGlsZSB3ZSBjb250aW51ZSB0byBoYXZlCi0JICogdGhlIG9sZCBhbmQgbmV3IHZhbGlkYXRpb24gYnVpbGRlcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5ld0NsZWFuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5jbGVhbihnZXRQcm9qZWN0KCksIG1vbml0b3IpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwZmE3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLSAqIAotICogQ29uc3RhbnRzIHVzZWQgdG8gYWNjZXNzIHRoZSBzdHJpbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGx1Z2luLgotICogCi0gKiBTZWUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUsIGluIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnksIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZ3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkNvbnN0YW50cyBleHRlbmRzIFJlc291cmNlQ29uc3RhbnRzIHsKLQkvL0RlZmF1bHQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWY3YjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5GaWx0ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLklQcm9qZWN0VmFsaWRhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0b3JMYXVuY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLS8qKgotICogVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gdGhpcyBjbGFzcywgc2luY2UKLSAqIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciBpcyBkb25lIGhlcmUgKHZpYSB0aGUgZ2V0UHJvamVjdCgpIG1ldGhvZCkuIFRoZQotICogaW5pdGlhbGl6YXRpb24gaXMgc2VwYXJhdGVkIGJlY2F1c2UgdGhlIElQcm9qZWN0IGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiA8cD4KLSAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSwgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCS8vIFNpbmNlIElSZXNvdXJjZUNvbnN0YW50cyBkb24ndCBoYXZlIGEgIm5vIGRlbHRhIiBmbGFnLCBsZXQgdGhpcyBjb25zdGFudCBiZSB0aGUgZmxhZy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19ERUxUQV9DSEFOR0UgPSAtMTsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTFRBX0FTX1NUUklORyA9ICJJRmlsZURlbHRhW3swfV0gJ3snezF9J30nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQSA9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBGb3IgdGhlIGRlcHJlY2lhdGVkIGNvbnN0cnVjdG9ycywgYnkgZGVmYXVsdCB0aGUgb3BlcmF0aW9uIHdpbGwgbm90IGZvcmsuIAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0FTWU5DID0gdHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9GT1JDRSA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvbkxhdW5jaGVySm9iIGxhdW5jaGVySm9iID0gbmV3IFZhbGlkYXRpb25MYXVuY2hlckpvYigpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBqb2JzUGVyUHJvY2Vzc29yID0gMzsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBWYWxpZGF0aW9uTGF1bmNoZXJKb2IgZXh0ZW5kcyBKb2IgewotCSAgICBwcml2YXRlIFF1ZXVlPEpvYj4gX3ZhbGlkYXRpb25Kb2JzID0gbmV3IExpbmtlZExpc3Q8Sm9iPigpOwotCSAgICAKLQkgICAgcHVibGljIFZhbGlkYXRpb25MYXVuY2hlckpvYigpIHsKLSAgICAgICAgICAgIHN1cGVyKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9WQUxJREFUSU9OX0pPQl9NU0cpKTsKLSAgICAgICAgICAgIHNldFN5c3RlbSh0cnVlKTsKLSAgICAgICAgICAgIHNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JICAgIH0KLQkgICAgCi0JICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCWludCBwcm9jZXNzb3JzID0gUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpOwotCQkJaW50IHRvdGFsSW5pdGlhbEpvYnMgPSBwcm9jZXNzb3JzICogam9ic1BlclByb2Nlc3NvcjsKLSAgICAJCXN5bmNocm9uaXplZCAoX3ZhbGlkYXRpb25Kb2JzKSB7Ci0gICAgCQkJLy8gbmV2ZXIgc2NoZWR1bGUgbW9yZSB0aGFuIDMgdmFsaWRhdGlvbiBqb2JzIHBlciBwcm9jZXNzb3IgYXQgYSB0aW1lCi0gICAgCQkJZm9yIChpbnQgaT0wOyBpPCB0b3RhbEluaXRpYWxKb2JzOyBpKyspIHsKLSAgICAJCQkJSm9iIHZhbGlkYXRpb25Kb2IgPSBfdmFsaWRhdGlvbkpvYnMucG9sbCgpOwotICAgIAkJCQlpZiAodmFsaWRhdGlvbkpvYiA9PSBudWxsKSBicmVhazsKLSAgICAJCQkJYWRkSm9iQ2hhbmdlQWRhcHRlcih2YWxpZGF0aW9uSm9iKTsKLSAgICAJCQkJdmFsaWRhdGlvbkpvYi5zY2hlZHVsZSgpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCSAgICB9Ci0JICAgIAotCSAgICBwcml2YXRlIHZvaWQgYWRkSm9iQ2hhbmdlQWRhcHRlcihKb2Igam9iKSB7Ci0JICAgIAlqb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKXsKLQkgICAgCQkvLyB3aGVuIGRvbmUsIHNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIHZhbGlkYXRpb24gam9iIHRvIHNjaGVkdWxlCi0JCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJc3luY2hyb25pemVkIChfdmFsaWRhdGlvbkpvYnMpIHsKLQkJCQkJCUpvYiB2YWxpZGF0aW9uSm9iID0gX3ZhbGlkYXRpb25Kb2JzLnBvbGwoKTsKLQkJCQkJCWlmICh2YWxpZGF0aW9uSm9iICE9IG51bGwpIHsKLQkJCQkJCQlhZGRKb2JDaGFuZ2VBZGFwdGVyKHZhbGlkYXRpb25Kb2IpOwotCQkJCQkJCXZhbGlkYXRpb25Kb2Iuc2NoZWR1bGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCSAgICB9Ci0JICAgIAotCSAgICBAT3ZlcnJpZGUKLQkgICAgcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCWlmIChmYW1pbHkgPT0gUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpcmV0dXJuIHRydWU7Ci0JCQlpZiAoZmFtaWx5ID09IFZhbGlkYXRpb25CdWlsZGVyLkZBTUlMWV9WQUxJREFUSU9OX0pPQil7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYmVsb25nc1RvKGZhbWlseSk7Ci0JICAgIH0KLQkgICAgCi0JICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25Kb2IoSm9iIHZhbGlkYXRpb25Kb2IpIHsKLQkgICAgCXN5bmNocm9uaXplZCAoX3ZhbGlkYXRpb25Kb2JzKSB7Ci0JICAgIAkJX3ZhbGlkYXRpb25Kb2JzLmFkZCh2YWxpZGF0aW9uSm9iKTsKLQkgICAgCQkvLyBzY2hlZHVsZSB0aGUgam9iIGlmIHdlIHdlcmUgZW1wdHkKLQkgICAgCQlpZiAoX3ZhbGlkYXRpb25Kb2JzLnNpemUoKSA9PSAxKSB7Ci0JICAgIAkJCXRoaXMuc2NoZWR1bGUoKTsKLQkgICAgCQl9Ci0JICAgIAl9Ci0JICAgIH0KLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgREVGQVVMVF9BU1lOQwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0ZPUksgPSBmYWxzZTsgLy8gQGRlcHJlY2F0ZWQKLQlwcml2YXRlIElQcm9qZWN0IAkJX3Byb2plY3Q7IC8vIHByb2plY3QgdG8gYmUgdmFsaWRhdGVkCi0JcHJpdmF0ZSBpbnQgCQkJX3J1bGVHcm91cCA9IFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQ7Ci0JcHJpdmF0ZSBib29sZWFuIF9mb3JrID0gREVGQVVMVF9BU1lOQzsgLy8gZG8gbm90IGZvcmsgdGhlIHZhbGlkYXRpb24gaW50byBhCi0JLy8gZGlmZmVyZW50IHRocmVhZCBieSBkZWZhdWx0Ci0JcHJpdmF0ZSBNYXA8VmFsaWRhdG9yTWV0YURhdGEsIFNldDxJRmlsZURlbHRhPj4gX2ZpbGVEZWx0YXM7IC8vIFRvIHJlZHVjZSBvYmplY3QgY3JlYXRpb24sCi0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBfZGVsdGE7Ci0JCi0JLy8gdGhlIHJlc291cmNlIGRlbHRhIHRyZWUgdG8gYmUgcHJvY2Vzc2VkLCBvciBudWxsIGlmIGEgZnVsbCBidWlsZC9tZW51Ci0JLy8gb3B0aW9uIHdhcyB0cmlnZ2VyZWQuIFRoaXMgdmFsdWUgaXMgY2FjaGVkIHNvIHRoYXQgdmFsaWRhdGlvbiBjYW4gYmUgcnVuCi0JLy8gZWl0aGVyIGZyb20gYSBidWlsZGVyLCBvciBmcm9tIGEgbWVudSBpdGVtLiAoVGhlIE9wZXJhdGlvbiBpbnRlcmZhY2UKLQkvLyBkb2Vzbid0IGFsbG93IGFueSBwYXJhbWV0ZXIgb24gZXhlY3V0ZSBleGNlcHQgdGhlIElQcm9ncmVzc01vbml0b3IuKQotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBfZW5hYmxlZFZhbGlkYXRvcnM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIF9mb3JjZSA9IERFRkFVTFRfRk9SQ0U7IC8vIGZvcmNlIHRoaXMgb3BlcmF0aW9uIHRvIHJ1biBldmVuIGlmIGl0IGRvZXNuJ3QgbmVlZCB0bz8KLQlwcml2YXRlIGJvb2xlYW4gX2lzRnVsbFZhbGlkYXRlOyAJLy8gUnVuIGEgZnVsbCB2YWxpZGF0aW9uIG9yIGFuIGluY3JlbWVudGFsPyAodHJ1ZSA9IGZ1bGwpCi0JcHJpdmF0ZSBCb29sZWFuIF9pc0F1dG9CdWlsZDsgCQkvLyBJcyB0aGUgZ2xvYmFsIGF1dG8tYnVpbGQgcHJlZmVyZW5jZSBlbmFibGVkPwotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBfbGF1bmNoZWRWYWxpZGF0b3JzOwotCQotCXByb3RlY3RlZCBJV29ya2JlbmNoQ29udGV4dCBjb250ZXh0OwotCi0JLy8gYXJlIGVuYWJsZWQgYW5kIHdlcmUgbGF1bmNoZWQgKGkuZS4sIHRoYXQgaGF2ZSBpbnB1dCB0byB2YWxpZGF0ZSkuIEZvciBpbnRlcm5hbAotCS8vIHZhbGlkYXRpb24gZnJhbWV3b3JrIHVzZSBvbmx5OwotCS8vIGl0J3MgbmVlZGVkIGZvciB0aGUgYXV0b21hdGljIHRlc3RzLgotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIEZJTkVTVCBsb2dnaW5nLCB0byByZXBvcnQgZXhhY3RseSB3aGF0IGRlbHRhcyB3ZXJlIGFib3V0IHRvIGJlCi0JICogdmFsaWRhdGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWx0YUFzU3RyaW5nKElGaWxlRGVsdGFbXSBkZWx0YSkgewotCQlTdHJpbmcgYXJncyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBudW1BcmdzID0gMDsKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCW51bUFyZ3MgPSBkZWx0YS5sZW5ndGg7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YS5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUEpOwotCQkJCWJ1ZmZlci5hcHBlbmQoZGVsdGFbaV0udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlidWZmZXIucmVwbGFjZSgwLCAxLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8gbWFnaWMgbnVtYmVycyAwIGFuZCAxID0+IFJlbW92ZSBmaXJzdCBDT01NQSBmcm9tIHRoZSBsaXN0IChoZW5jZSBpbmRleCAwKTsgbGVuZ3RoIG9mIENPTU1BIGlzIDIsIGhlbmNlIGluZGV4IDAsIDEuCi0JCQlhcmdzID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KERFTFRBX0FTX1NUUklORywgbmV3IE9iamVjdFtde1N0cmluZy52YWx1ZU9mKG51bUFyZ3MpLCBhcmdzfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNoZWNrQ2FuY2VsZWQoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWlmIChyZXBvcnRlciA9PSBudWxsKXJldHVybjsKLQkJZWxzZSBpZiAocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRm9yY2UoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuICgoZGVsdGEgPT0gbnVsbCkgPyBERUZBVUxUX0ZPUkNFIDogZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzaG91bGRGb3JjZShPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCXJldHVybiAoKChjaGFuZ2VkUmVzb3VyY2VzID09IG51bGwpIHx8IChjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aCA9PSAwKSkgPyBERUZBVUxUX0ZPUkNFIDogZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkLiBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBWYWxpZGF0aW9uT3BlcmF0aW9uKHByb2plY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25PcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIERFRkFVTFRfQVNZTkMsIERFRkFVTFRfRk9SQ0UpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBudWxsLCBudWxsLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBmb3JjZSwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkLiBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBWYWxpZGF0aW9uT3BlcmF0aW9uKHByb2plY3QsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBpbnQgcnVsZUdyb3VwKSB7Ci0JCXRoaXMocHJvamVjdCwgbnVsbCwgbnVsbCwgcnVsZUdyb3VwLCBERUZBVUxUX0ZPUkNFLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZC4gV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCwKLQkgKiAgICAgICAgICAgICAgSVJlc291cmNlRGVsdGEsIEJvb2xlYW4sIGludCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgYm9vbGVhbiBpc0F1dG9CdWlsZCwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBmb3JrKSB7Ci0JCXRoaXMocHJvamVjdCwgZGVsdGEsICgoaXNBdXRvQnVpbGQpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSksIHJ1bGVHcm91cCwgZm9yaywgZm9yY2UpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsLgotCSAqLwotCXByb3RlY3RlZCBWYWxpZGF0aW9uT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBCb29sZWFuIGlzQXV0b0J1aWxkLCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGZvcmspIHsKLQkJc3VwZXIoKTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQlfZGVsdGEgPSBkZWx0YTsKLQkJX2lzQXV0b0J1aWxkID0gaXNBdXRvQnVpbGQ7Ci0JCV9ydWxlR3JvdXAgPSBydWxlR3JvdXA7Ci0JCV9mb3JrID0gZm9yazsKLQkJX2ZvcmNlID0gZm9yY2U7Ci0JCV9lbmFibGVkVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCX0KLQkKLQkvKioKLQkgKiBJbnRlcm5hbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJV29ya2JlbmNoQ29udGV4dCBhQ29udGV4dCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIEJvb2xlYW4gaXNBdXRvQnVpbGQsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gZm9yaykgewotCQlzdXBlcigpOwotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JCV9kZWx0YSA9IGRlbHRhOwotCQlfaXNBdXRvQnVpbGQgPSBpc0F1dG9CdWlsZDsKLQkJX3J1bGVHcm91cCA9IHJ1bGVHcm91cDsKLQkJX2ZvcmsgPSBmb3JrOwotCQlfZm9yY2UgPSBmb3JjZTsKLQkJX2VuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWNvbnRleHQgPSBhQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVybWluYXRlQ2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IGdldEVuYWJsZWRWYWxpZGF0b3JzKCkpIHsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX0NMRUFOVVAsIG5ldyBTdHJpbmdbXXt2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pKTsKLQkJCXRyeSB7Ci0JCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModm1kLmdldFZhbGlkYXRvcigpKTsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYWRkQ2FuY2VsVGFzayh2bWQpOwotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSkpOwotCQl9Ci0JfSAKLQkKLQotCS8qKgotCSAqIEBwYXJhbSB2bWQKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogQHBhcmFtIHN0YXJ0Ci0JICovCi0vLwlwcml2YXRlIHZvaWQgbG9nVmFsaWRhdGlvbkluZm8oVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJRmlsZURlbHRhW10gZGVsdGEsIExvZ2dlciBsb2dnZXIsIGxvbmcgc3RhcnQpIHsKLS8vCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotLy8JCVRpbWVFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0VGltZUVudHJ5KCk7Ci0vLwkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24ubGF1bmNoVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLS8vCQllbnRyeS5zZXRQcm9qZWN0TmFtZShnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLS8vCQllbnRyeS5zZXRUb29sTmFtZSh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLS8vCQllbnRyeS5zZXRFbGFwc2VkVGltZShmaW5pc2ggLSBzdGFydCk7Ci0vLwkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotLy8JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCQlpZiAoaXNGdWxsVmFsaWRhdGUoKSkgewotLy8JCQkJYnVmZmVyLmFwcGVuZCgiRVZFUllUSElORyIpOyAvLyROT04tTkxTLTEkCi0vLwkJCX0gZWxzZSB7Ci0vLwkJCQlpZiAoZGVsdGEubGVuZ3RoID09IDApIHsKLS8vCQkJCQlidWZmZXIuYXBwZW5kKCJOT1RISU5HIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnVmZmVyLmFwcGVuZChnZXREZWx0YUFzU3RyaW5nKGRlbHRhKSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJZW50cnkuc2V0RGV0YWlscyhidWZmZXIudG9TdHJpbmcoKSk7Ci0vLwkJfQotLy8JCWxvZ2dlci53cml0ZShMZXZlbC5JTkZPLCBlbnRyeSk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBleGMKLQkgKi8KLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVUaHJvd2FibGVzKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIExvZ2dlciBsb2dnZXIsIFRocm93YWJsZSBleGMpIHsKLS8vCQkvLyBJZiBhIHJ1bnRpbWUgZXhjZXB0aW9uIGhhcyBvY2N1cmVkLCBlLmcuIE51bGxQb2ludGVyIG9yIENsYXNzQ2FzdCwKLS8vCQkvLyBkaXNwbGF5IGl0IHdpdGggdGhlICJBIHJ1bnRpbWUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAiIG1lc3NzYWdlLgotLy8JCS8vIFRoaXMgd2lsbCBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgd2hlbiBoZS9zaGUgY2FsbHMgSUJNCi0vLwkJLy8gU2VydmljZS4KLS8vCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLS8vCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0vLwkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uOjpsYXVuY2hWYWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLS8vCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotLy8JCX0KLS8vCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIChleGMuZ2V0TWVzc2FnZSgpID09IG51bGwgPyAiIiA6IGV4Yy5nZXRNZXNzYWdlKCkpfTsgLy8kTk9OLU5MUy0xJAotLy8JCU1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TWVzc2FnZSgpOwotLy8JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLS8vCQltZXNzYWdlLnNldElkKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUlVOVElNRSk7Ci0vLwkJbWVzc2FnZS5zZXRQYXJhbXMobXNnUGFybSk7Ci0vLwkJdHJ5IHsKLS8vCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2bWQuZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotLy8JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotLy8JCQloYW5kbGVJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHZtZCwgbG9nZ2VyLCBleGMyKTsKLS8vCQl9IGNhdGNoIChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotLy8JCQl0aHJvdyBlOwotLy8JCX0KLS8vCQlyZXR1cm47Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBleGMyCi0JICovCi0vLwlwcml2YXRlIHZvaWQgaGFuZGxlSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIExvZ2dlciBsb2dnZXIsIEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotLy8JCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLS8vCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotLy8JCS8vIExvZyB0aGUgcmVhc29uIGZvciB0aGUgZGlzYWJsZWQgdmFsaWRhdG9yCi0vLwkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotLy8JCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbjo6bGF1bmNoVmFsaWRhdG9yIChkZXByZWNhdGVkKSIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMyKTsKLS8vCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBwYXJhbSB2bWQKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogQHBhcmFtIGV4YwotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGhhbmRsZVZhbGlkYXRpb25FeGNlcHRpb25zKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIExvZ2dlciBsb2dnZXIsIFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0vLwkJLy8gRmlyc3QsIHNlZSBpZiBhIHZhbGlkYXRvciBqdXN0IGNhdWdodCBhbGwgVGhyb3dhYmxlcyBhbmQKLS8vCQkvLyBhY2NpZGVudGFsbHkgd3JhcHBlZCBhIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHByb3BhZ2F0aW5nCi0vLwkJLy8gaXQuCi0vLwkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkgewotLy8JCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbikgewotLy8JCQkJTWVzc2FnZUxpbWl0RXhjZXB0aW9uIG1zc2dFeGMgPSAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uKSBleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpOwotLy8JCQkJdGhyb3cgbXNzZ0V4YzsKLS8vCQkJfSBlbHNlIGlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgVmFsaWRhdGlvbkV4Y2VwdGlvbikgewotLy8JCQkJdHJ5IHsKLS8vCQkJCQlWYWxpZGF0aW9uRXhjZXB0aW9uIHZleGMgPSAoVmFsaWRhdGlvbkV4Y2VwdGlvbikgZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKTsKLS8vCQkJCQl2ZXhjLnNldENsYXNzTG9hZGVyKHZtZC5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOyAvLyBmaXJzdCwKLS8vCQkJCQkvLyBzZXQgdGhlIGNsYXNzIGxvYWRlcixzbyB0aGF0IHRoZSBleGNlcHRpb24ncyBnZXRNZXNzYWdlKCkgbWV0aG9kIGNhbiByZXRyaWV2ZQotLy8JCQkJCS8vIHRoZSByZXNvdXJjZSBidW5kbGUKLS8vCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotLy8JCQkJCWhhbmRsZUluc3RhbnRpYXRpb25FeGNlcHRpb24odm1kLCBsb2dnZXIsIGV4YzIpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IsIGxvZyB0aGUgZXJyb3IKLS8vCQkvLyBhbmQgY29udGludWUKLS8vCQkvLyB3aXRoIHRoZSBuZXh0IHZhbGlkYXRvci4KLS8vCQl0cnkgewotLy8JCQlleGMuc2V0Q2xhc3NMb2FkZXIodm1kLmdldFZhbGlkYXRvcigpLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7IC8vIGZpcnN0LAotLy8JCQkvLyBzZXQgdGhlIGNsYXNzIGxvYWRlcixzbyB0aGF0IHRoZSBleGNlcHRpb24ncyBnZXRNZXNzYWdlKCkgbWV0aG9kIGNhbiByZXRyaWV2ZSB0aGUKLS8vCQkJLy8gcmVzb3VyY2UgYnVuZGxlCi0vLwkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMyKSB7Ci0vLwkJCWhhbmRsZUluc3RhbnRpYXRpb25FeGNlcHRpb24odm1kLCBsb2dnZXIsIGV4YzIpOwotLy8JCX0KLS8vCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLS8vCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0vLwkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLnZhbGlkYXRlKFdvcmtiZW5jaE1vbml0b3IpIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0vLwkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkgewotLy8JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkpOwotLy8JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotLy8JCQl9Ci0vLwkJfQotLy8JCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLS8vCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtZXNzYWdlKTsKLS8vCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRNZXNzYWdlKCkgIT0gbnVsbCkgewotLy8JCQl0cnkgewotLy8JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2bWQuZ2V0VmFsaWRhdG9yKCksIGV4Yy5nZXRBc3NvY2lhdGVkTWVzc2FnZSgpKTsKLS8vCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMyKSB7Ci0vLwkJCQloYW5kbGVJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHZtZCwgbG9nZ2VyLCBleGMyKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBwYXJhbSB2bWQKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogQHBhcmFtIGV4YwotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGhhbmRsZUhlbHBlckNsZWFudXBFeGNlcHRpb25zKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIExvZ2dlciBsb2dnZXIsIFRocm93YWJsZSBleGMpIHsKLS8vCQkvLyBJZiBhIHJ1bnRpbWUgZXhjZXB0aW9uIGhhcyBvY2N1cmVkLCBlLmcuIE51bGxQb2ludGVyIG9yIENsYXNzQ2FzdCwKLS8vCQkvLyBkaXNwbGF5IGl0IHdpdGggdGhlICJBIHJ1bnRpbWUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAiIG1lc3NzYWdlLgotLy8JCS8vIFRoaXMgd2lsbCBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgd2hlbiBoZS9zaGUgY2FsbHMgSUJNCi0vLwkJLy8gU2VydmljZS4KLS8vCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLS8vCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0vLwkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uOjpsYXVuY2hWYWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLS8vCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotLy8JCX0KLS8vCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIChleGMuZ2V0TWVzc2FnZSgpID09IG51bGwgPyAiIiA6IGV4Yy5nZXRNZXNzYWdlKCkpfTsgLy8kTk9OLU5MUy0xJAotLy8JCU1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TWVzc2FnZSgpOwotLy8JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLS8vCQltZXNzYWdlLnNldElkKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUlVOVElNRSk7Ci0vLwkJbWVzc2FnZS5zZXRQYXJhbXMobXNnUGFybSk7Ci0vLwkJdHJ5IHsKLS8vCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2bWQuZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotLy8JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotLy8JCQloYW5kbGVJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHZtZCwgbG9nZ2VyLCBleGMyKTsKLS8vCQl9IGNhdGNoIChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotLy8JCQl0aHJvdyBlOwotLy8JCX0KLS8vCQlyZXR1cm47Ci0vLwl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcmsoKSB7Ci0JCXJldHVybiBfZm9yazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlKCkgewotCQlyZXR1cm4gX2ZvcmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gZm9yY2UpIHsKLQkJX2ZvcmNlID0gZm9yY2U7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGNvZGUgdGhhdCBpbnZva2VkIHRoaXMgb3BlcmF0aW9uIHN1c3BlbmRlZCBhdXRvLWJ1aWxkIGJlZm9yZSBpbnZva2luZyB0aGlzIG9wZXJhdGlvbiwKLQkgKiB0aGUgdXNlcidzIGF1dG8tYnVpbGQgc2V0dGluZyBpcyBzdG9yZWQgaW4gdGhlIGZvbGxvd2luZyBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b0J1aWxkKCkgewotCQlpZiAoX2lzQXV0b0J1aWxkID09IG51bGwpIHsKLQkJCXJldHVybiBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0dsb2JhbEF1dG9CdWlsZEVuYWJsZWQoKTsKLQkJfQotCQlyZXR1cm4gX2lzQXV0b0J1aWxkLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEF1dG9CdWlsZChib29sZWFuIGF1dG9PbikgewotCQlfaXNBdXRvQnVpbGQgPSAoKGF1dG9PbikgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Z1bGxWYWxpZGF0ZSgpIHsKLQkJcmV0dXJuIF9pc0Z1bGxWYWxpZGF0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RnVsbFZhbGlkYXRlKGJvb2xlYW4gYikgewotCQlfaXNGdWxsVmFsaWRhdGUgPSBiOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0UnVsZUdyb3VwKCkgewotCQlyZXR1cm4gX3J1bGVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsaWRhdG9yIG11c3QgcnVuIChpLmUuLCBpdCBoYXMgY2hhbmdlcyB0byB2YWxpZGF0ZSwgYW5kIGl0IHdhcyBub3QKLQkgKiBydW4gYXV0b21hdGljYWxseS4pCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGlvbk5lY2Vzc2FyeShWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIElGaWxlRGVsdGFbXSBkZWx0YSkgewotCQkvLyBWYWxpZGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkgaWYgdGhlcmUgYXJlIG5vIGZpbGVzIGZvciB0aGUgdmFsaWRhdG9yIHRvIHZhbGlkYXRlLgotCQlyZXR1cm4gaXNGdWxsVmFsaWRhdGUoKSB8fCAoZGVsdGEubGVuZ3RoID4gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYsIGdpdmVuIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgYW5kIGZpbGUgZGVsdGFzLCB0aGVyZSBpcyB3b3JrIGZvciB0aGlzCi0JICogb3BlcmF0aW9uIHRvIGRvLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkVmFsaWRhdG9ycyA9IGdldEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCWlmICgoZW5hYmxlZFZhbGlkYXRvcnMgPT0gbnVsbCkgfHwgKGVuYWJsZWRWYWxpZGF0b3JzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpc0Z1bGxWYWxpZGF0ZSgpKXJldHVybiB0cnVlOwotCQkKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBlbmFibGVkVmFsaWRhdG9ycykgewotCQkJaWYgKGlzVmFsaWRhdGlvbk5lY2Vzc2FyeSh2bWQsIGdldEZpbGVEZWx0YXMobW9uaXRvciwgdm1kKSkpcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGdldEZpbGVEZWx0YXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChfZmlsZURlbHRhcyA9PSBudWxsKWxvYWRGaWxlRGVsdGFzKG1vbml0b3IpOwotCQlyZXR1cm4gX2ZpbGVEZWx0YXM7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZURlbHRhW10gZ2V0RmlsZURlbHRhcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTZXQ8SUZpbGVEZWx0YT4gcmVzdWx0ID0gZ2V0RmlsZURlbHRhcyhtb25pdG9yKS5nZXQodm1kKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKXJldHVybiBuZXcgSUZpbGVEZWx0YVswXTsKLQkJCi0JCUlGaWxlRGVsdGFbXSB0ZW1wID0gbmV3IElGaWxlRGVsdGFbcmVzdWx0LnNpemUoKV07Ci0JCXJlc3VsdC50b0FycmF5KHRlbXApOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZSB0aGUgZmlsZSBkZWx0YXMgKFZNRCA8PT5TZXRbSUZpbGVEZWx0YV0pIGlmIHRoZSBmaWxlIGRlbHRhcyBoYXZlbid0IGJlZW4gbG9hZGVkLiBJZiB0aGUKLQkgKiBkZWx0YXMgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkLCByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZEZpbGVEZWx0YXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEFsdGhvdWdoLCBmb3IgYSBmdWxsIGJ1aWxkLCB3ZSBkb24ndCBidWlsZCB1cCBhIGxpc3Qgb2YgY2hhbmdlZAotCQkvLyBmaWxlcywgd2UgZG8gbmVlZCB0byBub3RpZnkgZWFjaCBJV29ya2JlbmNoQ29udGV4dCB0aGF0IGFuCi0JCS8vIElSZXNvdXJjZSBoYXMgYmVlbiBmaWx0ZXJlZCBpbi4KLQkJLy8gSXQncyBhIGZ1bGwgdmFsaWRhdGlvbiBpZiB0aGUgSVJlc291cmNlRGVsdGEgaXMgbnVsbCBhbmQgdGhlCi0JCS8vIE9iamVjdFtdIChvciBJUmVzb3VyY2VbXSkgaXMgYWxzbyBudWxsLgotCQkvLyBpLmUuLCBpdCdzIGEgZnVsbCB2YWxpZGF0aW9uIGlmIG5vIGluY3JlbWVudGFsIGlucHV0IGhhcyBiZWVuIHNldC4KLQkJc2V0RnVsbFZhbGlkYXRlKChnZXREZWx0YSgpID09IG51bGwpICYmIChfZmlsZURlbHRhcyA9PSBudWxsKSk7Ci0JCWlmIChpc0Z1bGxWYWxpZGF0ZSgpKSB7Ci0JCQlfZmlsZURlbHRhcyA9IEZpbHRlclV0aWwubG9hZERlbHRhcyhtb25pdG9yLCBnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBnZXRQcm9qZWN0KCkpOwotCQl9IGVsc2UgewotCQkJX2ZpbGVEZWx0YXMgPSBGaWx0ZXJVdGlsLmxvYWREZWx0YXMobW9uaXRvciwgZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSwgZ2V0RGVsdGEoKSk7IC8vIHRyYXZlcnNlLAotCQkJLy8gYW5kIHByb2Nlc3MsIGVhY2ggcmVzb3VyY2UgaW4gdGhlIGRlbHRhIHRyZWUKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZpbGVEZWx0YXMoTWFwPFZhbGlkYXRvck1ldGFEYXRhLCBTZXQ8SUZpbGVEZWx0YT4+IGRlbHRhcykgewotCQlfZmlsZURlbHRhcyA9IGRlbHRhczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVJlc291cmNlRGVsdGEgZ2V0RGVsdGEoKSB7Ci0JCXJldHVybiBfZGVsdGE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJX2RlbHRhID0gZGVsdGE7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXJlVmFsaWRhdG9yc0VuYWJsZWQoKSB7Ci0JCXJldHVybiAoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKS5zaXplKCkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWxpZGF0b3JzIHdoaWNoIGFyZSBib3RoIGNvbmZpZ3VyZWQgb24gdGhpcyB0eXBlIG9mIHByb2plY3QsIChhcyBzdG9yZWQgaW4KLQkgKiBnZXRQcm9qZWN0KCkpLCBhbmQgZW5hYmxlZCBieSB0aGUgdXNlciBvbiB0aGlzIHByb2plY3QuCi0JICovCi0JcHVibGljIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSB7Ci0JCXJldHVybiBfZW5hYmxlZFZhbGlkYXRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QsIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiBJdCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUKLQkgKiBhdXRvbWF0ZWQgdmFsaWRhdGlvbiBmcmFtZXdvcmsgdGVzdHMuCi0JICovCi0JcHVibGljIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0TGF1bmNoZWRWYWxpZGF0b3JzKCkgewotCQlpZiAoX2xhdW5jaGVkVmFsaWRhdG9ycyA9PSBudWxsKSB7Ci0JCQlfbGF1bmNoZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCX0KLQkJcmV0dXJuIF9sYXVuY2hlZFZhbGlkYXRvcnM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZFZhbGlkYXRvcnMoU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBldm1kcykgewotCQkvLyBDaGVjayB0aGF0IGV2ZXJ5IFZNRCBpbiB0aGUgc2V0IGlzIGNvbmZpZ3VyZWQgb24gdGhpcyBwcm9qZWN0LgotCQkvLyBOZWNlc3NhcnkgYmVjYXVzZSB0aGUgdXNlciBjYW4gbWFudWFsbHkgY2hvb3NlIHdoaWNoIHZhbGlkYXRvcnMKLQkJLy8gdG8gbGF1bmNoLCBhbmQgdGhlIHZhbGlkYXRvciBtYXkgbm90IGJlIGluc3RhbGxlZC4KLQkJX2VuYWJsZWRWYWxpZGF0b3JzLmNsZWFyKCk7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogZXZtZHMpIHsKLQkJCWlmIChWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuaXNDb25maWd1cmVkT25Qcm9qZWN0KHZtZCwgZ2V0UHJvamVjdCgpKSkgewotCQkJCV9lbmFibGVkVmFsaWRhdG9ycy5hZGQodm1kKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIElQcm9qZWN0IHRoYXQgdGhpcyBWYWxpZGF0aW9uT3BlcmF0aW9uIHdhcyBjcmVhdGVkIHdpdGguCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBfcHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFVuaXRzT2ZXb3JrKCkgewotCQkvKgotCQkgKiBMZXQgb25lIHVuaXQgb2Ygd29yayBlcXVhbCBvbmUgcmVzb3VyY2UuIG51bWJlciBvZiBlbmFibGVkIHZhbGlkYXRvcnMuIGkuZS4sIGVhY2gKLQkJICogZW5hYmxlZCB2YWxpZGF0b3IgbXVzdCBwcm9jZXNzIChhdCBtb3N0KSBlYWNoIHJlc291cmNlIGluIHRoZSBwcm9qZWN0OyBjb3VudCBlYWNoIHByb2Nlc3MKLQkJICogYXMgb25lIHVuaXQgb2Ygd29yay4gTm90ZSB0aGF0IHRoaXMgaXMgYSBjZWlsaW5nIG51bWJlciwgYmVjYXVzZSBpZiB3ZSdyZSBkb2luZyBhbgotCQkgKiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCBub3QgYWxsIHJlc291cmNlcyB3aWxsIGJlIHZhbGlkYXRlZC4KLQkJICogc2V0TnVtUmVzb3VyY2VzKGNvdW50UmVzb3VyY2VzKGdldFByb2plY3QoKSkpOyBnZXRFbmFibGVkVmFsaWRhdG9ycygpLnNpemUoKTsKLQkJICovCi0JCS8vIFVudGlsIHRoZSB2YWxpZGF0b3JzIGNhbiByZXBvcnQgdW5pdHMtb2Ytd29yayBjb21wbGV0ZSwKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgbW9uaXRvciB3aXRoIGFuIHVua25vd24gYW1vdW50IG9mIHdvcmsuCi0JCS8vIChTbyB0aGUgdXNlciB3aWxsIHNlZSBtb3ZlbWVudCBpbiB0aGUgcHJvZ3Jlc3MgYmFyLCBldmVuCi0JCS8vIGlmIHRoZSBtb3ZlbWVudCBkb2Vzbid0IGluZGljYXRlIHRoZSBhbW91bnQgb2Ygd29yayBkb25lLikKLQkJcmV0dXJuIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdXNlciBpcyBjYW5jZWxsaW5nIHZhbGlkYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvamVjdC9yZXNvdXJjZSwgQWRkIGFuIGluZm9ybWF0aW9uIHRhc2sKLQkgKiB0byB0aGUgdGFzayBsaXN0IGluZm9ybWluZyB0aGUgdXNlciB0aGF0IHZhbGlkYXRpb24gaGFzIG5vdCBiZWVuIHJ1biBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENhbmNlbFRhc2soVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCUludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuYWRkT3BlcmF0aW9uVGFzayhnZXRQcm9qZWN0KCksIHZtZCwgUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3RhcnRzIHRoZSB2YWxpZGF0aW9uIG9mIGVhY2ggY29uZmlndXJlZCBlbmFibGVkIHZhbGlkYXRvciBvbiB0aGUgY3VycmVudAotCSAqIHByb2plY3QuCi0JICogCi0JICogVGhlIElQcm9ncmVzc01vbml0b3IgcGFzc2VkIGluIG11c3Qgbm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gSW4gb3JkZXIgdG8gY2hlY2sgd2hldGhlciBvciBub3QgdGhlIG1vbml0b3IgaGFzIGJlZW4gY2FuY2VsZWQsIHRoZSBtb25pdG9yIG11c3Qgbm90IGJlIG51bGwuCi0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yID09IG51bGwpcmV0dXJuOwotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCWlmIChWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5pc1N1c3BlbmRlZChwcm9qZWN0KSlyZXR1cm47Ci0JCQlpZiAoVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuaXNEaXNhYmxlZChwcm9qZWN0KSlyZXR1cm47Ci0JCQkKLQkJCWlmICghYXJlVmFsaWRhdG9yc0VuYWJsZWQoKSkgewotCQkJCS8vIHNhdmUgc29tZSBwcm9jZXNzaW5nIHRpbWUuLi4KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsIFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyID0gbmV3IFdvcmtiZW5jaFJlcG9ydGVyKGdldFByb2plY3QoKSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBQZXJpb2RpY2FsbHkgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIGNhbmNlbGVkIHRoZSBvcGVyYXRpb24KLQkJCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJCQlwcmVWYWxpZGF0ZShyZXBvcnRlcik7Ci0JCQkJdmFsaWRhdGUocmVwb3J0ZXIpOwotCQkJCXZhbGlkYXRlUmVmZXJlbmNpYWxGaWxlcyhyZXBvcnRlcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vVE9ETyBHUksgZGV0ZXJtaW5lIGlmIHRpbWluZyBpbmZvIHNob3VsZCBiZSBhZGRlZCBoZXJlCi0vLwkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLS8vCQkJCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0vLwkJCQlUaW1lRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFRpbWVFbnRyeSgpOwotLy8JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24ucnVuKFdvcmtiZW5jaE1vbml0b3IpIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWVudHJ5LnNldFByb2plY3ROYW1lKGdldFByb2plY3QoKS5nZXROYW1lKCkpOwotLy8JCQkJZW50cnkuc2V0VG9vbE5hbWUoIlZhbGlkYXRpb25PcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJZW50cnkuc2V0RWxhcHNlZFRpbWUoZmluaXNoIC0gc3RhcnQpOwotLy8JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLS8vCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVmZXJlbmNpYWxGaWxlcyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLQkJCVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciByZWZGaWxlVmFsaWRhdG9yID0gcmVhZGVyLmdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcigpOwotCQkJaWYgKHJlZkZpbGVWYWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCWlmIChfZGVsdGEgIT0gbnVsbCkgewotCQkJCQlyZWZGaWxlVmFsaWRhdGVGaWxlRGVsdGEocmVwb3J0ZXIsIHJlZkZpbGVWYWxpZGF0b3IpOwotCQkJCX0gZWxzZSBpZiAoX3Byb2plY3QgIT0gbnVsbCkgewotCQkJCQlwb3N0VmFsaWRhdGVQcm9qZWN0KHJlcG9ydGVyLCByZWZGaWxlVmFsaWRhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmRmlsZVZhbGlkYXRlRmlsZURlbHRhKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgcmVmRmlsZVZhbGlkYXRvcikgewotCQlJUmVzb3VyY2VEZWx0YVtdIHJlc291cmNlRGVsdGEgPSBfZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbihJUmVzb3VyY2VEZWx0YS5BRERFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgfCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKTsKLQkJTGlzdDxJUmVzb3VyY2U+IGlucHV0RmlsZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLQkJCi0JCUxpc3Q8SUZpbGU+IHJlZmVyZW5jaW5nRmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQlpZiAocmVzb3VyY2VEZWx0YSAhPSBudWxsICYmIHJlc291cmNlRGVsdGEubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZURlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VEZWx0YVtpXS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJZ2V0RmlsZVJlc291cmNlRGVsdGFJbkZvbGRlcihyZXNvdXJjZURlbHRhW2ldLCBpbnB1dEZpbGVzKTsKLQkJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0JCQkJCWlucHV0RmlsZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJCUxpc3Q8SUZpbGU+IHJGaWxlc1RvVmFsaWRhdGUgPSByZWZGaWxlVmFsaWRhdG9yLmdldFJlZmVyZW5jZWRGaWxlKGlucHV0RmlsZXMpOwotCQkJaWYgKHJGaWxlc1RvVmFsaWRhdGUgIT0gbnVsbCAmJiAhckZpbGVzVG9WYWxpZGF0ZS5pc0VtcHR5KCkpCi0JCQkJcmVmZXJlbmNpbmdGaWxlcy5hZGRBbGwockZpbGVzVG9WYWxpZGF0ZSk7Ci0JCQl0cnkgewotCQkJCWlmICghcmVmZXJlbmNpbmdGaWxlcy5pc0VtcHR5KCkpCi0JCQkJCXZhbGlkYXRlUmVmZXJlbmNpbmdGaWxlcyhyZXBvcnRlciwgcmVmZXJlbmNpbmdGaWxlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEZpbGVSZXNvdXJjZURlbHRhSW5Gb2xkZXIoSVJlc291cmNlRGVsdGEgZGVsdGEsIExpc3Q8SVJlc291cmNlPiBpbnB1dEZpbGVzKSB7Ci0JCUlSZXNvdXJjZURlbHRhW10gcmVzb3VyY2VEZWx0YSA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZURlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZURlbHRhW2ldLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSlpbnB1dEZpbGVzLmFkZChyZXNvdXJjZSk7Ci0JCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpZ2V0RmlsZVJlc291cmNlRGVsdGFJbkZvbGRlcihyZXNvdXJjZURlbHRhW2ldLCBpbnB1dEZpbGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3N0VmFsaWRhdGVQcm9qZWN0KFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgcmVmRmlsZVZhbGlkYXRvcikgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHNldCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShfcHJvamVjdCk7Ci0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA6IHNldCkgewotCQkJTGlzdDxTdHJpbmc+IGZpbHRlcnMgPSBkYXRhLmdldE5hbWVGaWx0ZXJzKCk7Ci0JCQlMaXN0PElGaWxlPiBmaWxlcyA9IGdldEFsbEZpbGVzRm9yRmlsdGVyKGZpbHRlcnMpOwotCQkJaWYgKCFmaWxlcy5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0PElGaWxlPiBmaWxlRm9yVmFsaWRhdGlvbiA9IHJlZkZpbGVWYWxpZGF0b3IuZ2V0UmVmZXJlbmNlZEZpbGUoZmlsZXMpOwotCQkJCXRyeSB7Ci0JCQkJCXZhbGlkYXRlUmVmZXJlbmNpbmdGaWxlcyhyZXBvcnRlciwgZmlsZUZvclZhbGlkYXRpb24pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdDxJRmlsZT4gZ2V0QWxsRmlsZXNGb3JGaWx0ZXIoTGlzdDxTdHJpbmc+IGZpbHRlcnMpIHsKLQkJaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgewotCQkJTGlzdDxJRmlsZT4gYWxsUHJvamVjdEZpbGVzID0gUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9ySGVscGVyLmdldEFsbFByb2plY3RGaWxlcyhfcHJvamVjdCk7Ci0JCQlMaXN0PElGaWxlPiBmaWx0ZXJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCQlmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGZpbHRlcnMpIHsKLQkJCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCljb250aW51ZTsKLQkJCQkKLQkJCQlmb3IgKElGaWxlIHByb2plY3RGaWxlIDogYWxsUHJvamVjdEZpbGVzKSB7Ci0JCQkJCWlmIChmaWxlTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQkJCQlTdHJpbmcgZXh0TmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygyLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0JCQkJCQlTdHJpbmcgZXh0ID0gcHJvamVjdEZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCQkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5lcXVhbHMoZXh0TmFtZSkpZmlsdGVyRmlsZXMuYWRkKHByb2plY3RGaWxlKTsKLQkJCQkJfSBlbHNlIGlmIChmaWxlTmFtZS5lcXVhbHMocHJvamVjdEZpbGUuZ2V0TmFtZSgpKSlmaWx0ZXJGaWxlcy5hZGQocHJvamVjdEZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmaWx0ZXJGaWxlczsKLQkJfQotCQlyZXR1cm4gbmV3IExpbmtlZExpc3Q8SUZpbGU+KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVmZXJlbmNpbmdGaWxlcyhJUmVwb3J0ZXIgcmVwb3J0ZXIsIExpc3Q8SUZpbGU+IHJlZmVyZW5jaW5nRmlsZXMpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXQ8SUZpbGU+IHZhbGlkYXRlZEZpbGVzID0gbmV3IEhhc2hTZXQ8SUZpbGU+KCk7Ci0JCWZvciAoSUZpbGUgcmVmRmlsZSA6IHJlZmVyZW5jaW5nRmlsZXMpIHsKLQkJCWlmICghdmFsaWRhdGVkRmlsZXMuY29udGFpbnMocmVmRmlsZSkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZWZGaWxlLmdldFBhcmVudCgpOwotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICEocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkpCi0JCQkJCXByb2plY3QgPSBnZXRQcm9qZWN0Q29udGFpbmVyKHJlc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCXByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBzZXQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEocHJvamVjdCk7Ci0JCQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA6IHNldCkgewotCQkJCQkJaWYgKGRhdGEuaXNBcHBsaWNhYmxlVG8ocmVmRmlsZSkpIHsKLQkJCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGRhdGEuZ2V0VmFsaWRhdG9yKCk7Ci0JCQkJCQkJdmFsaWRhdG9yLnZhbGlkYXRlKGRhdGEuZ2V0SGVscGVyKHByb2plY3QpLHJlcG9ydGVyKTsKLQkJCQkJCQl2YWxpZGF0ZWRGaWxlcy5hZGQocmVmRmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RDb250YWluZXIoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlSZXNvdXJjZSBwUmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJaWYgKCEocFJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpKQotCQkJcmV0dXJuIGdldFByb2plY3RDb250YWluZXIocFJlc291cmNlKTsKLQkJcmV0dXJuIChJUHJvamVjdCkgcFJlc291cmNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZVZhbGlkYXRlKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBMb2FkIHRoZSBpbnB1dC4KLQkJZ2V0RmlsZURlbHRhcyhyZXBvcnRlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGFuZCBydW4gdGhlIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gYSBiYWNrZ3JvdW5kCi0JICogdGhyZWFkLCBhbmQgdGhlIG5vdC10aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoaXMgdGhyZWFkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlpZiAocmVwb3J0ZXIgPT0gbnVsbClyZXR1cm47Ci0JCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQlyZXBvcnRlci5nZXRQcm9ncmVzc01vbml0b3IoKS5iZWdpblRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19QUk9HUkVTU01PTklUT1JfVElUTEUpLCBnZXRVbml0c09mV29yaygpKTsKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQlJdGVyYXRvcjxWYWxpZGF0b3JNZXRhRGF0YT4gaXRlcmF0b3IgPSBudWxsOwotCQlJRmlsZURlbHRhW10gZGVsdGEgPSBudWxsOwotCQkKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBqb2JWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQkJCQotCQlmb3IoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSl7Ci0JCQlJVmFsaWRhdG9yIHZhbEluc3RhbmNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdmFsSW5zdGFuY2UgPSB2bWQuZ2V0VmFsaWRhdG9yKCk7Ci0JCQl9IAotCQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCQlpZighVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvYmxlbVZhbGlkYXRvcnMoKS5jb250YWlucyh2bWQpKSB7Ci0JCQkJCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2JsZW1WYWxpZGF0b3JzKCkuYWRkKHZtZCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlMS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoIGlzRm9yaygpICYmICh2YWxJbnN0YW5jZSAhPSBudWxsKSAmJiB2YWxJbnN0YW5jZSBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IgKXsKLQkJCQl0cnkgewotCQkJCQlkZWx0YSA9IGdldEZpbGVEZWx0YXMocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIHZtZCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gd2lsbFJ1biA9IChpc0ZvcmNlKCkgfHwgaXNWYWxpZGF0aW9uTmVjZXNzYXJ5KHZtZCwgZGVsdGEpKTsKLQkJCQlpZiggd2lsbFJ1biApam9iVmFsaWRhdG9ycy5hZGQoIHZtZCApOwotCQkJfQotCQkJZWxzZSBpZiAodmFsSW5zdGFuY2UgIT0gbnVsbCl7Ci0JCQkJdmFsaWRhdG9ycy5hZGQoIHZtZCApOwotCQkJfQotCQl9Ci0JCWlmKCBqb2JWYWxpZGF0b3JzLnNpemUoKSA+IDAgKXsKLQkJCWxhdW5jaEpvYnMoIGpvYlZhbGlkYXRvcnMsIHJlcG9ydGVyICk7Ci0JCX0KLQkJCQkKLQkJVmFsaWRhdG9yTWV0YURhdGEgY3VycmVudFZtZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZhbGlkYXRvcnMpIHsKLQkJCQljdXJyZW50Vm1kID0gdm1kOwotCQkJCS8vIElzIHZhbGlkYXRpb24gYWJvdXQgdG8gYmUgcnVuIG9uIHRoaXMgdmFsaWRhdG9yPwotCQkJCS8vIFZhbGlkYXRpb24gd2lsbCBydW4gZWl0aGVyIGlmIHRoaXMgb3BlcmF0aW9uIGZvcmNlcyByZWdhcmRsZXNzCi0JCQkJLy8gb2YgbmVlZCwgb3IgaWYgdGhlIHZhbGlkYXRvciB3YXMgbm90IHJ1biBhdXRvbWF0aWNhbGx5LgotCQkJCS8vIElmIHZhbGlkYXRpb24gaXMgbm90IGFib3V0IHRvIGJlIHJ1biwgdGhlbiBkb24ndCBhY3RpdmF0ZQotCQkJCS8vIHRoZSBwbHVnLWluCi0JCQkJdHJ5IHsKLQkJCQkJZGVsdGEgPSBnZXRGaWxlRGVsdGFzKHJlcG9ydGVyLmdldFByb2dyZXNzTW9uaXRvcigpLCB2bWQpOwotCQkJCQlib29sZWFuIHdpbGxSdW4gPSAoaXNGb3JjZSgpIHx8IGlzVmFsaWRhdGlvbk5lY2Vzc2FyeSh2bWQsIGRlbHRhKSk7Ci0JCQkJCWlmIChUcmFjaW5nLmlzVHJhY2VWMSgpKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiVmFsaWRhdGlvbk9wZXJhdGlvbi0wMTogd2lsbCBydW4/ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKHdpbGxSdW4pOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZCgiaXMgZm9yY2U/ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKGlzRm9yY2UoKSk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKCJpc0F1dG9CdWlsZD8gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoX2lzQXV0b0J1aWxkKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoImlzQXV0b1ZhbGlkYXRlPyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZCgiaXNJbmNyZW1lbnRhbD8gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQodm1kLmlzSW5jcmVtZW50YWwoKSk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoaXNGdWxsVmFsaWRhdGUoKSkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIkVWRVJZVEhJTkciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoZGVsdGEubGVuZ3RoID09IDApIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiTk9USElORyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChnZXREZWx0YUFzU3RyaW5nKGRlbHRhKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJVHJhY2luZy5sb2coYnVmZmVyKTsKLQkJCQkJfQotCQkJCQlpZiAoIXdpbGxSdW4pIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGV4dCA9IHZtZC5nZXRIZWxwZXIoZ2V0UHJvamVjdCgpKTsKLQkJCQkJaW5pdFZhbGlkYXRlQ29udGV4dChkZWx0YSk7Ci0JCQkJCXZhbGlkYXRvciA9IHZtZC5nZXRWYWxpZGF0b3IoKTsKLQkJCQkJCi0JCQkJCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQkJCQkKLQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotLy8JCQkJaWYgKGlzRm9yaygpICYmIHZtZC5pc0FzeW5jKCkpIHsKLS8vCQkJCQkvLyBEb24ndCBhcHBlYXIgdG8gcnVuIGluIHRoZSBmb3JlZ3JvdW5kIGJ5IHNlbmRpbmcKLS8vCQkJCQkvLyBwcm9ncmVzcyB0byB0aGUgSVByb2dyZXNzTW9uaXRvciBpbiB0aGUKLS8vCQkJCQkvLyBXb3JrYmVuY2hNb25pdG9yLiBTdXBwcmVzcyB0aGUgc3RhdHVzIG1lc3NhZ2VzIGJ5Ci0vLwkJCQkJLy8gY2hhbmdpbmcgdGhlIElQcm9ncmVzc01vbml0b3IgdG8gYQotLy8JCQkJCS8vIE51bGxQcm9ncmVzc01vbml0b3IuCi0vLwkJCQkJVlRocmVhZE1hbmFnZXIuZ2V0TWFuYWdlcigpLnF1ZXVlKHdyYXBJblJ1bm5hYmxlKG51bGxSZXBvcnRlciwgdmFsaWRhdG9yLCB2bWQsKFdvcmtiZW5jaENvbnRleHQpZ2V0Q29udGV4dCgpLGRlbHRhLCBpdGVyYXRvcikpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpbnRlcm5hbFZhbGlkYXRlKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgY29udGV4dCwgZGVsdGEpOwotLy8JCQkJfQotCQkJCWludGVybmFsVmFsaWRhdGUocmVwb3J0ZXIsIHZhbGlkYXRvciwgdm1kLCBjb250ZXh0LCBkZWx0YSk7Ci0JCQl9Ci0JCX0gCi0JCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCWhhbmRsZU9wZXJhdGlvbkNhbmNlbGxlZFZhbGlkYXRlRXhjZXB0aW9uKHJlcG9ydGVyLCB2YWxpZGF0b3IsIGN1cnJlbnRWbWQsIGl0ZXJhdG9yLCBleGMpOwotCQl9IAotCQlmaW5hbGx5IHsKLQkJCXJlbGVhc2VDYWNoZWRNYXBzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVsZWFzZUNhY2hlZE1hcHMoKSB7Ci0JCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5jbGVhckNhY2hlZE1hcHMoKTsKLQkJSVByb2plY3RWYWxpZGF0aW9uSGVscGVyIGhlbHBlciA9IFZhbGlkYXRpb25IZWxwZXJSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldFZhbGlkYXRpb25IZWxwZXIoKTsKLQkJaWYgKGhlbHBlciAhPSBudWxsKQotCQkJaGVscGVyLmRpc3Bvc2VJbnN0YW5jZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0VmFsaWRhdGVDb250ZXh0KElGaWxlRGVsdGFbXSBkZWx0YSkgewotCQkgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQkgKChXb3JrYmVuY2hDb250ZXh0KWNvbnRleHQpLnNldFZhbGlkYXRpb25GaWxlVVJJcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCQkgZm9yKElGaWxlRGVsdGEgZmlsZSA6IGRlbHRhKSB7Ci0JCQkJIGlmKGZpbGUuZ2V0RGVsdGFUeXBlKCkgIT0gSUZpbGVEZWx0YS5ERUxFVEVEICkgewotCQkJCQkgKChXb3JrYmVuY2hDb250ZXh0KWNvbnRleHQpLmdldFZhbGlkYXRpb25GaWxlVVJJcygpLmFkZChmaWxlLmdldEZpbGVOYW1lKCkpOwotCQkJCSB9Ci0JCQkgfSAKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGl0ZXJhdG9yCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBleGMKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlT3BlcmF0aW9uQ2FuY2VsbGVkVmFsaWRhdGVFeGNlcHRpb24oV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCAKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJdGVyYXRvcjxWYWxpZGF0b3JNZXRhRGF0YT4gaXRlcmF0b3IsIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGV4YykgewotCQkvKgotCQkgKiBJZiB0aGUgdXNlciB0ZXJtaW5hdGVzIHZhbGlkYXRpb24gKGkuZS4sIHByZXNzZXMgImNhbmNlbCIgb24gdGhlIHByb2dyZXNzIG1vbml0b3IpIGJlZm9yZQotCQkgKiB0aGUgdmFsaWRhdGlvbiBjb21wbGV0ZXMsIHBlcmZvcm0gY2xlYW4gdXAgb24gZWFjaCBjb25maWd1cmVkIGVuYWJsZWQgdmFsaWRhdG9yLgotCQkgKiAKLQkJICogVG8gY2xlYW4gdXAsIHNldmVyYWwgc3RlcHMgYXJlIHBlcmZvcm1lZDogMS4gY2FsbCA8Y29kZT48L2NvZGU+IG9uIGVhY2ggY29uZmlndXJlZAotCQkgKiBlbmFibGVkIHZhbGlkYXRvciwgc28gdGhhdCBlYWNoIHZhbGlkYXRvciBjYW4gcGVyZm9ybSBjbGVhbnVwIHRoYXQgaXQga25vd3MgaXMgbmVjZXNzYXJ5LgotCQkgKiAyLiByZW1vdmUgYWxsIHRhc2tzIHRoYXQgdGhpcyB2YWxpZGF0b3IgaGFzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QgMy4gYWRkIGFub3RoZXIgdGFzayB0bwotCQkgKiB0aGUgdGFzayBsaXN0IHRvIHNheSB0aGF0IHZhbGlkYXRpb24sIHVzaW5nIHRoaXMgdmFsaWRhdG9yIG9uIHRoaXMgcHJvamVjdCwgd2FzCi0JCSAqIHRlcm1pbmF0ZWQuCi0JCSAqIAotCQkgKiBTdGVwcyAyIGFuZCAzIGFyZSBkb25lIHNvIHRoYXQgaXQncyBjbGVhciB3aGF0IGhhcywgYW5kIGhhcyBub3QsIGJlZW4gdmFsaWRhdGVkLiBJZiB0aGVzZQotCQkgKiBzdGVwcyB3ZXJlbid0IHBlcmZvcm1lZCwgdmFsaWRhdGlvbiBjb3VsZCBiZSBkb25lIG9uIHNvbWUgaXRlbXMgaW4gdGhlIHByb2plY3QsIGJ1dCBub3QKLQkJICogb3RoZXJzOyBhbmQgdGhlIHVzZXIgY291bGQgbWlzdGFrZW5seSBiZWxpZXZlIHRoYXQgdGhvc2UgYXJlIHRoZSBvbmx5IHByb2JsZW1zIHdpdGggdGhlCi0JCSAqIHByb2plY3QuIFVubGVzcyB0aGUgdXNlciBrbm93cyB0aGF0IGEgZnVsbCB2ZXJpZmljYXRpb24gbmVlZHMgdG8gYmUgZG9uZSwgaGUvc2hlIGNvdWxkCi0JCSAqIGNvbnRpbnVlIHRvIHJlbHkgb24gYXV0b21hdGljIHZlcmlmaWNhdGlvbiwgYW5kIG5ldmVyIGtub3cgdGhhdCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBhCi0JCSAqIHJlc291cmNlIHdoaWNoIGhhc24ndCBiZWVuIHZhbGlkYXRlZC4KLQkJICovCi0JCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX0NMRUFOVVAsIG5ldyBTdHJpbmdbXXt2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pKTsKLQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yKTsKLQkJYWRkQ2FuY2VsVGFzayh2bWQpOwotCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVELCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0b3IgPSB2bWQuZ2V0VmFsaWRhdG9yKCk7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLQkJCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMyKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX0NMRUFOVVAsIG5ldyBTdHJpbmdbXXt2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pKTsKLQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JCQlhZGRDYW5jZWxUYXNrKHZtZCk7Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVELCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KSk7Ci0JCX0KLQkJdGhyb3cgZXhjOyAvLyBwcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbiB1cCB0byB0aGUgZnJhbWV3b3JrIHNvIHRoYXQKLQkJLy8gdGhlIGZyYW1ld29yayBjYW4gZGlzcGxheSB0aGUgY29ycmVjdCAiY2FuY2VsZWQiCi0JCS8vIG1lc3NhZ2UgaW4gdGhlIGRpYWxvZwotCi0JfQotCi0JLyogcGFja2FnZSAqLwotCXZvaWQgaW50ZXJuYWxWYWxpZGF0ZShmaW5hbCBXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIGZpbmFsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCxmaW5hbCBJV29ya2JlbmNoQ29udGV4dCBhQ29udGV4dCwgZmluYWwgSUZpbGVEZWx0YVtdIGRlbHRhKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tDYW5jZWxlZChyZXBvcnRlcik7Ci0JCQlyZW1vdmVPbGRNZXNzYWdlcyhyZXBvcnRlciwgdmFsaWRhdG9yLCB2bWQsIGRlbHRhKTsKLQkJCS8vIERvIE5PVCBjaGVjayBpZiB0aGUgbWVzc2FnZSBsaW1pdCBpcyBleGNlZWRlZCBiZWZvcmUgbGF1bmNoaW5nCi0JCQkvLyB0aGUgdmFsaWRhdG9yLgotCQkJLy8gRXZlbiBpZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQgd2hlbiB0aGUgbWVzc2FnZXMgYXJlIHJlbW92ZWQgZnJvbQotCQkJLy8gdGhlIGRlbHRhCi0JCQkvLyBmaWxlcywgaXQgY291bGQgYmUgdGhhdCB0aGUgdmFsaWRhdG9yIGl0c2VsZiB3aWxsIHJlbW92ZQotCQkJLy8gbWVzc2FnZXMgYmVmb3JlCi0JCQkvLyBwcm9jZWVkaW5nLiBMZXQgdGhlIHZhbGlkYXRvciBydW4gc28gdGhhdCBpdCBjYW4gcmVtb3ZlIG1lc3NhZ2VzCi0JCQkvLyBpZiBpdAotCQkJLy8gbmVlZHMgdG8sIGFuZCBpZiBpdCB0cmllcyB0byBhZGQgYSBtZXNzYWdlIHdoZW4gdGhlIGxpbWl0IGlzCi0JCQkvLyBleGNlZWRlZCwgbGV0Ci0JCQkvLyB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgdGFrZSBjYXJlIG9mIGl0LgotCQkJbGF1bmNoVmFsaWRhdG9yKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgYUNvbnRleHQsIGRlbHRhKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIHZhbGlkYXRlKFdvcmtiZW5jaFJlcG9ydGVyKSBtZXRob2QuCi0JCQl0aHJvdyBleGM7Ci0JCX1jYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IsIGxvZyB0aGUKLQkJCS8vIGVycm9yIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHZhbGlkYXRvci4KLQkJCS8vIElmIGEgcnVudGltZSBleGNlcHRpb24gaGFzIG9jY3VycmVkLCBlLmcuIE51bGxQb2ludGVyIG9yCi0JCQkvLyBDbGFzc0Nhc3QsIGRpc3BsYXkgaXQgd2l0aCB0aGUgIkEgcnVudGltZSBleGNlcHRpb24gaGFzIG9jY3VycmVkIiBtZXNzYWdlLgotCQkJLy8gVGhpcyB3aWxsIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciB3aGVuIGhlL3NoZSBjYWxscyBTZXJ2aWNlLgotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtc3NnKTsKLQkJCQotCQkJLyoKLQkJCSBUaGUgY29kZSAgYmVsb3cgIGNhdXNlcyBidW5kbGUgbm90IGZvdW5kIGV4Y2VwdGlvbiBzaW5jZSwgdGhlICBidW5kbGUgaGVyZSBpcwotCQkJIHZhbGlkYXRlX2Jhc2UgYW5kIHdlICBhcmUgIHRyeWluZyB0byBsb2FkIHRoYXQgYnVuZGxlIGZyb20gdGhlIGNsYXNzbG9hZGVyIG9mIAotCQkJIHRoZSBWYWxpZGF0b3IuIAotCQkJICAKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZXhjLmdldE1lc3NhZ2UoKSl9OyAvLyROT04tTkxTLTEkCi0JCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLQkJCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLQkJCW1lc3NhZ2Uuc2V0SWQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SVU5USU1FKTsKLQkJCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2YWxpZGF0b3IsIG1lc3NhZ2UpOwotCQkJKi8KLQkJfSBmaW5hbGx5IHsKLQkJCS8vIElmIHVzZXIgZml4ZXMgcHJvYmxlbSwgYW5kIGxpbWl0IGV4Y2VlZGVkLCBhZGQgImV4Y2VlZGVkIgotCQkJLy8gbWVzc2FnZSwgb3IKLQkJCS8vIGlmIGxpbWl0IG5vdCBleGNlZWRlZCBhbnkgbW9yZSwgcmVtb3ZlICJleGNlZWRlZCIgbWVzc2FnZS4KLQkJCS8vTWVzc2FnZSBMaW1pdCBpcyByZW1vdmVkIGZyb20gdGhlIGZyYW1ld29yawotCQkJLy9WYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5jaGVja01lc3NhZ2VMaW1pdChnZXRQcm9qZWN0KCksIHRydWUpOwotCQkJcmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuZG9uZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW4gb3JkZXIgdG8gYWxsb3cgdmFsaWRhdG9ycyB0byBydW4sIG11c3QgZmlyc3QgY2hlY2sgaWYgdGhlcmUncyBzcGFjZSBmb3IgbmV3IG1hcmtlcnMuIEJ1dAotCSAqIHRoZSBvbGQgbWFya2VycyBtdXN0IG5vdCBwcmV2ZW50IHZhbGlkYXRpb24gZnJvbSBydW5uaW5nIGFnYWluIChsaW1pdCBleGNlZWRlZCksIHNvIGRlbGV0ZQotCSAqIGFsbCBvZiB0aGUgb2xkIG1hcmtlcnMgZmlyc3QsIGFuZCB0aGVuIHJ1biB2YWxpZGF0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCByZW1vdmVPbGRNZXNzYWdlcyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSUZpbGVEZWx0YVtdIGRlbHRhKSB7Ci0JCWlmIChyZXBvcnRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gSWYgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiBlbmFibGVkLCByZW1vdmUgdGhlICJjYW5jZWwiIHRhc2suCi0JCS8vIElmIHRoZSB2YWxpZGF0b3IsIG9uIHRoZSBsYXN0IHJ1biwgdGhyZXcgYSBUaHJvd2FibGUsIHJlbW92ZSB0aGUKLQkJLy8gImludGVybmFsIGVycm9yIiB0YXNrLiAoRm9yIHRoZSBzYW1lIHJlYXNvbnMgd2UgcmVtb3ZlIHRoZSAiY2FuY2VsIgotCQkvLyB0YXNrLgotCQlJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnJlbW92ZU9wZXJhdGlvblRhc2tzKGdldFByb2plY3QoKSwgdm1kKTsKLQkJY2hlY2tDYW5jZWxlZChyZXBvcnRlcik7Ci0JCXRyeSB7Ci0JCQkvLyBDaGVjayB0byBzZWUgaWYgYSBmdWxsIGJ1aWxkIG11c3QgYmUgcGVyZm9ybWVkLCBvciBpZiBhIGRlbHRhCi0JCQkvLyBidWlsZCBpcyB0byBiZSBwZXJmb3JtZWQsIGlmIHRoZXJlIGFyZSBmaWxlcyB0byB2ZXJpZnkgZm9yIHRoYXQKLQkJCS8vIHZhbGlkYXRvci4gKElmIGl0J3MgZGVsdGEsIGJ1dCB0aGVyZSBhcmUgbm8gZmlsZXMsIGNhbGxpbmcKLQkJCS8vIHZhbGlkYXRlIG9uIHRoYXQgdmFsaWRhdG9yIHN0YXJ0cyBhIGZ1bGwgYnVpbGQsIGluc3RlYWQgb2YganVzdAotCQkJLy8gcmV0dXJuaW5nLikKLQkJCWlmIChpc0Z1bGxWYWxpZGF0ZSgpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1NUQVJUX1JFTU9WSU5HX09MRF9NRVNTQUdFUywgbmV3IFN0cmluZ1tde3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0JCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yKTsKLQkJCQltZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19GSU5JU0hfUkVNT1ZJTkdfT0xEX01FU1NBR0VTLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtZXNzYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayB0aGF0IHRoZXJlIGFyZSBkZWx0YXMgdG8gdmFsaWRhdGUKLQkJCQkvLyBiZWNhdXNlIHRoYXQncyBhbHJlYWR5IGNoZWNrZWQgaW4gaXNWYWxpZGF0aW9uTmVjZXNzYXJ5Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1NUQVJUX1JFTU9WSU5HX09MRF9NRVNTQUdFUywgbmV3IFN0cmluZ1tde3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YS5sZW5ndGg7IGkrKykgewotCQkJCQlXb3JrYmVuY2hGaWxlRGVsdGEgZmQgPSAoV29ya2JlbmNoRmlsZURlbHRhKSBkZWx0YVtpXTsKLQkJCQkJaWYgKGZkLmdldERlbHRhVHlwZSgpICE9IElGaWxlRGVsdGEuREVMRVRFRCkgewotCQkJCQkJLy8gSWYgdGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCwgZWNsaXBzZSBlcmFzZXMgYWxsCi0JCQkJCQkvLyBtYXJrZXJzIG9uIHRoZSBmaWxlLgotCQkJCQkJLy8gQWxzbywgd2hlbiBhIHJlc291cmNlIGRvZXNuJ3QgZXhpc3QsCi0JCQkJCQkvLyBXb3JrYmVuY2hSZXBvcnRlcidzIGdldE1lc3NhZ2VSZXNvdXJjZSgpCi0JCQkJCQkvLyByZXR1cm5zIHRoZSBJUHJvamVjdCwgd2hpY2ggbWVhbnMgdGhhdCByZW1vdmluZyB0aGUKLQkJCQkJCS8vIG1lc3NhZ2VzIGZyb20gdGhpcwotCQkJCQkJLy8gZmlsZSByZW1vdmVzIGFsbCBvZiB0aGlzIHZhbGlkYXRvcidzIG1lc3NhZ2VzIG9uCi0JCQkJCQkvLyB0aGlzIElQcm9qZWN0IChhaXggZGVmZWN0IDIwNjE1NykKLQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlcG9ydGVyLmdldE1lc3NhZ2VSZXNvdXJjZSh2YWxpZGF0b3IsIGZkKTsKLQkJCQkJCWlmIChmZC5nZXRPYmplY3QoKS5lcXVhbHMoZmQuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCQkJCQlXb3JrYmVuY2hSZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhyZXNvdXJjZSwgdmFsaWRhdG9yKTsgLy8gcmVtb3ZlCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvciwgZmQuZ2V0T2JqZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCW1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0ZJTklTSF9SRU1PVklOR19PTERfTUVTU0FHRVMsIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1lc3NhZ2UpOwotCQkJfQotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IGV4YzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJU3RyaW5nIG1zc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFksIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobXNzZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIGEgZnVsbCB2ZXJpZmljYXRpb24gb3IgYSBkZWx0YSB2ZXJpZmljYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIGJvdGggd2lsbCBjYWxsIHRoaXMKLQkgKiBtZXRob2QgdG8gcHJvY2VzcyB0aGUgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byBmaWx0ZXIgdGhlCi0JICogcmVzb3VyY2UgKGkuZS4sIHRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHJlc291cmNlIGZhaWxzIHRoZSBmaWx0ZXIgdGVzdCkuCi0JICogPGNvZGU+cHJvY2VzczwvY29kZT4gYWxzbyBzZW5kcyBvdXRwdXQgdG8gdGhlIDxjb2RlPklQcm9ncmVzc01vbml0b3I8L2NvZGU+LCBhbmQgY2FsbHMKLQkgKiB0aGUgY3VycmVudCBWYWxpZGF0b3IgdG8gdmFsaWRhdGUgdGhlIHJlc291cmNlLgotCSAqIAotCSAqIDxwPlRvIHByb2Nlc3MgYSByZXNvdXJjZSwgdGhlcmUgYXJlIHNldmVyYWwgc3RlcHM6PC9wPiAKLQkgKiA8cD4xLiBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgcmVnaXN0ZXJlZCBmb3IKLQkgKiB0aGlzIHZhbGlkYXRvciAoaS5lLiwgdGhlIHZhbGlkYXRvciBoYXMgZWl0aGVyIHNwZWNpZmllZCBpdCBpbiBhIGZpbHRlciwgb3IgaGFzIG5vdCBmaWx0ZXJlZAotCSAqIGl0IG91dCBleHBsaWNpdGx5KTwvcD4KLQkgKiAKLQkgKiA8cD4yLiBjYWxsIDxjb2RlPmlzVmFsaWRhdGlvblNvdXJjZTwvY29kZT4gb24gdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHdpdGgKLQkgKiB0aGUgY3VycmVudCByZXNvdXJjZS4gVGhpcyBtZXRob2QgcGVyZm9ybXMgZnVydGhlciBmaWx0ZXJpbmcgYnkgdGhlIFZhbGlkYXRvciBpdHNlbGYsIGluCi0JICogYWRkaXRpb24gdG8gdGhlIHN0YXRpYyBmaWx0ZXJpbmcgZG9uZSBieSB0aGUgZnJhbWV3b3JrLCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4KLQkgKiBwbHVnaW4ueG1sLjwvcD4gCi0JICogCi0JICogPHA+My4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuPC9wPiAKLQkgKiAKLQkgKiA8cD40LiBXaGVuIGNvbXBsZXRlIChlaXRoZXIgYnkgZmFpbGluZyB0byBwYXNzIGEgZmlsdGVyLCBvciBieSB0aGUKLQkgKiBjb21wbGV0aW9uIG9mIHRoZSA8Y29kZT52YWxpZGF0ZTwvY29kZT4pLCBpbmNyZW1lbnQgdGhlIElQcm9ncmVzc01vbml0b3IncyBzdGF0dXMgYnkgb25lCi0JICogKGkuZS4sIG9uZSByZXNvdXJjZSBoYXMgYmVlbiBwcm9jZXNzZWQuKTwvcD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgbGF1bmNoVmFsaWRhdG9yKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElGaWxlRGVsdGFbXSBkZWx0YSkgewotCQlpZiAocmVwb3J0ZXIgPT0gbnVsbClyZXR1cm47Ci0JCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQkvLyBDaGVjayB0byBzZWUgaWYgYSBmdWxsIGJ1aWxkIG11c3QgYmUgcGVyZm9ybWVkLCBvciBpZiBhIGRlbHRhCi0JCS8vIGJ1aWxkIGlzIHRvIGJlIHBlcmZvcm1lZCwgaWYgdGhlcmUgYXJlIGZpbGVzIHRvIHZlcmlmeSBmb3IgdGhhdAotCQkvLyB2YWxpZGF0b3IuIChJZiBpdCdzIGRlbHRhLCBidXQgdGhlcmUgYXJlIG5vIGZpbGVzLCBjYWxsaW5nCi0JCS8vIHZhbGlkYXRlIG9uIHRoYXQgdmFsaWRhdG9yIHN0YXJ0cyBhIGZ1bGwgYnVpbGQsIGluc3RlYWQgb2YganVzdAotCQkvLyByZXR1cm5pbmcuKQotCQl0cnkgewotCQkJLy8gVmFsaWRhdGUgdGhlIHJlc291cmNlOyB0aGlzIHN0ZXAgd2lsbCBhZGQgZXJyb3JzL3dhcm5pbmdzIHRvIHRoZQotCQkJLy8gdGFzayBsaXN0LCBhbmQgcmVtb3ZlIGVycm9ycy93YXJuaW5ncyBmcm9tIHRoZSB0YXNrIGxpc3QuCi0JCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgV29ya2JlbmNoQ29udGV4dCkgewotCQkJCS8vIEluaXRpYWxpemUgdGhlICJsb2FkUnVsZUdyb3VwIiBtZXRob2Qgd2l0aCB0aGUgZ3JvdXAgb2YgcnVsZXMKLQkJCQkvLyB3aGljaCB0aGUgdmFsaWRhdG9yIHNob3VsZCB2YWxpZGF0ZS4KLQkJCQkoKFdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuc2V0UnVsZUdyb3VwKGdldFJ1bGVHcm91cCgpKTsKLQkJCX0KLQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19TVEFSVElOR19WQUxJREFUSU9OLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1lc3NhZ2UpOwotCQkJaWYgKFRyYWNpbmcuaXNMb2dnaW5nKCkpIHsKLQkJCQkvLyBUaGlzIGludGVybmFsICJsYXVuY2hlZCB2YWxpZGF0b3JzIiB2YWx1ZSBpcyB1c2VkIG9ubHkgaW4gdGVzdHMuCi0JCQkJZ2V0TGF1bmNoZWRWYWxpZGF0b3JzKCkuYWRkKHZtZCk7Ci0JCQl9Ci0JCQkvL2luaXRWYWxpZGF0ZUNvbnRleHQoZGVsdGEpOwotCQkJVmFsaWRhdG9yTGF1bmNoZXIuZ2V0TGF1bmNoZXIoKS5zdGFydChoZWxwZXIsIHZhbGlkYXRvciwgcmVwb3J0ZXIpOwotCQkJLy9UT0RPIEdSSyBkZXRlcm1pbmUgaWYgdGltaW5nIGluZm8gc2hvdWxkIGJlIGFkZGVkIGhlcmUKLS8vCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5JTkZPKSkgewotLy8JCQkJVGltZUVudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRUaW1lRW50cnkoKTsKLS8vCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLmxhdW5jaFZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQllbnRyeS5zZXRQcm9qZWN0TmFtZShnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLS8vCQkJCWVudHJ5LnNldFRvb2xOYW1lKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotLy8JCQkJZW50cnkuc2V0RWxhcHNlZFRpbWUoZmluaXNoIC0gc3RhcnQpOwotLy8JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotLy8JCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCQkJaWYgKGlzRnVsbFZhbGlkYXRlKCkpIHsKLS8vCQkJCQkJYnVmZmVyLmFwcGVuZCgiRVZFUllUSElORyIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJaWYgKGRlbHRhLmxlbmd0aCA9PSAwKSB7Ci0vLwkJCQkJCQlidWZmZXIuYXBwZW5kKCJOT1RISU5HIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCWJ1ZmZlci5hcHBlbmQoZ2V0RGVsdGFBc1N0cmluZyhkZWx0YSkpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCWVudHJ5LnNldERldGFpbHMoYnVmZmVyLnRvU3RyaW5nKCkpOwotLy8JCQkJfQotLy8JCQkJbG9nZ2VyLndyaXRlKExldmVsLklORk8sIGVudHJ5KTsKLS8vCQkJfQotCQkJbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT04sIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgZXhjOwotCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJLy8gRmlyc3QsIHNlZSBpZiBhIHZhbGlkYXRvciBqdXN0IGNhdWdodCBhbGwgVGhyb3dhYmxlcyBhbmQKLQkJCS8vIGFjY2lkZW50YWxseSB3cmFwcGVkIGEgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGluc3RlYWQgb2YKLQkJCS8vIHByb3BhZ2F0aW5nIGl0LgotCQkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgVmFsaWRhdGlvbkV4Y2VwdGlvbikgewotCQkJCQlWYWxpZGF0aW9uRXhjZXB0aW9uIHZleGMgPSAoVmFsaWRhdGlvbkV4Y2VwdGlvbikgZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKTsKLQkJCQkJdmV4Yy5zZXRDbGFzc0xvYWRlcih2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsgLy8gZmlyc3QsCi0JCQkJCS8vIHNldCB0aGUgY2xhc3MgbG9hZGVyLCBzbyB0aGF0IHRoZSBleGNlcHRpb24ncyBnZXRNZXNzYWdlKCkgbWV0aG9kCi0JCQkJCS8vIGNhbiByZXRyaWV2ZSB0aGUgcmVzb3VyY2UgYnVuZGxlCi0JCQkJfQotCQkJfQotCQkJLy8gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhpcyBwYXJ0aWN1bGFyIHZhbGlkYXRvciwgbG9nIHRoZQotCQkJLy8gZXJyb3IgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgdmFsaWRhdG9yLgotCQkJZXhjLnNldENsYXNzTG9hZGVyKHZhbGlkYXRvci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOyAvLyBmaXJzdCwKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1lc3NhZ2UpOwotCQkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgZXhjLmdldEFzc29jaWF0ZWRNZXNzYWdlKCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtc3NnKTsKLQkJCQotCQkJLyoKLQkJCSBUaGUgY29kZSAgYmVsb3cgIGNhdXNlcyBidW5kbGUgbm90IGZvdW5kIGV4Y2VwdGlvbiBzaW5jZSwgdGhlICBidW5kbGUgaGVyZSBpcwotCQkJIHZhbGlkYXRlX2Jhc2UgYW5kIHdlICBhcmUgIHRyeWluZyB0byBsb2FkIHRoYXQgYnVuZGxlIGZyb20gdGhlIGNsYXNzbG9hZGVyIG9mIAotCQkJIHRoZSBWYWxpZGF0b3IuIAotCQkJIAotCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TWVzc2FnZSgpOwotCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotCQkJbWVzc2FnZS5zZXRQYXJhbXMobXNnUGFybSk7Ci0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgbWVzc2FnZSk7Ci0JCQkqLwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRvci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWhlbHBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vIE5vdyB0aGF0IGNsZWFudXAgaGFzIGJlZW4gY2FsbGVkLCBzZXQgdGhlIHByb2plY3QgdG8gbnVsbC4KLQkJCQkvLyBUaGlzIHByb2plY3QncwotCQkJCS8vIHJlc291cmNlcyBoYXZlIGJlZW4gZnJlZWQgc28gdGhpcyBwcm9qZWN0IHNob3VsZCBhbHNvIGJlCi0JCQkJLy8gY2xlYXJlZCBvbiB0aGUgaGVscGVyLgotCQkJCS8vIElmIGl0IGlzbid0IHNldCB0byBudWxsLCB0aGVuIHRoZSBuZXh0IHRpbWUgdGhhdCB0aGUgaGVscGVyCi0JCQkJLy8gaXMgcmV0cmlldmVkIGZyb20KLQkJCQkvLyB0aGUgVmFsaWRhdG9yTWV0YURhdGEsIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciB0aGlzCi0JCQkJLy8gcHJvamVjdCwgaW4gdGhlCi0JCQkJLy8gaGVscGVyJ3MgaW5pdGlhbGl6ZSBtZXRob2QsIHdpbGwgbm90IGJlIHJlYWxsb2NhdGVkIGlmIHRoZQotCQkJCS8vIHByb2plY3QgaXMgdGhlIHNhbWUuCi0JCQkJaGVscGVyLnNldFByb2plY3QobnVsbCk7Ci0JCQl9Ci0JCQkvLyBUZWxsIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRoYXQgd2UndmUgY29tcGxldGVkIG4gdW5pdHMgb2Ygd29yawotCQkJLy8gKGkuZS4sIG4gcmVzb3VyY2VzIHZhbGlkYXRlZCBieSBvbmUgdmFsaWRhdG9yKS4KLQkJCXJlcG9ydGVyLmdldFByb2dyZXNzTW9uaXRvcigpLndvcmtlZCgoKGRlbHRhID09IG51bGwpID8gMSA6IGRlbHRhLmxlbmd0aCkpOwotCQl9Ci0JfQotCi0vLwlwcml2YXRlIFJ1bm5hYmxlIHdyYXBJblJ1bm5hYmxlKGZpbmFsIFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgZmluYWwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBmaW5hbCBJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIGZpbmFsIElGaWxlRGVsdGFbXSBkZWx0YSwgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3IpIHsKLS8vCQkvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBSdW5uYWJsZSBlYWNoIHRpbWUgYmVjYXVzZSBzZXZlcmFsIFJ1bm5hYmxlCi0vLwkJLy8gaW5zdGFuY2VzIG1heSBleGlzdCBhdCB0aGUgc2FtZSB0aW1lLgotLy8JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFByb2plY3RSdW5uYWJsZShyZXBvcnRlciwgdmFsaWRhdG9yLCB2bWQsIGhlbHBlciwgZGVsdGEsIGl0ZXJhdG9yKTsKLS8vCQlyZXR1cm4gcnVubmFibGU7Ci0vLwl9Ci0KLQkvKgotCSAqIC8vIEZvciBjb252ZW5pZW5jZSwga2VlcCB0aGlzIG1ldGhvZCBpbiB0aGUgY2xhc3MgYnV0IGNvbW1lbnRlZCBvdXQuIC8vIFdoZW4gYXN5bmMgbmVlZHMgdG8KLQkgKiBiZSB0ZXN0ZWQsIHRoaXMgbWV0aG9kIG1heSBiZSBuZWVkZWQgYWdhaW4uIHByaXZhdGUgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIHByZWZpeCwKLQkgKiBJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIpIHsgSVByb2plY3QgaFByb2plY3QgPSBoZWxwZXIuZ2V0UHJvamVjdCgpOyBTeXN0ZW0uZXJyLnByaW50bG4ocHJlZml4ICsKLQkgKiAiU3RhcnQgVmFsaWRhdGlvbk9wZXJhdGlvbiAiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIjo6IiArIGhQcm9qZWN0LmdldE5hbWUoKSk7Ci0JICogaWYoIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpLmVxdWFscygiVmFsaWRhdGlvblRocmVhZCIpICYmCi0JICogKGhQcm9qZWN0LmdldE5hbWUoKS5pbmRleE9mKCJub0ZvcmsiKSA+IC0xKSkgeyBUaHJlYWQuZHVtcFN0YWNrKCk7IH0gZWxzZQotCSAqIGlmKCghVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkuZXF1YWxzKCJWYWxpZGF0aW9uVGhyZWFkIikpICYmCi0JICogKGhQcm9qZWN0LmdldE5hbWUoKS5pbmRleE9mKCJmb3JrIikgPiAtMSkpIHsgVGhyZWFkLmR1bXBTdGFjaygpOyB9IFN5c3RlbS5lcnIucHJpbnRsbihwcmVmaXggKwotCSAqICJFbmQgVmFsaWRhdGlvbk9wZXJhdGlvbiIpOyB9Ci0JICovCi0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdXNlZCBieSB0aGUgZnJhbWV3b3JrLgotCSAqLwotCXB1YmxpYyBjbGFzcyBQcm9qZWN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgV29ya2JlbmNoUmVwb3J0ZXIgX3JlcG9ydGVyOwotCQlwcml2YXRlIElWYWxpZGF0b3IgX3ZhbGlkYXRvcjsKLQkJcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBfdm1kOwotCQlwcml2YXRlIElGaWxlRGVsdGFbXSBfZGVsdGE7Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBQcm9qZWN0UnVubmFibGUoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCAKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBJRmlsZURlbHRhW10gZGVsdGEsIEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0JCQlfcmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJCV92YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCQlfdm1kID0gdm1kOwotCQkJX2RlbHRhID0gZGVsdGE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWludGVybmFsVmFsaWRhdGUoX3JlcG9ydGVyLCBfdmFsaWRhdG9yLCBfdm1kLCBjb250ZXh0LF9kZWx0YSk7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkvLyBVc2VyIGNhbid0IGNhbmNlbCBhIGpvYiBpbiBhIGJhY2tncm91bmQgdGhyZWFkLCBzbyBpZ25vcmUgdGhpcyBleGNlcHRpb24uCi0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCXJldHVybiBfcmVwb3J0ZXIuZ2V0UHJvamVjdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb250ZXh0LgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdGlvbkNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoSVdvcmtiZW5jaENvbnRleHQgY29udGV4dCkgewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQkKLQl2b2lkIGxhdW5jaEpvYnMoU2V0PFZhbGlkYXRvck1ldGFEYXRhPiB2YWxpZGF0b3JzLCBmaW5hbCBXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uewotCQkKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQlJRmlsZURlbHRhW10gZGVsdGEgPSBudWxsOwotCQlJV29ya2JlbmNoQ29udGV4dCB3b3JrYmVuY2hjb250ZXh0ID0gbnVsbDsKLQkJCi0JCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdmFsaWRhdG9ycykgewotCQkJY2hlY2tDYW5jZWxlZChyZXBvcnRlcik7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJZGVsdGEgPSBnZXRGaWxlRGVsdGFzKHJlcG9ydGVyLmdldFByb2dyZXNzTW9uaXRvcigpLCB2bWQpOwotCQkJCWJvb2xlYW4gd2lsbFJ1biA9IChpc0ZvcmNlKCkgfHwgaXNWYWxpZGF0aW9uTmVjZXNzYXJ5KHZtZCwgZGVsdGEpKTsKLQkJCQlpZiAoIXdpbGxSdW4pY29udGludWU7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCVN0cmluZyBtc3NnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtc3NnKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0b3IgPSB2bWQuY3JlYXRlVmFsaWRhdG9yKCk7Ci0JCQkJd29ya2JlbmNoY29udGV4dCA9IHZtZC5jcmVhdGVIZWxwZXIoIGdldFByb2plY3QoKSApOwotCQkJCWluaXRWYWxpZGF0ZUNvbnRleHQoIGRlbHRhLCB3b3JrYmVuY2hjb250ZXh0ICk7Ci0JCQkJdm1kLmFkZEhlbHBlcigoSVZhbGlkYXRvckpvYil2YWxpZGF0b3IsIHdvcmtiZW5jaGNvbnRleHQpOwkJCQkKLQkJCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJCQkKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQkJCXJlbW92ZU9sZE1lc3NhZ2VzKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgZGVsdGEpOwotCQkJCQotCQkJCWlmKCB2YWxpZGF0b3IgaW5zdGFuY2VvZiBJVmFsaWRhdG9ySm9iICl7Ci0JCQkJCWxhdW5jaFZhbGlkYXRvckpvYiggcmVwb3J0ZXIsIChJVmFsaWRhdG9ySm9iKXZhbGlkYXRvciwgdm1kLCB3b3JrYmVuY2hjb250ZXh0LCBkZWx0YSk7Ci0JCQkJfQotCi0JCQkJCi0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl0aHJvdyBleGM7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJU3RyaW5nIG1zc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFksIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCVN0cmluZyBtc3NnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtc3NnKTsKLQkJCQl0aHJvdyBlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBJZiB1c2VyIGZpeGVzIHByb2JsZW0sIGFuZCBsaW1pdCBleGNlZWRlZCwgYWRkICJleGNlZWRlZCIKLQkJCQkvLyBtZXNzYWdlLCBvciBpZiBsaW1pdCBub3QgZXhjZWVkZWQgYW55IG1vcmUsIHJlbW92ZSAiZXhjZWVkZWQiIG1lc3NhZ2UuCi0JCQkJcmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuZG9uZSgpOwotCQkJfQotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRlQ29udGV4dChJRmlsZURlbHRhW10gZGVsdGEsIElXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQgKSB7Ci0JCSBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFdvcmtiZW5jaENvbnRleHQpIHsKLQkJCSAoKFdvcmtiZW5jaENvbnRleHQpY29udGV4dCkuc2V0VmFsaWRhdGlvbkZpbGVVUklzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCSBmb3IoSUZpbGVEZWx0YSBmaWxlIDogZGVsdGEpIHsKLQkJCQkgaWYoZmlsZS5nZXREZWx0YVR5cGUoKSAhPSBJRmlsZURlbHRhLkRFTEVURUQgKSB7Ci0JCQkJCSAoKFdvcmtiZW5jaENvbnRleHQpY29udGV4dCkuZ2V0VmFsaWRhdGlvbkZpbGVVUklzKCkuYWRkKGZpbGUuZ2V0RmlsZU5hbWUoKSk7Ci0JCQkJIH0KLQkJCSB9IAotCQl9Ci0JfQotCQkJCQkJCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGxhdW5jaFZhbGlkYXRvckpvYihXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwKLQkJSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBJRmlsZURlbHRhW10gZGVsdGEpIHsKLQkJCi0JCWlmIChyZXBvcnRlciA9PSBudWxsKXJldHVybjsKLQkJY2hlY2tDYW5jZWxlZChyZXBvcnRlcik7Ci0KLQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIFdvcmtiZW5jaENvbnRleHQpIHsKLQkJCSgoV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5zZXRSdWxlR3JvdXAoZ2V0UnVsZUdyb3VwKCkpOwotCQl9Ci0JCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkvLyBUaGlzIGludGVybmFsICJsYXVuY2hlZCB2YWxpZGF0b3JzIiB2YWx1ZSBpcyB1c2VkIG9ubHkgaW4gdGVzdHMuCi0JCQlnZXRMYXVuY2hlZFZhbGlkYXRvcnMoKS5hZGQodm1kKTsKLQkJfQotCQkKLQkJVmFsaWRhdG9ySm9iIHZhbGlkYXRvcmpvYiA9IG5ldyBWYWxpZGF0b3JKb2IoIHZhbGlkYXRvciwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIAotCQkJdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSwgaGVscGVyLmdldFByb2plY3QoKSwgaGVscGVyICk7Ci0KLQkJSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlID0gdmFsaWRhdG9yLmdldFNjaGVkdWxpbmdSdWxlKGhlbHBlcik7Ci0JCXZhbGlkYXRvcmpvYi5zZXRSdWxlKCBzY2hlZHVsaW5nUnVsZSApOwkJCi0JCVF1YWxpZmllZE5hbWUgdmFsaWRhdG9yS2V5ID0gbmV3IFF1YWxpZmllZE5hbWUobnVsbCwgIlZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCXZhbGlkYXRvcmpvYi5zZXRQcm9wZXJ0eSggdmFsaWRhdG9yS2V5LCB2YWxpZGF0b3IgKTsKLQkJdmFsaWRhdG9yam9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKAotCQkJbmV3IEpvYkNoYW5nZUFkYXB0ZXIoKXsKLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCl7Ci0JCQkJCUpvYiBqb2IgPSBldmVudC5nZXRKb2IoKTsKLQkJCQkJUXVhbGlmaWVkTmFtZSB2YWxpZGF0b3JLZXkgPSBuZXcgUXVhbGlmaWVkTmFtZShudWxsLCAiVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IgPSAoSVZhbGlkYXRvckpvYilqb2IuZ2V0UHJvcGVydHkoIHZhbGlkYXRvcktleSApOwotCQkJCQlWYWxpZGF0b3JNYW5hZ2VyIG1nciA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpOwotCQkJCQlmaW5hbCBMaXN0PE1lc3NhZ2VJbmZvPiBsaXN0ID0gbWdyLmdldE1lc3NhZ2VzKHZhbGlkYXRvcik7CQkJCQkJCQotCQkJCQkKLQkJCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQkJICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJCQkJCWZvcihNZXNzYWdlSW5mbyBpbmZvIDogbGlzdCl7Ci0JCQkJCQkJCXRyeSB7CQkJCQkJCQkKLQkJCQkJCQkJCVRhc2tMaXN0VXRpbGl0eS5hZGRUYXNrKCBpbmZvLmdldE1lc3NhZ2VPd25lcklkKCksIGluZm8uZ2V0UmVzb3VyY2UoKSwKLQkJCQkJCQkJCQlpbmZvLmdldExvY2F0aW9uKCksIGluZm8uZ2V0TXNnKCkuZ2V0SWQoKSwgaW5mby5nZXRUZXh0KCksCi0JCQkJCQkJCQkJaW5mby5nZXRNc2coKS5nZXRTZXZlcml0eSgpLAotCQkJCQkJCQkJCWluZm8uZ2V0TWFya2VySWQoKSwKLQkJCQkJCQkJCQlpbmZvLmdldFRhcmdldE9iamVjdE5hbWUoKSwKLQkJCQkJCQkJCQlpbmZvLmdldE1zZygpLmdldEdyb3VwTmFtZSgpLAotCQkJCQkJCQkJCWluZm8uZ2V0TXNnKCkuZ2V0T2Zmc2V0KCksCi0JCQkJCQkJCQkJaW5mby5nZXRNc2coKS5nZXRMZW5ndGgoKSk7CQkJCQkJCQkKLQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfQkJCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCSAgICB9Ci0JCQkJCX07Ci0JCQkJCXRyeSB7Ci0JCQkJCQkKLQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG51bGwsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCSAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJbWdyLmNsZWFyTWVzc2FnZXMoIHZhbGlkYXRvciApOwotCQkJCQl2YWxpZGF0b3IgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJdmFsaWRhdG9yam9iLnNldFByaW9yaXR5KEpvYi5ERUNPUkFURSk7Ci0JCWxhdW5jaGVySm9iLmFkZFZhbGlkYXRpb25Kb2IodmFsaWRhdG9yam9iKTsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25VdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1MzQ3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB2YWxpZGF0b3JzIGFuZCBjb2RlIG91dHNpZGUKLSAqIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25VdGlsaXR5IHsKLQkvL1RPRE8gTWFrZSB0aGUgVmFsaWRhdGlvblV0aWxpdHkgY29uc3RydWN0b3IgcHJpdmF0ZSBpbiBNaWxlc3RvbmUgNC4KLQotCS8qKgotCSAqIEdpdmVuIGFuIElSZXNvdXJjZSBhbmQgb25lIG9mIHRoZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuU2V2ZXJ0eUVudW0gY29uc3RhbnRzLAotCSAqIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZXMgb2YgdGhlIHZhbGlkYXRvcnMgd2hpY2ggaGF2ZQotCSAqIHJlcG9ydGVkIG1lc3NhZ2VzLCBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGFnYWluc3QgdGhlIHJlc291cmNlIGFuZCB0aGUgcmVzb3VyY2UncyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGxpc3RWYWxpZGF0b3JDbGFzc2VzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5KSB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgc2V2ZXJpdHkpOwotCQlpZiAoKG1hcmtlcnMgPT0gbnVsbCkgfHwgKG1hcmtlcnMubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCi0JCVNldDxTdHJpbmc+IHRlbXBTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJdHJ5IHsKLQkJCQlPYmplY3Qgb3duZXIgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJCWlmICgob3duZXIgPT0gbnVsbCkgfHwgIShvd25lciBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJLy8gVGhlIFZhbGlkYXRpb25NaWdyYXRvciB3aWxsIHJlbW92ZSBhbnkgInVub3duZWQiIHZhbGlkYXRpb24gbWFya2Vycy4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRlbXBTZXQuYWRkKChTdHJpbmcpb3duZXIpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQotCi0JCWlmICh0ZW1wU2V0LnNpemUoKSA+IDApIHsKLQkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbdGVtcFNldC5zaXplKCldOwotCQkJdGVtcFNldC50b0FycmF5KHJlc3VsdCk7Ci0JCQl0ZW1wU2V0LmNsZWFyKCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFRoaXMgaW5zdGFuY2UgbWV0aG9kIHdpbGwgYmUgbWFkZSBzdGF0aWMgaW4gTWlsZXN0b25lIDQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHsKLQkJcmV0dXJuIGlzRW5hYmxlZChwcm9qZWN0LCBuZXcgU3RyaW5nW117dmFsaWRhdG9yQ2xhc3NOYW1lfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSB2YWxpZGF0b3JzLCBpZGVudGlmaWVkIGJ5IHRoZWlyIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lcywgYXJlCi0JICogZW5hYmxlZCBvbiB0aGUgcHJvamVjdC4gSWYgYSB2YWxpZGF0b3IgaXNuJ3QgZW5hYmxlZCwgb3IgaWYgdGhlcmUncyBhbiBpbnRlcm5hbCBlcnJvciB3aGlsZQotCSAqIHJldHJpZXZpbmcgdGhlIHVzZXIncyBjb25maWd1cmF0aW9uLCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSB2YWxpZGF0b3JDbGFzc05hbWVzKSB7Ci0JCWlmICgodmFsaWRhdG9yQ2xhc3NOYW1lcyA9PSBudWxsKSB8fCAodmFsaWRhdG9yQ2xhc3NOYW1lcy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0b3JDbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFwcmpwLmlzRW5hYmxlZCh2YWxpZGF0b3JDbGFzc05hbWVzW2ldKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9ySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9ySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGRkMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlBlcmZvcm1hbmNlQ291bnRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvckpvYiBleHRlbmRzIEpvYiB7Ci0KLQotCXByaXZhdGUgSVByb2plY3QJCQlwcm9qZWN0OwotCXByaXZhdGUgSVdvcmtiZW5jaENvbnRleHQgCWhlbHBlcjsKLQlwcml2YXRlIElWYWxpZGF0b3JKb2IJCXZhbGlkYXRvcjsKLQkKLQlwdWJsaWMgVmFsaWRhdG9ySm9iKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkgICAKLQlwdWJsaWMgVmFsaWRhdG9ySm9iKCBJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciwgU3RyaW5nIGRpc3BsYXlOYW1lLCBTdHJpbmcgbmFtZSwgSVByb2plY3QgcHJvamVjdCwgSVdvcmtiZW5jaENvbnRleHQgYUhlbHBlciAgKXsKLQkJc3VwZXIoZGlzcGxheU5hbWUpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLmhlbHBlciA9IGFIZWxwZXI7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQkKLQkvL3JldmlzaXQgcmVwb3J0ZXIgaW4gdGhlIGNvZGUgIGJlbG93Ci0JLy9zdWJ0YXNrIGluZm9ybWF0aW9uIGlzIGRpc3BsYXllZCBpbiB0aGUgbW9uaXRvciBjcmVhdGVkIGJ5IHRoZSBKb2IKLQkvL2Vycm9yIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIGJ5IHRoZSBJUmVwb3J0ZXIKLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlJUGVyZm9ybWFuY2VNb25pdG9yIHBtID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0UGVyZm9ybWFuY2VNb25pdG9yKCk7Ci0JCWxvbmcgZWxhcHNlZCA9IC0xOwotCQlsb25nIGNwdVRpbWUgPSAtMTsKLQkJaWYgKHBtLmlzQ29sbGVjdGluZygpKXsKLQkJCWVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWNwdVRpbWUgPSBNaXNjLmdldENQVVRpbWUoKTsKLQkJfQotCi0JCW1vbml0b3IuYmVnaW5UYXNrKCJWYWxpZGF0aW5nIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RhdHVzIHN0YXR1cyA9IElWYWxpZGF0b3JKb2IuT0tfU1RBVFVTOwotCQlXb3JrYmVuY2hSZXBvcnRlcglyZXBvcnRlciA9IG5ldyBXb3JrYmVuY2hSZXBvcnRlciggcHJvamVjdCwgbW9uaXRvciApOwotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCQkKLQkJdHJ5IHsKLQotCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZSgKLQkJCQlSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1NUQVJUSU5HX1ZBTElEQVRJT04sCi0JCQkJbmV3IFN0cmluZ1tde2hlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCi0JCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7CQkKLQkJCXN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZUluSm9iKGhlbHBlciwgcmVwb3J0ZXIpOwotCQkKLQkJCW1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OLAotCQkJCW5ldyBTdHJpbmdbXXtoZWxwZXIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLSAKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBleGM7Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBGaXJzdCwgc2VlIGlmIGEgdmFsaWRhdG9yIGp1c3QgY2F1Z2h0IGFsbCBUaHJvd2FibGVzIGFuZAotCQkJLy8gYWNjaWRlbnRhbGx5IHdyYXBwZWQgYSBNZXNzYWdlTGltaXRFeGNlcHRpb24gaW5zdGVhZCBvZgotCQkJLy8gcHJvcGFnYXRpbmcgaXQuCi0JCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCVZhbGlkYXRpb25FeGNlcHRpb24gdmV4YyA9IChWYWxpZGF0aW9uRXhjZXB0aW9uKSBleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpOwotCQkJCQl2ZXhjLnNldENsYXNzTG9hZGVyKHZhbGlkYXRvci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOyAKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGlzIHBhcnRpY3VsYXIgdmFsaWRhdG9yLCBsb2cgdGhlCi0JCQkvLyBlcnJvciBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dCB2YWxpZGF0b3IuCi0JCQlleGMuc2V0Q2xhc3NMb2FkZXIodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0KLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoCi0JCQkJCVJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwKLQkJCQkJbmV3IFN0cmluZ1tde2hlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCi0JCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0JCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodmFsaWRhdG9yLCBleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVN0cmluZyBtc3NnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoCi0JCQkJUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLAotCQkJCW5ldyBTdHJpbmdbXXtoZWxwZXIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgfSk7Ci0JCQkKLQkJCW1vbml0b3Iuc3ViVGFzayhtc3NnKTsKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJCQotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZXhjLmdldE1lc3NhZ2UoKSl9OyAvLyROT04tTkxTLTEkCQkJCQotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TWVzc2FnZSgpOwotCQkJCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLQkJCQltZXNzYWdlLnNldElkKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUlVOVElNRSk7Ci0JCQkJbWVzc2FnZS5zZXRQYXJhbXMobXNnUGFybSk7CQkJCQotCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtZXNzYWdlLmdldFRleHQoKSk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaGVscGVyLmNsZWFudXAocmVwb3J0ZXIpOwotCQkJCQl2bWQucmVtb3ZlSGVscGVyKCB2YWxpZGF0b3IgKTsKLQkJCQl9Y2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZXhjLmdldE1lc3NhZ2UoKSl9OyAvLyROT04tTkxTLTEkCi0JCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TWVzc2FnZSgpOwotCQkJCQltZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0JCQkJCW1lc3NhZ2Uuc2V0SWQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SVU5USU1FKTsKLQkJCQkJbWVzc2FnZS5zZXRQYXJhbXMobXNnUGFybSk7Ci0JCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodmFsaWRhdG9yLCBtZXNzYWdlKTsKLQkKLQkJCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1lc3NhZ2UuZ2V0VGV4dCgpKTsJCi0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaGVscGVyLnNldFByb2plY3QobnVsbCk7Ci0JCQkJCXZtZC5yZW1vdmVIZWxwZXIoIHZhbGlkYXRvciApOwotCQkJCQloZWxwZXIgPSBudWxsOwotCQkJCQlyZXBvcnRlciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJLy9yZXBvcnRlci5nZXRQcm9ncmVzc01vbml0b3IoKS53b3JrZWQoKChkZWx0YSA9PSBudWxsKSA/IDEgOiBkZWx0YS5sZW5ndGgpKTsgLy8gT25lCi0JCQkvL21vbml0b3Iud29ya2VkKCgoZGVsdGEgPT0gbnVsbCkgPyAxIDogZGVsdGEubGVuZ3RoKSk7IC8vIE9uZQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJaWYgKHBtLmlzQ29sbGVjdGluZygpKXsKLQkJCWlmIChjcHVUaW1lICE9IC0xKXsKLQkJCQljcHVUaW1lID0gTWlzYy5nZXRDUFVUaW1lKCkgLSBjcHVUaW1lOwotCQkJfQotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gbnVsbDsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJCXBtLmFkZChuZXcgUGVyZm9ybWFuY2VDb3VudGVycyh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpLCAKLQkJCQl2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSxwcm9qZWN0TmFtZSwgLTEsIAotCQkJCVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLWVsYXBzZWQsIGNwdVRpbWUpKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCXJldHVybiAocHJvamVjdC5nZXROYW1lKCkgKyBWYWxpZGF0b3JNYW5hZ2VyLlZBTElEQVRPUl9KT0JfRkFNSUxZKS5lcXVhbHMoZmFtaWx5KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzUzOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBBIGNlbnRyYWxpemVkIGNsYXNzIGZvciBhY2Nlc3NpbmcgdmFsaWRhdGlvbiBtZXRhZGF0YS4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRvck1hbmFnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9KT0JfRkFNSUxZID0gInZhbGlkYXRvcnMiOwkgLy8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JNYW5hZ2VyIGluc3Q7Ci0JcHJpdmF0ZSBzdGF0aWMgSVJlc291cmNlVXRpbCBfcmVzb3VyY2VVdGlsOyAvLyBhIGNvbW1vbiB1dGlsaXR5LCBkaWZmZXJlbnQgd2hldGhlciBvciBub3QKLQkvLyBXU0FEIGlzIHJ1bm5pbmcgaW4gaGVhZGxlc3Mgb3IgVUkgbW9kZSwgd2hpY2ggY2FuIHJldHJpZXZlIHRoZSBsaW5lIG51bWJlciBvZiBzb21lIE1PRiBvYmplY3RzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIFJFU09VUkNFVVRJTF9ERUZBVUxUQ0xBU1MgPSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkRlZmF1bHRSZXNvdXJjZVV0aWwuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgX3Jlc291cmNlVXRpbENsYXNzID0gUkVTT1VSQ0VVVElMX0RFRkFVTFRDTEFTUzsJCQotCXByaXZhdGUgc3RhdGljIENsYXNzIAlfbWVzc2FnZUxpbWl0T3duZXI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBFbXB0eVNldCA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCQotCXByaXZhdGUgU3RyaW5nW10gCQlfaW50ZXJuYWxPd25lcnM7Ci0JcHJpdmF0ZSBNYXA8SVZhbGlkYXRvckpvYiwgTGlzdDxNZXNzYWdlSW5mbz4+IF92YWxpZGF0b3JNc2dzID0gCi0JCUNvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcCggbmV3IEhhc2hNYXA8SVZhbGlkYXRvckpvYiwgTGlzdDxNZXNzYWdlSW5mbz4+KCkgKTsJCi0JcHJpdmF0ZSBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IF9wcm9ibGVtVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwkKLQkKLQlwcml2YXRlIFZhbGlkYXRvck1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCV9pbnRlcm5hbE93bmVycyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkJYWRkSW50ZXJuYWxPd25lcihnZXRNZXNzYWdlTGltaXRPd25lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIGFsbCB2YWxpZGF0b3JzIGZvciB0aGUgY3VycmVudCBwcm9qZWN0LCBhbmQgZG9lcyBub3QgdG91Y2ggdGhlIGF1dG8tdmFsaWRhdGUgc2V0dGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNhYmxlQWxsVmFsaWRhdG9ycyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIERpc2FibGUgdGhlIGluZGl2aWR1YWwgdmFsaWRhdG9ycwotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhjdXJyZW50UHJvamVjdCwgRW1wdHlTZXQsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuYWJsZVZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9ySWQpIHsKLQotCQl0cnkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcklkKTsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2YgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJZ2YuZW5hYmxlU2luZ2xlVmFsaWRhdG9yKHZtZCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNhYmxlVmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JJZCl7Ci0KLQkJdHJ5IHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JJZCk7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdmID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCWdmLmRpc2FibGVTaW5nbGVWYWxpZGF0b3Iodm1kKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGVuYWJsZVZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9ySWQsIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gbWFudWFsVmFsaWRhdGlvbiwgYm9vbGVhbiBidWlsZFZhbGlkYXRpb24pIHsJCQotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXByanAuc2V0RG9lc1Byb2plY3RPdmVycmlkZSh0cnVlKTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JJZCk7Ci0JCQkKLQkJCWlmKG1hbnVhbFZhbGlkYXRpb24pcHJqcC5lbmFibGVTaW5nbGVNYW51YWxWYWxpZGF0b3Iodm1kKTsKLQkJCWlmIChidWlsZFZhbGlkYXRpb24pcHJqcC5lbmFibGVTaW5nbGVCdWlsZFZhbGlkYXRvcih2bWQpOwotCQkJcHJqcC5zdG9yZSgpOwkJCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNhYmxlVmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JJZCwgSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBtYW51YWxWYWxpZGF0aW9uLCBib29sZWFuIGJ1aWxkVmFsaWRhdGlvbil7Ci0KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlwcmpwLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9ySWQpOwotCQkJCi0JCQlpZihtYW51YWxWYWxpZGF0aW9uKXByanAuZGlzYWJsZVNpbmdsZU1hbnVhbFZhbGlkYXRvcih2bWQpOwotCQkJaWYgKGJ1aWxkVmFsaWRhdGlvbilwcmpwLmRpc2FibGVTaW5nbGVCdWlsZFZhbGlkYXRvcih2bWQpOwotCQkJcHJqcC5zdG9yZSgpOwotCQkJCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCQotCQotCQotCS8qKgotCSAqIEdpdmVuIGFuIElQcm9qZWN0LCBpZiB0aGUgSVByb2plY3QgZG9lcyBub3Qgc3VwcG9ydCBidWlsZCB2YWxpZGF0aW9uLCBhZGQgdGhlIHZhbGlkYXRpb24KLQkgKiBidWlsZGVyIHRvIHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uIHNvIHRoYXQgdGhlIHByb2plY3QgY2FuIHN1cHBvcnQgYnVpbGQgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUHJvamVjdEJ1aWxkVmFsaWRhdGlvblN1cHBvcnQoSVByb2plY3QgcHJvamVjdCkgewotCQkvKgotCQkgKiBJJ20gd29ya2luZyBteSB3YXkgdGhyb3VnaCB0aGUgY29kZSB0byBzZWUgd2hlcmUgdGhpcyBnZXRzIGNhbGxlZC4gT25lIHBsYWNlIHdhcyBpbiBNb2R1bGVDb3JlTmF0dXJlCi0JCSAqIHdoaWNoIGhhZCBoYXJkIGNvZGVkIHRoZSBidWlsZGVyIGlkLgotCQkgKi8KLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm47Ci0KLQkJYm9vbGVhbiBpc0J1aWxkZXJBZGRlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCWlmIChjb21tYW5kcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJQ29tbWFuZCBjb21tYW5kIDogY29tbWFuZHMpIHsKLQkJCQkJU3RyaW5nIGJ1aWxkZXJOYW1lID0gY29tbWFuZC5nZXRCdWlsZGVyTmFtZSgpOwotCQkJCQlpZiAoYnVpbGRlck5hbWUgPT0gbnVsbCkgewotCQkJCQkJLy8gYnVpbGRlciBuYW1lIHdpbGwgYmUgbnVsbCBpZiBpdCBoYXMgbm90IGJlZW4gc2V0Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChidWlsZGVyTmFtZS5lcXVhbHMoVmFsaWRhdGlvblBsdWdpbi5WQUxJREFUSU9OX0JVSUxERVJfSUQpKSB7Ci0JCQkJCQlpc0J1aWxkZXJBZGRlZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFpc0J1aWxkZXJBZGRlZCkgewotCQkJCUlDb21tYW5kIG5ld0NvbW1hbmQgPSBkZXNjcmlwdGlvbi5uZXdDb21tYW5kKCk7Ci0JCQkJbmV3Q29tbWFuZC5zZXRCdWlsZGVyTmFtZShWYWxpZGF0aW9uUGx1Z2luLlZBTElEQVRJT05fQlVJTERFUl9JRCk7Ci0KLQkJCQlJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbnVsbDsKLQkJCQlpZiAoY29tbWFuZHMgIT0gbnVsbCkgewotCQkJCQluZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtjb21tYW5kcy5sZW5ndGggKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShjb21tYW5kcywgMCwgbmV3Q29tbWFuZHMsIDAsIGNvbW1hbmRzLmxlbmd0aCk7Ci0JCQkJCW5ld0NvbW1hbmRzW2NvbW1hbmRzLmxlbmd0aF0gPSBuZXdDb21tYW5kOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kWzFdOwotCQkJCQluZXdDb21tYW5kc1swXSA9IG5ld0NvbW1hbmQ7Ci0JCQkJfQotCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0KLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIGlmIHdlIGNhbid0IHJlYWQgdGhlIGluZm9ybWF0aW9uLCB0aGUgcHJvamVjdCBpc24ndCBvcGVuLCBzbyBpdCBjYW4ndCBydW4KLQkJCS8vIGF1dG8tdmFsaWRhdGUKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSVByb2plY3QsIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvamVjdCBjYW4gcnVuIGJ1aWxkIHZhbGlkYXRpb24gKGkuZS4sCi0JICogaW5jcmVtZW50YWwgdmFsaWRhdGlvbiksIGFuZCBmYWxzZSBvdGhlcndpc2UuIFRoZSB0ZXN0LCB0byBmaW5kIG91dCBpZiB0aGUgcHJvamVjdCBzdXBwb3J0cwotCSAqIGJ1aWxkIHZhbGlkYXRpb24gb3Igbm90LCBpcyB0byBzZWUgaWYgdGhlIFZhbGlkYXRpb25CdWlsZGVyIGlzIGNvbmZpZ3VyZWQgb24gdGhhdCB0eXBlIG9mCi0JICogcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgbG9uZy1ydW5uaW5nIHByb2Nlc3MgLSBpcyB0aGVyZSBhbnkgd2F5IHRoYXQgSSBjYW4gc2hvcnRlbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhpcwotCSAqIHRha2VzPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzUHJvamVjdFN1cHBvcnRCdWlsZFZhbGlkYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGNhblJ1bkFWID0gZmFsc2U7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBjYW5SdW5BVjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOyAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGlmIGRlc2NyaXB0aW9uCi0JCQkvLyBpcyBudWxsLCBiZWNhdXNlIGl0J3MgbmV2ZXIgbnVsbAotCQkJaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gY2FuUnVuQVY7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgYnVpbGRlck5hbWUgPSBjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpOwotCQkJCWlmIChidWlsZGVyTmFtZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGJ1aWxkZXIgbmFtZSB3aWxsIGJlIG51bGwgaWYgaXQgaGFzIG5vdCBiZWVuIHNldAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoYnVpbGRlck5hbWUuZXF1YWxzKFZhbGlkYXRpb25QbHVnaW4uVkFMSURBVElPTl9CVUlMREVSX0lEKSkgewotCQkJCQljYW5SdW5BViA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIGlmIHdlIGNhbid0IHJlYWQgdGhlIGluZm9ybWF0aW9uLCB0aGUgcHJvamVjdCBpc24ndCBvcGVuLCBzbyBpdCBjYW4ndCBydW4KLQkJCS8vIGF1dG8tdmFsaWRhdGUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBjYW5SdW5BVjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgYWxsIHZhbGlkYXRvcnMgZm9yIHRoZSBjdXJyZW50IHByb2plY3QsIGFuZCBkb2VzIG5vdCB0b3VjaCB0aGUgYXV0by12YWxpZGF0ZSBzZXR0aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUFsbFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIFR1cm4gYXV0by12YWxpZGF0ZSBvZmYKLQkJLy8Jc2V0QXV0b1ZhbGlkYXRlKGN1cnJlbnRQcm9qZWN0LCBmYWxzZSk7Ci0KLQkJLy8gRW5hYmxlIHRoZSBpbmRpdmlkdWFsIHZhbGlkYXRvcnMKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlwcmpwLnNldEVuYWJsZWRWYWxpZGF0b3JzKHByanAuZ2V0VmFsaWRhdG9ycygpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKiAKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGluY3JlbWVudGFsIFZhbGlkYXRvck1ldGFEYXRhIGNvbmZpZ3VyZWQgb24gYSBjZXJ0YWluIHR5cGUgb2YgSVByb2plY3QKLQkgKiAoZS5nLiBFSkIgUHJvamVjdCB2cy4gV2ViIFByb2plY3QpLgotCSAqLwotCXB1YmxpYyBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldFByb2plY3RDb25maWd1cmVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChwcmpwLmdldEluY3JlbWVudGFsVmFsaWRhdG9ycygpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIEVtcHR5U2V0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKiAKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIFZhbGlkYXRvck1ldGFEYXRhIGNvbmZpZ3VyZWQgb24gYSBjZXJ0YWluIHR5cGUgb2YgSVByb2plY3QgKGUuZy4gRUpCCi0JICogUHJvamVjdCB2cy4gV2ViIFByb2plY3QpLgotCSAqIAotCSAqIElmIHRoZSBjb2xsZWN0aW9uIGhhcyBub3QgYmVlbiBjYWxjdWxhdGVkIGJlZm9yZSwgY2FsY3VsYXRlIGl0IG5vdywgYW5kIGNhY2hlIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0UHJvamVjdENvbmZpZ3VyZWRWYWxpZGF0b3JNZXRhRGF0YShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRWYWxpZGF0b3JzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gRW1wdHlTZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqIAotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgVmFsaWRhdG9yTWV0YURhdGEgZW5hYmxlZCBvbiBhIGNlcnRhaW4gdHlwZSBvZiBJUHJvamVjdCAoZS5nLiBFSkIKLQkgKiBQcm9qZWN0IHZzLiBXZWIgUHJvamVjdCkuIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpc0luY3JlbWVudGFsLCBpZGVudGlmaWVzIHdoZXRoZXIgaXQncyB0aGUKLQkgKiBpbmNyZW1lbnRhbCwgb3Igbm9uLWluY3JlbWVudGFsLCB2YWxpZGF0b3JzIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZC4gSWYgdGhlIHBhcmFtZXRlciBpcwotCSAqIHRydWUsIHJldHVybiBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzLiBJZiB0aGUgcGFyYW1ldGVyIGlzIGZhbHNlLCByZXR1cm4gbm9uaW5jcmVtZW50YWwKLQkgKiB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldFByb2plY3RFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnModHJ1ZSkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gRW1wdHlTZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqIAotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgVmFsaWRhdG9yTWV0YURhdGEgZW5hYmxlZCBvbiBhIGNlcnRhaW4gdHlwZSBvZiBJUHJvamVjdCAoZS5nLiBFSkIKLQkgKiBQcm9qZWN0IHZzLiBXZWIgUHJvamVjdCkuIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpc0luY3JlbWVudGFsLCBpZGVudGlmaWVzIHdoZXRoZXIgaXQncyB0aGUKLQkgKiBpbmNyZW1lbnRhbCwgb3Igbm9uLWluY3JlbWVudGFsLCB2YWxpZGF0b3JzIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZC4gSWYgdGhlIHBhcmFtZXRlciBpcwotCSAqIHRydWUsIHJldHVybiBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzLiBJZiB0aGUgcGFyYW1ldGVyIGlzIGZhbHNlLCByZXR1cm4gbm9uaW5jcmVtZW50YWwKLQkgKiB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFZhbGlkYXRvck1ldGFEYXRhPiBnZXRQcm9qZWN0RW5hYmxlZE5vbkluY3JlbWVudGFsVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKGZhbHNlKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBFbXB0eVNldDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICogCi0JICogUmV0dXJucyBhIFZlY3RvciBvZiBhbGwgVmFsaWRhdG9yTWV0YURhdGEgd2hvIGFyZSBib3RoIGNvbmZpZ3VyZWQgb24gdGhpcyB0eXBlIG9mIHByb2plY3QsCi0JICogYW5kIHdobyBhcmUgYWxzbyBlbmFibGVkIGJ5IHRoaXMgcHJvamVjdC4gSWYgdGhlIGxpc3Qgb2YgZW5hYmxlZCB2YWxpZGF0b3JzIGhhc24ndCBiZWVuCi0JICogbG9hZGVkIGludG8gdGhlIGNhY2hlLCBsb2FkIGl0IG5vdy4gT3RoZXJ3aXNlLCBqdXN0IHJldHVybiBpdC4KLQkgKi8KLQlwdWJsaWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRQcm9qZWN0RW5hYmxlZFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0RW5hYmxlZFZhbGlkYXRvcnMocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChpbnN0ID09IG51bGwpIHsKLQkJCWluc3QgPSBuZXcgVmFsaWRhdG9yTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlVXRpbCBnZXRSZXNvdXJjZVV0aWwoKSB7Ci0JCWlmIChfcmVzb3VyY2VVdGlsID09IG51bGwpIHsKLQkJCWlmIChfcmVzb3VyY2VVdGlsQ2xhc3MgPT0gbnVsbCkgewotCQkJCS8vIFNpbmNlIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIG11c3QgbmV2ZXIgYmUgbnVsbCwKLQkJCQkvLyBkZWZhdWx0IHRoZSByZXNvdXJjZSB1dGlsIHRvIHRoZSBoZWFkbGVzcyByZXNvdXJjZSB1dGlsLgotCQkJCV9yZXNvdXJjZVV0aWxDbGFzcyA9IFJFU09VUkNFVVRJTF9ERUZBVUxUQ0xBU1M7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJX3Jlc291cmNlVXRpbCA9IChJUmVzb3VyY2VVdGlsKSBfcmVzb3VyY2VVdGlsQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJX3Jlc291cmNlVXRpbCA9IG51bGw7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlfcmVzb3VyY2VVdGlsID0gbnVsbDsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCV9yZXNvdXJjZVV0aWwgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBfcmVzb3VyY2VVdGlsOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIEl0IHdpbGwgYmUKLQkgKiAgICAgICAgICAgICBtb3ZlZCB0byBhIGNsYXNzIGluIHRoZSAiaW50ZXJuYWwiIHBhY2thZ2UgYXQgc29tZSB0aW1lLgotCSAqLwotCXB1YmxpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKGludCBzZXZlcml0eSwgSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIHNldmVyaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBJdCB3aWxsIGJlCi0JICogICAgICAgICAgICAgbW92ZWQgdG8gYSBjbGFzcyBpbiB0aGUgImludGVybmFsIiBwYWNrYWdlIGF0IHNvbWUgdGltZS4KLQkgKi8KLQlwdWJsaWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBzZXZlcml0eSkgewotCQlyZXR1cm4gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgc2V2ZXJpdHkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIEl0IHdpbGwgYmUKLQkgKiAgICAgICAgICAgICBtb3ZlZCB0byBhIGNsYXNzIGluIHRoZSAiaW50ZXJuYWwiIHBhY2thZ2UgYXQgc29tZSB0aW1lLgotCSAqLwotCXB1YmxpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMpIHsKLQkJcmV0dXJuIFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIHZhbGlkYXRvck5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YShJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlyZXR1cm4gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKi8KLQlwdWJsaWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoQ29sbGVjdGlvbjxWYWxpZGF0b3JNZXRhRGF0YT4gdm1kcykgewotCQlpZiAodm1kcyA9PSBudWxsKXJldHVybiBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpIHsKLQkJCWlmICh2bWQuaXNJbmNyZW1lbnRhbCgpKXJlc3VsdC5hZGQodm1kKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBpZGVudGlmaWVkIGJ5IHZhbGlkYXRvcklkIHdpbGwgdmFsaWRhdGUgdGhlIGdpdmVuIHJlc291cmNlLiBJZgotCSAqIGVpdGhlciBwYXJhbWV0ZXIgaXMgbnVsbCwgZmFsc2UgaXMgcmV0dXJuZWQuIElmIHRoZSB2YWxpZGF0b3IgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCB0aGUKLQkgKiB2YWxpZGF0aW9uIGZyYW1ld29yayAoaS5lLiwgZWl0aGVyIG5vIHZhbGlkYXRvciBpbiB0aGUgYWN0aXZhdGVkIHBsdWdpbnMgaXMgaWRlbnRpZmllZCBieQotCSAqIHRoYXQgcGx1Z2luIGlkLCBvciB0aGUgZ2l2ZW4gSVJlc291cmNlJ3MgcHJvamVjdCBkb2VzIG5vdCBydW4gdGhhdCBwYXJ0aWN1bGFyIHZhbGlkYXRvciksCi0JICogdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVUbyhTdHJpbmcgdmFsaWRhdG9ySWQsIElSZXNvdXJjZSByZXMpIHsKLQkJaWYgKCh2YWxpZGF0b3JJZCA9PSBudWxsKSB8fCAocmVzID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9ySWQpOwotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCS8vIHZhbGlkYXRvciBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmcmFtZXdvcmsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmlzQ29uZmlndXJlZE9uUHJvamVjdCh2bWQsIHJlcy5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdm1kLmlzQXBwbGljYWJsZVRvKHJlcyk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9WYWxpZGF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc0F1dG9WYWxpZGF0ZShwcm9qZWN0LCBpc0dsb2JhbEF1dG9CdWlsZEVuYWJsZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogS2VlcGluZyB0aGlzIEFQSSBhcm91bmQgc28gYXMgbm90IHRvIGJyZWFrIGV4aXN0aW5nIGNvZGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIGlzQXV0b1ZhbGlkYXRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvVmFsaWRhdGVDaGVja2VkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzQXV0b1ZhbGlkYXRlKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEtlZXBpbmcgdGhpcyBBUEkgYXJvdW5kIHNvIGFzIG5vdCB0byBicmVhayBleGlzdGluZyBjb2RlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBpc0F1dG9WYWxpZGF0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1ZhbGlkYXRlQ2hlY2tlZChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzR2xvYmFsQXV0b0J1aWxkT24pIHsKLQkJcmV0dXJuIGlzQXV0b1ZhbGlkYXRlKHByb2plY3QsIGlzR2xvYmFsQXV0b0J1aWxkT24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0ZSB3aWxsIHJ1biB3aGVuIHRoZXJlIGlzIGEgcmVzb3VyY2UgY2hhbmdlLiBUaGUgZm9sbG93aW5nCi0JICogYXR0cmlidXRlcyBhcmUgY2hlY2tlZDogMS4gZG9lcyB0aGlzIHByb2plY3QgaGF2ZSBhdXRvLXZhbGlkYXRlIG9uIG9yIG9mZj8gMi4gaWYgdGhpcyBwcm9qZWN0Ci0JICogZG9lcyBub3QgaGF2ZSBhbiBhdXRvLXZhbGlkYXRlIHZhbHVlIHNldCwgaXMgdGhlIGdsb2JhbCBhdXRvLXZhbGlkYXRlIHByZWZlcmVuY2Ugb24/IDMuIGlmIDEKLQkgKiBvciAyIGlzIHRydWUsIGRvZXMgdGhlIHByb2plY3Qgc3VwcG9ydCBhdXRvLXZhbGlkYXRlPyA0LiBpZiAxLzIsICYgMywgaXMgYXV0by1idWlsZCBvbj8gNS4gaWYKLQkgKiAxLzIsIDMsIGFuZCA0LCBpcyB0aGVyZSBhdCBsZWFzdCBvbmUgaW5jcmVtZW50YWwgdmFsaWRhdG9yIGVuYWJsZWQgb24gdGhlIHByb2plY3Q/Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgYXV0byB2YWxpZGF0ZSBpcyBub3QgdXNlZCBhbnkgbW9yZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1ZhbGlkYXRlKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNHbG9iYWxBdXRvQnVpbGRPbikgewotCQkvKnRyeSB7Ci0JCQkvLyAxLiBkb2VzIHRoZSBwcm9qZWN0IGhhdmUgYXV0by12YWxpZGF0ZSBvbiBvciBvZmY/Ci0JCQlib29sZWFuIGlzQXV0b1ZhbGlkYXRlID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpLmlzQXV0b1ZhbGlkYXRlKCk7Ci0JCQlpZiAoIWlzQXV0b1ZhbGlkYXRlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyAzLiBkb2VzIHRoZSBwcm9qZWN0IHN1cHBvcnQgYXV0by12YWxpZGF0ZT8KLQkJCS8vIDQuIGlzIGF1dG8tYnVpbGQgb24/Ci0JCQkvLyA1LiBpcyB0aGVyZSBhdCBsZWFzdCBvbmUgaW5jcmVtZW50YWwgdmFsaWRhdG9yIGVuYWJsZWQgb24gdGhlIHByb2plY3Q/Ci0JCQkKLQkJCSAqIEF1dG8tdmFsaWRhdGlvbiwgb24gdGhlIHByb3BlcnRpZXMgcGFnZSwgY2FuIGJlIGVuYWJsZWQgdW5kZXIgdGhlc2UgY29uZGl0aW9uczogMS4KLQkJCSAqIHRoZSBwcm9qZWN0IHN1cHBvcnRzIGF1dG8tdmFsaWRhdGlvbiwgQU5EIDIuIGZoZSBwbGF0Zm9ybSdzIGdsb2JhbCAiYXV0b21hdGljYWxseQotCQkJICogYnVpbGQiIGlzIHNlbGVjdGVkLCBBTkQgMy4gYXQgbGVhc3Qgb25lIG9mIHRoZSBwcm9qZWN0J3MgdmFsaWRhdG9ycyBzdXBwb3J0cwotCQkJICogaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gV2l0aG91dCAjMSwgdGhlIFZhbGlkYXRpb25CdWlsZGVyIGlzIG5ldmVyIGNhbGxlZCBiZWNhdXNlCi0JCQkgKiBpdCdzIG5vdCBjb25maWd1cmVkIG9uIHRoZSBwcm9qZWN0LiBXaXRob3V0ICMyLCB0aGUgVmFsaWRhdGlvbkJ1aWxkZXIgd2lsbCBub3QgYmUKLQkJCSAqIGNhbGxlZCBiZWNhdXNlIGF1dG8tYnVpbGRpbmcgaXMgdHVybmVkIG9mZi4gV2l0aG91dCAjMywgdGhlIFZhbGlkYXRpb25CdWlsZGVyIHdpbGwgYmUKLQkJCSAqIGNhbGxlZCwgYnV0IHRoZXJlJ3Mgbm8gcG9pbnQgYmVjYXVzZSBubyB2YWxpZGF0b3JzIGNhbiBydW4uCi0JCQkgCi0JCQlyZXR1cm4gY2FuQXV0b1ZhbGlkYXRlQnV0dG9uQmVFbmFibGVkKHByb2plY3QsIGlzR2xvYmFsQXV0b0J1aWxkT24pOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJWYWxpZGF0b3JNYW5hZ2VyLmNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZCgiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBJZiB0aGUgdXNlcidzIHNldHRpbmcgY2FuJ3QgYmUgcmV0cmlldmVkLCByZXR1cm4gdGhlIGRlZmF1bHQKLQkJCXJldHVybiBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5nZXRBdXRvVmFsaWRhdGVEZWZhdWx0KCk7Ci0JCX0qLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQXV0b1ZhbGlkYXRlQnV0dG9uQmVFbmFibGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChwcm9qZWN0LCBpc0dsb2JhbEF1dG9CdWlsZEVuYWJsZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKi8KLQlwdWJsaWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnModHJ1ZSk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldCh2bWRzKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIEVtcHR5U2V0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKiAKLQkgKiBHaXZlbiBhIGNoZWNrZWQgbGlzdCBvZiBlbmFibGVkIHZhbGlkYXRvcnMsIHJldHVybiBhIHNldCBvZiB0aGUgb25lcyB3aGljaCBhcmUgY29uZmlndXJlZCBvbgotCSAqIHRoZSBwcm9qZWN0IGFuZCwgaWYgZ2V0SW5jcmVtZW50YWwgaXMgdHJ1ZSwgd2hpY2ggYWxzbyBydW4gaW5jcmVtZW50YWxseS4KLQkgKi8KLQlwdWJsaWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRQcm9qZWN0Q29uZmlndXJlZFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCwgT2JqZWN0W10gZW5hYmxlZFZhbCwgCi0JCQlib29sZWFuIGdldEluY3JlbWVudGFsKSB7Ci0JCWlmICgocHJvamVjdCA9PSBudWxsKSB8fCAoZW5hYmxlZFZhbCA9PSBudWxsKSB8fCAoZW5hYmxlZFZhbC5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJfQotCi0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gdmFsID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW5hYmxlZFZhbC5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBlbmFibGVkVmFsW2ldOwotCQkJaWYgKCF2bWQuaXNDb25maWd1cmVkT25Qcm9qZWN0KHByb2plY3QpKWNvbnRpbnVlOwotCi0JCQlpZiAoIWdldEluY3JlbWVudGFsIHx8IHZtZC5pc0luY3JlbWVudGFsKCkpdmFsLmFkZCh2bWQpOwotCQl9Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmNyZW1lbnRhbFZhbGlkYXRvcnMoT2JqZWN0W10gZW5hYmxlZFZhbCkgewotCQlpZiAoKGVuYWJsZWRWYWwgPT0gbnVsbCkgfHwgKGVuYWJsZWRWYWwubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuYWJsZWRWYWwubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgZW5hYmxlZFZhbFtpXTsKLQotCQkJaWYgKHZtZC5pc0luY3JlbWVudGFsKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqLwotCXByb3RlY3RlZCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldEVuYWJsZWRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IG51bGw7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJaWYoIXByanAudXNlR2xvYmFsUHJlZmVyZW5jZSgpKSAKLQkJCSAgIHZtZHMgPSBwcmpwLmdldEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCQllbHNlCi0JCQkgICB2bWRzID0gZ2V0U3RhdGVPZlByb2plY3RMZXZlbFZhbGlkYXRvcnNGcm9tR2xvYmFsKHByanApOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQodm1kcyk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBFbXB0eVNldDsKLQkJfQotCX0KLQotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRTdGF0ZU9mUHJvamVjdExldmVsVmFsaWRhdG9yc0Zyb21HbG9iYWwoUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlMaXN0PFZhbGlkYXRvck1ldGFEYXRhPiBlbmFibGVkR2xvYmFsVmFsaWRhdG9yc0ZvclByb2plY3QgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQlHbG9iYWxDb25maWd1cmF0aW9uIGdmID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJTGlzdDxTdHJpbmc+IGFsbFByb2plY3RWYWxpZGF0b3IgPSBnZXRBbGxWYWxpZGF0b3JVbmlxdWVOYW1lcyhwcmpwLmdldFZhbGlkYXRvcnMoKSk7Ci0JCWZvcihWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBnZi5nZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCkpIHsKLQkJCWlmKGFsbFByb2plY3RWYWxpZGF0b3IuY29udGFpbnModm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSkpIHsKLQkJCQllbmFibGVkR2xvYmFsVmFsaWRhdG9yc0ZvclByb2plY3QuYWRkKHZtZCk7Ci0JCQl9Ci0JICAgfQotCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pIGVuYWJsZWRHbG9iYWxWYWxpZGF0b3JzRm9yUHJvamVjdC50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtlbmFibGVkR2xvYmFsVmFsaWRhdG9yc0ZvclByb2plY3Quc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGdldEFsbFZhbGlkYXRvclVuaXF1ZU5hbWVzKFZhbGlkYXRvck1ldGFEYXRhW10gbWV0YURhdGEpIHsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvcihWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBtZXRhRGF0YSkgewotCQkJbmFtZXMuYWRkKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JCi0KLQlwcm90ZWN0ZWQgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gcHJqcC5nZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQodm1kcyk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBFbXB0eVNldDsKLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gcHJqcC5nZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldCh2bWRzKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIEVtcHR5U2V0OwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgdXNlIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBVcGRhdGUgdGhlIHRhc2sgbGlzdCBiYXNlZCBvbiB3aGljaAotCSAqIHZhbGlkYXRvcnMgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBieSB0aGUgdmFsaWRhdGlvbgotCSAqIGZyYW1ld29yayBVSSBjbGFzc2VzLiBSZW1vdmUgdGhlIG1lc3NhZ2VzIGJlbG9uZ2luZyB0byBkaXNhYmxlZCB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRhc2tMaXN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBwcmpwLmdldERpc2FibGVkVmFsaWRhdG9ycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdm1kc1tpXTsKLQkJCQkvLyBGb3IgdmFsaWRhdG9ycyB3aG8gYXJlbid0IGdvaW5nIHRvIHJ1biwgY2xlYXIgdGhlaXIgbWVzc2FnZXMgZnJvbSB0aGUgdGFzayBsaXN0LgotCQkJCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBlbnRyaWVzIGJlY2F1c2UgZWFjaCBWYWxpZGF0b3IgbXVzdCBiZSB1bmlxdWUuCi0JCQkJLy8gVGhlIHVuaXF1ZW5lc3Mgb2YgZWFjaCBWYWxpZGF0b3IgaXMgY2hlY2tlZCBieSB0aGUgcGx1Z2luIHJlZ2lzdHJ5LgotCQkJCVdvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHByb2plY3QsIHZtZC5nZXRWYWxpZGF0b3JOYW1lcygpLCBudWxsKTsKLQkJCX0KLQkJCSAvL01lc3NhZ2UgTGltaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBmcmFtZXdvcmsgLSBXVFAxLjVNNQotCQkJLyppZiAocHJqcC5udW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCkgPiAwKSB7Ci0JCQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuY2hlY2tNZXNzYWdlTGltaXQocHJvamVjdCwgZmFsc2UpOyAvLyBEbyBub3QgcmVtb3ZlCi0JCQkJLy8gdGhlIGV4Y2VlZGVkCi0JCQkJLy8gbWVzc2FnZTsgb25seQotCQkJCS8vIFZhbGlkYXRpb25PcGVyYXRpb24KLQkJCQkvLyBzaG91bGQgZG8gdGhhdAotCQkJCS8vIGJlY2F1c2UgaXQncwotCQkJCS8vIGFib3V0IHRvIHJ1bgotCQkJCS8vIHZhbGlkYXRpb24uIElmCi0JCQkJLy8gdGhlIGxpbWl0IGlzCi0JCQkJLy8gaW5jcmVhc2VkLAotCQkJCS8vIG1lc3NhZ2VzIG1heQotCQkJCS8vIHN0aWxsIGJlCi0JCQkJLy8gbWlzc2luZywgc28KLQkJCQkvLyBkb24ndCByZW1vdmUgdGhlCi0JCQkJLy8gIm1lc3NhZ2VzIG1heSBiZQotCQkJCS8vIG1pc3NpbmciCi0JCQkJLy8gbWVzc2FnZS4KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQ2FuJ3QgcnVuIHZhbGlkYXRpb24sIHNvIHJlbW92ZSB0aGUgImV4Y2VlZGVkIiBtZXNzYWdlCi0JCQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZUxpbWl0RXhjZWVkZWQocHJvamVjdCk7Ci0JCQl9Ki8KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BdXRvVmFsaWRhdGVCdXR0b25CZUVuYWJsZWQoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc0dsb2JhbEF1dG9CdWlsZE9uKSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJYm9vbGVhbiBpbmNyZW1lbnRhbFZhbEVuYWJsZWQgPSAocHJqcC5udW1iZXJPZkVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKSA+IDApOwotCQkJcmV0dXJuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChwcm9qZWN0LCBpc0dsb2JhbEF1dG9CdWlsZE9uLCBpbmNyZW1lbnRhbFZhbEVuYWJsZWQpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BdXRvVmFsaWRhdGVCdXR0b25CZUVuYWJsZWQoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc0dsb2JhbEF1dG9CdWlsZE9uLCBib29sZWFuIGluY3JlbWVudGFsVmFsRW5hYmxlZCkgewotCQlib29sZWFuIGRvZXNQcm9qZWN0U3VwcG9ydEF1dG9WYWxpZGF0ZSA9IGRvZXNQcm9qZWN0U3VwcG9ydEJ1aWxkVmFsaWRhdGlvbihwcm9qZWN0KTsKLQkJcmV0dXJuIChkb2VzUHJvamVjdFN1cHBvcnRBdXRvVmFsaWRhdGUgJiYgaXNHbG9iYWxBdXRvQnVpbGRPbiAmJiBpbmNyZW1lbnRhbFZhbEVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllZCBieSB0aGUgU3RyaW5nIGlzIGNvbmZpZ3VyZWQgb24gdGhlIElQcm9qZWN0IGFuZAotCSAqIGVuYWJsZWQgb24gdGhlIElQcm9qZWN0LiBPdGhlcndpc2UgcmV0dXJuIGZhbHNlOwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsaWRhdG9yTmFtZSkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXJldHVybiBwcmpwLmlzRW5hYmxlZCh2YWxpZGF0b3JOYW1lKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4gUmV0dXJuIHRydWUgaWYgdGhlIFZhbGlkYXRvck1ldGFEYXRhIGlzCi0JICogICAgICAgICAgICAgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcmV0dXJuIHByanAuaXNFbmFibGVkKHZtZCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlyZXR1cm4gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmlzQ29uZmlndXJlZE9uUHJvamVjdCh2bWQsIHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2xvYmFsIGF1dG8tYnVpbGQgc2V0dGluZyBpcyB0dXJuZWQgb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzQXV0b0J1aWxkaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVuYWJsZWQgdmFsaWRhdG9ycyBvbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IG51bWJlclByb2plY3RFbmFibGVkVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlyZXR1cm4gcHJqcC5udW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2UgVmFsaWRhdGlvbkZyYW1ld29yay5zdXNwZW5kVmFsaWRhdGlvbihwcm9qZWN0LCBzdXNwZW5kKSBkaXJlY3RseS4KLQkgKiBAc2VlIFZhbGlkYXRpb25GcmFtZXdvcmsjc3VzcGVuZFZhbGlkYXRpb24oSVByb2plY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZFZhbGlkYXRpb24oSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBzdXNwZW5kKSB7Ci0JCVZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLnN1c3BlbmRWYWxpZGF0aW9uKHByb2plY3QsIHN1c3BlbmQpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5zdXNwZW5kQWxsVmFsaWRhdGlvbihzdXNwZW5kKSBkaXJlY3RseS4KLQkgKiBAc2VlIFZhbGlkYXRpb25GcmFtZXdvcmsjc3VzcGVuZEFsbFZhbGlkYXRpb24oYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXNwZW5kQWxsVmFsaWRhdGlvbihib29sZWFuIHN1c3BlbmQpIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuc3VzcGVuZEFsbFZhbGlkYXRpb24oc3VzcGVuZCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmlzU3VzcGVuZGVkKCkgZGlyZWN0bHkuCi0JICogQHNlZSBWYWxpZGF0aW9uRnJhbWV3b3JrI2lzU3VzcGVuZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmlzU3VzcGVuZGVkKHByb2plY3QpIGRpcmVjdGx5LgotCSAqIEBzZWUgVmFsaWRhdGlvbkZyYW1ld29yayNpc1N1c3BlbmRlZChJUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5pc1N1c3BlbmRlZChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2UgVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuaXNQcm9qZWN0U3VzcGVuZGVkKHByb2plY3QpIGRpcmVjdGx5LgotCSAqIEBzZWUgVmFsaWRhdGlvbkZyYW1ld29yayNpc1Byb2plY3RTdXNwZW5kZWQoSVByb2plY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0U3VzcGVuZGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmlzUHJvamVjdFN1c3BlbmRlZChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqIAotCSAqIEdpdmVuIGEgbGlzdCBvZiB2YWxpZGF0b3JzJyBwbHVnaW4gaWRzLCBtYWtlIHRob3NlIHZhbGlkYXRvcnMgZW5hYmxlZCBmb3IgdGhpcyBwcm9qZWN0LiBBbGwKLQkgKiBvdGhlcnMsIGRpc2FibGUgZm9yIHRoaXMgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0LCBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZtZHNTZXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IG51bGw7Ci0JCQlpZiAodm1kc1NldCA9PSBudWxsKSB7Ci0JCQkJdm1kcyA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJdm1kcyA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVt2bWRzU2V0LnNpemUoKV07Ci0JCQkJdm1kc1NldC50b0FycmF5KHZtZHMpOwotCQkJfQotCi0JCQlwcmpwLnNldEVuYWJsZWRWYWxpZGF0b3JzKHZtZHMpOwotCi0JCQl1cGRhdGVUYXNrTGlzdChwcm9qZWN0KTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlc291cmNlVXRpbENsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCV9yZXNvdXJjZVV0aWxDbGFzcyA9IGNsYXp6OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciB1c2UgYnkgYmF0Y2ggRUpCIGRlcGxveSBvbmx5LiBPbmx5IGluIGJhdGNoIG1vZGUgaXMgYW4gaW5maW5pdGUgbnVtYmVyIG9mCi0JICogbWVzc2FnZXMgYWxsb3dlZC4KLQkgKiAKLQkgKiBFbmFibGUgYSBwcm9qZWN0IHRvIGhhdmUgYW4gaW5maW5pdGUgbnVtYmVyIG9mIG1lc3NhZ2VzLgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9NZXNzYWdlTGltaXQoSVByb2plY3QgcHJvamVjdCkgey8qCi0JCXNldE1lc3NhZ2VMaW1pdChwcm9qZWN0LCBXb3JrYmVuY2hSZXBvcnRlci5OT19NRVNTQUdFX0xJTUlUKTsKLQkqL30KLQotCS8qKgotCSAqIFRoaXMgbWVzc2FnZSBpcyBmb3IgdXNlIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBJZiB0aGUgIm1heCBtZXNzYWdlcyB3ZXJlIHJlcG9ydGVkIgotCSAqIElNYXJrZXIgZXhpc3RzLCByZXR1cm4gaXQuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcml2YXRlIElNYXJrZXJbXSBnZXRMaW1pdE1lc3NhZ2UoSVByb2plY3QgcHJvamVjdCkgewotCQlJTWFya2VyW10gZXhjZWVkZWRNZXNzYWdlID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBXb3JrYmVuY2hSZXBvcnRlci5nZXRVbmlxdWVJZChnZXRNZXNzYWdlTGltaXRPd25lcigpKSk7Ci0JCWlmICgoZXhjZWVkZWRNZXNzYWdlICE9IG51bGwpICYmIChleGNlZWRlZE1lc3NhZ2UubGVuZ3RoICE9IDApKSB7Ci0JCQlyZXR1cm4gZXhjZWVkZWRNZXNzYWdlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0vLwkvKioKLS8vCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBJTWFya2VyIGlzIGEgImxpbWl0IHdhcyBleGNlZWRlZCIgbWVzc2FnZSwgZmFsc2Ugb3RoZXJ3aXNlLgotLy8JICovCi0vLwlwcml2YXRlIGJvb2xlYW4gaXNMaW1pdE1lc3NhZ2UoSU1hcmtlciBtYXJrZXIpIHsKLS8vCQlpZiAobWFya2VyID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIFRhc2tMaXN0VXRpbGl0eS5pc093bmVyKG1hcmtlciwgV29ya2JlbmNoUmVwb3J0ZXIuZ2V0VW5pcXVlSWQoZ2V0TWVzc2FnZUxpbWl0T3duZXIoKSkpOwotLy8JfQotCi0vLwkvKioKLS8vCSAqIFJldHVybiBhbGwgb2YgdGhlIElNYXJrZXJzIG9uIHRoZSBJUHJvamVjdCBleGNsdWRpbmcgdGhlICJsaW1pdCB3YXMgZXhjZWVkZWQiIG1lc3NhZ2UuIElmCi0vLwkgKiB0aGVyZSBhcmUgbm8gbWFya2VycywgcmV0dXJuIG51bGwuCi0vLwkgKi8KLS8vCXByaXZhdGUgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrc1dpdGhvdXRMaW1pdE1lc3NhZ2UoSVByb2plY3QgcHJvamVjdCkgewotLy8JCUlNYXJrZXJbXSBhbGxUYXNrcyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTKTsKLS8vCQlpZiAoKGFsbFRhc2tzID09IG51bGwpIHx8IChhbGxUYXNrcy5sZW5ndGggPT0gMCkpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8KLS8vCQkvLyBEb24ndCBjaGVjayBpZiB0aGUgbGltaXQgbWVzc2FnZSBleGlzdHMgYmVjYXVzZQotLy8JCS8vIGFueSBpbnRlcmFjdGlvbiB3aXRoIG1hcmtlcnMgaXMgY29zdGx5LiBTaW5jZSB0aGUKLS8vCQkvLyBpbnRlcmFjdGlvbiBoYXMgdG8gYmUgZG9uZSBhdCBsZWFzdCBvbmNlLCBtYWtlIHRoYXQKLS8vCQkvLyBzaW5nbGUgb2NjYXNpb24gaW4gdGhlIGZvciBsb29wIGJlbG93LgotLy8JCUlNYXJrZXJbXSB2YWxpZGF0b3JNZXNzYWdlcyA9IG5ldyBJTWFya2VyW2FsbFRhc2tzLmxlbmd0aF07Ci0vLwkJaW50IGNvdW50ID0gMDsgLy8gaG93IG1hbnkgbWFya2VycyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHJlc3VsdCBhcnJheT8KLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFRhc2tzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCUlNYXJrZXIgbWFya2VyID0gYWxsVGFza3NbaV07Ci0vLwkJCWlmIChpc0xpbWl0TWVzc2FnZShtYXJrZXIpKSB7Ci0vLwkJCQljb250aW51ZTsKLS8vCQkJfQotLy8JCQl2YWxpZGF0b3JNZXNzYWdlc1tjb3VudCsrXSA9IG1hcmtlcjsKLS8vCQl9Ci0vLwotLy8JCUlNYXJrZXJbXSByZXN1bHQgPSBuZXcgSU1hcmtlcltjb3VudF07Ci0vLwkJU3lzdGVtLmFycmF5Y29weSh2YWxpZGF0b3JNZXNzYWdlcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIFJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcwotCSAqIHJlbW92ZWQsIGZhbHNlIGlmIHRoZSBtZXNzYWdlIGRpZG4ndCBleGlzdC4KLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBzaG91bGQgYmUgbm90IGJlIHVzZWQgYW55bW9yZSBhcyBNZXNzYWdlIExpbWl0IGlzIHJlbW92ZWQgZnJvbQotCSAqIHRoZSBmcmFtZXdvcmsgLSBXVFAxLjVNNQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZU1lc3NhZ2VMaW1pdEV4Y2VlZGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSU1hcmtlcltdIGV4Y2VlZGVkTWVzc2FnZSA9IGdldExpbWl0TWVzc2FnZShwcm9qZWN0KTsKLQkJaWYgKGV4Y2VlZGVkTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5kZWxldGVNYXJrZXJzKGV4Y2VlZGVkTWVzc2FnZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGxhc3QgdmFsaWRhdGlvbiBvcGVyYXRpb24gdGVybWluYXRlZCBkdWUgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzCi0JICogaGF2aW5nIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YXNWYWxpZGF0aW9uVGVybWluYXRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNYXJrZXJbXSBleGNlZWRlZE1lc3NhZ2UgPSBnZXRMaW1pdE1lc3NhZ2UocHJvamVjdCk7Ci0JCXJldHVybiAoZXhjZWVkZWRNZXNzYWdlICE9IG51bGwpOyAvLyBWYWxpZGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGlmIHRoZSBtZXNzYWdlIGV4aXN0cy4KLQl9Ci0KLQlwcml2YXRlIENsYXNzIGdldE1lc3NhZ2VMaW1pdE93bmVyKCkgewotCQlpZiAoX21lc3NhZ2VMaW1pdE93bmVyID09IG51bGwpIHsKLQkJCV9tZXNzYWdlTGltaXRPd25lciA9IGdldENsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIF9tZXNzYWdlTGltaXRPd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBvd25lciBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggb3ducyB2YWxpZGF0aW9uIGZyYW1ld29yayBzdGF0dXMKLQkgKiBtZXNzYWdlcy4KLQkgKiAKLQkgKiBPTkxZIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzaG91bGQgdXNlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJuYWxPd25lcihTdHJpbmcgb3duZXIpIHsKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgX2ludGVybmFsT3duZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgaW50ZXJuYWxPd25lciA9IF9pbnRlcm5hbE93bmVyc1tpXTsKLQkJCWlmIChvd25lci5lcXVhbHMoaW50ZXJuYWxPd25lcikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBjbGFzcyB0byB0aGUgbGlzdCBvZiBvd25lcnMgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4gT05MWSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsKLQkgKiBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIChpdCBpcyB1c2VkIGZvciBtZXNzYWdlcyBvd25lZCBieSBmcmFtZXdvcmsgY2xhc3NlcyBvciBjbGFzc2VzIHVzZWQgYnkKLQkgKiB0aGUgVFZUIHBsdWdpbi4pCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW50ZXJuYWxPd25lcihDbGFzcyBjbGF6eikgewotCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nW10gdGVtcEludGVybmFsT3duZXJzID0gbmV3IFN0cmluZ1tfaW50ZXJuYWxPd25lcnMubGVuZ3RoICsgMV07Ci0JCWlmIChfaW50ZXJuYWxPd25lcnMubGVuZ3RoID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShfaW50ZXJuYWxPd25lcnMsIDAsIHRlbXBJbnRlcm5hbE93bmVycywgMCwgX2ludGVybmFsT3duZXJzLmxlbmd0aCk7Ci0JCX0KLQkJdGVtcEludGVybmFsT3duZXJzW19pbnRlcm5hbE93bmVycy5sZW5ndGhdID0gV29ya2JlbmNoUmVwb3J0ZXIuZ2V0VW5pcXVlSWQoY2xhenopOwotCi0JCV9pbnRlcm5hbE93bmVycyA9IHRlbXBJbnRlcm5hbE93bmVyczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2FjaGVNZXNzYWdlKElWYWxpZGF0b3JKb2IgdmFsaWRhdG9yLCBNZXNzYWdlSW5mbyBpbmZvKXsKLQkJTGlzdDxNZXNzYWdlSW5mbz4gbGlzdCA9IF92YWxpZGF0b3JNc2dzLmdldCh2YWxpZGF0b3IpOwotCQlpZiggbGlzdCA9PSBudWxsICl7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxNZXNzYWdlSW5mbz4oKTsKLQkJCV92YWxpZGF0b3JNc2dzLnB1dCh2YWxpZGF0b3IsIGxpc3QpOwotCQl9Ci0JCWxpc3QuYWRkKGluZm8pOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxNZXNzYWdlSW5mbz4gZ2V0TWVzc2FnZXMoSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IpewotCQlMaXN0PE1lc3NhZ2VJbmZvPiBsaXN0ID0gX3ZhbGlkYXRvck1zZ3MuZ2V0KHZhbGlkYXRvcik7Ci0JCWlmKCBsaXN0ID09IG51bGwgKWxpc3QgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VJbmZvPigpOwkJCi0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhck1lc3NhZ2VzKElWYWxpZGF0b3JKb2IgdmFsaWRhdG9yKXsKLQkJTGlzdDxNZXNzYWdlSW5mbz4gbGlzdCA9IF92YWxpZGF0b3JNc2dzLmdldCh2YWxpZGF0b3IpOwotCQlpZiggbGlzdCAhPSBudWxsICl7Ci0JCQlsaXN0LmNsZWFyKCk7Ci0JCX0KLQkJX3ZhbGlkYXRvck1zZ3MucmVtb3ZlKCB2YWxpZGF0b3IgKTsKLQl9Ci0KLQkKLQlwdWJsaWMgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRQcm9ibGVtVmFsaWRhdG9ycygpIHsKLQkJcmV0dXJuIF9wcm9ibGVtVmFsaWRhdG9yczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGRkZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvclN1YnNldE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkZpbHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlZ2lzdHJ5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLQotLyoqCi0gKiBSdW4gc29tZSB2YWxpZGF0b3JzIG9uIGEgZ2l2ZW4gSVByb2plY3QuIEFueSB2YWxpZGF0b3JzIHdoaWNoIGNhbm5vdCBiZSBsb2FkZWQgb3Igd2hpY2ggYXJlIG5vdAotICogcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoaXMgdHlwZSBvZiBwcm9qZWN0IHdpbGwgYmUgaWdub3JlZC4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uT3BlcmF0aW9uIHsKLQkvLyBCeSBkZWZhdWx0LCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBubyBkZWZhdWx0IGZhbGxiYWNrIGV4dGVuc2lvbgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfREVGQVVMVEVYVEVOU0lPTiA9IG51bGw7IAotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9wZXJhdGlvbiB0aGF0IHJ1bnMgYSBmdWxsIHZhbGlkYXRpb24gb24gdGhlIG5hbWVkIHZhbGlkYXRvcnMgZWl0aGVyIGlmIHZhbGlkYXRpb24KLQkgKiBuZWVkcyB0byAoQHNlZSBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oSVByb2plY3QpKSBvciBpZiA8Y29kZT5mb3JjZTwvY29kZT4gaXMgdHJ1ZS4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBmb3JjZSwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBvcGVyYXRpb24gdGhhdCBydW5zIGEgZnVsbCB2YWxpZGF0aW9uIG9uIHRoZSBuYW1lZCB2YWxpZGF0b3JzIHVzaW5nIHRoZQotCSAqIDxjb2RlPnJ1bGVHcm91cDwvY29kZT4gcGFzcy4gVXNlIHRoaXMgY29uc3RydWN0b3Igb25seSBpZiB5b3Ugd2FudCB0byBydW4gYSB2YWxpZGF0b3IgdGhhdAotCSAqIHN1cHBvcnRzIHRoZSB0d28gcGFzc2VzOiBGQVNUIGFuZCBGVUxMLgotCSAqIAotCSAqIElmIGZvcmNlIGlzIHRydWUsIHZhbGlkYXRpb24gaXMgcnVuIHdoZXRoZXIgb3Igbm90IGl0IG5lZWRzIHRvLgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVdvcmtiZW5jaENvbnRleHQgYVdvcmtlbmNoQ29udGV4dCwgYm9vbGVhbiBmb3JjZSwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LCBhV29ya2VuY2hDb250ZXh0LCBudWxsLCBudWxsLCBydWxlR3JvdXAsIGZvcmNlLCBhc3luYyk7Ci0JfQotCQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9wZXJhdGlvbiB0aGF0IHJ1bnMgYSBmdWxsIHZhbGlkYXRpb24gb24gdGhlIG5hbWVkIHZhbGlkYXRvcnMgdXNpbmcgdGhlCi0JICogPGNvZGU+cnVsZUdyb3VwPC9jb2RlPiBwYXNzLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBvbmx5IGlmIHlvdSB3YW50IHRvIHJ1biBhIHZhbGlkYXRvciB0aGF0Ci0JICogc3VwcG9ydHMgdGhlIHR3byBwYXNzZXM6IEZBU1QgYW5kIEZVTEwuCi0JICogCi0JICogSWYgZm9yY2UgaXMgdHJ1ZSwgdmFsaWRhdGlvbiBpcyBydW4gd2hldGhlciBvciBub3QgaXQgbmVlZHMgdG8uCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGUgYmFja2dyb3VuZAotCSAqIHZhbGlkYXRpb24gdGhyZWFkLCBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGZvcmNlLCBpbnQgcnVsZUdyb3VwLCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIG51bGwsIG51bGwsIHJ1bGVHcm91cCwgZm9yY2UsIGFzeW5jKTsKLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMocHJvamVjdCkpOwotCQlzZXRGaWxlRGVsdGFzKEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBmYWxzZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gb3BlcmF0aW9uIHRoYXQgcnVucyBhIGZ1bGwgdmFsaWRhdGlvbiBvbiB0aGUgbmFtZWQgdmFsaWRhdG9ycyB1c2luZyB0aGUKLQkgKiA8Y29kZT5ydWxlR3JvdXA8L2NvZGU+IHBhc3MuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIG9ubHkgaWYgeW91IHdhbnQgdG8gcnVuIGEgdmFsaWRhdG9yIHRoYXQKLQkgKiBzdXBwb3J0cyB0aGUgdHdvIHBhc3NlczogRkFTVCBhbmQgRlVMTC4KLQkgKiAKLQkgKiBJZiBmb3JjZSBpcyB0cnVlLCB2YWxpZGF0aW9uIGlzIHJ1biB3aGV0aGVyIG9yIG5vdCBpdCBuZWVkcyB0by4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgbnVsbCwgbnVsbCwgcnVsZUdyb3VwLCBmb3JjZSwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBmaWxlRXh0ZW5zaW9uIHBhcmFtZXRlciBtdXN0IGJlICIuWCIsIHdoZXJlIFggaXMgdGhlIGV4dGVuc2lvbi4gRG8gbm90IHR5cGUgIiouWCIgb3IgIlgiCi0JICogKGkuZS4sIHdpdGhvdXQgdGhlIGRvdCkuIFRoZSBwYXJhbWV0ZXIgY291bGQgYWxzbyBiZSB0aGUgZmlsZSBuYW1lLCBlLmcuICJmb28uWCIuCi0JICogCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBpbnZva2VyIHdpc2hlcyB0byBmb3JjZSB2YWxpZGF0aW9uIG9uIGNlcnRhaW4KLQkgKiByZXNvdXJjZXMsIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHVzZXIgdG8gc2F2ZSB0aGVpciBjaGFuZ2VzLgotCSAqIAotCSAqIEFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCBmb3IgdGhlCi0JICogZmlsZUV4dGVuc2lvbiBvbiB0aGUgZ2l2ZW4gSVByb2plY3QuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGUgYmFja2dyb3VuZAotCSAqIHZhbGlkYXRpb24gdGhyZWFkLCBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmlsZUV4dGVuc2lvbiwgT2JqZWN0W10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBhc3luYykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRoaXMocHJvamVjdCwgZmlsZUV4dGVuc2lvbiwgREVGQVVMVF9ERUZBVUxURVhURU5TSU9OLCBjaGFuZ2VkUmVzb3VyY2VzLCBhc3luYyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGZpbGVFeHRlbnNpb24gcGFyYW1ldGVyIG11c3QgYmUgIi5YIiwgd2hlcmUgWCBpcyB0aGUgZXh0ZW5zaW9uLiBEbyBub3QgdHlwZSAiKi5YIiBvciAiWCIKLQkgKiAoaS5lLiwgd2l0aG91dCB0aGUgZG90KS4gVGhlIHBhcmFtZXRlciBjb3VsZCBhbHNvIGJlIHRoZSBmaWxlIG5hbWUsIGUuZy4gImZvby5YIi4KLQkgKiAKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGludm9rZXIgd2lzaGVzIHRvIGZvcmNlIHZhbGlkYXRpb24gb24gY2VydGFpbgotCSAqIHJlc291cmNlcywgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgdXNlciB0byBzYXZlIHRoZWlyIGNoYW5nZXMuCi0JICogCi0JICogSWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiBmaWxlcyBuYW1lZCAiLlgiLCB0aGVuIHVzZSB0aGUgdmFsaWRhdG9ycyBjb25maWd1cmVkCi0JICogb24gdmFsaWRhdG9ycyBuYW1lZCAiLlkiLCB3aGVyZSBkZWZhdWx0RXh0ZW5zaW9uIGlkZW50aWZpZXMgdGhlIGZhbGxiYWNrIGV4dGVuc2lvbiB0byB1c2UuCi0JICogZGVmYXVsdEV4dGVuc2lvbiBmb2xsb3dzIHRoZSBzYW1lIHN5bnRheCBhcyBmaWxlRXh0ZW5zaW9uLgotCSAqIAotCSAqIEFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCBmb3IgdGhlCi0JICogZmlsZUV4dGVuc2lvbiBvciBkZWZhdWx0RXh0ZW5zaW9uIG9uIHRoZSBnaXZlbiBJUHJvamVjdC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWxlRXh0ZW5zaW9uLCBTdHJpbmcgZGVmYXVsdEV4dGVuc2lvbiwgT2JqZWN0W10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBhc3luYykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3QsIHNob3VsZEZvcmNlKGNoYW5nZWRSZXNvdXJjZXMpLCBhc3luYyk7Ci0KLQkJLy8gZm9yY2UgdGhlIHJlc291cmNlcyB0byBiZSBmaWx0ZXJlZCBpbiBldmVuIGlmIHRoZSB2YWxpZGF0b3IgZG9lc24ndCBub3JtYWxseSB0YWtlIHRoZW0/Ci0JCWJvb2xlYW4gZmlsdGVySW4gPSBmYWxzZTsgCi0JCQotCQkvLyBhIGxpc3Qgb2YgdmFsaWRhdG9ycyB3aGljaCBhcmUgY29uZmlndXJlZCB0byBydW4gb24gZmlsZXMgd2l0aCB0aGF0IGV4dGVuc2lvbi4KLQkJLy8gQSB2YWxpZGF0b3Igd2lsbCBiZSBpbiB0aGUgbGlzdCB3aGV0aGVyIGl0IGhhcyBiZWVuIGVuYWJsZWQgb3IgZGlzYWJsZWQgYnkgdGhlIHVzZXIuCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yc0ZvckV4dGVuc2lvbihwcm9qZWN0LCBmaWxlRXh0ZW5zaW9uKTsKLQkJaWYgKChkZWZhdWx0RXh0ZW5zaW9uICE9IG51bGwpICYmICgodm1kcyA9PSBudWxsKSB8fCAodm1kcy5sZW5ndGggPT0gMCkpKSB7Ci0JCQlmaWx0ZXJJbiA9IHRydWU7Ci0JCQl2bWRzID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JzRm9yRXh0ZW5zaW9uKHByb2plY3QsIGRlZmF1bHRFeHRlbnNpb24pOwotCQl9Ci0KLQkJaWYgKCh2bWRzID09IG51bGwpIHx8ICh2bWRzLmxlbmd0aCA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldCh2bWRzKSk7Ci0KLQkJLy8gY29uc3RydWN0IGFuIGFycmF5IG9mIElGaWxlRGVsdGFbXSB0byB3cmFwIHRoZSBPYmplY3RbXTsKLQkJLy8gb25lIElGaWxlRGVsdGEgZm9yIGVhY2ggT2JqZWN0IGluIHRoZSBhcnJheQotCQlzZXRGaWxlRGVsdGFzKEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBmaWx0ZXJJbikpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgcHJvdmlkZWQgZm9yIHRoZSB2YWxpZGF0aW9uIGFzeW5jIHRlc3RpbmcsIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLQkgKiBjYWxsZWQgb3V0c2lkZSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JICogCi0JICogUnVuIHZhbGlkYXRpb24gb24gdGhlIGNoYW5nZWQgcmVzb3VyY2VzIHdpdGggdGhlIGdpdmVuIHZhbGlkYXRvcnMuIEFsbCByZXNvdXJjZXMgbXVzdCBiZSBmcm9tCi0JICogdGhlIHNhbWUgcHJvamVjdDsgaWYgdGhleSdyZSBub3QsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQWxsIHZhbGlkYXRvcnMKLQkgKiBtdXN0IGJlIGFibGUgdG8gcnVuIG9uIHRoZSByZXNvdXJjZXMnIHByb2plY3Q7IGlmIG5vdCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUKLQkgKiB0aHJvd24uIElmIHRoZSB2bWRzIGFyZSBlaXRoZXIgZW1wdHkgb3IgbnVsbCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhlcHRpb24gd2lsbCBiZSB0aHJvd24uIElmCi0JICogdGhlIHByb2plY3QgaXMgY2xvc2VkIG9yIGRvZXNuJ3QgZXhpc3QgdGhlbiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0JICogCi0JICogVGhlIGlmaWxlRGVsdGFUeXBlIGlzIG9uZSBvZiB0aGUgSUZpbGVEZWx0YSBjb25zdGFudHM6IEFEREVELCBDSEFOR0VELCBvciBERUxFVEVELgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzLCBJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBpbnQgaWZpbGVEZWx0YVR5cGUsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkvLyBIYXZlIHRvIGhhdmUgdGhlIElQcm9qZWN0IGFzIGEgcGFyYW1ldGVyIGJlY2F1c2UgVmFsaWRhdGlvbk9wZXJhdGlvbiBuZWVkcyB0aGUgSVByb2plY3QsCi0JCS8vIGFuZCB0aGUgc3VwZXIoLi4pCi0JCS8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGluIHRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkLgotCQlzdXBlcihwcm9qZWN0LCBmb3JjZSwgYXN5bmMpOwotCi0JCWlmICgodm1kcyA9PSBudWxsKSB8fCAodm1kcy5sZW5ndGggPT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19CQURWTUQpKTsKLQkJfQotCi0JCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX09QRU5QUkosIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJfQotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19FWElTVFBSSiwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0KLQkJaWYgKChjaGFuZ2VkUmVzb3VyY2VzICE9IG51bGwpICYmIChjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aCA+IDApKSB7Ci0JCQlTZXQ8SVByb2plY3Q+IHRlbXBTZXQgPSBuZXcgSGFzaFNldDxJUHJvamVjdD4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHAgPSBjaGFuZ2VkUmVzb3VyY2VzW2ldLmdldFByb2plY3QoKTsKLQkJCQlpZiAoIXAuaXNPcGVuKCkpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX09QRU5QUkosIG5ldyBTdHJpbmdbXXtwLmdldE5hbWUoKX0pKTsKLQkJCQl9Ci0JCQkJaWYgKCFwLmV4aXN0cygpKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19FWElTVFBSSiwgbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpfSkpOwotCQkJCX0KLQkJCQl0ZW1wU2V0LmFkZChwcm9qZWN0KTsKLQkJCX0KLQotCQkJaWYgKCF0ZW1wU2V0LmNvbnRhaW5zKHByb2plY3QpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0JBRFBSSiwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSkpOwotCQkJfQotCQkJaWYgKHRlbXBTZXQuc2l6ZSgpICE9IDEpIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCUl0ZXJhdG9yPElQcm9qZWN0PiBpdGVyYXRvciA9IHRlbXBTZXQuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlQcm9qZWN0IHAgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnVmZmVyLmFwcGVuZChwLmdldE5hbWUoKSk7Ci0JCQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfTVVMVElQUkosIG5ldyBTdHJpbmdbXXtidWZmZXIudG9TdHJpbmcoKX0pKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdm1kc1tpXTsKLQkJCWlmICghVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmlzQ29uZmlndXJlZE9uUHJvamVjdCh2bWQsIHByb2plY3QpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0JBRFZBTCwgbmV3IFN0cmluZ1tde3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCBwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJCX0KLQkJfQotCi0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQodm1kcykpOwotCQlzZXRGaWxlRGVsdGFzKEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBpZmlsZURlbHRhVHlwZSkpOyAvLyBjb25zdHJ1Y3QKLQkJLy8gYW4gYXJyYXkgb2YgSUZpbGVEZWx0YVtdIHRvIHdyYXAgdGhlIElSZXNvdXJjZVtdOyBvbmUgSUZpbGVEZWx0YSBmb3IgZWFjaCBJUmVzb3VyY2UgaW4gdGhlIGFycmF5Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gYXJyYXkgb2YgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWVzIG9mIHZhbGlkYXRvcnMsIGNyZWF0ZSB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIHRvCi0JICogYmUgcnVuLiBUaGUgYXJyYXkgaXMgbm90IGNoZWNrZWQgZm9yIGR1cGxpY2F0ZXMgb3IgZm9yIGludmFsaWQgdmFsaWRhdG9ycyAoaS5lLiwgYSB2YWxpZGF0b3IKLQkgKiBvZiB0aGF0IGNsYXNzIHR5cGUgaXMgbm90IGxvYWRlZCwgb3IgdGhlIHZhbGlkYXRvciBpcyBsb2FkZWQgYnV0IGNhbm5vdCBydW4gYWdhaW5zdCB0aGlzIHR5cGUKLQkgKiBvZiBJUHJvamVjdC4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9ycyhTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZW5hYmxlZCA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPigpOwotCQlmb3IgKFN0cmluZyBuYW1lIDogdmFsaWRhdG9yTmFtZXMpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShuYW1lKTsKLQkJCWlmICh2bWQgPT0gbnVsbCkgewotCQkJCS8vIE5vIHZhbGlkYXRvciwgd2l0aCB0aGF0IHBsdWctaW4gaWQsIGNhbiBiZSBydW4gb24gdGhhdCBwcm9qZWN0LgotCQkJCS8vIEVpdGhlciB0aGUgdmFsaWRhdG9yIGlzbid0IGluc3RhbGxlZCwgb3IgdGhlIElQcm9qZWN0IHBhc3NlZCBpbgotCQkJCS8vIGRvZXNuJ3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IG5hdHVyZS4KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5hbWUpOwotCQkJfQotCQkJZW5hYmxlZC5hZGQodm1kKTsKLQkJfQotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBzZXRGb3JjZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsd2F5c1J1bihib29sZWFuIGZvcmNlKSB7Ci0JCXNldEZvcmNlKGZvcmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvV29ya2JlbmNoQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhMzZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvV29ya2JlbmNoQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZWdpc3RyeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcmVnaXN0cmF0aW9uIG9mIHN5bWJvbGljIG1vZGVsIG5hbWVzLCBhbmQgYWxzbyBwcm92aWRlcyB0aGUgbWVjaGFuaXNtIGZvcgotICogcmVnaXN0ZXJpbmcgdGhlIGxvYWQgbW9kZWwgbWV0aG9kIHdoaWNoIGxvYWRzIGEgc3BlY2lmaWMgdHlwZSBvZiBNT0YgbW9kZWwsIGFzIGlkZW50aWZpZWQgYnkgdGhlCi0gKiBzeW1ib2xpYyBtb2RlbCBuYW1lLgotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQ29udGV4dCBpbXBsZW1lbnRzIElXb3JrYmVuY2hDb250ZXh0IHsKLQlwcml2YXRlIElQcm9qZWN0IAlfcHJvamVjdDsKLQlwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsTWV0aG9kPiAJX21vZGVsUmVnaXN0cnk7Ci0JcHJpdmF0ZSBpbnQgCQlfcnVsZUdyb3VwID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVDsKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25GaWxlVVJJczsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1BST0pFQ1RfRklMRVMgPSAiZ2V0QWxsRmlsZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0ZJTEUgPSAiZ2V0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9ICJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfT1dORVIgPSAib3duZXIiOyAgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdvcmtiZW5jaENvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCV9tb2RlbFJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE1ldGhvZD4oKTsKLQotCQlyZWdpc3Rlck1vZGVsKElSdWxlR3JvdXAuUEFTU19MRVZFTCwgImxvYWRSdWxlR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy90aGUgZm9sbG93aW5nIHdpbGwgcmVnaXN0ZXIgdGhlIGhlbHBlcidzIHN5bWJvbGljIG1ldGhvZHMKLQkgICAgQ2xhc3MgW10gYXJncyA9IG5ldyBDbGFzc1sxXSA7Ci0JICAgIGFyZ3NbMF0gPSBTdHJpbmcuY2xhc3MgOyAgLy8gYSBzdHJpbmcgYXJndW1lbnQgZGVub3RpbmcgYSBzcGVjaWZpYyBKU1AuCi0JCXJlZ2lzdGVyTW9kZWwoR0VUX0ZJTEUsICJnZXRGaWxlIiwgYXJncyk7Ly8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKEdFVF9QUk9KRUNUX0ZJTEVTLCAiZ2V0RmlsZXMiLCBhcmdzKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogV2hlbiB0aGUgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgc28gdGhhdCB0aGUgSVdvcmtiZW5jaENvbnRleHQgY2FuCi0JICogY2xlYW4gdXAgYW55IHJlc291cmNlcyBpdCBhbGxvY2F0ZWQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uLgotCSAqIAotCSAqIElmIHRoZSBjbGVhbnVwIGlzIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgc3VidGFzayBtZXNzYWdlcyBzaG91bGQgYmUgc2VudCB0byB0aGUgSVJlcG9ydGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gRGVmYXVsdDogbm90aGluZyB0byBjbGVhbiB1cAotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIElQcm9qZWN0IGlzIGNsb3NpbmcsIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCBuZWVkcyB0byBiZSBkb25lLiBXaGVuIHRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkLCBpZiB0aGUgaGVscGVyIGhhcyBjYWNoZWQgYW55IHJlc291cmNlcyBmcm9tIHRoZSBJUHJvamVjdCwgaXQgc2hvdWxkIHJlbGVhc2UgdGhvc2UKLQkgKiByZXNvdXJjZXMuIElmIHlvdSBkbyBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGluIHlvdXIgaGVscGVyLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhCi0JICogbm8tb3AuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2luZygpIHsKLQkJY2xvc2luZyhnZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIElQcm9qZWN0IGlzIGNsb3NpbmcsIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCBuZWVkcyB0byBiZSBkb25lLiBXaGVuIHRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkLCBpZiB0aGUgaGVscGVyIGhhcyBjYWNoZWQgYW55IHJlc291cmNlcyBmcm9tIHRoZSBJUHJvamVjdCwgaXQgc2hvdWxkIHJlbGVhc2UgdGhvc2UKLQkgKiByZXNvdXJjZXMuIElmIHlvdSBkbyBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGluIHlvdXIgaGVscGVyLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhCi0JICogbm8tb3AuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgT3ZlcnJpZGUgY2xvc2luZygpIGluc3RlYWQsIGFuZCB1c2UgZ2V0UHJvamVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2luZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIElQcm9qZWN0IGlzIGJlaW5nIGRlbGV0ZWQsIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCBuZWVkcyB0byBiZSBkb25lLiBXaGVuIHRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkLCBpZiB0aGUgaGVscGVyIGhhcyBjYWNoZWQgYW55IHJlc291cmNlcyBmcm9tIHRoZSBJUHJvamVjdCwgaXQgc2hvdWxkIHJlbGVhc2UKLQkgKiB0aG9zZSByZXNvdXJjZXMuIElmIHlvdSBkbyBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGluIHlvdXIgaGVscGVyLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZQotCSAqIGEgbm8tb3AuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRpbmcoKSB7Ci0JCWRlbGV0aW5nKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogV2hlbiB0aGUgSVByb2plY3QgaXMgYmVpbmcgZGVsZXRlZCwgcGVyZm9ybSBhbnkgY2xlYW51cCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuIFdoZW4gdGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQsIGlmIHRoZSBoZWxwZXIgaGFzIGNhY2hlZCBhbnkgcmVzb3VyY2VzIGZyb20gdGhlIElQcm9qZWN0LCBpdCBzaG91bGQgcmVsZWFzZQotCSAqIHRob3NlIHJlc291cmNlcy4gSWYgeW91IGRvIG5vdCBhbGxvY2F0ZSByZXNvdXJjZXMgaW4geW91ciBoZWxwZXIsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0JICogYSBuby1vcC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBPdmVycmlkZSBkZWxldGluZygpIGluc3RlYWQsIGFuZCB1c2UgZ2V0UHJvamVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUGF0aCBvZiBhIHJlc291cmNlLCByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLiBJZiB0aGUgSVJlc291cmNlIGlzIG5vdCBhIG1lbWJlcgotCSAqIG9mIHRoZSBjb250YWluZXIsIHJldHVybiBudWxsLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZnVsIGZvciBpbXBsZW1lbnRvcnMgb2YgdGhpcyBjbGFzczsKLQkgKiBzcGVjaWZpY2FsbHksIGluIHRoZWlyIGdldFBvcnRhYmxlTmFtZSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKFN0cmluZyBmdWxsUGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJaWYgKChmdWxsUGF0aCA9PSBudWxsKSB8fCAoY29udGFpbmVyID09IG51bGwpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQYXRoIHJlbFBhdGggPSBnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgobmV3IFBhdGgoZnVsbFBhdGgpLCBjb250YWluZXIpOwotCQlpZiAocmVsUGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIHJlbFBhdGgudG9TdHJpbmcoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVBhdGggb2YgYSByZXNvdXJjZSwgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci4gSWYgdGhlIElSZXNvdXJjZSBpcyBub3QgYSBtZW1iZXIKLQkgKiBvZiB0aGUgY29udGFpbmVyLCByZXR1cm4gbnVsbC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50b3JzIG9mIHRoaXMgY2xhc3M7Ci0JICogc3BlY2lmaWNhbGx5LCBpbiB0aGVpciBnZXRQb3J0YWJsZU5hbWUgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKElSZXNvdXJjZSByZXNvdXJjZSwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJaWYgKChyZXNvdXJjZSA9PSBudWxsKSB8fCAoY29udGFpbmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlSZXNvdXJjZSBmb3VuZFJlc291cmNlID0gbnVsbDsKLQkJSVBhdGggcmVsUGF0aCA9IGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBjb250YWluZXIpOwotCQlpZiAocmVsUGF0aCAhPSBudWxsKSB7Ci0JCQkvLyBpZiByZWxQYXRoIGlzIG51bGwsIHRoZSByZXNvdXJjZSBpcyBub3QgYSBkaXJlY3QgbWVtYmVyIG9mIHRoZSBjb250YWluZXIKLQkJCXRyeSB7Ci0JCQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkgeyAvLyBmaW5kTWVtYmVyIHdvbid0IHdvcmsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWZvdW5kUmVzb3VyY2UgPSBjb250YWluZXIuZ2V0RmlsZShyZWxQYXRoKTsKLQkJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJCWZvdW5kUmVzb3VyY2UgPSBjb250YWluZXIuZ2V0Rm9sZGVyKHJlbFBhdGgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm91bmRSZXNvdXJjZSA9IGNvbnRhaW5lci5maW5kTWVtYmVyKHJlbFBhdGgsIHRydWUpOyAvLyB0cnVlIG1lYW5zIGluY2x1ZGUKLQkJCQkJLy8gcGhhbnRvbSByZXNvdXJjZXMKLQkJCQkJaWYgKChmb3VuZFJlc291cmNlICE9IG51bGwpICYmICFmb3VuZFJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCQlmb3VuZFJlc291cmNlID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZm91bmRSZXNvdXJjZSA9IG51bGw7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm91bmRSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGZpbGUgaGFzIGJlZW4gZm91bmQKLQkJaW50IG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9IGNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhtYXRjaGluZ0ZpcnN0U2VnbWVudHMpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElQYXRoLCBpZiB0aGUgSVBhdGggaXMgYWJzb2x1dGUsIGFuZCBpcyBhIHBhcnQgb2YgdGhlIElDb250YWluZXIsIHJldHVybiBhbiBJUGF0aAotCSAqIHdoaWNoIGlzIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIuIElmIHRoZSBJUGF0aCBpcyBub3QgcGFydCBvZiB0aGUgSUNvbnRhaW5lciwgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgoSVBhdGggcGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJaWYgKChwYXRoID09IG51bGwpIHx8IChjb250YWluZXIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkvLyBJcyB0aGUgcGF0aCBwYXJ0IG9mIHRoZSBJQ29udGFpbmVyPwotCQkJaW50IG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9IHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpKTsKLQkJCWlmICgobWF0Y2hpbmdGaXJzdFNlZ21lbnRzID4gMCkgJiYgKG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9PSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKS5zZWdtZW50Q291bnQoKSkpIHsKLQkJCQkvLyBwYXJ0IG9mIHRoZSBJQ29udGFpbmVyCi0JCQkJcmV0dXJuIHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhtYXRjaGluZ0ZpcnN0U2VnbWVudHMpOwotCQkJfQotCQkJLy8gbm90IHBhcnQgb2YgdGhlIElDb250YWluZXIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIHBhdGggaXMgcmVsYXRpdmUKLQkJLy8gSXMgdGhlIHBhdGggcGFydCBvZiB0aGUgSUNvbnRhaW5lcj8KLQkJLy9UT0RPIGRvbid0IGhhdmUgdGltZSB0byBpbXBsZW1lbnQgdGhpcyBub3csIGJ1dCBzaG91bGQgaW4gZnV0dXJlLiAtIFJ1dGgKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSU1lc3NhZ2UncyB0YXJnZXQgb2JqZWN0LCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGUgb2JqZWN0LCBzbyB0aGF0IHRoZQotCSAqIHVzZXIgY2FuIGxvY2F0ZSBpdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrYmVuY2hGaWxlRGVsdGEpIHsKLQkJCVdvcmtiZW5jaEZpbGVEZWx0YSB3ZmQgPSAoV29ya2JlbmNoRmlsZURlbHRhKSBvYmplY3Q7Ci0JCQlpZiAod2ZkLmdldFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCS8vIHJlc291cmNlIHdpbGwgYmUgbnVsbCBpZiBXb3JrYmVuY2hGaWxlRGVsdGEgd2FzIGNvbnN0cnVjdGVkIGZyb20gYW4gT2JqZWN0Ci0JCQkJLy8gaW5zdGVhZCBvZiBhbiBJUmVzb3VyY2UKLQkJCQlyZXR1cm4gd2ZkLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIE9iamVjdCwgaWYgdGhlIG9iamVjdCBoYXMgYSBjb3JyZXNwb25kaW5nIElGaWxlIGluIHRoZSB3b3JrYmVuY2gsIHJldHVybiB0aGUgSUZpbGUuCi0JICogT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLiBJbiBlY2xpcHNlLCBpbiBvcmRlciB0byBhZGQgb3IgcmVtb3ZlIGEgdGFzawotCSAqIGxpc3QgZW50cnksIHRoZSBJUmVzb3VyY2UsIHRvIHdoaWNoIHRoZSBlbnRyeSBhcHBsaWVzLCBtdXN0IGJlIGlkZW50aWZpZWQuIFRoZSBJUmVwb3J0ZXIKLQkgKiBpbnRlcmZhY2UgcGFzc2VzIGluIGFuIE9iamVjdCBpbiB0aGVzZSBtZXRob2RzOgotCSAqIAotCSAqIGFkZFZhbGlkYXRpb25NZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKSAvLyBPYmplY3QgaXMgYSBwYXJ0IG9mIElNZXNzYWdlCi0JICogCi0JICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KSwKLQkgKiAKLQkgKiBUaHVzLCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgbmVlZHMgdG8ga25vdyBob3csIGdpdmVuIHRoZSBPYmplY3QsIHdoaWNoIElGaWxlIHRoYXQgdGhlIE9iamVjdAotCSAqIHJlcHJlc2VudHMgaW4gdGhlIHdvcmtiZW5jaCwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBhZGQgdGhlIHRhc2sgbGlzdCBlbnRyeS4KLQkgKiAKLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwsIHRoZW4gdGhlIFdvcmtiZW5jaFJlcG9ydGVyIHdpbGwgYWRkIHRoZSBtZXNzYWdlIHRvIHRoZSBJUHJvamVjdAotCSAqIGluc3RlYWQgb2YgYW4gSUZpbGUuCi0JICogIAotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtiZW5jaEZpbGVEZWx0YSkgewotCQkJLy8gcmVzb3VyY2UgbWF5IGJlIG51bGwgaWYgV29ya2JlbmNoRmlsZURlbHRhIHdhcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIE9iamVjdCBpbnN0ZWFkIG9mCi0JCQkvLyBhbiBJUmVzb3VyY2UKLQkJCXJlcyA9ICgoV29ya2JlbmNoRmlsZURlbHRhKSBvYmopLmdldFJlc291cmNlKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0JCX0KLQotCQlpZiAoKHJlcyA9PSBudWxsKSB8fCAoIXJlcy5leGlzdHMoKSkpIHsKLQkJCXJldHVybiBnZXRGaWxlKG9iaik7Ci0JCX0KLQotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBJUHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gRUpCTmF0dXJlUnVudGltZSwgcmV0dXJuIHRoZSBJSmF2YVByb2plY3Qgd2hpY2gKLQkgKiByZXByZXNlbnRzIGl0LgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotLy8JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJTWVzc2FnZSdzIHRhcmdldCBvYmplY3QsIHJldHVybiB0aGUgbGluZSBudW1iZXIsIG9mIHRoZSBJRmlsZSwgd2hpY2ggdGhlIHRhcmdldAotCSAqIG9iamVjdCByZXByZXNlbnRzLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIG9yIGlmIGFjY2VzcyB0byBsaW5lIG51bWJlcnMgaXMgbm90IHBvc3NpYmxlLAotCSAqIHJldHVybiAiMCIuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oT2JqZWN0IG9iamVjdCkgewotCQlJUmVzb3VyY2VVdGlsIHV0aWwgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldFJlc291cmNlVXRpbCgpOwotCQlpZiAodXRpbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSU1lc3NhZ2UuTElORU5PX1VOU0VUOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdXRpbC5nZXRMaW5lTm8ob2JqZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIEdpdmVuIGFuIElNZXNzYWdlJ3MgdGFyZ2V0IG9iamVjdCwgcmV0dXJuIHRoZSBsaW5lIG51bWJlciwgb2YgdGhlIElGaWxlLCB3aGljaCB0aGUgdGFyZ2V0Ci0JICogb2JqZWN0IHJlcHJlc2VudHMsIGlmIHBvc3NpYmxlLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIG9yIGlmIGFjY2VzcyB0byBsaW5lIG51bWJlcnMgaXMgbm90Ci0JICogcG9zc2libGUsIHJldHVybiBhIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGxvY2F0aW9uLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZXRoZXIgb3Igbm90IHRoZSBJUmVzb3VyY2UgaXMgYW4gSUZpbGUsIElGb2xkZXIsIG9yIElQcm9qZWN0LgotCSAqIExpbmUgbnVtYmVycyBhcmUgdmFsaWQgb25seSBmb3IgSUZpbGUgdHlwZXM7IGlmIHRoZSByZXNvdXJjZSBpcyBub3QgYW4gSUZpbGUsIHRoZW4gYSB0ZXh0Ci0JICogZGVzY3JpcHRpb24gb2YgdGhlIGxvY2F0aW9uIG11c3QgYmUgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZSByZXMgPSBnZXRSZXNvdXJjZShvYmplY3QpOwotCQlpZiAoKHJlcyA9PSBudWxsKSB8fCAhKHJlcyBpbnN0YW5jZW9mIElGaWxlKSkKLQkJCS8vIHJldHVybiBhIHRleHQgZGVzY3JpcHRpb24KLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbihvYmplY3QpOwotCQkvLyBkZWZhdWx0IHRvIGEgbGluZSBudW1iZXIsIGlmIGl0J3MgYXZhaWxhYmxlLiBFbHNlLCB1c2UgYSB0ZXh0IGRlc2NyaXB0aW9uLgotCQlpbnQgbGluZU51bWJlciA9IGdldExpbmVObyhvYmplY3QpOwotCQlpZiAobGluZU51bWJlciA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbihvYmplY3QpOwotCQl9Ci0JCS8vIHJldHVybiB0aGUgbGluZSBudW1iZXIKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGxpbmVOdW1iZXIpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgbmFtZSBvZiBhIGxvYWQgbWV0aG9kLCBhbmQgdGhlIHR5cGVzIG9mIHBhcmFtZXRlcnMgaXQgdGFrZXMgKHRoaXMgbWV0aG9kIGlzIGFsd2F5cwotCSAqIGNhbGxlZCB3aXRoIG51bGwgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIpLCByZXR1cm4gdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCB3aGljaAotCSAqIHJlcHJlc2VudHMgdGhlIGxvYWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgZmluYWwgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJtVHlwZXMpIHsKLQkJTWV0aG9kIG0gPSBudWxsOwotCQl0cnkgewotCQkJbSA9IGdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIG07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQ29udGV4dC5nZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVByb2plY3Qgd2hpY2ggaXMgYWJvdXQgdG8gYmUgdmFsaWRhdGVkLiBFYWNoIElXb3JrYmVuY2hDb250ZXh0IGtub3dzIGhvdyB0bwotCSAqIHRyYXZlcnNlIGEgY2VydGFpbiB0eXBlIG9mIElQcm9qZWN0LCBmb3IgZXhhbXBsZSwgYW4gRUpCIHByb2plY3Qgb3IgYSB3ZWIgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkKLQkgIC8qKgotCSAgICogR2V0IHRoZSBJRmlsZSBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lLgotCSAgICogCi0JICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmV0cmlldmUuCi0JICAgKiBAcmV0dXJuIEFuIElGaWxlIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzcGVjaWZpZWQgb3IgbnVsbCBpZiBpdCBjYW4ndCBiZSByZXNvbHZlZC4KLQkgICAqLwotCSAgcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVuYW1lKQotCSAgewotCSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUgbmFtZSA9ICIgKyBmaWxlbmFtZSk7Ci0JICAgIElSZXNvdXJjZSByZXMgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihmaWxlbmFtZSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tIHJlc291cmNlcwotCSAgICBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIAotCSAgICB7Ci0JICAgICAgcmV0dXJuIChJRmlsZSkgcmVzOwotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUKLQkgICAqIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgotCSAgICogCi0JICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0JICAgKiBAcmV0dXJuIFRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIHJlbGV2YW50IGZvciB0aGUgdmFsaWRhdG9yIGNsYXNzIHNwZWNpZmllZC4KLQkgICAqLwotCSAgcHVibGljIENvbGxlY3Rpb248SUZpbGU+IGdldEZpbGVzKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpCi0JICB7Ci0JICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JICAgIExpc3Q8SUZpbGU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsKLQkgICAgZ2V0RmlsZXMoZmlsZXMsIHByb2plY3QsIHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JICAgIHJldHVybiBmaWxlczsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlCi0JICAgKiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4KLQkgICAqIAotCSAgICogQHBhcmFtIGZpbGVzIFRoZSBmaWxlcyByZWxldmFudCBmb3IgdGhlIGNsYXNzIG5hbWUuCi0JICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIGxvb2sgZm9yIGZpbGVzIGluLgotCSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBnZXRGaWxlcyhDb2xsZWN0aW9uPElGaWxlPiBmaWxlcywgSUNvbnRhaW5lciByZXNvdXJjZSwgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkKLQkgIHsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICBJUmVzb3VyY2UgW10gcmVzb3VyY2VBcnJheSA9IHJlc291cmNlLm1lbWJlcnMoZmFsc2UpOwotCSAgICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKQotCSAgICAgIHsgICAgICAgCi0JICAgICAgICBpZiAoVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNBcHBsaWNhYmxlVG8odmFsaWRhdG9yQ2xhc3NOYW1lLCByZXNvdXJjZUFycmF5W2ldKSkgCi0JICAgICAgICB7Ci0JICAgICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldIGluc3RhbmNlb2YgSUZpbGUpIAotCQkJCSAgZmlsZXMuYWRkKChJRmlsZSlyZXNvdXJjZUFycmF5W2ldKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCSAgICAgICAgIGdldEZpbGVzKGZpbGVzLChJQ29udGFpbmVyKXJlc291cmNlQXJyYXlbaV0sIHZhbGlkYXRvckNsYXNzTmFtZSkgOwotCSAgICAgIH0KLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JICB9Ci0JICAKLQotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdGhlIGZvbGRlcnMgKG9yIHByb2plY3QpIHdoaWNoIGNvbnRhaW4gdGhlIC5qYXZhIHNvdXJjZSBmaWxlcy4KLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyW10gZ2V0UHJvamVjdFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewotLy8JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIE5PX0NPTlRBSU5FUlM7Ci0vLwkJfQotLy8KLS8vCQlJSmF2YVByb2plY3QganAgPSBnZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLS8vCQlpZiAoanAgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gTk9fQ09OVEFJTkVSUzsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBnZXRQcm9qZWN0U291cmNlQ29udGFpbmVycyhqcCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvbGRlcnMgKG9yIHByb2plY3QpIHdoaWNoIGNvbnRhaW4gdGhlIC5qYXZhIHNvdXJjZSBmaWxlcy4KLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lcltdIGdldFByb2plY3RTb3VyY2VDb250YWluZXJzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotLy8JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotLy8KLS8vCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBudWxsOwotLy8JCXRyeSB7Ci0vLwkJCWNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOyAvLyB0cnVlIG1lYW5zIGlnbm9yZSB1bnJlc29sdmVkCi0vLwkJCS8vIChtaXNzaW5nKSB2YXJpYWJsZXMsIGluc3RlYWQgb2YKLS8vCQkJLy8gdGhyb3dpbmcgYW4gZXhjZXB0aW9uCi0vLwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykgewotLy8JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLS8vCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLS8vCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hDb250ZXh0OjpnZXRQcm9qZWN0U291cmNlQ29udGFpbmVycyhJSmF2YVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotLy8JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCi0vLwkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCi0vLwkJLy8gVHJhdmVyc2UgdGhlIGNsYXNzcGF0aCwgYW5kIGNhbGN1bGF0ZSBhIGxpc3Qgb2YganVzdCB0aGUKLS8vCQkvLyBJRm9sZGVycyBhbmQgSVByb2plY3RzIChpLmUuLCBJQ29udGFpbmVycykgd2hpY2ggY29udGFpbiBzb3VyY2UKLS8vCQlJQ29udGFpbmVyW10gaWNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lcltjbGFzc3BhdGgubGVuZ3RoXTsKLS8vCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLS8vCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwotLy8JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLS8vCQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLS8vCQkJCUlQYXRoIHJlbEVudHJ5UGF0aCA9IGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChlbnRyeVBhdGgsIHByb2plY3QpOwotLy8JCQkJaWYgKHJlbEVudHJ5UGF0aCA9PSBudWxsKSB7Ci0vLwkJCQkJLy8gY2xhc3NwYXRoIGVudHJ5IHJlZmVycyB0byBzb21ldGhpbmcgd2hpY2ggZG9lc24ndCBleGlzdAotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCUlSZXNvdXJjZSBvdXRwdXRSZXNvdXJjZSA9IHByb2plY3QuZmluZE1lbWJlcihyZWxFbnRyeVBhdGgpOwotLy8JCQkJaWYgKG91dHB1dFJlc291cmNlID09IG51bGwpIHsKLS8vCQkJCQkvLyBjbGFzc3BhdGggZW50cnkgcmVmZXJzIHRvIHNvbWV0aGluZyB3aGljaCBkb2Vzbid0IGV4aXN0Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJaWYgKG91dHB1dFJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotLy8JCQkJCWljb250YWluZXJzW3ZhbGlkQ291bnQrK10gPSAoSUNvbnRhaW5lcikgb3V0cHV0UmVzb3VyY2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vICBmb2xsb3dpbmcgbGluZSBjYXVzZXMgYSBDbGFzc0Nhc3RFeGNlcHRpb24sIHNvIGNvbnN0cnVjdCBhbiBhcnJheSBvZiBJQ29udGFpbmVycwotLy8JCS8vIGV4cGxpY2l0bHkKLS8vCQkvLwlyZXR1cm4gKElDb250YWluZXJbXSlpY29udGFpbmVycy50b0FycmF5KCk7Ci0vLwkJSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lclt2YWxpZENvdW50XTsKLS8vCQlTeXN0ZW0uYXJyYXljb3B5KGljb250YWluZXJzLCAwLCBjb250YWluZXJzLCAwLCB2YWxpZENvdW50KTsKLS8vCQlyZXR1cm4gY29udGFpbmVyczsKLS8vCX0KLQotCXB1YmxpYyBpbnQgZ2V0UnVsZUdyb3VwKCkgewotCQlyZXR1cm4gX3J1bGVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGVuIGJ5IEFXb3JrYmVuY2hIZWxwZXJzLCBpZiB0aGV5IHdpc2ggdG8gcGVyZm9ybSBzb21lCi0JICogaW5pdGlhbGl6YXRpb24gb25jZSB0aGUgSVByb2plY3QgaXMgc2V0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCi0JICogCi0JICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgSVdvcmtiZW5jaENvbnRleHQgZGVsZWdhdGVzIHRvIGFub3RoZXIgSVdvcmtiZW5jaENvbnRleHQsIHRoZW4gdGhhdAotCSAqIElXb3JrYmVuY2hDb250ZXh0J3Mgc2V0UHJvamVjdCgpIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGhlcmUuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIGluIGFuIElKYXZhUHJvamVjdCwgYW5kIGlmIGl0IGlzIGluIG9uZSBvZiB0aGUgc291cmNlCi0JICogZm9sZGVycyBpbiB0aGUgSUphdmFQcm9qZWN0LiBJZiB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXIgaGFwcGVucyB0byBiZSB0aGUgcHJvamVjdCdzCi0JICogb3V0cHV0IGZvbGRlciB0b28sIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuIElmIHJlcyBpcyBudWxsLCBvciBpcyBub3QgZm91bmQgaW4gb25lIG9mCi0JICogdGhlIHNvdXJjZSBjb250YWluZXJzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBmYWxzZS4KLQkgKi8KLS8vCXB1YmxpYyBib29sZWFuIGlzSW5KYXZhU291cmNlUGF0aChJUmVzb3VyY2UgcmVzKSB7Ci0vLwkJaWYgKHJlcyA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwotLy8JCUlDb250YWluZXJbXSBjb250YWluZXJzID0gZ2V0UHJvamVjdFNvdXJjZUNvbnRhaW5lcnMocmVzLmdldFByb2plY3QoKSk7Ci0vLwkJZm9yIChpbnQgYyA9IDA7IGMgPCBjb250YWluZXJzLmxlbmd0aDsgYysrKSB7Ci0vLwkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChyZXMsIGNvbnRhaW5lcnNbY10pOwotLy8JCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwpIHsKLS8vCQkJCS8vIGZpbGUgaGFzIGJlZW4gZm91bmQKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ltYm9saWMgbmFtZSBpcyByZWdpc3RlcmVkLCBhbmQgY2FuIGJlIGxvYWRlZCBieSBXb3JrYmVuY2hDb250ZXh0J3MKLQkgKiAibG9hZE1vZGVsIiBtZXRob2QuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBzZWUgdGhlIGNvbW1lbnQgYWJvdmUgV29ya2JlbmNoQ29udGV4dCdzCi0JICogInJlZ2lzdGVyTW9kZWwiIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlpZiAoc3ltYm9saWNOYW1lID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gX21vZGVsUmVnaXN0cnkuY29udGFpbnNLZXkoc3ltYm9saWNOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHN5bWJvbGljIG5hbWUsIGxvYWQgdGhlIE1PRiBtb2RlbCB3aGljaCBpcyBpZGVudGlmaWVkIGJ5IHRoYXQgbmFtZS4KLQkgKiAKLQkgKiBGb3Igc3VwcG9ydCBvZiBkeW5hbWljIHN5bWJvbGljIG5hbWVzLCBzdWNoIGFzIGZpbGUgbmFtZXMsIHJlYWQgdGhlIGNvbW1lbnQgYWJvdmUgdGhlCi0JICogcmVnaXN0ZXJNb2RlbCBtZXRob2QuCi0JICogCi0JICogQHNlZSByZWdpc3Rlck1vZGVsCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gbG9hZE1vZGVsKHN5bWJvbGljTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBzeW1ib2xpYyBuYW1lLCBsb2FkIHRoZSBNT0YgbW9kZWwgd2hpY2ggaXMgaWRlbnRpZmllZCBieSB0aGF0IG5hbWUuCi0JICogCi0JICogRm9yIHN1cHBvcnQgb2YgZHluYW1pYyBzeW1ib2xpYyBuYW1lcywgc3VjaCBhcyBmaWxlIG5hbWVzLCByZWFkIHRoZSBjb21tZW50IGFib3ZlIHRoZQotCSAqIHJlZ2lzdGVyTW9kZWwgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgcmVnaXN0ZXJNb2RlbAotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbG9hZGVyID0gX21vZGVsUmVnaXN0cnkuZ2V0KHN5bWJvbGljTmFtZSk7Ci0JCQlpZiAobG9hZGVyID09IG51bGwpcmV0dXJuIG51bGw7Ci0KLQkJCXJldHVybiBsb2FkZXIuaW52b2tlKHRoaXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGUpIHsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGxvYWRSdWxlR3JvdXAoKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlcihnZXRSdWxlR3JvdXAoKSk7IC8vIGhhdmUgdG8gd3JhcCB0aGUgaW50IGluIGFuIEludGVnZXIgYmVjYXVzZSBjYW4ndCBjYXN0Ci0JCS8vIGFuIGludCB0byBhbiBPYmplY3QKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYnkKLQkgKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWZvcmUgdGhlIElWYWxpZGF0b3IncyB2YWxpZGF0ZSBtZXRob2QgaXMgY2FsbGVkLCB0byBzZXQgdGhlIGdyb3VwIG9mCi0JICogcnVsZXMgd2hpY2ggdGhlIElWYWxpZGF0b3Igc2hvdWxkIGNoZWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bGVHcm91cChpbnQgcmcpIHsKLQkJX3J1bGVHcm91cCA9IHJnOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgbG9hZCBtZXRob2QgZm9yIGEgc3ltYm9saWMgbmFtZS4gQSBsb2FkIG1ldGhvZCBpcyBkZWZpbmVkIGFzIGEgbWV0aG9kIHdoaWNoIHRha2VzCi0JICogbm8gcGFyYW1ldGVycyBhbmQgcmV0dXJucyBhIFJlZk9iamVjdC4KLQkgKiAKLQkgKiBFdmVyeSBzdWJjbGFzcyBvZiBXb3JrYmVuY2hDb250ZXh0LCBmb3IgZXZlcnkgc3RhdGljIHR5cGUgb2Ygc3ltYm9saWMgbmFtZSB3aGljaCBpdCBzdXBwb3J0cywKLQkgKiBzaG91bGQgY2FsbCByZWdpc3Rlck1vZGVsLiBGb3IgSVdvcmtiZW5jaEhlbHBlcnMgd2hpY2ggc3VwcG9ydCBkeW5hbWljIHN5bWJvbGljIG5hbWVzLCBzdWNoCi0JICogYXMgZmlsZSBuYW1lcywgZWFjaCBJV29ya2JlbmNoQ29udGV4dCBzaG91bGQgb3ZlcnJpZGUgdGhlICJsb2FkTW9kZWwiIG1ldGhvZC4gVGhlaXIKLQkgKiAibG9hZE1vZGVsIiBzaG91bGQgZmlyc3QgY2FsbCB0aGlzIGNsYXNzJyAiaXNSZWdpc3RlcmVkIiBtZXRob2QgdG8gc2VlIGlmIHRoZXkncmUgZGVhbGluZwotCSAqIHdpdGggYSBzdGF0aWMgc3ltYm9saWMgbmFtZSwgb3IgYSBkeW5hbWljIG9uZS4gSWYgdGhlIHN5bWJvbGljIG5hbWUgaXMgcmVnaXN0ZXJlZCwgdGhlCi0JICogY2hpbGQncyAibG9hZE1vZGVsIiBtZXRob2Qgc2hvdWxkIGp1c3QgcmV0dXJuIHRoZSByZXN1bHQgb2YgV29ya2JlbmNoQ29udGV4dCdzICJsb2FkTW9kZWwiCi0JICogbWV0aG9kLiBPdGhlcndpc2UsIGl0IHNob3VsZCByZXR1cm4gdGhlIHJlc3VsdCBiYXNlZCBvbiBpdHMgb3duIHByb2Nlc3NpbmcuCi0JICogCi0JICogV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBsb2FkIG1ldGhvZCBpZGVudGlmaWVkIGJ5IGxvYWRNZXRob2ROYW1lIGlzIGxvY2F0ZWQgJiBzdG9yZWQKLQkgKiBmb3IgZnV0dXJlIHJldHJpZXZhbCBieSB0aGUgImxvYWRNb2RlbCIgbWV0aG9kLiBXaGVuIHRoZSBJVmFsaWRhdG9yIGNhbGxzICJsb2FkTW9kZWwiIHdpdGggYQotCSAqIHN5bWJvbGljIG5hbWUsIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Qgd2hpY2ggd2FzIGxvYWRlZCBieSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBhbmQKLQkgKiB0aGUgcmVzdWx0IChSZWZPYmplY3QpIHJldHVybmVkIGJ5IHRoYXQgbWV0aG9kIGlzIHJldHVybmVkIGJ5ICJsb2FkTW9kZWwiLgotCSAqIAotCSAqIHN5bWJvbGljTmFtZSBtdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcuIGxvYWRNZXRob2ROYW1lIG11c3Qgbm90IGJlIG51bGwgb3IgdGhlCi0JICogZW1wdHkgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZ2lzdGVyTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgU3RyaW5nIGxvYWRNZXRob2ROYW1lKSB7Ci0JCXJlZ2lzdGVyTW9kZWwoc3ltYm9saWNOYW1lLCBsb2FkTWV0aG9kTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBsb2FkIG1ldGhvZCBmb3IgYSBzeW1ib2xpYyBuYW1lLiBBIGxvYWQgbWV0aG9kIGlzIGRlZmluZWQgYXMgYSBtZXRob2Qgd2hpY2ggdGFrZXMKLQkgKiBubyBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGEgUmVmT2JqZWN0LgotCSAqIAotCSAqIEV2ZXJ5IHN1YmNsYXNzIG9mIFdvcmtiZW5jaENvbnRleHQsIGZvciBldmVyeSBzdGF0aWMgdHlwZSBvZiBzeW1ib2xpYyBuYW1lIHdoaWNoIGl0IHN1cHBvcnRzLAotCSAqIHNob3VsZCBjYWxsIHJlZ2lzdGVyTW9kZWwuIEZvciBJV29ya2JlbmNoSGVscGVycyB3aGljaCBzdXBwb3J0IGR5bmFtaWMgc3ltYm9saWMgbmFtZXMsIHN1Y2gKLQkgKiBhcyBmaWxlIG5hbWVzLCBlYWNoIElXb3JrYmVuY2hDb250ZXh0IHNob3VsZCBvdmVycmlkZSB0aGUgImxvYWRNb2RlbCIgbWV0aG9kLiBUaGVpcgotCSAqICJsb2FkTW9kZWwiIHNob3VsZCBmaXJzdCBjYWxsIHRoaXMgY2xhc3MnICJpc1JlZ2lzdGVyZWQiIG1ldGhvZCB0byBzZWUgaWYgdGhleSdyZSBkZWFsaW5nCi0JICogd2l0aCBhIHN0YXRpYyBzeW1ib2xpYyBuYW1lLCBvciBhIGR5bmFtaWMgb25lLiBJZiB0aGUgc3ltYm9saWMgbmFtZSBpcyByZWdpc3RlcmVkLCB0aGUKLQkgKiBjaGlsZCdzICJsb2FkTW9kZWwiIG1ldGhvZCBzaG91bGQganVzdCByZXR1cm4gdGhlIHJlc3VsdCBvZiBXb3JrYmVuY2hDb250ZXh0J3MgImxvYWRNb2RlbCIKLQkgKiBtZXRob2QuIE90aGVyd2lzZSwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVzdWx0IGJhc2VkIG9uIGl0cyBvd24gcHJvY2Vzc2luZy4KLQkgKiAKLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGxvYWQgbWV0aG9kIGlkZW50aWZpZWQgYnkgbG9hZE1ldGhvZE5hbWUgaXMgbG9jYXRlZCAmIHN0b3JlZAotCSAqIGZvciBmdXR1cmUgcmV0cmlldmFsIGJ5IHRoZSAibG9hZE1vZGVsIiBtZXRob2QuIFdoZW4gdGhlIElWYWxpZGF0b3IgY2FsbHMgImxvYWRNb2RlbCIgd2l0aCBhCi0JICogc3ltYm9saWMgbmFtZSwgdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCB3aGljaCB3YXMgbG9hZGVkIGJ5IHRoaXMgbWV0aG9kIGlzIGludm9rZWQsIGFuZAotCSAqIHRoZSByZXN1bHQgKFJlZk9iamVjdCkgcmV0dXJuZWQgYnkgdGhhdCBtZXRob2QgaXMgcmV0dXJuZWQgYnkgImxvYWRNb2RlbCIuCi0JICogCi0JICogc3ltYm9saWNOYW1lIG11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZy4gbG9hZE1ldGhvZE5hbWUgbXVzdCBub3QgYmUgbnVsbCBvciB0aGUKLQkgKiBlbXB0eSBzdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVnaXN0ZXJNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBTdHJpbmcgbG9hZE1ldGhvZE5hbWUsIENsYXNzW10gcGFybXMpIHsKLQkJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZChsb2FkTWV0aG9kTmFtZSwgcGFybXMpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIldvcmtiZW5jaENvbnRleHQtMDE6IGxvYWQgbWV0aG9kICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsb2FkTWV0aG9kTmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IChwYXJtcyAhPSBudWxsKSAmJiAoaSA8IHBhcm1zLmxlbmd0aCk7IGkrKykgewotCQkJCQlidWZmZXIuYXBwZW5kKHBhcm1zW2ldKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKSBtdXN0IGV4aXN0LiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbm5vdCBzdXBwb3J0IG1vZGVsICIgKyBzeW1ib2xpY05hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCVRyYWNpbmcubG9nKGJ1ZmZlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlfbW9kZWxSZWdpc3RyeS5wdXQoc3ltYm9saWNOYW1lLCBtZXRob2QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciBmdWxsIG9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24gaXMgcnVubmluZywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGZvciBldmVyeQotCSAqIElSZXNvdXJjZSB3aGljaCBpcyBmaWx0ZXJlZCBpbiBieSB0aGUgSVZhbGlkYXRvciwgc28gdGhhdCB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGNhbiByZWNlaXZlCi0JICogbm90aWZpY2F0aW9uIHRoYXQgb25lIG9mIHRoZSByZXNvdXJjZXMsIHdoaWNoIHZhbGlkYXRpb24gd2lsbCBydW4gb24sIGlzIGJlaW5nIGZpbHRlcmVkIGluLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vIGRlZmF1bHQ6IGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrLCB0byBpbml0aWFsaXplIHRoZSBJV29ya2JlbmNoQ29udGV4dCBzbyB0aGF0Ci0JICogaXQgY2FuIGdhdGhlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QuCi0JICogCi0JICogSWYgYW4gSVdvcmtiZW5jaENvbnRleHQgZGVsZWdhdGVzIHNvbWUgbW9kZWwgbG9hZGluZyB0byBhbm90aGVyIElXb3JrYmVuY2hDb250ZXh0LCB0aGlzIG1ldGhvZAotCSAqIHNob3VsZCBiZSBvdmVycmlkZW4gc28gdGhhdCB0aGUgZGVsZWdhdGVlIElXb3JrYmVuY2hDb250ZXh0IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIElQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJLy8gUHJvamVjdCB3aWxsIGJlIHNldCBiYWNrIHRvIG51bGwgb25jZSB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCBpcyBjb21wbGV0ZS4KLQkJCWluaXRpYWxpemUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgSVdvcmtiZW5jaENvbnRleHQgdGhhdCB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4gVGhlcmUgd2lsbCBiZQotCSAqIGNhbGxzIHRvIGNsb3NpbmcoSVByb2plY3QpIGFuZCBwb3NzaWJseSBkZWxldGluZyhJUHJvamVjdCkgZm9sbG93aW5nIHRoaXMgY2FsbCwgYnV0IHRoZQotCSAqIHJlc291cmNlcyBtYXkgYWxyZWFkeSBiZSBjbG9zZWQgYnkgdGhlIHRpbWUgdGhhdCB0aG9zZSBtZXRob2RzIGFyZSBjYWxsZWQsIHNvIEVWRVJZVEhJTkcKLQkgKiBzaG91bGQgYmUgY2xlYW5lZCB1cCBpbiB0aGlzIG1ldGhvZC4gVGhlIHBhcmFtZXRlciBwYXNzZWQgaW4gaXMgdGhlIHByb2plY3Qgd2hpY2ggaXMgYWJvdXQgdG8KLQkgKiBzaHV0IGRvd24uIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IElQcm9qZWN0IGluIHRoZSB3b3JrYmVuY2guIFRoZSBJUHJvamVjdAotCSAqIG1heSwgb3IgbWF5IG5vdCwgYmUgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQkvLyBEZWZhdWx0IGlzIHRvIGFzc3VtZSB0aGF0IG5vIHJlc291cmNlcyB3ZXJlIGFsbG9jYXRlZDsgdGhlcmVmb3JlLAotCQkvLyBubyBjbGVhbnVwIG5lZWRzIHRvIGJlIGRvbmUuCi0JCXNodXRkb3duKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBJV29ya2JlbmNoQ29udGV4dCB0aGF0IHRoZSBWYWxpZGF0aW9uIEZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLiBUaGVyZSB3aWxsIGJlCi0JICogY2FsbHMgdG8gY2xvc2luZyhJUHJvamVjdCkgYW5kIHBvc3NpYmx5IGRlbGV0aW5nKElQcm9qZWN0KSBmb2xsb3dpbmcgdGhpcyBjYWxsLCBidXQgdGhlCi0JICogcmVzb3VyY2VzIG1heSBhbHJlYWR5IGJlIGNsb3NlZCBieSB0aGUgdGltZSB0aGF0IHRob3NlIG1ldGhvZHMgYXJlIGNhbGxlZCwgc28gRVZFUllUSElORwotCSAqIHNob3VsZCBiZSBjbGVhbmVkIHVwIGluIHRoaXMgbWV0aG9kLiBUaGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyB0aGUgcHJvamVjdCB3aGljaCBpcyBhYm91dCB0bwotCSAqIHNodXQgZG93bi4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb25jZSBmb3IgZXZlcnkgSVByb2plY3QgaW4gdGhlIHdvcmtiZW5jaC4gVGhlIElQcm9qZWN0Ci0JICogbWF5LCBvciBtYXkgbm90LCBiZSBjbG9zZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgT3ZlcnJpZGUgc2h1dGRvd24oKSBpbnN0ZWFkLCBhbmQgdXNlIGdldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy8gRGVmYXVsdCBpcyB0byBhc3N1bWUgdGhhdCBubyByZXNvdXJjZXMgd2VyZSBhbGxvY2F0ZWQ7IHRoZXJlZm9yZSwKLQkJLy8gbm8gY2xlYW51cCBuZWVkcyB0byBiZSBkb25lLgotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRVUklzKCkgewotCQlTdHJpbmdbXSB1cmlzID0gbmV3IFN0cmluZ1t2YWxpZGF0aW9uRmlsZVVSSXMuc2l6ZSgpXTsKLQkJdmFsaWRhdGlvbkZpbGVVUklzLnRvQXJyYXkodXJpcyk7Ci0JCXJldHVybiB1cmlzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsaWRhdGlvbkZpbGVVUklzLgotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsaWRhdGlvbkZpbGVVUklzKCkgewotCQlyZXR1cm4gdmFsaWRhdGlvbkZpbGVVUklzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZGF0aW9uRmlsZVVSSXMgVGhlIHZhbGlkYXRpb25GaWxlVVJJcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbkZpbGVVUklzKExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uRmlsZVVSSXMpIHsKLQkJdGhpcy52YWxpZGF0aW9uRmlsZVVSSXMgPSB2YWxpZGF0aW9uRmlsZVVSSXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaEZpbGVEZWx0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaEZpbGVEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTUzZTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Xb3JrYmVuY2hGaWxlRGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5GaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotCi0KLS8qKgotICogRWNsaXBzZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBGaWxlRGVsdGEgd2hpY2ggYWxzbyBjYWNoZXMgdGhlIElSZXNvdXJjZSB3aGljaCBpcyBhc3NvY2lhdGVkCi0gKiB3aXRoIHRoZSBGaWxlRGVsdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hGaWxlRGVsdGEgZXh0ZW5kcyBGaWxlRGVsdGEgewotCXByaXZhdGUgSVJlc291cmNlIF9yZXNvdXJjZTsKLQlwcml2YXRlIE9iamVjdCBfY2hhbmdlZFJlc291cmNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRSA9ICJGSUxFIE5BTUU6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQSA9ICIgIERFTFRBOiAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFID0gIiAgUkVTT1VSQ0U6ICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUID0gIiAgT0JKRUNUOiAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgV29ya2JlbmNoRmlsZURlbHRhKFN0cmluZyBhRmlsZU5hbWUsIGludCBhRmlsZURlbHRhLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIoYUZpbGVOYW1lLCBhRmlsZURlbHRhKTsKLQkJc2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQlzZXRPYmplY3QocmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBXb3JrYmVuY2hGaWxlRGVsdGEoT2JqZWN0IGNoYW5nZWRSZXNvdXJjZSkgewotCQlzdXBlcihudWxsLCBJRmlsZURlbHRhLkNIQU5HRUQpOwotCQlzZXRPYmplY3QoY2hhbmdlZFJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gX3Jlc291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlfcmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY2hhbmdlZCByZXNvdXJjZSBpcyBub3QgYW4gSVJlc291cmNlIChlLmcuLCBhIFJlZk9iamVjdCksIHRoZW4gdGhlIGdldEZpbGVOYW1lIG1ldGhvZAotCSAqIHdpbGwgcmV0dXJuIG51bGwsIGdldFJlc291cmNlIHdpbGwgcmV0dXJuIG51bGwsIGFuZCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgb2JqZWN0LiBJZgotCSAqIHRoZSBjaGFuZ2VkUmVzb3VyY2UgaXMgYW4gSVJlc291cmNlLCB0aGVuIGJvdGggdGhpcyBtZXRob2QgYW5kIHRoZSBnZXRSZXNvdXJjZSBtZXRob2Qgd2lsbAotCSAqIHJldHVybiB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBfY2hhbmdlZFJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG8pIHsKLQkJX2NoYW5nZWRSZXNvdXJjZSA9IG87Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoRklMRV9OQU1FKTsKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRGaWxlTmFtZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoREVMVEEpOwotCQlidWZmZXIuYXBwZW5kKGdldERlbHRhVHlwZSgpKTsKLQkJYnVmZmVyLmFwcGVuZChSRVNPVVJDRSk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZ2V0UmVzb3VyY2UoKSkpOwotCQlidWZmZXIuYXBwZW5kKE9CSkVDVCk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZ2V0T2JqZWN0KCkpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Xb3JrYmVuY2hSZXBvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaFJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTYyZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaFJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqIElWYWxpZGF0b3IgaW5zdGFuY2VzIHdpbGwgaW50ZXJhY3Qgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBidXQgc2hvdWxkIG5ldmVyIGNhc3QgdGhhdAotICogSVJlcG9ydGVyIGluc3RhbmNlIHRvIFdvcmtiZW5jaFJlcG9ydGVyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgdXNlciBhbmQgdGhlIElWYWxpZGF0b3IgaW4gdGhlIGVjbGlwc2Ugd29ya2JlbmNoCi0gKiBlbnZpcm9ubWVudC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhbiBJV29ya3NwYWNlUnVubmFibGUgb3IgSVJ1bm5hYmxlV2l0aFByb2dyZXNzLiBNYW55Ci0gKiByZXNvdXJjZSBkZWx0YXMgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgotICogPHA+Ci0gKiBPbmx5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBtYXkgaW5zdGFudGlhdGUgb3IgYWx0ZXIgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gKi8KLQotcHVibGljIGNsYXNzIFdvcmtiZW5jaFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPQ0FUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19NRVNTQUdFX0xJTUlUID0gLTE7Ci0KLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0OwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfbW9uaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgbWVzc2FnZU93bmVyLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIG1lc3NhZ2VPd25lciwgbnVsbCwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgbWVzc2FnZU93bmVyLCBDbGFzc0xvYWRlciBjbCwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlhZGRNZXNzYWdlKHJlc291cmNlLCBtZXNzYWdlT3duZXIsIGNsLCBtZXNzYWdlLCBudWxsLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyBjbGF6eiwgSU1lc3NhZ2UgbWVzc2FnZSwgCi0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJYWRkTWVzc2FnZShyZXNvdXJjZSwgY2xhenosIG51bGwsIG1lc3NhZ2UsIHRhcmdldE9iamVjdE5hbWUsIGxvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyBjbGF6eiwgSU1lc3NhZ2UgbWVzc2FnZSwgCi0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24sU3RyaW5nIG1hcmtlcklkKSB7Ci0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIGNsYXp6LCBudWxsLCBtZXNzYWdlLCB0YXJnZXRPYmplY3ROYW1lLCBsb2NhdGlvbixtYXJrZXJJZCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgY2xhenosIENsYXNzTG9hZGVyIGNsLCBJTWVzc2FnZSBtZXNzYWdlLCAKLQkJU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAoKGNsYXp6ID09IG51bGwpIHx8IChtZXNzYWdlID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSlyZXR1cm47Ci0KLQkJaWYgKGNsID09IG51bGwpY2wgPSBjbGF6ei5nZXRDbGFzc0xvYWRlcigpOwotCi0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIGdldFVuaXF1ZUlkKGNsYXp6KSwgY2wsIG1lc3NhZ2UsIHRhcmdldE9iamVjdE5hbWUsIGxvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyBjbGF6eiwgQ2xhc3NMb2FkZXIgY2wsIElNZXNzYWdlIG1lc3NhZ2UsIAotCQlTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWFya2VySWQpIHsKLQkJaWYgKChjbGF6eiA9PSBudWxsKSB8fCAobWVzc2FnZSA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkpcmV0dXJuOwotCi0JCWlmIChjbCA9PSBudWxsKWNsID0gY2xhenouZ2V0Q2xhc3NMb2FkZXIoKTsKLQotCQlhZGRNZXNzYWdlKHJlc291cmNlLCBnZXRVbmlxdWVJZChjbGF6eiksIGNsLCBtZXNzYWdlLCB0YXJnZXRPYmplY3ROYW1lLCBsb2NhdGlvbiwgbWFya2VySWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2VPd25lcklkLCBDbGFzc0xvYWRlciBjbCwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlhZGRNZXNzYWdlKHJlc291cmNlLCBtZXNzYWdlT3duZXJJZCwgY2wsIG1lc3NhZ2UsIG51bGwsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2VPd25lcklkLCBDbGFzc0xvYWRlciBjbCwgCi0JCUlNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJaW50IHNldmVyaXR5ID0gbWVzc2FnZS5nZXRTZXZlcml0eSgpOwotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LmFkZFRhc2sobWVzc2FnZU93bmVySWQsIHJlc291cmNlLCBsb2NhdGlvbiwgbWVzc2FnZS5nZXRJZCgpLCAKLQkJCQltZXNzYWdlLmdldFRleHQoY2wpLCBzZXZlcml0eSx0YXJnZXRPYmplY3ROYW1lLCBtZXNzYWdlLmdldEdyb3VwTmFtZSgpLCAKLQkJCQltZXNzYWdlLmdldE9mZnNldCgpLCBtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVzc2FnZShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlT3duZXJJZCwgQ2xhc3NMb2FkZXIgY2wsIAotCQlJTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWFya2VySWQpIHsKLQkJaW50IHNldmVyaXR5ID0gbWVzc2FnZS5nZXRTZXZlcml0eSgpOwotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LmFkZFRhc2sobWVzc2FnZU93bmVySWQsIHJlc291cmNlLCBsb2NhdGlvbiwgbWVzc2FnZS5nZXRJZCgpLCAKLQkJCQltZXNzYWdlLmdldFRleHQoY2wpLCBzZXZlcml0eSxtYXJrZXJJZCx0YXJnZXRPYmplY3ROYW1lLCBtZXNzYWdlLmdldEdyb3VwTmFtZSgpLCAKLQkJCQltZXNzYWdlLmdldE9mZnNldCgpLCBtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVJlc291cmNlIHJlc291cmNlLCBJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbClyZXR1cm47Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcik7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJLy8gbG9nCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcyA9IHZtZC5nZXRWYWxpZGF0b3JOYW1lcygpOwotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCB2YWxpZGF0b3JOYW1lcyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIHZhbGlkYXRpb24KLQkgKiAgICAgICAgICAgICBmcmFtZXdvcmsuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElSZXNvdXJjZSByZXNvdXJjZSwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCS8vIGxvZwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMgPSB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKTsKLQkJdHJ5IHsKLQkJCS8vU3RyaW5nIHRhcmdldE9iamVjdE5hbWUgPSBnZXRUYXJnZXRPYmplY3ROYW1lKHZtZC5nZXRIZWxwZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSwgb2JqZWN0KTsKLQkJCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lID0gZ2V0VGFyZ2V0T2JqZWN0TmFtZSggZ2V0SGVscGVyKCByZXNvdXJjZS5nZXRQcm9qZWN0KCksIHZhbGlkYXRvciksIG9iamVjdCk7CQkJCi0JCQlyZW1vdmVBbGxNZXNzYWdlcyhyZXNvdXJjZSwgdmFsaWRhdG9yTmFtZXMsIHRhcmdldE9iamVjdE5hbWUpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIHZhbGlkYXRvck5hbWVzLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSkgewotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCB2YWxpZGF0b3JOYW1lcywgdGFyZ2V0T2JqZWN0TmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzIG1lc3NhZ2VPd25lciwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGUgYWRkTWVzc2FnZShDbGFzcywgSU1lc3NhZ2UpIGlzIGRlZmF1bHRlZCB0byB0aGUgSVByb2plY3QsCi0JCS8vIHJlbW92ZSB0aGUgbWVzc2FnZSBzdWJzZXRzIGZyb20gdGhlIElQcm9qZWN0Ci0JCXJlbW92ZU1lc3NhZ2VTdWJzZXQocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXtnZXRVbmlxdWVJZChtZXNzYWdlT3duZXIpfSwgbnVsbCwgZ3JvdXBOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlT3duZXJJZCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGUgYWRkTWVzc2FnZShDbGFzcywgSU1lc3NhZ2UpIGlzIGRlZmF1bHRlZCB0byB0aGUgSVByb2plY3QsCi0JCS8vIHJlbW92ZSB0aGUgbWVzc2FnZSBzdWJzZXRzIGZyb20gdGhlIElQcm9qZWN0Ci0JCXJlbW92ZU1lc3NhZ2VTdWJzZXQocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXttZXNzYWdlT3duZXJJZH0sIG51bGwsIGdyb3VwTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcklkLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVySWQsIHRhcmdldE9iamVjdE5hbWUsIGdyb3VwTmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIENsYXNzIGluc3RhbmNlLCByZXR1cm4gdGhlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGluc3RhbmNlLiAoVXNlZCBhcyB0aGUKLQkgKiB2YWx1ZSBmb3IgdGhlIG1lc3NhZ2Ugb3duZXIuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkKENsYXNzIGNsYXp6KSB7Ci0JCWlmIChjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEl0IGlzIHNhZmUgdG8gbG9hZCB0aGlzIFN0cmluZyBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UgYmVjYXVzZQotCQkvLyB0aGUgQ2xhc3MgbmFtZSB3aWxsIG5vdCBjaGFuZ2UgZHVyaW5nIFdTQUQncyBzZXNzaW9uLgotCQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpLmludGVybigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFVuaXF1ZUlkKHZhbGlkYXRvci5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhdGlvbihJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uVGV4dChoZWxwZXIsIG51bGwpOwotCQl9Ci0JCWludCBsaW5lTm8gPSBtZXNzYWdlLmdldExpbmVOdW1iZXIoKTsKLQkJaWYgKGxpbmVObyA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvblRleHQoaGVscGVyLCBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YobGluZU5vKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhdGlvblRleHQoSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlsb2NhdGlvbiA9IGhlbHBlci5nZXRMb2NhdGlvbih0YXJnZXRPYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKChsb2NhdGlvbiA9PSBudWxsKSB8fCAobG9jYXRpb24udHJpbSgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2F0aW9uID0gREVGQVVMVF9MT0NBVElPTjsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLy8gVE9ETyBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwcm90ZWN0ZWQgZm9yIHRoZSBTYWJlclJlcG9ydGVyLiBNYWtlIHRoaXMgbWV0aG9kIHByaXZhdGUgYWdhaW4KLQkvLyBvbmNlIHRoZSBmcmFtZXdvcmsgc3VwcG9ydHMgSU1hcmtlci5QUklPUklUWS4KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGFyZ2V0T2JqZWN0TmFtZShoZWxwZXIsIG51bGwpOwotCQl9Ci0JCXJldHVybiBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRhcmdldE9iamVjdE5hbWUgPSBoZWxwZXIuZ2V0VGFyZ2V0T2JqZWN0TmFtZSh0YXJnZXRPYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHRhcmdldE9iamVjdE5hbWU7Ci0JfQotCi0JLy8gVE9ETyBUaGlzIG1ldGhvZCB3YXMgbWFkZSAicHJvdGVjdGVkIiBmb3IgdGhlIFNhYmVyUmVwb3J0ZXIuIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kISBUaGlzCi0JLy8gbWV0aG9kIHdpbGwgYmUgbWFkZSBwcml2YXRlIG9uY2Ugc3VwcG9ydCBmb3IgbWFya2VyIFBSSU9SSVRZIGF0dHJpYnV0ZXMgaXMgaW4gdGhlIGZyYW1ld29yay4KLQlwcm90ZWN0ZWQgc3RhdGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZNRChJVmFsaWRhdG9yIHZhbGlkYXRvcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgLy8gYWxyZWFkeSBsb2dnZWQgaW4gdGhlIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcgotCQl9Ci0JCXJldHVybiB2bWQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQuIFRoZSBJVmFsaWRhdGlvbkNvbnRleHQgd2lsbCBiZSBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hSZXBvcnRlcihJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEFuIElSZXBvcnRlciBpbnN0YW5jZSBtdXN0IGV4aXN0IGZvciBlYWNoIFJ1bm5hYmxlIGluIG9yZGVyIGZvciB0aGUgdmFsaWRhdG9yIHRvIHJlcG9ydAotCSAqIHN0YXR1cyBtZXNzYWdlcy4gSVByb2plY3QgYW5kIElQcm9ncmVzc01vbml0b3IgbXVzdCBub3QgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoUmVwb3J0ZXIoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQkJX21vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCS8vIFRPRE8gVGhpcyBtZXRob2Qgd2FzIG1hZGUgcHJvdGVjdGVkIGZvciB0aGUgU2FiZXJSZXBvcnRlci4gTWFrZSBpdCBwcml2YXRlIGFnYWluIG9uY2UgdGhlCi0JLy8gZnJhbWV3b3JrIHN1cHBvcnQgSU1hcmtlci5QUklPUklUWS4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaENvbnRleHQgZ2V0SGVscGVyKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0Vk1EKHZhbGlkYXRvcik7Ci0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IHZtZC5nZXRIZWxwZXIoIGdldFByb2plY3QoKSwgdmFsaWRhdG9yICk7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSVdvcmtiZW5jaENvbnRleHQgZ2V0SGVscGVyKElQcm9qZWN0IHByb2plY3QsIElWYWxpZGF0b3IgdmFsaWRhdG9yKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0Vk1EKHZhbGlkYXRvcik7Ci0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IHZtZC5nZXRIZWxwZXIoIHByb2plY3QsIHZhbGlkYXRvciApOwotCQlyZXR1cm4gaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIF9tb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgcmV0dXJuIG51bGwuCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0RGVmYXVsdFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcHJqID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJqICE9IG51bGwpIHsKLQkJCXJldHVybiBwcmo7Ci0JCX0KLQkJLy8gcmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdAotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGFuIElNZXNzYWdlIGlzIGNyZWF0ZWQsIHRoZSB1c2VyIGhhcyB0aGUgb3B0aW9uIG9mIGNyZWF0aW5nIGl0IHdpdGggYSB0YXJnZXQgb2JqZWN0LgotCSAqIFRoYXQgdGFyZ2V0IG9iamVjdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIG9iamVjdCBoYXMgdGhlIHByb2JsZW0gaWRlbnRpZmllZCBieSB0aGUKLQkgKiBJTWVzc2FnZS4gVGhpcyBtZXRob2QsIGdpdmVuIHRoZSB0YXJnZXQgb2JqZWN0LCByZXR1cm5zIHRoZSBJUmVzb3VyY2Ugd2hpY2ggcmVwcmVzZW50cyB0aGF0Ci0JICogb2JqZWN0IGluIHRoZSB3b3JrYmVuY2guCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRNZXNzYWdlUmVzb3VyY2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgb2JqZWN0OwotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrYmVuY2hGaWxlRGVsdGEpIHsKLQkJCQkvLyByZXNvdXJjZSBtYXkgYmUgbnVsbCBpZiB0aGUgV29ya2JlbmNoRmlsZURlbHRhIHdhcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIE9iamVjdAotCQkJCS8vIGluc3RlYWQgb2YgYW4gSVJlc291cmNlCi0JCQkJcmVzb3VyY2UgPSAoKFdvcmtiZW5jaEZpbGVEZWx0YSkgb2JqZWN0KS5nZXRSZXNvdXJjZSgpOwotCQkJfQotCi0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IGdldEhlbHBlcih2YWxpZGF0b3IpOwotCQkJCQlyZXNvdXJjZSA9IGhlbHBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0cnkgewotCQkJCQkJLy8gVW5saWtlbHkgdGhhdCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24sIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMKLQkJCQkJCS8vIGludm9rZWQgYnkgdGhlIHZhbGlkYXRvciwgYW5kIGlmIHRoZSB2YWxpZGF0b3IgaXMgaW52b2tlZCwgaXQncyBsaWtlbHkKLQkJCQkJCS8vIHRoYXQgdGhlIGhlbHBlciBoYXMgYmVlbiBsb2FkZWQgdG9vLgotCQkJCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0Vk1EKHZhbGlkYXRvcik7Ci0KLQkJCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0KLQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCS8vIEV2ZW4gdGhlIElWYWxpZGF0b3IgaXMgaW52YWxpZC4gVW5mb3J0dW5hdGVseSwgY2FuJ3QgZGlzYWJsZSB0aGUKLQkJCQkJCS8vIHZhbGlkYXRvciBiZWNhdXNlIGl0IGNhbid0IGJlIGZvdW5kIGJ5IHRoZSByZWdpc3RyeSByZWFkZXIuCi0JCQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZTIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gRXZlbiB0aGUgSVZhbGlkYXRvciBpcyBpbnZhbGlkLiBVbmZvcnR1bmF0ZWx5LCBjYW4ndCBkaXNhYmxlIHRoZQotCQkJCQkvLyB2YWxpZGF0b3IgYmVjYXVzZSBpdCBjYW4ndCBiZSBmb3VuZCBieSB0aGUgcmVnaXN0cnkgcmVhZGVyLgotCQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBnZXREZWZhdWx0UmVzb3VyY2UoKTsKLQkJfQotCi0JCWlmICghcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCXJlc291cmNlID0gZ2V0RGVmYXVsdFJlc291cmNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogU2hvdyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW5kaWNhdGluZyB3aGljaCBzdWJ0YXNrIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIDxicj4KLQkgKiA8YnI+Ci0JICogPGNvZGU+bWVzc2FnZTwvY29kZT4gbWF5IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4gPGJyPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlTdWJ0YXNrKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAobWVzc2FnZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhtZXNzYWdlKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNnZXRNZXNzYWdlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNpc0NhbmNlbGxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCWlmIChnZXRQcm9ncmVzc01vbml0b3IoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjYWRkTWVzc2FnZShJVmFsaWRhdG9yLCBJTWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSAgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRNZXNzYWdlUmVzb3VyY2UodmFsaWRhdG9yLCBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gbnVsbDsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0Vk1EKHZhbGlkYXRvcik7Ci0JCXRyeSB7Ci0JCQloZWxwZXIgPSBnZXRIZWxwZXIodmFsaWRhdG9yKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0cnkgewotCQkJCS8vIFVubGlrZWx5IHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzCi0JCQkJLy8gaW52b2tlZCBieSB0aGUgdmFsaWRhdG9yLCBhbmQgaWYgdGhlIHZhbGlkYXRvciBpcyBpbnZva2VkLCBpdCdzIGxpa2VseQotCQkJCS8vIHRoYXQgdGhlIGhlbHBlciBoYXMgYmVlbiBsb2FkZWQgdG9vCi0JCQkJCQkJCQotCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGMyKSB7Ci0JCQkJbG9nRGlzYWJsZWRWYWxpZGF0b3IoZXhjMik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjKSB7Ci0JCQlsb2dEaXNhYmxlZFZhbGlkYXRvcihleGMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKSB7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKAotCQkJCQlSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVkFMSURfUkVTT1VSQ0UpLCAKLQkJCQkJbmV3IE9iamVjdFtde21lc3NhZ2UuZ2V0VGV4dCgpLCBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZSl9KTsKLQkJCQlUcmFjaW5nLmxvZygiV29ya2JlbmNoUmVwb3J0ZXItMDE6ICIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmKCB2YWxpZGF0b3IgaW5zdGFuY2VvZiBJVmFsaWRhdG9ySm9iICl7Ci0JCQljYWNoZU1lc3NhZ2UoIChJVmFsaWRhdG9ySm9iKXZhbGlkYXRvciwgcmVzb3VyY2UsIHZhbGlkYXRvci5nZXRDbGFzcygpLCBtZXNzYWdlLCAKLQkJCQlnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZSksIGdldExvY2F0aW9uKGhlbHBlciwgbWVzc2FnZSksIGdldE1hcmtlcklkKHZtZCwgbWVzc2FnZSkgKTsKLQkJfWVsc2UKLQkJCWFkZE1lc3NhZ2UocmVzb3VyY2UsIHZhbGlkYXRvci5nZXRDbGFzcygpLCBtZXNzYWdlLCBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZSksIAotCQkJCWdldExvY2F0aW9uKGhlbHBlciwgbWVzc2FnZSksZ2V0TWFya2VySWQodm1kLG1lc3NhZ2UpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYXJrZXJJZChWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKHZtZC5nZXRNYXJrZXJJZHMoKSAhPSBudWxsKSB7Ci0JCQlpZiAodm1kLmdldE1hcmtlcklkcygpLmxlbmd0aCA9PSAxKQotCQkJCXJldHVybiB2bWQuZ2V0TWFya2VySWRzKClbMF07Ci0JCQllbHNlIGlmICh2bWQuZ2V0TWFya2VySWRzKCkubGVuZ3RoID4gMSkgewotCQkJCVN0cmluZyBtZXNzYWdlTWFya2VySWQgPSBtZXNzYWdlLmdldE1hcmtlcklkKCk7Ci0JCQkJaWYgKG1lc3NhZ2VNYXJrZXJJZCAhPSBudWxsICYmIG1lc3NhZ2VNYXJrZXJJZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJU3RyaW5nIGZpcnN0TWFya2VySWQgPSB2bWQuZ2V0TWFya2VySWRzKClbMF07Ci0JCQkJCVN0cmluZyBwbHVnaW5RdWFsaWZpZXIgPSBmaXJzdE1hcmtlcklkLnN1YnN0cmluZygwLCBmaXJzdE1hcmtlcklkLmxhc3RJbmRleE9mKCIuIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBxdWFsaWZpZWRNZXNzYWdlTWFya2VySWQgPSBudWxsOwotCQkJCQlpZiAobWVzc2FnZU1hcmtlcklkLmluZGV4T2YocGx1Z2luUXVhbGlmaWVyKSA9PSAtMSkKLQkJCQkJCXF1YWxpZmllZE1lc3NhZ2VNYXJrZXJJZCA9IHBsdWdpblF1YWxpZmllciArICIuIiArIG1lc3NhZ2VNYXJrZXJJZDsgLy8kTk9OLU5MUy0xJAotCQkJCQllbHNlCi0JCQkJCQlxdWFsaWZpZWRNZXNzYWdlTWFya2VySWQgPSBtZXNzYWdlTWFya2VySWQ7Ci0JCQkJCWlmIChBcnJheXMuYXNMaXN0KHZtZC5nZXRNYXJrZXJJZHMoKSkuY29udGFpbnMocXVhbGlmaWVkTWVzc2FnZU1hcmtlcklkKSkKLQkJCQkJCXJldHVybiBxdWFsaWZpZWRNZXNzYWdlTWFya2VySWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dEaXNhYmxlZFZhbGlkYXRvcihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkvLyBFdmVuIHRoZSBJVmFsaWRhdG9yIGlzIGludmFsaWQuIFVuZm9ydHVuYXRlbHksIGNhbid0IGRpc2FibGUgdGhlCi0JCS8vIHZhbGlkYXRvciBiZWNhdXNlIGl0IGNhbid0IGJlIGZvdW5kIGJ5IHRoZSByZWdpc3RyeSByZWFkZXIuCi0JCS8vIExvZyB0aGUgcmVhc29uIGZvciB0aGUgZGlzYWJsZWQgdmFsaWRhdG9yCi0JCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLmNvcmUuSVJlcG9ydGVyI2Rpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IsIElNZXNzYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAobWVzc2FnZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlkaXNwbGF5U3VidGFzayhtZXNzYWdlLmdldFRleHQodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNyZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgeyAvLyBnZXRIZWxwZXIgY291bGQgYmUgbnVsbCBpZiB0aGUgdXNlciBjYW5jZWxsZWQgYmVmb3JlIHNvbWV0aGluZwotCQkJLy8gd2FzIGZ1bGx5IGluaXRpYWxpemVkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNyZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yLCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0TWVzc2FnZVJlc291cmNlKHZhbGlkYXRvciwgb2JqZWN0KTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL2hlbHBlciA9IHZtZC5nZXRIZWxwZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCWhlbHBlciA9IGdldEhlbHBlcih2YWxpZGF0b3IpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFVubGlrZWx5IHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzCi0JCQkvLyBpbnZva2VkIGJ5IHRoZSB2YWxpZGF0b3IsIGFuZCBpZiB0aGUgdmFsaWRhdG9yIGlzIGludm9rZWQsIGl0J3MgbGlrZWx5Ci0JCQkvLyB0aGF0IHRoZSBoZWxwZXIgaGFzIGJlZW4gbG9hZGVkIHRvby4KLQotCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcyA9IHZtZC5nZXRWYWxpZGF0b3JOYW1lcygpOwotCQlTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSA9IGdldFRhcmdldE9iamVjdE5hbWUoaGVscGVyLCBvYmplY3QpOwotCQlyZW1vdmVBbGxNZXNzYWdlcyhyZXNvdXJjZSwgdmFsaWRhdG9yTmFtZXMsIHRhcmdldE9iamVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNyZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IsIE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmosIFN0cmluZyBncm91cE5hbWUpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0TWVzc2FnZVJlc291cmNlKHZhbGlkYXRvciwgb2JqKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vaGVscGVyID0gdm1kLmdldEhlbHBlcihyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQkJaGVscGVyID0gZ2V0SGVscGVyKCByZXNvdXJjZS5nZXRQcm9qZWN0KCksIHZhbGlkYXRvciApOwotCQl9IAotCQljYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBVbmxpa2VseSB0aGF0IGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biwgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcwotCQkJLy8gaW52b2tlZCBieSB0aGUgdmFsaWRhdG9yLCBhbmQgaWYgdGhlIHZhbGlkYXRvciBpcyBpbnZva2VkLCBpdCdzIGxpa2VseQotCQkJLy8gdGhhdCB0aGUgaGVscGVyIGhhcyBiZWVuIGxvYWRlZCB0b28uCi0KLQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMgPSB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKTsKLQkJU3RyaW5nIHRhcmdldE9iamVjdE5hbWUgPSBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgb2JqKTsKLQkJcmVtb3ZlTWVzc2FnZVN1YnNldChyZXNvdXJjZSwgdmFsaWRhdG9yTmFtZXMsIHRhcmdldE9iamVjdE5hbWUsIGdyb3VwTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FjaGVNZXNzYWdlKCBJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciwKLQkJSVJlc291cmNlIHJlc291cmNlLAlDbGFzcyBjbGF6eiwgSU1lc3NhZ2UgbWVzc2FnZSwKLQkJU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG1hcmtlcklkICl7Ci0JCQotCQlpZiAoKGNsYXp6ID09IG51bGwpIHx8IChtZXNzYWdlID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSlyZXR1cm47Ci0JCQotCQlDbGFzc0xvYWRlciBjbCA9IGNsYXp6LmdldENsYXNzTG9hZGVyKCk7Ci0JCVN0cmluZyB0ZXh0ID0gbWVzc2FnZS5nZXRUZXh0KGNsKTsKLQkJTWVzc2FnZUluZm8gbXNnSW5mbyA9IG5ldyBNZXNzYWdlSW5mbyhnZXRVbmlxdWVJZChjbGF6eiksIHJlc291cmNlLCBsb2NhdGlvbiwKLQkJCQl0ZXh0LCB0YXJnZXRPYmplY3ROYW1lLCBtYXJrZXJJZCwgbWVzc2FnZSApOwotCi0JCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmNhY2hlTWVzc2FnZSggdmFsaWRhdG9yLCBtc2dJbmZvICk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wbHVnaW4vVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3BsdWdpbi9WYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZjdjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3BsdWdpbi9WYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JUHJvamVjdFZhbGlkYXRpb25IZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIgewotCi0JLyoqIHZhbGlkYXRpb25IZWxwZXIgLSBleHRlbnNpb24gcG9pbnQgbmFtZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0hFTFBFUiA9ICJ2YWxpZGF0aW9uSGVscGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkvKiogaGVscGVyQ2xhc3MgLSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGV4dGVuc2lvbi4gKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IRUxQRVJfQ0xBU1MgPSAiaGVscGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyIElOU1RBTkNFID0gbnVsbDsKLQlwcml2YXRlIExpc3Q8SVByb2plY3RWYWxpZGF0aW9uSGVscGVyPiBfdmFsaWRhdGlvbkhlbHBlcnM7Ci0JCi0JcHVibGljIFZhbGlkYXRpb25IZWxwZXJSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBWYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIoKTsKLQkJCUlOU1RBTkNFLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIHRoZSBleHRlbnNpb24gcG9pbnQgYW5kIHBhcnNlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQotCQkJLmdldEV4dGVuc2lvblBvaW50KFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lELCBWQUxJREFUSU9OX0hFTFBFUik7Ci0JCWlmIChwb2ludCA9PSBudWxsKXJldHVybjsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaW50ZXJuYWxSZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiByZWNvZ25pemVkID0gdGhpcy5yZWFkRWxlbWVudChlbGVtZW50KTsKLQkJaWYgKCFyZWNvZ25pemVkKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiRXJyb3IgcHJvY2Vzc2luZyBleHRlbnNpb246ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBMb2dzIHRoZSBlcnJvciBpbiB0aGUgZGVza3RvcCBsb2cgdXNpbmcgdGhlIHByb3ZpZGVkIHRleHQgYW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SVByb2plY3RWYWxpZGF0aW9uSGVscGVyPiBnZXRWYWxpZGF0aW9uSGVscGVycygpIHsKLQkJaWYgKF92YWxpZGF0aW9uSGVscGVycyA9PSBudWxsKQotCQkJX3ZhbGlkYXRpb25IZWxwZXJzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdFZhbGlkYXRpb25IZWxwZXI+KCk7Ci0JCXJldHVybiBfdmFsaWRhdGlvbkhlbHBlcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVkFMSURBVElPTl9IRUxQRVIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJUHJvamVjdFZhbGlkYXRpb25IZWxwZXIgaGVscGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWhlbHBlciA9IChJUHJvamVjdFZhbGlkYXRpb25IZWxwZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfSEVMUEVSX0NMQVNTKTsKLQkJCWdldFZhbGlkYXRpb25IZWxwZXJzKCkuYWRkKGhlbHBlcik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3RWYWxpZGF0aW9uSGVscGVyIGdldFZhbGlkYXRpb25IZWxwZXIoKSB7Ci0JCWlmIChnZXRWYWxpZGF0aW9uSGVscGVycygpLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25IZWxwZXJzKCkuZ2V0KDApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wbHVnaW4vVmFsaWRhdGlvblBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wbHVnaW4vVmFsaWRhdGlvblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjhiOGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGx1Z2luL1ZhbGlkYXRpb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5EZXBlbmRlbmN5SW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RVbmF2YWlsYWJsZUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlVW5hdmFpbGFibGVFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogSG93IGRvZXMgdGhpcyBwbHVnLWluIGdldCBhY3RpdmF0ZWQ/IFRoZXJlIGFyZSBtYW55IG90aGVyIHBsdWctaW5zIHRoYXQgZGVwZW5kIG9uIHRoaXMgcGx1Zy1pbiwgc28gdGhlcmUgYXJlCi0gKiBtYW55IHBhdGhzIHRoYXQgd2lsbCBhY3RpdmF0ZSBpdC4gT25lIGNvbW1vbiBwYXRoIGlzIHRoZSBKMkVFIHBlcnNwZWN0aXZlLiBJZiB0aGUgSjJFRSBwbHVnLWluIHN0YXJ0IG1ldGhvZCwgdGhleQotICogcmVmZXJlbmNlIGEgY2xhc3MgaW4gdGhpcyBwbHVnLWluLCB3aGljaCBhY3RpdmF0ZXMgdGhlIHBsdWctaW4uIEZvciB0aGF0IGNhc2UgdGhpcyBwbHVnLWluIHdpbGwgYmUgYWN0aXZlIGV2ZW4gYmVmb3JlCi0gKiB0aGUgd29ya2JlbmNoIGlzIHVwLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgCVZBTElEQVRJT05fUFJPUF9GSUxFX05BTUUgPSAidmFsaWRhdGVfYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24gLSB0aGUgcGx1Zy1pbiBpZCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIAlQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvblBsdWdpbiBfcGx1Z2luOwotCXByaXZhdGUgc3RhdGljIE1lc3NhZ2UgCQlfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0JVSUxERVJfSUQgPSBQTFVHSU5fSUQgKyAiLnZhbGlkYXRpb25idWlsZGVyIjsgLy8kTk9OLU5MUy0xJC8vIHBsdWdpbiBpZCBvZiB0aGUgdmFsaWRhdGlvbiBidWlsZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0VYVF9QVF9JRCA9ICJ2YWxpZGF0b3IiOyAvLyROT04tTkxTLTEkLy8gZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmF0aW9uIG9mIHRoZSB2YWxpZGF0b3IgCi0KLQlwdWJsaWMgVmFsaWRhdGlvblBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKF9wbHVnaW4gPT0gbnVsbClfcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUncyBwcm9wZXJ0eSBmaWxlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRCdW5kbGVQcm9wZXJ0eUZpbGVOYW1lKCkgaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCdW5kbGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0QnVuZGxlUHJvcGVydHlGaWxlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgbmFtZSBvZiB0aGUgYnVuZGxlJ3MgcHJvcGVydHkgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCdW5kbGVQcm9wZXJ0eUZpbGVOYW1lKCkgewotCQlyZXR1cm4gVkFMSURBVElPTl9QUk9QX0ZJTEVfTkFNRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKLQkJaWYgKF9tZXNzYWdlID09IG51bGwpIHsKLQkJCV9tZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKLQkJCV9tZXNzYWdlLnNldEJ1bmRsZU5hbWUoZ2V0QnVuZGxlUHJvcGVydHlGaWxlTmFtZSgpKTsKLQkJfQotCQkvLyBjbGVhciB0aGUgbWVzc2FnZSBmb3IgcmV1c2UKLQkJX21lc3NhZ2Uuc2V0SWQobnVsbCk7Ci0JCV9tZXNzYWdlLnNldFBhcmFtcyhudWxsKTsKLQkJX21lc3NhZ2Uuc2V0VGFyZ2V0T2JqZWN0KG51bGwpOwotCQlfbWVzc2FnZS5zZXRHcm91cE5hbWUobnVsbCk7Ci0JCV9tZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLkxPV19TRVZFUklUWSk7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25QbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gX3BsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoRXZlbnRNYW5hZ2VyLmdldE1hbmFnZXIoKSwgCi0JCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIHwgCi0JCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0JCURlcGVuZGVuY3lJbmRleCBkaSA9IChEZXBlbmRlbmN5SW5kZXgpVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0RGVwZW5kZW5jeUluZGV4KCk7Ci0JCUlXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCXdzLmFkZFNhdmVQYXJ0aWNpcGFudCh0aGlzLCBkaSk7Ci0vLwkJd3MuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihWYWxPcGVyYXRpb25NYW5hZ2VyLmdldERlZmF1bHQoKSwgCi0vLwkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQpOwotCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciggRXZlbnRNYW5hZ2VyLmdldE1hbmFnZXIoKSApOwkJCi0vLwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoIFZhbE9wZXJhdGlvbk1hbmFnZXIuZ2V0RGVmYXVsdCgpICk7CQkKLQkJRXZlbnRNYW5hZ2VyLmdldE1hbmFnZXIoKS5zaHV0ZG93bigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbiNnZXRQbHVnaW5JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpewotCQlJU2NvcGVDb250ZXh0IHByb2plY3RDb250ZXh0ID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KTsKLQkJcmV0dXJuIHByb2plY3RDb250ZXh0LmdldE5vZGUoUExVR0lOX0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogV3JpdGUgdGhpcyBleGNlcHRpb24gdG8gdGhlIGxvZy4KLQkgKiA8cD4KLQkgKiBXZSBhcmUgaW4gdGhlIHRyYW5zaXRpb24gb2YgbW92aW5nIHRvIGEgbmV3IGFwcHJvYWNoIGZvciBsb2NhbGl6ZWQgbWVzc2FnZXMuIFRoaXMgaXMgdGhlIG5ldyAKLQkgKiBhcHByb2FjaCBmb3IgZXhjZXB0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZSB0aGUgdGhyb3dhYmxlLCB0aGlzIGNhbiBiZSBudWxsIGluIHdoaWNoIGNhc2UgaXQgaXMgYSBub3AuCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKXsKLQkJaGFuZGxlRXhjZXB0aW9uKGUsIElTdGF0dXMuRVJST1IpOwotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSB0aGlzIGV4Y2VwdGlvbiB0byB0aGUgbG9nLgotCSAqIDxwPgotCSAqIFdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiBvZiBtb3ZpbmcgdG8gYSBuZXcgYXBwcm9hY2ggZm9yIGxvY2FsaXplZCBtZXNzYWdlcy4gVGhpcyBpcyB0aGUgbmV3IAotCSAqIGFwcHJvYWNoIGZvciBleGNlcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBlIHRoZSB0aHJvd2FibGUsIHRoaXMgY2FuIGJlIG51bGwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIG5vcC4KLQkgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLiBUaGlzIG11c3QgYmUgb25lIG9mIHRoZSBJU3RhdHVzIHNldmVyaXRpZXMuIAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSwgaW50IHNldmVyaXR5KXsKLQkJaWYgKGUgPT0gbnVsbClyZXR1cm47Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsKLQkJZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGhhbmRsZVByb2plY3RVbmF2YWlsYWJsZUVycm9yKFByb2plY3RVbmF2YWlsYWJsZUVycm9yIGUpewotCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSloYW5kbGVFeGNlcHRpb24oZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGhhbmRsZVJlc291cmNlVW5hdmFpbGFibGVFcnJvcihSZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IgZSl7Ci0JCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKWhhbmRsZUV4Y2VwdGlvbihlKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFdyaXRlIGEgbWVzc2FnZSBpbnRvIHRoZSBsb2cuIAotCSAqIAotCSAqIFdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiBvZiBtb3ZpbmcgdG8gYSBuZXcgYXBwcm9hY2ggZm9yIGxvY2FsaXplZCBtZXNzYWdlcy4gVGhpcyBpcyB0aGUgbmV3IAotCSAqIGFwcHJvYWNoIGZvciBleGNlcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eSBtZXNzYWdlIHNldmVyaXR5LCBzZWUgSVN0YXVzCi0JICogQHBhcmFtIG1lc3NhZ2UgYSBsb2NhbGl6ZWQgbWVzc2FnZQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSl7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UpOwotCQlnZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCi0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvVmFsaWRhdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvVmFsaWRhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhNDYxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ZhbGlkYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IHRvIGFjY2VzcyBhbiBpbnN0YW5jZSBvZiB0aGUgVmFsaWRhdGlvbkZhY3RvcnlJbXBsCi0gKiBpbnN0YW5jZSwgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gc29tZSBvZiB0aGUgaW50ZXJuYWwgc3RhdGUKLSAqIG9mIHZhbGlkYXRvcnMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKiBbaXNzdWU6IExNIC0gMiBpc3N1ZXMuCi0gKiAgMS4gSSBkb24ndCB0aGluayB0aGUgbmFtZSAnZmFjdG9yeScgcHJvdmlkZXMgYSBnb29kIGRlc2NyaXB0aW9uIG9mIAotICogICAgIHRoaXMgaW50ZXJmYWNlLiBVbmxlc3MgSSdtIG1pc3Rha2VuIHRoZSBWYWxpZGF0aW9uRmFjdG9yeSBkb2Vzbid0Ci0gKiAgICAgYWN0dWFsbHkgY3JlYXRlIHZhbGlkYXRvcnMgYnV0IHNpbXBseSByZXR1cm5zIGV4aXN0aW5nIHZhbGlkYXRvcnMuCi0gKiAgICAgTG9va2luZyBhdCB0aGUgaW1wbGVtZW50YXRpb24gdGhpcyBpcyBjdXJyZW50bHkgdGhlIGNhc2UuIEkgc3VnZ2VzdAotICogICAgIHJlbmFtaW5nIHRoaXMgdG8gVmFsaWRhdG9yUmVnaXN0cnkgb3Igc29tZXRoaW5nIHNpbWlsYXIuCi0gKiAgMi4gSSB0aGluayB0aGUgY29tbW9uIHdheSBmb3IgY3JlYXRpbmcgYSBmYWN0b3J5IGlzIHRvIGNyZWF0ZSBhIGNsYXNzCi0gKiAgICAgd2l0aCBhIHN0YXRpYyBtZXRob2Qgc3VjaCBhcyBnZXRGYWN0b3J5LiBJZiB0aGlzIGlzIHRvIGJlIGEgZmFjdG9yeQotICogICAgIGl0IHNob3VsZCBwcm9iYWJseSBiZSBzdHJ1Y3R1cmVkIGFzIHBlciB0aGUgY29udmVudGlvbi5dCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkZhY3RvcnkgewotCQotCVZhbGlkYXRpb25GYWN0b3J5IGluc3RhbmNlID0gVmFsaWRhdGlvbkZhY3RvcnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JLyoqCi0JICogVGhpcyBhcGkgcmV0dXJucyB0aGUgSVZhbGlkYXRvciBnaXZlbiB0aGUgdmFsaWRhdG9yVW5pcXVlTmFtZSBpZC4gVGhlIHVuaXF1ZQotCSAqIGlkIG5hbWUgaXMgdGhlIGNsYXNzIG5hbWUgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBuYW1lIGVsZW1lbnQgaW4gdGhlIAotCSAqIHBsdWdpbiBleHRlbnNpb24gb2YgdGhlIHZhbGlkYXRvci4KLQkgKiBAcGFyYW0gdmFsaWRhdG9yVW5pcXVlSWQKLQkgKiBAcmV0dXJuIElWYWxpZGF0b3IKLQkgKiBAcGxhbm5lZGZvciBXVFAgMS4wCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JVbmlxdWVJZCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0VtcHR5U2NoZWR1bGluZ1J1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0VtcHR5U2NoZWR1bGluZ1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFjYjU5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9FbXB0eVNjaGVkdWxpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLQotcHVibGljIGNsYXNzIEVtcHR5U2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCQkKLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgCi0gICAgewotICAgICAgICAgcmV0dXJuIHJ1bGUgPT0gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0gICAgICAgICByZXR1cm4gcnVsZSA9PSB0aGlzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0ZpbGVEZWx0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvRmlsZURlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTZiYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvRmlsZURlbHRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlOwotCi0KLQotLyoqCi0gKiA8cD4KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElGaWxlRGVsdGEKLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGEKLSAqIAotICogIFtpc3N1ZTogQ1MgLSBpcyB0aGVyZSBhIHJlYXNvbiB0aGF0IHdlIG5lZWQgdG8gZXhwb3NlIHRoaXMgaW1wbCBjbGFzcyBhcyBhbiBBUEk/Ci0gKiAgIEl0IHdvdWxkIHNlZW0gYmV0dGVyIHRvIG9ubHkgZXhwb3NlIElGaWxlRGVsdGEuICBJIGNhbid0IHRoaW5rIG9mIGEgcmVhc29uIHdoZXJlIAotICogICBhIHR5cGljYWwgY2xpZW50IHdvdWxkIG5lZWQgdG8gY3JlYXRlIG9uZSBvZiB0aGVzZS5dCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRGVsdGEgaW1wbGVtZW50cyBJRmlsZURlbHRhIHsKLQlwcml2YXRlIGludCBmaWxlRGVsdGE7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgRmlsZURlbHRhCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBGaWxlRGVsdGEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0cnVjdG9yIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFGaWxlTmFtZSBzcGVjaWZpZXMgdGhlIGZpbGUgbmFtZQotCSAqIEBwYXJhbSBhRmlsZURlbHRhIHNwZWNpZmllcyB0aGUgCi0JICovCi0JcHVibGljIEZpbGVEZWx0YShTdHJpbmcgYUZpbGVOYW1lLCBpbnQgYUZpbGVEZWx0YSkgewotCQlmaWxlTmFtZSA9IGFGaWxlTmFtZTsKLQkJZmlsZURlbHRhID0gYUZpbGVEZWx0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGaWxlRGVsdGEjZ2V0RGVsdGFUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlbHRhVHlwZSgpIHsKLQkJcmV0dXJuIGZpbGVEZWx0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGaWxlRGVsdGEjZ2V0RmlsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXQgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNoYW5nZSB0aGF0IHRoZSBmaWxlIAotCSAqIGhhcyB1bmRlcmdvbmUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbHRhVHlwZShpbnQgZGVsdGFUeXBlKSB7Ci0JCWZpbGVEZWx0YSA9IGRlbHRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggaGFzIGNoYW5nZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBhRmlsZU5hbWUpIHsKLQkJZmlsZU5hbWUgPSBhRmlsZU5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvSUZpbGVEZWx0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvSUZpbGVEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQ4ZWVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0lGaWxlRGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkLCBmb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwgdG8gZW5jYXBzdWxhdGUgdGhlIGNoYW5nZSAKLSAqIHN0YXR1cyBvZiBhIHJlc291cmNlLiBJRmlsZURlbHRhIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIGhhcyAKLSAqIGNoYW5nZWQsIGFuZCBhIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNoYW5nZSB3aGljaCBoYXMgb2NjdXJyZWQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogPC9wPgotICogW2lzc3VlOiBMTSAtIEZyb20gc3BlYWtpbmcgd2l0aCBWaWpheSB0aGUgbmFtZSBJRmlsZURlbHRhIGRvZXNuJ3QgcmVhbGx5IGNhcHR1cmUKLSAqICB3aGF0IHRoaXMgaW50ZXJmYWNlIGlzIGZvci4gVmFsaWRhdGlvbiBtYXkgb2NjdXIgb2YgZmlsZXMsIGl0IG1heSBvY2N1ciBvbiByZXNvdXJjZXMsCi0gKiAgb3IgaXQgbWF5IG9jY3VyIG9uIHNvbWV0aGluZyBtb3JlIGFic3RyYWN0IHNpbXBseSBrbm93biBhcyBhbiBhcnRpZmFjdC4gVGhlIGRlbHRhIHBhcnQKLSAqICBvZiB0aGUgbmFtZSBhbHNvIHNlZW1zIG1pc2xlYWRpbmcgYXMgdGhpcyBpbnRlcmZhY2UgZG9lc24ndCBwcm92aWRlIHRoZSBkZWx0YSBidXQKLSAqICByYXRoZXIgcHJvdmlkZXMgdGhlIHR5cGUgb2YgY2hhbmdlLiBJIHN1Z2dlc3QgcmVuYW1pbmcgdGhpcyBpbnRlcmZhY2UgdG8gSU1vZGlmaWVkQXJ0aWZhY3QKLSAqICBvciBzb21ldGhpbmcgYWxvbmcgdGhvc2UgbGluZXMgdG8gYmV0dGVyIGNhcHR1cmUgaXRzIHVzZS4gXQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlRGVsdGEgewotCQotCS8qKiAxIC0gdGhlIGZpbGUgaGFzIGJlZW4gYWRkZWQgKi8KLQlpbnQgQURERUQgPSAxOwotCQotCS8qKiAyIC0gdGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCAqLwotCWludCBDSEFOR0VEID0gMjsKLQkKLQkvKiogMyAtIHRoZSBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQgKi8KLQlpbnQgREVMRVRFRCA9IDM7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGUgdHlwZSBvZiBjaGFuZ2Ugd2hpY2ggaGFzIG9jY3VycmVkOgotCSAqIElGaWxlRGVsdGEuQURERUQsIElGaWxlRGVsdGEuQ0hBTkdFRCwgb3IgSUZpbGVEZWx0YS5ERUxFVEVELgotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlbHRhIHR5cGUuCi0JICogQHBsYW5uZWRmb3IgV1RQIDEuMAotCSAqIAotCSAqIFtpc3N1ZTogTE0gLSBGcm9tIG15IGV4cGVyaWVuY2UgYSB2YWxpZGF0b3Igc2ltcGx5IG5lZWRzIHRvIGtub3cgd2hhdCBhcnRpZmFjdCBuZWVkcwotCSAqICB0byBiZSB2YWxpZGF0ZWQuIENhbiB5b3UgcHJvdmlkZSBhIHVzZSBjYXNlIHdoZXJlIHRoZSB0eXBlIG9mIGNoYW5nZSBpcyBuZWVkZWQgZm9yCi0JICogIHZhbGlkYXRpb24/IF0KLQkgKi8KLQlpbnQgZ2V0RGVsdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlY2xpcHNlIHJlc291cmNlIGZpbGUgd2hpY2ggaGFzIGNoYW5nZWQuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBub3QgYmUgCi0JICogbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikuCi0JICogPC9wPgotCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlsZSBuYW1lLgotCSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLQkgKiAKLQkgKiBbaXNzdWU6IExNIC0gRm9sbG93aW5nIG15IGNvbW1lbnRzIGFib3ZlIHRoaXMgbWV0aG9kIHNob3VsZCBiZSByZW5hbWVkIHRvIGdldEFydGlmYWN0TmFtZSBvcgotCSAqICBzb21ldGhpbmcgdGhhdCBmb2xsb3dzIGFsb25nIHdpdGggdGhlIGludGVyZmFjZSByZW5hbWUuIF0KLQkgKi8KLQlTdHJpbmcgZ2V0RmlsZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0lNZXNzYWdlQWNjZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9JTWVzc2FnZUFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjg1ZjY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0lNZXNzYWdlQWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0KLS8qKgotICogPHA+Ci0gKiBJbnRlcmZhY2Ugd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNjZXNzIG1lc3NhZ2VzIHdoaWNoIGFyZSBzdG9yZWQgd2l0aGluIGEgcmVwb3J0ZXIgd2hpY2ggcmV0YWlucwotICogaXRzIG1lc3NhZ2UgaGlzdG9yeS4KLSAqIDwvcD4KLSAqIAotICogW2lzc3VlOiBDUyAtIFRoaXMgaW50ZXJmYWNlIHNlZW1zIGxpa2Ugb3ZlcmtpbGwuICBJJ2QgdGhpbmsgdGhhdCBhbiBJUmVwb3J0IHNob3VsZCBzaW1wbHkgaGF2ZSBhIGdldE1lc3NhZ2VzKCkgbWV0aG9kLgotICogSSB0aGluayBNZXNzYWdlRmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlIGF0IHRoZSAnZGlzcGxheScgbGV2ZWwgYW5kIG5vdCBhdCB0aGlzIGxldmVsIG9mIHRoZSBBUEkuXQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlQWNjZXNzIHsKLQkvKioKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBBIGZpbHRlciB3aGljaCBzcGVjaWZpZXMgYSBzdWJzZXQgb2YgbWVzc2FnZXMgdG8gcmV0cmlldmUuIG51bGwgc3BlY2lmaWVzLCAiYWxsCi0JICogICAgICAgICAgICBtZXNzYWdlcyIuCi0JICogQHJldHVybiBMaXN0IGxpc3Qgb2YgbWVzc2FnZXMgcmVsYXRlZCB0byB0aGUgdGFyZ2V0IG9iamVjdAotCSAqLwotCWFic3RyYWN0IExpc3QgZ2V0TWVzc2FnZXMoTWVzc2FnZUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgQSBmaWx0ZXIgd2hpY2ggc3BlY2lmaWVzIGEgc3Vic2V0IG9mIG1lc3NhZ2VzIHRvIHJldHJpZXZlLiBudWxsIHNwZWNpZmllcywgImFsbAotCSAqICAgICAgICAgICAgbWVzc2FnZXMiLgotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgbG9jYWwgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlcyBpbnRvLiBudWxsIHNwZWNpZmllcywgInVzZSBkZWZhdWx0Ci0JICogICAgICAgICAgICBsb2NhbGUiLgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgbWVzc2FnZXMgcmVsYXRlZCB0byB0aGUgdGFyZ2V0IG9iamVjdCwgdHJhbnNsYXRlZCBpbnRvIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhbGUuCi0JICovCi0JYWJzdHJhY3QgTGlzdCBnZXRNZXNzYWdlc0FzVGV4dChNZXNzYWdlRmlsdGVyIGZpbHRlciwgTG9jYWxlIHRhcmdldExvY2FsZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9NZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTgxMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIDxwPgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSU1lc3NhZ2UgaW50ZXJmYWNlLCBwcm92aWRlZCBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZQotICogSVZhbGlkYXRvcnMuIElmIGFuIElWYWxpZGF0b3IgbmVlZHMgdG8gcnVuIGluIGJvdGggQUFUIGFuZCBXU0FEIHRoZW4gdGhpcyBJTWVzc2FnZSBpbXBsZW1lbnRhdGlvbgotICogc2hvdWxkIGJlIHVzZWQ7IGlmIHRoZSBJVmFsaWRhdG9yIHJ1bnMgaW4gV1NBRCBhbG9uZSwgdGhlIFdTQUQgTG9jYWxpemVkTWVzc2FnZSBtYXkgYmUgdXNlZCBpbgotICogcGxhY2Ugb2YgdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlCi0gKiAKLSAqIFtpc3N1ZTogQ1MgLSBJJ2Qgc3VnZ2VzdCBzcGxpdHRpbmcgdGhpcyBjbGFzcyBpbnRvIE1lc3NhZ2UgYW5kIEJ1bmRsZU1lc3NhZ2UgKHdoZXJlIHRoZSBsYXR0ZXIgaW5oZXJpdHMKLSAqIGZyb20gdGhlIGZvcm1lci4gIFdlIGhhdmUgbWFueSBtZXNzYWdlcyB0aGF0IGNvbWUgKGZyb20geGVyY2VzKSBwcmV0cmFuc2xhdGVkIGFuZCBkb24ndCByZXF1aXJlICdidW5kbGUnCi0gKiByZWxhdGVkIGZpZWxkcyBhbmQgbWV0aG9kcy4gU3BsaXR0aW5nIHRoaXMgY2xhc3Mgd291bGQgbWFrZSBpdCBlYXNpZXIgdG8gdW5kZXJzdGFuZCB3aGVyZSBidW5kbGUgcmVsYXRlZAotICogZnVuY3Rpb24gaXMgY29taW5nIGludG8gcGxheS4gQmVsb3cgSSd2ZSBsaXN0ZWQgb3V0IHdoYXQgd291bGQgZ28gaW50byBCdW5kbGVNZXNzYWdlIHRvIGRlbW9uc3RyYXRlIGhvdyAKLSAqIHdlIGNhbiBzaW1wbGlmeSB0aGUgJ01lc3NhZ2UnIGNsYXNzIGJ5IGZhY3RvcmluZyBvdXQgdGhlIGJ1bmRsZSByZWxhdGVkIGRldGFpbHMuCi0gKiAKLSAqIE1lc3NhZ2UKLSAqCXByaXZhdGUgT2JqZWN0IHRhcmdldE9iamVjdCA9IG51bGw7Ci0gKglwcml2YXRlIFN0cmluZyBncm91cE5hbWUgPSBudWxsOwotICoJcHJpdmF0ZSBpbnQgbGluZU51bWJlciA9IElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLSAqCXByaXZhdGUgaW50IGxlbmd0aCA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLSAqCXByaXZhdGUgaW50IG9mZnNldCA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLSAqCi0gKiAgICAKLSAqIEJ1bmRsZU1lc3NhZ2UKLSAqCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLSAqCXByaXZhdGUgU3RyaW5nW10gcGFyYW1zID0gbnVsbDsKLSAqCXByaXZhdGUgU3RyaW5nIGJ1bmRsZU5hbWUgPSBudWxsOwotICogICAKLSAqICAgLSBnZXRJZCgpCi0gKiAgIC0gZ2V0QnVuZGxlKC4uLikKLSAqICAgLSBnZXRCdW5kbGVOYW1lKCkKLSAqICAgLSBnZXRQYXJhbXMoKQotICogICAtIGdldFRleHQoTG9jYWxlKQotICogICAtIGdldFRleHQoQ2xhc3NMb2FkZXIpCi0gKiAgIC0gZ2V0VGV4dChMb2NhbGUsIENsYXNzTG9hZGVyKQotICogICAtIHNldElkKFN0cmluZykKLSAqICAgLSBzZXRCdW5kbGVOYW1lKFN0cmluZykKLSAqICAgLSBzZXRQYXJhbXMoU3RyaW5nW10pCi0gKiBdCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlIGltcGxlbWVudHMgSU1lc3NhZ2UgewotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nW10gcGFyYW1zOwotCXByaXZhdGUgaW50IHNldmVyaXR5ID0gTWVzc2FnZUZpbHRlci5BTllfU0VWRVJJVFk7Ci0JcHJpdmF0ZSBPYmplY3QgdGFyZ2V0T2JqZWN0OwotCXByaXZhdGUgU3RyaW5nIGJ1bmRsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZ3JvdXBOYW1lOwotCXByaXZhdGUgaW50IGxpbmVOdW1iZXIgPSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQ7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotCXByaXZhdGUgaW50IG9mZnNldCA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1lc3NhZ2VBdHRyaWJ1dGVzOwotCXByaXZhdGUgU3RyaW5nIG1hcmtlcklkOwotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIE1lc3NhZ2UKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIE1lc3NhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIE1lc3NhZ2Ugb2JqZWN0IHdpdGggYnVuZGxlIG5hbWUsIHNldmVyaXR5IGFuZCBhIHVuaXF1ZSBpZAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUJ1bmRsZU5hbWUgCi0JICogCQkJTXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikuIAotCSAqIEBwYXJhbSBhU2V2ZXJpdHkgCi0JICogCQkJTXVzdCBiZSBvbmUgb2YgdGhlIHNldmVyaXRpZXMgc3BlY2lmaWVkIGluIElNZXNzYWdlLiAKLQkgKiBAcGFyYW0gYW5JZCAKLQkgKiAJCQlNdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZShTdHJpbmcgYUJ1bmRsZU5hbWUsIGludCBhU2V2ZXJpdHksIFN0cmluZyBhbklkKSB7Ci0JCXRoaXMoYUJ1bmRsZU5hbWUsIGFTZXZlcml0eSwgYW5JZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIE1lc3NhZ2Ugb2JqZWN0IHdpdGggYnVuZGxlIG5hbWUsIHNldmVyaXR5LCBhIHVuaXF1ZSBpZCwgYW5kIAotCSAqIGEgbGlzdCBvZiBwYXJhbWV0ZXJzLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFCdW5kbGVOYW1lIAotCSAqIAkJCU11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZyAoIiIpLiAKLQkgKiBAcGFyYW0gYVNldmVyaXR5IAotCSAqIAkJCU11c3QgYmUgb25lIG9mIHRoZSBzZXZlcml0aWVzIHNwZWNpZmllZCBpbiBJTWVzc2FnZS4KLQkgKiBAcGFyYW0gYW5JZCAKLQkgKiAJCQlNdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4KLQkgKiBAcGFyYW0gYVBhcmFtcyAKLQkgKiAJCQlNYXkgYmUgbnVsbCwgaWYgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgaW4gdGhlIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIE1lc3NhZ2UoU3RyaW5nIGFCdW5kbGVOYW1lLCBpbnQgYVNldmVyaXR5LCBTdHJpbmcgYW5JZCwgU3RyaW5nW10gYVBhcmFtcykgewotCQl0aGlzKGFCdW5kbGVOYW1lLCBhU2V2ZXJpdHksIGFuSWQsIGFQYXJhbXMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgTWVzc2FnZSBvYmplY3Qgd2l0aCBidW5kbGUgbmFtZSwgc2V2ZXJpdHksIGEgdW5pcXVlIGlkLCBhbmQgCi0JICogYSBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIHRoZSB0YXJnZXQgb2JqZWN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUJ1bmRsZU5hbWUgCi0JICogCQkJTXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikuIAotCSAqIEBwYXJhbSBhU2V2ZXJpdHkgCi0JICogCQkJTXVzdCBiZSBvbmUgb2YgdGhlIHNldmVyaXRpZXMgc3BlY2lmaWVkIGluIElNZXNzYWdlLgotCSAqIEBwYXJhbSBhbklkIAotCSAqIAkJCU11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZyAoIiIpLgotCSAqIEBwYXJhbSBhUGFyYW1zIAotCSAqIAkJCU1heSBiZSBudWxsLCBpZiB0aGVyZSBhcmUgbm8gcGFyYW1ldGVycyBpbiB0aGUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gdGFyZ2V0T2JqZWN0IAotCSAqIAkJCU1heSBiZSBudWxsLCBpZiB0aGUgbWVzc2FnZSBkb2VzIG5vdCBwZXJ0YWluIHRvIGEgcGFydGljdWxhciAKLQkgKiAJCQlvYmplY3QuCi0JICovCi0JcHVibGljIE1lc3NhZ2UoU3RyaW5nIGFCdW5kbGVOYW1lLCBpbnQgYVNldmVyaXR5LCBTdHJpbmcgYW5JZCwgU3RyaW5nW10gYVBhcmFtcywgT2JqZWN0IGFUYXJnZXRPYmplY3QpIHsKLQkJYnVuZGxlTmFtZSA9IGFCdW5kbGVOYW1lOwotCQlzZXZlcml0eSA9IGFTZXZlcml0eTsKLQkJaWQgPSBhbklkOwotCQlwYXJhbXMgPSBhUGFyYW1zOwotCQl0YXJnZXRPYmplY3QgPSBhVGFyZ2V0T2JqZWN0OwotCX0KLQkKLQlwdWJsaWMgTWVzc2FnZShTdHJpbmcgYUJ1bmRsZU5hbWUsIGludCBhU2V2ZXJpdHksIFN0cmluZyBhbklkLCBTdHJpbmdbXSBhUGFyYW1zLCBPYmplY3QgYVRhcmdldE9iamVjdCwgU3RyaW5nIGFHcm91cE5hbWUpIHsKLQkJYnVuZGxlTmFtZSA9IGFCdW5kbGVOYW1lOwotCQlzZXZlcml0eSA9IGFTZXZlcml0eTsKLQkJaWQgPSBhbklkOwotCQlwYXJhbXMgPSBhUGFyYW1zOwotCQl0YXJnZXRPYmplY3QgPSBhVGFyZ2V0T2JqZWN0OwotCQlncm91cE5hbWUgPSBhR3JvdXBOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIGJ1bmRsZSB3aGljaCBjb250YWlucyB0aGUgbWVzc2FnZXMsIGFzIGlkZW50aWZpZWQgYnkKLQkgKiAKLQkgKiBAbGluayAjZ2V0QnVuZGxlTmFtZSgpCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGNsYXNzTG9hZGVyID09IG51bGwpIHsKLQkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QnVuZGxlTmFtZSgpLCBsb2NhbGUpOwotCQkJfSBlbHNlIHsKLQkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QnVuZGxlTmFtZSgpLCBsb2NhbGUsIGNsYXNzTG9hZGVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vdHJ5IHRvICBsb2FkIHRoZSBidW5kbGUgZnJvbSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgcGx1Z2luCi0JCQlidW5kbGUgPSBnZXRGcmFtZXdvcmtCdW5kbGUobG9jYWxlKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZ2V0RnJhbWV3b3JrQnVuZGxlKExvY2FsZSBsb2NhbGUpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCdW5kbGVOYW1lKCksIGxvY2FsZSwgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQkJCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0QnVuZGxlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCdW5kbGVOYW1lKCkgewotCQlyZXR1cm4gYnVuZGxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldEdyb3VwTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHcm91cE5hbWUoKSB7Ci0JCXJldHVybiBncm91cE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0TGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldExpbmVOdW1iZXIoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIGxpbmVOdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRPZmZzZXQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0UGFyYW1zKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1zKCkgewotCQlyZXR1cm4gcGFyYW1zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0U2V2ZXJpdHkoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBzZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFRhcmdldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXRPYmplY3QoKSB7Ci0JCXJldHVybiB0YXJnZXRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRUZXh0KExvY2FsZS5nZXREZWZhdWx0KCksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0VGV4dChDbGFzc0xvYWRlcikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJcmV0dXJuIGdldFRleHQoTG9jYWxlLmdldERlZmF1bHQoKSwgY2xhc3NMb2FkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0VGV4dChMb2NhbGUpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsb2NhbGUpIHsKLQkJcmV0dXJuIGdldFRleHQobG9jYWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFRleHQoTG9jYWxlLCBDbGFzc0xvYWRlcikKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0KExvY2FsZSBsb2NhbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAobG9jYWxlID09IG51bGwpIHsKLQkJCXJldHVybiBtZXNzYWdlOwotCQl9Ci0KLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKGxvY2FsZSwgY2xhc3NMb2FkZXIpOwotCQlpZiAoYnVuZGxlID09IG51bGwpIHsKLQkJCXJldHVybiBtZXNzYWdlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCW1lc3NhZ2UgPSBidW5kbGUuZ2V0U3RyaW5nKGdldElkKCkpOwotCi0JCQlpZiAoZ2V0UGFyYW1zKCkgIT0gbnVsbCkgewotCQkJCW1lc3NhZ2UgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgKE9iamVjdFtdKWdldFBhcmFtcygpKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4YykgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGV4Yy5nZXRNZXNzYWdlKCkpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKGdldElkKCkpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihnZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0QnVuZGxlTmFtZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnVuZGxlTmFtZShTdHJpbmcgYUJ1bmRsZU5hbWUpIHsKLQkJYnVuZGxlTmFtZSA9IGFCdW5kbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0R3JvdXBOYW1lKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcm91cE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZ3JvdXBOYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldElkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJaWQgPSBuZXdJZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldExlbmd0aChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA8IDApIHsKLQkJCWxlbmd0aCA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLQkJfQotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldExpbmVObyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZU5vKGludCBsaW5lTnVtYmVyKSB7Ci0JCWlmIChsaW5lTnVtYmVyIDwgMCkgewotCQkJdGhpcy5saW5lTnVtYmVyID0gSU1lc3NhZ2UuTElORU5PX1VOU0VUOwotCQl9IGVsc2UgewotCQkJdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0T2Zmc2V0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJb2Zmc2V0ID0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotCQl9Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0UGFyYW1zKFN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtcyhTdHJpbmdbXSBuZXdQYXJhbXMpIHsKLQkJcGFyYW1zID0gbmV3UGFyYW1zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0U2V2ZXJpdHkoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBuZXdTZXZlcml0eSkgewotCQlzZXZlcml0eSA9IG5ld1NldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0VGFyZ2V0T2JqZWN0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRPYmplY3QoT2JqZWN0IG9iaikgewotCQl0YXJnZXRPYmplY3QgPSBvYmo7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJaWYobWVzc2FnZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1lc3NhZ2VBdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlpZihtZXNzYWdlQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQl9Ci0JCW1lc3NhZ2VBdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGVOYW1lLHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG1lc3NhZ2VBdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFya2VySWQoKSB7Ci0JCXJldHVybiBtYXJrZXJJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXJJZChTdHJpbmcgbWFya2VySWQpIHsKLQkJdGhpcy5tYXJrZXJJZCA9IG1hcmtlcklkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL01lc3NhZ2VGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL01lc3NhZ2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlOTdhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9NZXNzYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotCi0vKioKLSAqIDxwPgotICogRW5jYXBzdWxhdGVzIGNvbW1vbiBtZXNzYWdlIGZpbHRlcmluZyBwYXJhbWV0ZXJzLiBNZXNzYWdlIEZpbHRlcnMgYXJlIHVzZWQgd2hlbiByZXRyaWV2aW5nCi0gKiBtZXNzYWdlcyB2aWEgYW4gSU1lc3NhZ2VBY2Nlc3MuIFRoZSBmaWx0ZXIgZW5jYXBzdWxhdGVzIGEgc2ltcGxlIHNldCBvZiB0eXBpY2FsIGZpbHRlciBjcml0ZXJpYQotICogd2hpY2ggaXMgdXNlZCB0byBzZWxlY3QgYSBzdWJzZXQgb2YgbWVzc2FnZXMgdG8gcmV0cmlldmUuIElmIG11bHRpcGxlIGF0dHJpYnV0ZXMgb2YgdGhlIG1lc3NhZ2UKLSAqIGZpbHRlciBhcmUgc3BlY2lmaWVkLCB0aGV5IHNob3VsZCBiZSBsb2dpY2FsbHkgQU5EJ2QgdG9nZXRoZXIgYnkgdGhlIE1lc3NhZ2VBY2Nlc3MKLSAqIGltcGxlbWVudGF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUZpbHRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5ZX1NFVkVSSVRZID0gLTE7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBNZXNzYWdlcyBtYXRjaGluZyB0aGlzIHNldmVyaXR5KHMpIHdpbGwgYmUgcmV0cmlldmVkLiBPbmUgb2YgU2V2ZXJpdHlFbnVtIFhYWF9zZXZlcml0eQotCSAqIGNvbnN0YW50cywgb3IgQU5ZX1NFVkVSSVRZIHRvIHNwZWNpZnkgdGhhdCBtZXNzYWdlcyBvZiBhbnkgc2V2ZXJpdHkgd2lsbCBiZSByZXR1cm5lZC4gVGhpcwotCSAqIGZpZWxkIGNhbiBiZSBjb21iaW5lZCB3aXRoIG90aGVyIGZpbHRlciBhdHRyaWJ1dGVzIHRvIG5hcnJvdyB0aGUgc2VsZWN0aW9uIHNldCBmdXJ0aGVyLgotCSAqIDwvcD4KLQkgKi8KLQlwcml2YXRlIGludCBzZXZlcml0eSA9IEFOWV9TRVZFUklUWTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSB2YWxpZGF0b3Igd2hpY2ggcmVwb3J0ZWQgdGhlIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLiBBbGwgbWVzc2FnZXMgd2hpY2ggd2VyZQotCSAqIHJlcG9ydGVkIHVzaW5nIHZhbGlkYXRvciBtYXRjaGluZyB0aGlzIHZhbGlkYXRvciB3aWxsIGJlIHJldHVybmVkLiBUaGlzIGZpZWxkIGNhbiBiZSBjb21iaW5lZAotCSAqIHdpdGggb3RoZXIgZmlsdGVyIGF0dHJpYnV0ZXMgdG8gbmFycm93IHRoZSBzZWxlY3Rpb24gc2V0IGZ1cnRoZXIuCi0JICogPC9wPgotCSAqLwotCXByaXZhdGUgSVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgdGFyZ2V0IG9iamVjdCBvZiB0aGUgbWVzc2FnZXMgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQsIG9yIG51bGwgdG8gc3BlY2lmeSB0byByZXRyaWV2ZQotCSAqIG1lc3NhZ2VzIG9mIGFueSB0YXJnZXQuIEFsbCBtZXNzYWdlcyBoYXZpbmcgYSB0YXJnZXQgb2JqZWN0IG1hdGNoaW5nIHRoaXMgb2JqZWN0IHdpbGwgYmUKLQkgKiByZXR1cm5lZC4gVGhpcyBmaWVsZCBjYW4gYmUgY29tYmluZWQgd2l0aCBvdGhlciBmaWx0ZXIgYXR0cmlidXRlcyB0byBuYXJyb3cgdGhlIHNlbGVjdGlvbiBzZXQKLQkgKiBmdXJ0aGVyLgotCSAqIDwvcD4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCB0YXJnZXRPYmplY3Q7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRmlsdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhU2V2ZXJpdHkKLQkgKiAJCQlTZXZlcml0eSBvZiB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAJCQlJVmFsaWRhdG9yIHdoaWNoIHJlcG9ydGVkIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIGFUYXJnZXRPYmplY3QKLQkgKiAJCQlUYXJnZXQgb2JqZWN0IG9mIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIE1lc3NhZ2VGaWx0ZXIoaW50IGFTZXZlcml0eSwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBhVGFyZ2V0T2JqZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXNldmVyaXR5ID0gYVNldmVyaXR5OwotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJdGFyZ2V0T2JqZWN0ID0gYVRhcmdldE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzZXZlcml0eSBmaWx0ZXIgY29uc3RyYWludC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdGFyZ2V0IG9iamVjdCBmaWx0ZXIgY29uc3RyYWludC4KLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRUYXJnZXRPYmplY3QoKSB7Ci0JCXJldHVybiB0YXJnZXRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdmFsaWRhdG9yIHRvIGZpbHRlciBvbi4KLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzZXZlcml0eSBmaWx0ZXIgY29uc3RyYWludC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2V2ZXJpdHkKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGZpbHRlciBjb25zdHJhaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IG5ld1NldmVyaXR5KSB7Ci0JCXNldmVyaXR5ID0gbmV3U2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB0YXJnZXQgb2JqZWN0IGZpbHRlciBjb25zdHJhaW50LgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYXJnZXRPYmplY3QKLQkgKiAgICAgICAgICAgICB0YXJnZXQgb2JqZWN0IGZpbHRlciBjb25zdHJhaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QgbmV3VGFyZ2V0T2JqZWN0KSB7Ci0JCXRhcmdldE9iamVjdCA9IG5ld1RhcmdldE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbGlkYXRvciB0byByZXR1cm4gbWVzc2FnZXMgZm9yLgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvciB0byByZXR1cm4gbWVzc2FnZXMgZm9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL1ZhbGlkYXRpb25FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL1ZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5NzBhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9WYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aGUgb25seSBleGNlcHRpb24gd2hpY2ggc2hvdWxkIGJlIHRocm93biBieSBJVmFsaWRhdG9ycy4gVGhlIG1lc3NhZ2UgaW4gdGhpcwotICogZXhjZXB0aW9uIG11c3QgYmUgc3VpdGFibGUgZm9yIHNob3dpbmcgdG8gdGhlIHVzZXIuIEFsbCBWYWxpZGF0aW9uRXhjZXB0aW9ucyB3aWxsIGhhdmUgdGhlaXIKLSAqIG1lc3NhZ2UgZXh0cmFjdGVkIHdoZW4gdGhleSdyZSBjYXVnaHQsIGFuZCB0aGUgbWVzc2FnZSB3aWxsIGJlIHNob3duIHRvIHRoZSB1c2VyLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCXByaXZhdGUgVGhyb3dhYmxlIF9sb3dMZXZlbEV4Y2VwdGlvbjsKLQlwcml2YXRlIElNZXNzYWdlIF9tZXNzYWdlOwotCXByaXZhdGUgQ2xhc3NMb2FkZXIgX2xvYWRlcjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM4NzUxNjk5MzEyNDIyOTk0OUw7Ci0KLQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggYSBnaXZlbiBtZXNzYWdlIHN0cmluZy4gPGJyPgotCSAqIDxicj4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgSU1lc3NhZ2UsIHdoaWNoIGlzIExvY2FsZS1pbmRlcGVuZGVudCwgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2UgdG8gYmUgc2hvd24gdG8KLQkgKiAgICAgICAgICAgIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uRXhjZXB0aW9uKElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJdGhpcyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBzdHJpbmcsIGFuZCBsb3ctbGV2ZWwgZXhjZXB0aW9uLiA8YnI+Ci0JICogPGJyPgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBJTWVzc2FnZSBMb2NhbGUtaW5kZXBlbmRlbnQgbWVzc2FnZSB0byBiZSBzaG93biB0byB0aGUgdXNlci4KLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICByZWxldmFudCBsb3ctbGV2ZWwgZXhjZXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLiA8YnI+Ci0JICogICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcCBGb3IgZXhhbXBsZSwgd2hlbiBhIG1ldGhvZCBmYWlscyBiZWNhdXNlIG9mIGEgbmV0d29yawotCSAqICAgICAgICAgICAgY29tbXVuaWNhdGlvbnMgJm5ic3A7Jm5ic3A7Jm5ic3AgcHJvYmxlbSwgdGhpcyB3b3VsZCBiZSB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPmphdmEuaW8uSU9FeGNlcHRpb248L2NvZGU+ICZuYnNwOyZuYnNwOyZuYnNwIGRlc2NyaWJpbmcgdGhlIGV4YWN0IG5hdHVyZQotCSAqICAgICAgICAgICAgb2YgdGhlIHByb2JsZW0uCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25FeGNlcHRpb24oSU1lc3NhZ2UgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcigpOwotCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCV9sb3dMZXZlbEV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb3ctbGV2ZWwgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZhbGlkYXRpb25FeGNlcHRpb24uCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gX2xvd0xldmVsRXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIElNZXNzYWdlIHRvIGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsIGlmIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBiZSBoYW5kbGVkCi0JICogaW50ZXJuYWxseS4KLQkgKi8KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGlmIHRoZSBJVmFsaWRhdG9yIHdoaWNoIHRocmV3IHRoaXMgZXhjZXB0aW9uIHdhcyBsb2FkZWQgYnkgYSBkaWZmZXJlbnQgQ2xhc3NMb2FkZXIgdGhhbiB0aGUKLQkgKiBmcmFtZXdvcmssIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIENsYXNzTG9hZGVyIG9mIHRoZSBJVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIF9sb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcgb2YgdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdCBpZiBpdCB3YXMKLQkgKiAgICAgICAgIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlI1Rocm93YWJsZShTdHJpbmcpIGNyZWF0ZWR9d2l0aCBhbiBlcnJvciBtZXNzYWdlIHN0cmluZzsKLQkgKiAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IHdhcyB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoKSBjcmVhdGVkfXdpdGgKLQkgKiAgICAgICAgIG5vIGVycm9yIG1lc3NhZ2UuCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlLmdldFRleHQoZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvY2FsZQotCSAqIAkJCVRoZSBsb2NhbGUgb2Ygd2hpY2ggdG8gZ2V0IHRoZSBtZXNzYWdlLgotCSAqIEByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoaXMgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QgaWYgaXQgd2FzCi0JICogICAgICAgICB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoU3RyaW5nKSBjcmVhdGVkfXdpdGggYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmc7Ci0JICogICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCB3YXMge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKCkgY3JlYXRlZH13aXRoCi0JICogICAgICAgICBubyBlcnJvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShMb2NhbGUgbG9jYWxlKSB7Ci0JCXJldHVybiBfbWVzc2FnZS5nZXRUZXh0KGxvY2FsZSwgZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogSWYgdGhlIElWYWxpZGF0b3Igd2hpY2ggdGhyZXcgdGhpcyBleGNlcHRpb24gd2FzIGxvYWRlZCBieSBhIGRpZmZlcmVudCBDbGFzc0xvYWRlciB0aGFuIHRoZQotCSAqIGZyYW1ld29yaywgdGhpcyBtZXRob2Qgc2hvdWxkIHNldCB0aGUgQ2xhc3NMb2FkZXIgdG8gYmUgdGhlIENsYXNzTG9hZGVyIG9mIHRoZSBJVmFsaWRhdG9yLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogIAkJQ2xhc3NMb2FkZXIgb2YgdGhlIHZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGxvYWRlcikgewotCQlfbG9hZGVyID0gbG9hZGVyOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGlzIHRocm93YWJsZSBvYmplY3QuIElmIHRoaXMgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QKLQkgKiB3YXMge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKFN0cmluZykgY3JlYXRlZH13aXRoIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLCB0aGVuCi0JICogdGhlIHJlc3VsdCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aHJlZSBzdHJpbmdzOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIG5hbWUgb2YgdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGlzIG9iamVjdAotCSAqIDxsaT4iOiAiIChhIGNvbG9uIGFuZCBhIHNwYWNlKQotCSAqIDxsaT5UaGUgcmVzdWx0IG9mIHRoZSB7QGxpbmsgI2dldE1lc3NhZ2V9bWV0aG9kIGZvciB0aGlzIG9iamVjdAotCSAqIDwvdWw+Ci0JICogSWYgdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdCB3YXMge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKCkgY3JlYXRlZH0KLQkgKiB3aXRoIG5vIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLCB0aGVuIHRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhpcyBvYmplY3QgaXMgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0b1N0cmluZyhMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyB0aHJvd2FibGUgb2JqZWN0LiBJZiB0aGlzIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0Ci0JICogd2FzIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlI1Rocm93YWJsZShTdHJpbmcpIGNyZWF0ZWR9d2l0aCBhbiBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhlbgotCSAqIHRoZSByZXN1bHQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhyZWUgc3RyaW5nczoKLQkgKiA8dWw+Ci0JICogPGxpPlRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhpcyBvYmplY3QKLQkgKiA8bGk+IjogIiAoYSBjb2xvbiBhbmQgYSBzcGFjZSkKLQkgKiA8bGk+VGhlIHJlc3VsdCBvZiB0aGUge0BsaW5rICNnZXRNZXNzYWdlfW1ldGhvZCBmb3IgdGhpcyBvYmplY3QKLQkgKiA8L3VsPgotCSAqIElmIHRoaXMgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3Qgd2FzIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlI1Rocm93YWJsZSgpIGNyZWF0ZWR9Ci0JICogd2l0aCBubyBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhlbiB0aGUgbmFtZSBvZiB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoaXMgb2JqZWN0IGlzIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKExvY2FsZSBsb2NhbGUpIHsKLQkJU3RyaW5nIHMgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKGxvY2FsZSk7Ci0JCXJldHVybiAobWVzc2FnZSAhPSBudWxsKSA/IChzICsgIjogIiArIG1lc3NhZ2UpIDogczsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL1ZhbGlkYXRvckxhdW5jaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9WYWxpZGF0b3JMYXVuY2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNhODljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL1ZhbGlkYXRvckxhdW5jaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTWVzc2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLS8qKgotICogVGhpcyBzaW5nbGV0b24gbGF1bmNoZXMgdGhlIHZhbGlkYXRpb24gb24gYSBzaW5nbGUgdmFsaWRhdG9yLiBDbGllbnRzIHNob3VsZCBjYWxsIHRoaXMgY2xhc3MncwotICogPGNvZGU+c3RhcnQ8L2NvZGU+IG1ldGhvZCB0byBiZWdpbiB0aGUgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckxhdW5jaGVyIHsKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JMYXVuY2hlciBfbGF1bmNoZXI7Ci0KLQlwcml2YXRlIFZhbGlkYXRvckxhdW5jaGVyKCkgewotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBsYXVuY2hlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvckxhdW5jaGVyIGdldExhdW5jaGVyKCkgewotCQlpZiAoX2xhdW5jaGVyID09IG51bGwpIHsKLQkJCV9sYXVuY2hlciA9IG5ldyBWYWxpZGF0b3JMYXVuY2hlcigpOwotCQl9Ci0JCXJldHVybiBfbGF1bmNoZXI7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgdGhlIGxhdW5jaCBwb2ludCBvZiB0aGUgdmFsaWRhdGlvbi4gSXQgcnVucyB2YWxpZGF0aW9uIG9uIHRoZSB2YWxpZGF0b3IKLQkgKiBhY2Nlc3NlZCBieSB0aGUgSVZhbGlkYXRpb25Db250ZXh0LiBXaGVuIHRoZSB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLCBlYWNoIHZhbGlkYXRvciBtYXkgcGVyZm9ybSByZXNvdXJjZQotCSAqIGNsZWFudXAsIGlmIG5lY2Vzc2FyeS4KLQkgKiA8cD4KLQkgKiBJZiA8Y29kZT5oZWxwZXI8L2NvZGU+LDxjb2RlPnZhbGlkYXRvcjwvY29kZT4sIG9yIDxjb2RlPnJlcG9ydGVyPC9jb2RlPiBhcmUgbnVsbCwKLQkgKiB2YWxpZGF0aW9uIGlzIG5vdCBwZXJmb3JtZWQuIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4gbWF5IGJlIG51bGwsIG9yIGVtcHR5LCBpZiBhIGZ1bGwKLQkgKiBidWlsZCBzaG91bGQgYmUgZG9uZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGhlbHBlciAKLQkgKiAJCQlsb2FkcyBhbiBvYmplY3QuIAotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAJCQl2YWxpZGF0b3Igb2JqZWN0IHRvIGxhdW5jaCB2YWxpZGF0aW9uLgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIAkJCUlzIGFuIGluc3RhbmNlIG9mIGFuIElSZXBvcnRlciBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgZm9yIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIGZpbmFsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZiAoKGhlbHBlciA9PSBudWxsKSB8fCAodmFsaWRhdG9yID09IG51bGwpIHx8IChyZXBvcnRlciA9PSBudWxsKSlyZXR1cm47Ci0KLQkJLy8gQ2FuJ3QgZm9yY2UgZWFjaCB2YWxpZGF0b3IgdG8gY2hlY2sgaWYgaXQncyBjYW5jZWxsZWQgb3Igbm90LAotCQkvLyBzbyBjaGVjayBmb3IgY2FuY2VsbGF0aW9uIGhlcmUuIEhvcGVmdWxseSB0aGUgdXNlciB3b24ndCB3YWl0IHRvbyBsb25nLgotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSlyZXR1cm47Ci0JCQotCi0JCS8vIElmIHRoZSB2YWxpZGF0b3IgaXMgYWJvdXQgdG8gcGVyZm9ybSBhIGZ1bGwgYnVpbGQsIHJlbW92ZSBhbGwgb2YgaXRzIHByZXZpb3VzIHZhbGlkYXRpb24KLQkJLy8gbWVzc2FnZXMuCi0JCWlmICgoaGVscGVyLmdldFVSSXMoKSA9PSBudWxsKSB8fCAoaGVscGVyLmdldFVSSXMoKS5sZW5ndGggPT0gMCkpIHsKLQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JCX0KLQkJaWYoIHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IgKXsKLQkJCSgoSVZhbGlkYXRvckpvYil2YWxpZGF0b3IpLnZhbGlkYXRlSW5Kb2IoaGVscGVyLCByZXBvcnRlcik7Ci0JCX1lbHNlewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQl9Ci0JCWlmKCB2YWxpZGF0b3IgaW5zdGFuY2VvZiBJVmFsaWRhdG9ySm9iICl7Ci0JCQkvL3RoZSAgdmFsaWRhdG9ycyB3aG8gaGF2ZSBpbXBsZW1lbnRlZCBJVmFsaWRhdG9ySm9iIGJ1dCBhcmUgcnVubmluZyBzeW5jaHJvbm91c2x5Ci0JCQkvL3dvdWxkIGxvZyBtZXNzYWdlcyBub3cgLi4uCi0JCQlWYWxpZGF0b3JNYW5hZ2VyIG1nciA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpOwotCQkJZmluYWwgTGlzdDxNZXNzYWdlSW5mbz4gbGlzdCA9IG1nci5nZXRNZXNzYWdlcygoSVZhbGlkYXRvckpvYil2YWxpZGF0b3IpOwotCi0JCQlmb3IoTWVzc2FnZUluZm8gaW5mbyA6IGxpc3QpewotCQkJCXRyeSB7Ci0JCQkJCVRhc2tMaXN0VXRpbGl0eS5hZGRUYXNrKCBpbmZvLmdldE1lc3NhZ2VPd25lcklkKCksIGluZm8uZ2V0UmVzb3VyY2UoKSwKLQkJCQkJCQlpbmZvLmdldExvY2F0aW9uKCksIGluZm8uZ2V0TXNnKCkuZ2V0SWQoKSwgaW5mby5nZXRUZXh0KCksCi0JCQkJCQkJaW5mby5nZXRNc2coKS5nZXRTZXZlcml0eSgpLCBpbmZvLmdldE1hcmtlcklkKCksIAotCQkJCQkJCWluZm8uZ2V0VGFyZ2V0T2JqZWN0TmFtZSgpLAotCQkJCQkJCWluZm8uZ2V0TXNnKCkuZ2V0R3JvdXBOYW1lKCksIGluZm8uZ2V0TXNnKCkuZ2V0T2Zmc2V0KCksIGluZm8uZ2V0TXNnKCkuZ2V0TGVuZ3RoKCkpOwotCQkJCQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQl9CQkJCQkJCQkJCQotCQkJfQotCQkJbWdyLmNsZWFyTWVzc2FnZXMoIChJVmFsaWRhdG9ySm9iKXZhbGlkYXRvciApOwotCQl9Ci0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MDk0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgbG9jYWxlLWluZGVwZW5kZW50IHZhbGlkYXRpb24gbWVzc2FnZS4KLSAqIDwvcD4KLSAqIDxwPgotICogR2l2ZW4gdGhlc2UgdGhyZWUgdmFsdWVzIGFzIGlucHV0LCB0aGlzIGludGVyZmFjZSBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIGZpbmFsIG1lc3NhZ2Ugc3RyaW5nLgotICogKGkuZS4sIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBhcmFtZXRlcnMgYWxyZWFkeSBzdWJzdGl0dXRlZCBpbi4pIEVpdGhlciB0aGUgZGVmYXVsdCBMb2NhbGUgY2FuIGJlCi0gKiB1c2VkLCBvciB0aGUgY2FsbGVyIGNhbiBzcGVjaWZ5IGEgTG9jYWxlLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlIHsKLQkvKgotICogCi0gKiBbaXNzdWU6IENTIC0gVGhlICdJTWVzc2FnZScgaW50ZXJmYWNlIHdvdWxkIGJlIHNpbXBsZXIgd2l0aG91dCB0aGUgYnVuZGxlIHJlbGF0ZWQgZGV0YWlscy4gIEknZCBsaWtlIHRvIHVuZGVyc3RhbmQKLSAqIHdoeSB3ZSBjYW4gJ3ByZWNvbXB1dGUnIHRoZSB0cmFuc2xhdGVkIG1lc3NhZ2UuIElzIHRoZXJlIHNvbWUgYmVuZWZpdCB0byBwZXJmb3JtICdsYXRlIGNvbXB1dGF0aW9uJyBvZiB0aGVzZSBtZXNzYWdlcz8KLSAqIEhvdyBkb2VzIHRoaXMgY29tcGFyZSB0byB0aGUgZWNsaXBzZSBNYXJrZXIgKGFzIGZhciBhcyBJIGtub3cgdGhlIE1hcmtlcidzIHRleHQoKSBpcyBwcmVMb2NhbGl6ZWQpLgotICogSGVyZSdzIGEgbGlzdCBvZiB0aGUgbWV0aG9kcyB0aGF0IGFyZSByZWxhdGVkIHRvICdidW5kbGUgc3BlY2lmaWMnIGFzcGVjdHMgYW5kIGNvdWxkIGJlIHNlcGFyYXRlIG91dCAob3IgZGVzaWduZWQgYXdheSk/Ci0gKiAgICAKLSAqICAgLSBnZXRJZCgpCi0gKiAgIC0gZ2V0QnVuZGxlKC4uLikKLSAqICAgLSBnZXRCdW5kbGVOYW1lKCkKLSAqICAgLSBnZXRQYXJhbXMoKQotICogICAtIGdldFRleHQoTG9jYWxlKQotICogICAtIGdldFRleHQoQ2xhc3NMb2FkZXIpCi0gKiAgIC0gZ2V0VGV4dChMb2NhbGUsIENsYXNzTG9hZGVyKQotICogICAtIHNldElkKFN0cmluZykKLSAqICAgLSBzZXRCdW5kbGVOYW1lKFN0cmluZykKLSAqICAgLSBzZXRQYXJhbXMoU3RyaW5nW10pCi0gKiBdCi0gKiAKLSAqICAgLSB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgT2JqZWN0IHZhbHVlKQotICogICAtIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotICogXQotCSAqLwotCWludCBPRkZTRVRfVU5TRVQgPSAtMTsgLy8gc2VlIGdldExlbmd0aCgpLCBnZXRPZmZzZXQoKQotCWludCBMSU5FTk9fVU5TRVQgPSAwOwotCQotCS8qKgotCSAqIFR5cGljYWxseSB1c2VkIHRvIHNwZWNpZnkgZXJyb3IgbWVzc2FnZXMuCi0JICovCi0JaW50IEhJR0hfU0VWRVJJVFkgPSAweDAwMDE7Ci0JLyoqCi0JICogVHlwaWNhbGx5IHVzZWQgdG8gc3BlY2lmeSB3YXJuaW5nIG1lc3NhZ2VzLgotCSAqLwotCWludCBOT1JNQUxfU0VWRVJJVFkgPSAweDAwMDI7Ci0JLyoqCi0JICogVHlwaWNhbGx5IHVzZWQgdG8gc3BlY2lmeSBpbmZvcm1hdGlvbiBtZXNzYWdlcy4KLQkgKi8KLQlpbnQgTE9XX1NFVkVSSVRZID0gMHgwMDA0OwotCS8qKgotCSAqIFNwZWNpZnkgaGlnaCAoZXJyb3IpIGFuZCBub3JtYWwgKHdhcm5pbmcpIG1lc3NhZ2VzLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGEgTWVzc2FnZUZpbHRlciwgdG8KLQkgKiBmaWx0ZXIgb3V0IGluZm9ybWF0aW9uIG1lc3NhZ2VzLgotCSAqLwotCWludCBFUlJPUl9BTkRfV0FSTklORyA9IEhJR0hfU0VWRVJJVFkgfCBOT1JNQUxfU0VWRVJJVFk7Ci0JLyoqCi0JICogU3BlY2lmeSBhbGwgdHlwZXMgb2YgbWVzc2FnZXMuIFR5cGljYWxseSB1c2VkIHdpdGggYSBNZXNzYWdlRmlsdGVyLgotCSAqLwotCWludCBBTExfTUVTU0FHRVMgPSBFUlJPUl9BTkRfV0FSTklORyB8IExPV19TRVZFUklUWTsKLQkKLQkvKiogCi0JICogVGFyZ2V0UmVzb3VyY2UgLSBUaGUga2V5IHRvIHVzZSB3aGVuIGFzc29jaWF0aW5nIGEgcmVzb3VyY2Ugd2l0aCBhIG1lc3NhZ2UgdmlhIGFuCi0JICogYXR0cmlidXRlLiAKLQkgKiA8cD4KLQkgKiBOb3JtYWxseSwgdGhlIHRhcmdldCBpcyBzdG9yZWQgdXNpbmcgdGhlIHNldFRhcmdldE9iamVjdCgpIG1ldGhvZCwgYnV0Ci0JICogc29tZSBvZiB0aGUgbGVnYWN5IHZhbGlkYXRvcnMgdXNlZCB0aGlzIGZpZWxkIGZvciBvYmplY3RzIHRoYXQgd2hlcmUgbm90IElSZXNvdXJjZXMuCi0JICogSW4gb3JkZXIgdG8gYXNzb2NpYXRlIHRoZSBtZXNzYWdlIHdpdGggdGhlIHByb3BlciBJUmVzb3VyY2UgdGhlIHZhbGlkYXRvciBjYW4gc3RvcmUKLQkgKiB0aGUgSVJlc291cmNlIGFzIGFuIGF0dHJpYnV0ZSBhbmQgdXNlIHRoaXMgc3RyaW5nIGFzIHRoZSBrZXkuCi0JICogPC9wPgotCSAqLwotCVN0cmluZyBUYXJnZXRSZXNvdXJjZSA9ICJUYXJnZXRSZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgY29udGFpbmVkIGluLgotCSAqLwotCVN0cmluZyBnZXRCdW5kbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBUbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkgYXNzaWduIGdyb3VwIG5hbWVzCi0JICogdG8gSU1lc3NhZ2VzLiBBbiBJTWVzc2FnZSBzdWJzZXQgd2lsbCBiZSBpZGVudGlmaWVkIGJ5IHRoZSBuYW1lIG9mIGl0cyBncm91cC4gRGVmYXVsdCAobnVsbCkKLQkgKiBtZWFucyBubyBncm91cC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBncm91cCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLgotCSAqLwotCVN0cmluZyBnZXRHcm91cE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBtZXNzYWdlLiBNZXNzYWdlIGlkcyBhcmUgdXNlZCBhcyB0aGUgY29uc3RhbnRzIGluIHByb3BlcnR5IGJ1bmRsZXMKLQkgKiB3aGljaCBsb2NhbGl6ZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1lc3NhZ2UgaW4gYSBsb2NhbGUtaW5kZXBlbmRlbnQgZmFzaGlvbi4gVGhlIGlkIGlzIHRoZQotCSAqIGtleSwgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSwgd2hpY2ggaWRlbnRpZmllcyB0aGUgc3RyaW5nIHRvIGJlIGxvYWRlZC4gVGhlIGlkIG1heSBub3QgYmUgbnVsbAotCSAqIG9yIHRoZSBlbXB0eSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgaWQgb2YgdGhlIG1lc3NhZ2UKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcHJvYmxlbSBhcmVhLCBzdGFydGluZyBmcm9tIHRoZSBvZmZzZXQuIElmIHVuc2V0LCB2YWx1ZSA9Ci0JICogSU1lc3NhZ2UuT0ZGU0VUX1VOU0VULgotCSAqIAotCSAqIEBzZWUgI2dldE9mZnNldCgpCi0JICovCi0JaW50IGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogSWYgdGhlcmUgaXMgYSB0YXJnZXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElNZXNzYWdlLCBhbmQgdGhhdCB0YXJnZXQgb2JqZWN0IGlzIGEgZmlsZSwKLQkgKiB0aGVuIGFuIG9wdGlvbmFsIGxpbmUgbnVtYmVyIG1heSBiZSBzZXQuIFRoZSBsaW5lIG51bWJlciBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUKLQkgKiBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhpcyBtZXNzYWdlLiBJZiBubyBsaW5lIG51bWJlciBoYXMgYmVlbiBzZXQsICNMSU5FTk9fVU5TRVQgd2lsbCBiZQotCSAqIHJldHVybmVkLgotCSAqIAotCSAqIEByZXR1cm4gbGluZSBudW1iZXIgb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9ibGVtLgotCSAqLwotCWludCBnZXRMaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuIElmIHVuc2V0LCB2YWx1ZSA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVC4gRm9yIGV4YW1wbGUsIGlmCi0JICogdGhlIGphdmEgY29tcGlsZXIgd2VyZSBhIHZhbGlkYXRvciwgYW5kIGl0IHJlcG9ydGVkIHRoYXQgYSB2YXJpYWJsZSBuYW1lIHdhcyB1bmtub3duLCBvZmZzZXQKLQkgKiB3b3VsZCBpZGVudGlmeSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdW5rbm93biB2YXJpYWJsZS4gVGhlIHBvc2l0aW9uIGlzCi0JICogaWRlbnRpZmllZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0JICogCi0JICogQHJldHVybiBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UKLQkgKi8KLQlpbnQgZ2V0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZXNzYWdlLiBNZXNzYWdlIHBhcmFtZXRlcnMgYXJlIHRoZSB2YWx1ZXMgd2hpY2ggYXJlCi0JICogc3Vic3RpdHV0ZWQgaW50byBwYXJhbWV0ZXIgc2xvdHMgaW4gbG9jYWxpemVkIG1lc3NhZ2UgdGV4dCBkZXNjcmlwdGlvbnMuCi0JICogCi0JICogQHJldHVybiBwYXJhbWV0ZXJzIG9mIHRoZSBtZXNzYWdlCi0JICovCi0JU3RyaW5nW10gZ2V0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZS4gT25lIG9mIFNldmVyaXR5RW51bSBjb25zdGFudHMuCi0JICogCi0JICogQHNlZSBJTWVzc2FnZSNISUdIX1NFVkVSSVRZCi0JICogQHNlZSBJTWVzc2FnZSNOT1JNQUxfU0VWRVJJVFkKLQkgKiBAc2VlIElNZXNzYWdlI0xPV19TRVZFUklUWQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZQotCSAqLwotCWludCBnZXRTZXZlcml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhhdCB0aGlzIElNZXNzYWdlIGlzIHJlcG9ydGluZyB0aGUgcHJvYmxlbSBhZ2FpbnN0LCBpZiBhbnkuIG51bGwgd2lsbCBiZQotCSAqIHJldHVybmVkIGlmIHRoaXMgaXMgYSBnZW5lcmFsIG1lc3NhZ2Ugd2hpY2ggZG9lcyBub3QgYXBwbHkgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdDsgZm9yCi0JICogZXhhbXBsZSwgImludGVybmFsIGVycm9yIi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YXJnZXQgb2JqZWN0IGZvciB0aGUgbWVzc2FnZQotCSAqLwotCU9iamVjdCBnZXRUYXJnZXRPYmplY3QoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQgTG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIGRlZmF1bHQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzc0xvYWRlciAKLQkgKiAJCQkJVGhlIENsYXNzTG9hZGVyIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBsb2FkIHRoZSBSZXNvdXJjZUJ1bmRsZS4KLQkgKiAgICAgICAgICAgIAotCSAqIEByZXR1cm4gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIHNwZWNpZmllZCBDbGFzc0xvYWRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbGFzc0xvYWRlcik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGludG8uCi0JICogICAgICAgICAgICAKLQkgKiBAcmV0dXJuIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0dGVkIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIGRlZmF1bHQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoTG9jYWxlIGxvY2FsZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGludG8uCi0JICogQHBhcmFtIGNsYXNzTG9hZGVyCi0JICogICAgICAgICAgICBUaGUgQ2xhc3NMb2FkZXIgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIFJlc291cmNlQnVuZGxlLgotCSAqICAgICAgICAgICAgCi0JICogQHJldHVybiBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlIGZvcm1hdHRlZCBpbiB0aGUgc3BlY2lmaWVkIGxvY2FsZSwgd2l0aCB0aGUKLQkgKiBidW5kbGUgbG9hZGVkIGJ5IHRoZSBzcGVjaWZpZWQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpOwotCQotCS8qKgotCSAqIFByb3ZpZGVzIGEgd2F5IHRvIHN0b3JlIHNvbWUgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRoYXQgYSBtZXNzYWdlIHdvdWxkIGxpa2UgdG8gc3RvcmUKLQkgKiB0aGF0IGNhbiB1c2VkIGJ5IHNvbWUgb3RoZXIgcGFydGllcyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRob3NlIGF0dHJpYnV0ZSB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiBAcmV0dXJuIGFuIE9iamVjdCBiYXNpY2FsbHkgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IG5hbWUuCi0JICovCi0JCi0JIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotCQotCS8qKgotCSAqIFNldCB0aGUgYXR0cmlidXRlTmFtZSBhbmQgdmFsdWUgYXMga2V5IHZhbHVlIHBhaXIuCi0JICogCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICovCi0JCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE9iamVjdCB2YWx1ZSk7Ci0JICAgCi0KLQkvKioKLQkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgY29udGFpbmVkIGluLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIAotCSAqIAkJCU5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCBjb250YWlucyB0aGUgbWVzc2FnZS4KLQkgKi8KLQl2b2lkIHNldEJ1bmRsZU5hbWUoU3RyaW5nIGJ1bmRsZU5hbWUpOwotCi0JLyoqCi0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5IGFzc2lnbiBncm91cCBuYW1lcwotCSAqIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZCBieSB0aGUgbmFtZSBvZiBpdHMgZ3JvdXAuIERlZmF1bHQgKG51bGwpCi0JICogbWVhbnMgbm8gZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAJCQlOYW1lIG9mIHRoZSBncm91cC4KLQkgKi8KLQl2b2lkIHNldEdyb3VwTmFtZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlkIG9mIHRoZSBtZXNzYWdlLiBNZXNzYWdlIGlkcyBhcmUgdXNlZCBhcyB0aGUgY29uc3RhbnRzIGluIHByb3BlcnR5IGJ1bmRsZXMgd2hpY2gKLQkgKiBsb2NhbGl6ZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1lc3NhZ2UgaW4gYSBsb2NhbGUtaW5kZXBlbmRlbnQgZmFzaGlvbi4gVGhlIGlkIGlzIHRoZSBrZXksCi0JICogaW4gdGhlIHJlc291cmNlIGJ1bmRsZSwgd2hpY2ggaWRlbnRpZmllcyB0aGUgc3RyaW5nIHRvIGJlIGxvYWRlZC4gVGhlIGlkIG1heSBub3QgYmUgbnVsbCBvcgotCSAqIHRoZSBlbXB0eSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG5ld0lkCi0JICogICAgICAgICAgICBJZCBvZiB0aGUgbWVzc2FnZS4KLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyBuZXdJZCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIHByb2JsZW0sIHN0YXJ0aW5nIGZyb20gdGhlIG9mZnNldC4gSWYgdW5zZXQsIHZhbHVlID0KLQkgKiBJTWVzc2FnZS5PRkZTRVRfVU5TRVQuCi0JICogCi0JICogQHNlZSAjc2V0T2Zmc2V0KGludCkKLQkgKiAKLQkgKiBAcGFyYW0gbGVuZ3RoIAotCSAqCQkJU2V0cyB0aGUgbGVuZ3RoLiAJCQotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogSWYgdGhlcmUgaXMgYSB0YXJnZXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElNZXNzYWdlLCBhbmQgdGhhdCB0YXJnZXQgb2JqZWN0IGlzIGEgZmlsZSwKLQkgKiB0aGVuIGFuIG9wdGlvbmFsIGxpbmUgbnVtYmVyIG1heSBiZSBzZXQuIFRoZSBsaW5lIG51bWJlciBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUKLQkgKiBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhpcyBtZXNzYWdlLiBUbyBpbmRpY2F0ZSBubyBsaW5lIG51bWJlciwgdXNlICNMSU5FTk9fVU5TRVQuCi0JICogCi0JICogQHBhcmFtIGxpbmVOdW1iZXIgCi0JICoJCQlTZXRzIHRoZSBsaW5lIG51bWJlci4KLQkgKi8KLQl2b2lkIHNldExpbmVObyhpbnQgbGluZU51bWJlcik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuIElmIHVuc2V0LCB2YWx1ZSA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVC4gRm9yIGV4YW1wbGUsIGlmIHRoZQotCSAqIGphdmEgY29tcGlsZXIgd2VyZSBhIHZhbGlkYXRvciwgYW5kIGl0IHJlcG9ydGVkIHRoYXQgYSB2YXJpYWJsZSBuYW1lIHdhcyB1bmtub3duLCBvZmZzZXQKLQkgKiB3b3VsZCBpZGVudGlmeSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdW5rbm93biB2YXJpYWJsZS4gVGhlIHBvc2l0aW9uIGlzCi0JICogaWRlbnRpZmllZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG9mZnNldCAKLQkgKgkJCVNldHMgdGhlIG9mZnNldCBvZiB0aGUgbWVzc2FnZS4KLQkgKi8KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1lc3NhZ2UuIE1lc3NhZ2UgcGFyYW1ldGVycyBhcmUgdGhlIHZhbHVlcyB3aGljaCBhcmUgc3Vic3RpdHV0ZWQKLQkgKiBpbnRvIHBhcmFtZXRlciBzbG90cyBpbiBsb2NhbGl6ZWQgbWVzc2FnZSB0ZXh0IGRlc2NyaXB0aW9ucy4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgaWYgZ2V0SWQoKSByZXR1cm5zICJNWV9JRCIsIHRoZW4gdGhlIFJlc291cmNlQnVuZGxlIGlkZW50aWZpZWQgYnkKLQkgKiBnZXRCdW5kbGVOYW1lKCkgaXMgc2VhcmNoZWQgZm9yIHRoZSBtZXNzYWdlIG5hbWVkICJNWV9JRCIsIGFuZCBpZiBmb3VuZCwKLQkgKiBoYXMgaXQncyBwYXJhbWV0ZXJzIHNldC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNmb3JtYXQoU3RyaW5nLCBPYmplY3RbXSkgaXMgaW52b2tlZCBvbiB0aGUgbWVzc2FnZSwgd2l0aAotCSAqICAgICAgPGNvZGU+bmV3UGFyYW1zPC9jb2RlPiBwYXNzZWQgaW4gYXMgdGhlIE9iamVjdFtdLgotCSAqICAgICAgCi0JICogQHBhcmFtIG5ld1BhcmFtcwotCSAqICAgICAgICAgICAgUGFyYW1ldGVycyBvZiB0aGUgbWVzc2FnZS4KLQkgKi8KLQl2b2lkIHNldFBhcmFtcyhTdHJpbmdbXSBuZXdQYXJhbXMpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuIE9uZSBvZiBTZXZlcml0eUVudW0gY29uc3RhbnRzLgotCSAqIAotCSAqIEBzZWUgSU1lc3NhZ2UjSElHSF9TRVZFUklUWQotCSAqIEBzZWUgSU1lc3NhZ2UjTk9STUFMX1NFVkVSSVRZCi0JICogQHNlZSBJTWVzc2FnZSNMT1dfU0VWRVJJVFkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2V2ZXJpdHkKLQkgKiAgICAgICAgICAgIFNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlLgotCSAqLwotCXZvaWQgc2V0U2V2ZXJpdHkoaW50IG5ld1NldmVyaXR5KTsKLQotCS8qKgotCSAqIEFzc29jaWF0ZSB0aGlzIElNZXNzYWdlIHdpdGggdGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgcHJvYmxlbS4gQSBudWxsIHZhbHVlIGlzIHBlcm1pdHRlZC4gSWYgYQotCSAqIG1lc3NhZ2UgaXMgYXBwbGljYWJsZSB0byBvbmUgb2JqZWN0LCB0aGVuIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldC4gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdAotCSAqIHZhbHVlIChudWxsKSBzaG91bGQgYmUga2VwdC4gR2l2ZW4gdGhpcyB0YXJnZXQgb2JqZWN0LCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gY2FsY3VsYXRlIHRoZQotCSAqIGV4YWN0IGxvY2F0aW9uIG9mIHRoZSBwcm9ibGVtLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHByb2JsZW0uCi0JICovCi0Jdm9pZCBzZXRUYXJnZXRPYmplY3QoT2JqZWN0IG9iaik7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBhIE1lc3NhZ2Ugb2JqZWN0LgotCSAqLwotCUhhc2hNYXAgZ2V0QXR0cmlidXRlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFya2VyIGlkIGlmIG9uZSBpcyBzZXQgb24gdGhpcyBvYmplY3Qgd2hlbiBjcmVhdGVkLgotCSAqLwotCVN0cmluZyBnZXRNYXJrZXJJZCgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgbWFya2VyIGlkIG9uIGEgTWVzc2FnZSBvYmplY3QuCi0JICovCi0JIHZvaWQgc2V0TWFya2VySWQoU3RyaW5nIG1hcmtlcklkKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZlZjM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotLyoqCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGFNb2RlbENvbnRleHQgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgewotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWwoU3RyaW5nIFVSSSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxMDM1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IGV4dGVuZHMgSVZhbGlkYXRpb25Db250ZXh0IHRvIHByb3ZpZGUgYWNjZXNzIHRvIGEKLSAqIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBvbiB3aGljaCBhIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQKLXsKLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBwcm9qZWN0IG9uIHdoaWNoIHRoZSB2YWxpZGF0b3IgaXMgYmVpbmcgaW52b2tlZC4KLSAgICogCi0gICAqIEByZXR1cm4gYW4gSVByb2plY3QgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IG9uIHdoaWNoIHRoZSB2YWxpZGF0b3IgaXMKLSAgICogICAgICAgICBiZWluZyBpbnZva2VkLgotICAgKi8KLSAgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwNTEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qCi0gKiBDQ00gLSBSZXBvcnRlciBpcyBub3cgcGFzc2VkIGxvY2FsZS1pbmRlcGVuZGVudCBtZXNzYWdlcy4KLSAqICAgICAgIE1lc3NhZ2VzIHNob3VsZCBvbmx5IGJlIHRyYW5zbGF0ZWQgdG8gYSBsb2NhbGUgdXBvbiBhY2Nlc3MuCi0gKiAgICAgICBPciBpbiBzcGVjaWFsIGxvY2FsZS1kZXBlbmRlbnQgcmVwb3J0ZXIgaW1wbGVtZW50YXRpb25zIChjb25zb2xlIGxvZ2dlcikuCi0gKi8KLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHVzZWQgYnkgSVZhbGlkYXRvcidzIHRvIHJlcG9ydCBtZXNzYWdlcy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJUmVwb3J0ZXIgY291bGQKLSAqIHNpbXBseSBsb2cgdGhlIG1lc3NhZ2VzIHRvIHN0ZG91dCwgYSBmaWxlLCBvciByZXRhaW4gdGhlbSBpbiBhIGJ1ZmZlciBmb3IgbGF0ZXIgYWNjZXNzIGJ5IGEgdXNlcgotICogaW50ZXJmYWNlLgotICogPHA+Ci0gKiBSZXBvcnRlciBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGtlZXAgbm9uLWxvY2FsaXplZCB2ZXJzaW9ucyBvZiB0aGVpciBtZXNzYWdlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogQW55IG1lc3NhZ2VzIHdoaWNoIG5lZWQgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFyZSBkb25lIHRocm91Z2ggdGhpcyBjbGFzcywgYW5kIGlmIHRoZSB1c2VyCi0gKiBjYW5jZWxzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCB0aGlzIGNsYXNzIGlzIHRoZSBvbmUgd2hpY2ggcmVnaXN0ZXJzIHRoZSBjYW5jZWxsYXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBJUmVwb3J0ZXIgaW5zdGFuY2UgaXMgY3JlYXRlZCBhdCB0aGUgdGltZSB2YWxpZGF0aW9uIGJlZ2lucyBhbmQgZW5kcyB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuCi0gKiBUaGVyZSBpcyBvbmx5IG9uZSBJUmVwb3J0ZXIgaW5zdGFuY2UgY3JlYXRlZCBmb3IgYWxsIHZhbGlkYXRvcnMgdGhhdCBhcmUgcnVuIG9uIGEgSVJlc291cmNlLiBUaGUgSVJlc291cmNlCi0gKiBwcm92aWRlcyBhIHdheSB0byBnZXQgbWVzc2FnZXMgcHV0IG91dCBlYWNoIHZhbGlkYXRvciBhbmQgYWRkIGFuZCBkZWxldGUgbWVzc2FnZXMgZm9yIG9uZSB2YWxpZGF0b3IKLSAqIGF0IGEgdGltZS4gCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlcG9ydGVyIHsKLQkvKioKLQkgKiA8cD4KLQkgKiBBZGQgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLiBJdCB3aWxsIGJlIGRpc3BsYXllZCBsYXRlciwgd2l0aCBhbGwgb2YgdGhlCi0JICogb3RoZXIgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIElWYWxpZGF0b3IgcGFzc2VkIGluIGlzIG5lZWRlZCBmb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiAod2hlbiBhIG1lc3NhZ2UgbmVlZHMgdG8gYmUKLQkgKiByZW1vdmVkLCBvbmUgdmFsaWRhdG9yIHNob3VsZCBub3QgcmVtb3ZlIG1lc3NhZ2VzIGVudGVyZWQgYnkgYW5vdGhlciB2YWxpZGF0b3IuKSBUaGUKLQkgKiB2YWxpZGF0b3IgaXMgYWxzbyBxdWVyaWVkIGZvciBpbmZvcm1hdGlvbiBhYm91dCBpdHMgcmVzb3VyY2UgYnVuZGxlLCB0byBlbmFibGUgc3VwcG9ydCBmb3IKLQkgKiBsb2NhbGl6YXRpb24gb2YgbWVzc2FnZXMgaW4gYSBjbGllbnQtc2VydmVyIGVudmlyb25tZW50LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBCb3RoIHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG9yaWdpbgotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRvciB3aGljaCBpcyB0aGUgc291cmNlIG9mIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBBIG1lc3NhZ2UgdG8gYmUgcmVwb3J0ZWQuCi0JICovCi0Jdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3Igb3JpZ2luLCBJTWVzc2FnZSBtZXNzYWdlKTsKLQotCS8qKgotCSAqIFNob3cgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSwgZm9ybWF0dGVkIGluIHRoZSBkZWZhdWx0Ci0JICogTG9jYWxlLCB0byB0aGUgdXNlciBpbW1lZGlhdGVseS4gVGhpcyBtZXNzYWdlIGluZGljYXRlcyB3aGljaCBzdWJ0YXNrIGlzCi0JICogY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIG1lc3NhZ2UgaXMgbm90IHN0b3JlZC4gVGhlIHN1YnRhc2sgbWVzc2FnZQotCSAqIGluIHRoaXMgY29udGV4dCBpcyB0aGUgc3VidGFzayBpbiBhIElQcm9ncmVzc01vbnRpb3IKLQkgKiA8cD4KLQkgKiBCb3RoIHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIAkJVGhlIHZhbGlkYXRvciBpc3N1aW5nIHRoZSBzdWJ0YXNrIG1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAJCVRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLQkgKiAKLQkgKi8KLQl2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgYWNjZXNzIGludGVyZmFjZSB0byB0aGlzIHJlcG9ydGVyLCBvciBudWxsIGlmIG1lc3NhZ2UgYWNjZXNzIGlzIG5vdAotCSAqIHN1cHBvcnRlZC4KLQkgKiAgICAgCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgY2FuY2VsZWQgdmFsaWRhdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0JICogY2FsbGVkIGJ5IElWYWxpZGF0b3JzIHBlcmlvZGljYWxseSwgYmVjYXVzZSBubyBldmVudCBpcyBmaXJlZCB0byBub3RpZnkgSVZhbGlkYXRvcnMgdGhhdCB0aGUKLQkgKiB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24uIElmIGEgdmFsaWRhdG9yIGRvZXMgbm90IGNoZWNrIHRoaXMgbWV0aG9kLCBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0Ci0JICogaXMgaWdub3JlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgY2FuY2VsZWQgdmFsaWRhdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAgCi0JICovCi0JYm9vbGVhbiBpc0NhbmNlbGxlZCgpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZAotCSAqIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLiAKLQkgKiA8cD4KLQkgKiBUaGUgSVZhbGlkYXRvciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG9yaWdpbgotCSAqIAkJCU9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLiAgCi0JICovCi0Jdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMsIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLAotCSAqIHBlcnRhaW5pbmcgdG8gdGhlIE9iamVjdCBwcm92aWRlZC4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgZm9yCi0JICogaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gPGJyPgotCSAqIDxicj4KLQkgKiBJZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIG51bGwsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJlbW92ZSBhbGwKLQkgKiBtZXNzYWdlcyBvd25lZCBieSB0aGUgdmFsaWRhdG9yLiAoaS5lLiwgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHRoZQotCSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IpIG1ldGhvZC4pIDxicj4KLQkgKiA8YnI+Ci0JICogPHA+Ci0JICogVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW4KLQkgKiAJCU9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAJCU9iamVjdCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLiBPYmplY3QgaXMgdGhlIHRhcmdldCBvYmplY3QKLQkgKiAJCXRoYXQgd2FzIHNldCBvbiB0aGUgSU1lc3NhZ2Ugd2hlbiBhZGRpbmcgdGhlIG1lc3NhZ2UgYXMgcHJvYmxlbQotCSAqIAkJbWFya2VyLgotCSAqIAotCSAqLwotCXZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4sIE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5Ci0JICogYXNzaWduIGdyb3VwIG5hbWVzIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZCBieQotCSAqIHRoZSBuYW1lIG9mIGl0cyBncm91cC4gVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgb25seSB0aGUgSU1lc3NhZ2UncyB0aGF0Ci0JICogYXJlIGluIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZS4gCi0JICogPHA+Ci0JICogVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgbnVsbCwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgcmVtb3ZlIGFsbAotCSAqIG1lc3NhZ2VzIG93bmVkIGJ5IHRoZSB2YWxpZGF0b3IuIChpLmUuLCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgdGhlCi0JICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikgbWV0aG9kLikKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgZ3JvdXBOYW1lIGlzIG51bGwsIHRoYXQncyB0aGUgc2FtZSBhcyBubyBncm91cCAoaS5lLiwgdGhlIHNhbWUKLQkgKiBiZWhhdmlvdXIgYXMgdGhlIDxjb2RlPnJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kLikKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIAkJT3JpZ2luYXRvciB2YWxpZGF0b3Igb2YgdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIG9iagotCSAqIAkJT2JqZWN0IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuCi0JICogQHBhcmFtIGdyb3VwTmFtZQotCSAqIAkJTmFtZSBvZiB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhlIG1lc3NhZ2UgYmVsb25ncy4KLQkgKi8KLQl2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmosIFN0cmluZyBncm91cE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhOGNlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRvIHNlcGFyYXRlIHRoZSBJVmFsaWRhdG9yIGZyb20gdGhlIG1vZGVsIGxvYWRpbmcuIEEgbW9kZWwgCi0gKiBpcyBhIGdyb3VwIG9mIG9iamVjdChzKSB0aGF0IG11c3QgZm9sbG93IHNvbWUgcnVsZXMuCi0gKiA8cD4KLSAqIFRoZSBtb2RlbCBpcyBsb2FkZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHZhbGlkYXRvciBpcyBydW5uaW5nIGluIAotICogYXMteW91LXR5cGUgb3IgYnVpbGRlciBiYXNlZCBjb250ZXh0LiBJZiB0aGUgPGNvZGU+bG9hZE1vZGVsPC9jb2RlPiBtZXRob2Qgd2FzIGEgbWV0aG9kIG9uIHRoZSBJVmFsaWRhdG9yLCAKLSAqIHRoZW4gdGhlcmUgd291bGQgbmVlZCB0byBiZSB0d28gdmVyc2lvbnMgb2YgdmFsaWRhdG9ycywgb25lIGZvciBhcy15b3UtdHlwZSBhbmQgb25lIGZvciAKLSAqIGJ1aWxkZXIgYmFzZWQuIEJlY2F1c2UgPGNvZGU+bG9hZE1vZGVsPC9jb2RlPiBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBJVmFsaWRhdG9yLCB3ZSBwcm92aWRlIAotICogdHdvIGRpZmZlcmVudCBJSGVscGVycyBpbnN0ZWFkLCBhbmQgc2hpcCB0aGUgb25lIHNwZWNpZmljIHRvIHRoZSBlbnZpcm9ubWVudC4KLSAqIDwvcD4KLSAqIDxwPgotICogRWFjaCBJVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50YXRpb24gbG9hZHMgYSBzcGVjaWZpYyBtb2RlbCBhcyBpZGVudGlmaWVkIGJ5IGEgU3RyaW5nCi0gKiA8Y29kZT5zeW1ib2xpY05hbWU8L2NvZGU+LiBUaGUgc3ltYm9saWNOYW1lIGNhbiBiZSBhbnkgdmFsdWUgZXhjZXB0IG51bGwgb3IgdGhlIAotICogZW1wdHkgc3RyaW5nLiBFYWNoIHZhbGlkYXRvciBpZGVudGlmaWVzIHRoZSBzeW1ib2xpYyBuYW1lcyB3aGljaCBpdCBuZWVkcywgYW5kIHRoZQotICogdHlwZSBvZiBtb2RlbCB3aGljaCBuZWVkcyB0byBiZSByZXR1cm5lZCB3aGVuIHRoYXQgc3ltYm9saWMgbmFtZSBpcyBsb2FkZWQgdmlhIGEgCi0gKiA8Y29kZT5sb2FkTW9kZWw8L2NvZGU+IG1ldGhvZC4gQW4gSVZhbGlkYXRpb25Db250ZXh0IGNhbiBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgSVZhbGlkYXRvcjsgCi0gKiB0aGUgaGVscGVyIG5lZWRzIHRvIHN1cHBvcnQgZXZlcnkgbW9kZWwgdGhhdCBlYWNoIHZhbGlkYXRvciBuZWVkcy4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvbkNvbnRleHQgewotCS8qKgotCSAqIDxwPgotCSAqIExvYWQgdGhlIG1vZGVsIGlkZW50aWZpZWQgYnkgPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPi4gPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPiAKLQkgKiBtdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbGlkYXRvciBuZWVkcyB0byBiZSBydW4gaW4gYm90aCAKLQkgKiBhcy15b3UtdHlwZSBhbmQgYnVpbGRlciBiYXNlZCB2YWxpZGF0aW9uLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc3ltYm9saWNOYW1lIGlzIGEgc3RyaW5nIG5hbWUgdGhhdCBpcyByZWdpc3RlcmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLQkgKiBJVmFsaWRhdG9yQ29udGV4dC4gRm9yIGFuIGV4YW1wbGUgb3VyIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsb2FkTW9kZWwgdXNlCi0JICogbWV0aG9kIG5hbWVzIGZvciBzeW1ib2xpY05hbWVzIHRvIGxvYWQgdGhlIG1vZGVsIG9iamVjdCB0byBiZSB2YWxpZGF0ZWQuIFVzZXJzIGNhbgotCSAqIHVzZSB0aGVpciBvd24gbW9kZWwgbG9hZCBtZWNoYW5pc20uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgPGNvZGU+V29ya2JlbmNoQ29udGV4dDwvY29kZT4KLQkgKi8KLQlPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUpOwotCi0JLyoKLQkgKiAKLQkgKiBbaXNzdWUgOiBDUyAtIEl0J3Mgbm90IGF0IGFsbCBjbGVhciBob3cgdGhlc2UgcGFyYW1ldGVycyB3b3VsZCBnZXQgcGFzc2VkIGludG8gYSBoZWxwZXIuICBJJ2Qgc3VnZ2VzdAotCSAqIHByb3ZpZGluZyBnZXRQcm9wZXJ0eSgpIGFuZCBzZXRQcm9wZXJ0eSgpIG1ldGhvZHMgb24gdGhlIGNsYXNzIHRvIGFsbG93IGNvbnRleHR1YWwgaW5mb3JtYXRpb24gdG8gYmUgCi0JICogc3VwcGxpZWQgYW5kIHF1ZXJpZWQgaW4gYSBnZW5lcmljIG1hbm5lci5dCi0JICovCi0JLyoqCi0JICogPHA+Ci0JICogTG9hZCB0aGUgbW9kZWwgaWRlbnRpZmllZCBieSA8Y29kZT5zeW1ib2xpY05hbWU8L2NvZGU+IGFuZCA8Y29kZT5wYXJtczwvY29kZT4uCi0JICogPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPiBtdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbGlkYXRvciAKLQkgKiBuZWVkcyB0byBiZSBydW4gaW4gYm90aCBhcy15b3UtdHlwZSBhbmQgYnVpbGRlciBiYXNlZCB2YWxpZGF0aW9uLiAKLQkgKiBJZiA8Y29kZT5wYXJtczwvY29kZT4gaXMgbnVsbCB0aGVuIHRoaXMKLQkgKiBtZXRob2QgYmVoYXZlcyB0aGUgc2FtZSBhcwotCSAqIAotCSAqIEBsaW5rICNsb2FkTW9kZWwoU3RyaW5nKS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20KLQkgKiBAbGluayAjbG9hZE1vZGVsKFN0cmluZykgYmVjYXVzZSBpdCB0YWtlcyBwYXJhbWV0ZXJzLCBmcm9tIHRoZSBJVmFsaWRhdG9yLCB3aGljaCAKLQkgKiAJCSBhcmUgYXZhaWxhYmxlIG9ubHkgYXQgcnVudGltZS4gSWYgeW91IG5lZWQgdG8gcGFzcyBhIGxpdmUgb2JqZWN0IHRvIHRoZSBJVmFsaWRhdGlvbkNvbnRleHQsIAotCSAqIAkJIHRoaXMgaXMgdGhlIGxvYWRNb2RlbCBtZXRob2QgdG8gdXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lIFN0cmluZyBpZGVudGlmaWVyIGZvciBtb2RlbC4KLQkgKiBAcGFyYW0gcGFybXMgCSAgIExpc3Qgb2YgcGFyYW1ldGVycyB0aGF0IHRoZSBtb2RlbCB0YWtlcyBmb3IgaW52b2NhdGlvbi4KLQkgKi8KLQlPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IHdpdGggdGhlIGxpc3Qgb2YgVVJJJ3MgdGhhdCBuZWVkIHRvIGJlIHZhbGlkYXRlZCBpbiB0aGUKLQkgKiBjYXNlIG9mIEluY3JlbWVudGFsIGJ1aWxkLgotCSAqLwotCQotCVN0cmluZ1tdIGdldFVSSXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmJkNTVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBWYWxpZGF0b3JzLiBBIFZhbGlkYXRvciBpcyBhIGNsYXNzIHdoaWNoIHZlcmlmaWVzIHRoYXQgb2JqZWN0cwotICogZm9sbG93IHNvbWUgcnVsZXMuIEZvciBleGFtcGxlLCBpbiBhIE1PRiBtb2RlbCB3aGljaCByZXByZXNlbnRzIGFuIEVKQiBqYXIsIHRoZSBFSkIgc3BlY2lmaWNhdGlvbgotICogZGV0ZXJtaW5lcyB0aGUgcnVsZXMuIAotICogPHA+Ci0gKiBBIHZhbGlkYXRvciBjYW4gcGVyZm9ybSBmdWxsIHZhbGlkYXRpb24gb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gQWxsIHZhbGlkYXRvcnMgbXVzdCBpbXBsZW1lbnQKLSAqIGZ1bGwgdmFsaWRhdGlvbiBidXQgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiBpcyBvcHRpb25hbC4KLSAqIDwvcD4KLSAqIDxwPgotICogRWFjaCB2YWxpZGF0b3IgbXVzdCBub3QgYmUgdGllZCB0byBhbnkgcGFydGljdWxhciB3b3JrYmVuY2ggaW1wbGVtZW50YXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEEgdmFsaWRhdG9yJ3MgdmVyaWZpY2F0aW9uIHN0YXJ0cyB3aGVuIHRoZSBWYWxpZGF0b3JMYXVuY2hlciBzaW5nbGV0b24gY2FsbHMKLSAqIDxjb2RlPnZhbGlkYXRlPC9jb2RlPi4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9yewotCQotCS8qCi0JICogW2lzc3VlIDogQ1MgLSBQZXJoYXBzIHRoZSBJVmFsaWRhdG9yIHNob3VsZCBiZSByZXF1aXJlZCB0byBwcm92aWRlIGEgJ25hbWUnIHRoYXQgY2FuIGJlIHVzZWQgZGVzY3JpYmUgCi0JICogdGhlIHJ1bm5pbmcgdmFsaWRhdGlvbiAnSm9iJy4gIFRoZW4gdGhlIGZyYW1ld29yayBjb3VsZCBhdXRvbWF0aWNhbGx5IHNheSBzb21ldGhpbmcgbGlrZSAnWFlaIHZhbGlkYXRvciA6IGNsZWFudXAnLgotCSAqIFJlbHlpbmcgb24gdGhlIElWYWxpZGF0b3IgdG8gcHJvdmlkZSBzdWJ0YXNrIGluZm9ybWF0aW9uIHNlZW1zIGVycm9yIHByb25lLl0KLQkgKiBbaXNzdWU6IExNIC0gSXMgdGhlIGNsZWFudXAgbWV0aG9kIG5lY2Vzc2FyeT8gQ2FuIHRoZSBmcmFtZXdvcmsgcHV0IGEgcmVxdWlyZW1lbnQgdGhhdCBjbGllbnQgdmFsaWRhdG9ycyAnY2xlYW4gdXAnCi0JICogIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgdmFsaWRhdGUgbWV0aG9kPyBdIAotCSAqLwotCQotCS8qKgotCSAqIFBlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAgb25jZSB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLiBJZiBjbGVhbnVwIHdpbGwgdGFrZSBzb21lIHRpbWUsIHRoZQotCSAqIElWYWxpZGF0b3Igc2hvdWxkIHJlcG9ydCBzdWJ0YXNrIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHRocm91Z2ggdGhlIElSZXBvcnRlciBwYXJhbWV0ZXIuIFRoZQotCSAqIElSZXBvcnRlciBwYXJhbWV0ZXIgd2lsbCBub3QgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVwb3J0ZXIgVXNlZCBmb3IgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcik7Ci0KLQkvKgotCSAqIFtpc3N1ZSA6IENTIC0gSSdtIGN1cmlvdXMgdG8gdW5kZXJzdGFuZCB3aHkgdGhlIHZhbGlkYXRvciBpcyBub3QgaW52b2tlZCBkaXJlY3RseSBvbiBhIGZpbGUuICBJdCBzZWVtcyBpdCBzaG91bGQgYmUgdGhlCi0JICogZG9tYWluIG9mIGFub3RoZXIgQVBJIHRvIG1hbmFnZSBtYW5hZ2UgaW5jcmVtZW50YWwgZmlsZSBjaGFuZ2VzIGFuZCB0cmlnZ2VyaW5nIHZhbGlkYXRpb25zIGFjY29yZGluZ2x5LiAKLQkgKiBEbyB3ZSBoYXZlIGEgY3VycmVudCB1c2UgY2FzZSBpbiBXVFAgd2hlcmUgdGhlIHZhbGlkYXRvciBkb2VzIGFueXRoaW5nIG1vcmUgdmFsaWRhdGUgYSBmaWxlIGZyb20gdGhlIGNoYW5nZWRGaWxlcyBsaXN0P10KLQkgKi8KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIG9iamVjdHMuCi0JICogPHA+Ci0JICogPGNvZGU+aGVscGVyPC9jb2RlPiBhbmQgPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IG1heSBub3QgYmUgbnVsbC4gPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPgotCSAqIG1heSBiZSBudWxsLCBpZiBhIGZ1bGwgYnVpbGQgaXMgZGVzaXJlZC4gPGJyPgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gaGVscGVyIAotCSAqIAkJCUxvYWRzIGFuIG9iamVjdC4gCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogCQkJSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4KLQkgKiAKLQkgKi8KLQl2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yRXh0ZW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODFhNmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3JFeHRlbmRlciB7Ci0KLQl2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNWU3YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBKb2IgaW50ZXJmYWNlIGZvciB0aGUgdmFsaWRhdG9yLiBWYWxpZGF0b3JzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBhcmUgZXhlY3V0ZWQgYXMKLSAqIGJhY2tncm91bmQgam9icy4gCi0gKiBGb2xsb3dpbmcgaXMgYSBzZXF1ZW5jZSBvZiAgY2FsbHM6Ci0gKiA8dWw+Ci0gKiA8bGk+dmFsaWRhdG9yLmdldFNjaGVkdWxpbmdSdWxlKGhlbHBlcikKLSAqIDxsaT52YWxpZGF0b3IudmFsaWRhdGUocmVwb3J0ZXIpCi0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3JKb2IgZXh0ZW5kcyBJVmFsaWRhdG9yewotCi0JSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIsIDAsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkKLQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBvYmplY3RzLgotCSAqIDxwPgotCSAqIDxjb2RlPnJlcG9ydGVyPC9jb2RlPiBtYXkgbm90IGJlIG51bGwuIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4KLQkgKiBtYXkgYmUgbnVsbCwgaWYgYSBmdWxsIGJ1aWxkIGlzIGRlc2lyZWQuIDxicj4KLQkgKiA8L3A+Ci0gICAgICoKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiAgICAgICAgICAgIElzIGFuIGluc3RhbmNlIG9mIGFuIElSZXBvcnRlciBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgZm9yIGludGVyYWN0aW9uIHdpdGggdGhlCi0JICogICAgICAgICAgICB1c2VyLgotCSAqIEBwYXJhbSBoZWxwZXIgV2lsbCBub3QgYmUgbnVsbCwgbG9hZHMgYW4gb2JqZWN0LgotCSAqLwotCUlTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogR2V0IHRoZSBzY2hlZHVsaW5nIHJ1bGUsIHdoaWNoIHRoZSBmcmFtZXdvcmsgYXBwbGllcyB0byB0aGUgVmFsaWRhdG9yIGpvYi4KLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyIFdpbGwgbm90IGJlIG51bGwsIGxvYWRzIGFuIG9iamVjdC4KLQkgKi8KLQlJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTg2YmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotLyoKLSAqIFtpc3N1ZTogTE0gLSBHb2luZyBhbG9uZyB3aXRoIG15IGNvbW1lbnQgb24gdGhlIGFkZE1lc3NhZ2UgbWV0aG9kIGluIElSZXBvcnRlciBJIAotICogIHRoaW5rIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqICBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYSBuZWVkIGZvciB0aGlzIGNsYXNzIHRvIGJlIGV4cG9zZWQgdG8gY2xpZW50cy4gSWYgdG9vIG1hbnkKLSAqICBtZXNzYWdlcyBhcmUgYWRkZWQgdGhlIGZyYW1ld29yayBzaG91bGQgaGFuZGxlIHRoaXMgd2l0aG91dCBub3RpZnlpbmcgdGhlIGNsaWVudAotICogIHZhbGlkYXRvci4gXQotICovCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieQotICogCi0gKiBAc2VlIElSZXBvcnRlciNhZGRNZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKSBtZXRob2QgaWYgbm8gbW9yZSBtZXNzYWdlcyBjYW4gYmUgcmVwb3J0ZWQKLSAqICAgICAgYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaGFzIGJlZW4gcmVwb3J0ZWQuCi0gKiAgQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBub3QgbG9uZ2VyIHVzZWQgYnkgdGhlIGZyYW1ld29yay4gVGhlIGZyYW1ld29yayBpcwotICogIG5vdCBnb2luZyB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGRpc3BsYXllZCBieSBhIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MDM0ODk3MTkwNzQ1NzY2OTQwTDsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiZGIyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VmFsaWRhdGlvbiBGcmFtZXdvcmsgKFZlcnNpb24gMSk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5BbiBlYXJsaWVyIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLjwvcD4KLTxwPlRoaXMgZnJhbWV3b3JrIGlzIGJlaW5nIHJlcGxhY2VkIGJ5IHRoZSA8Y29kZT5uZXdlciBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvY29kZT4gZnJhbWV3b3JrLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2MxZDU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMjsKLQotLyoqCi0gKiBUaGUgY2xhc3MgdGhhdCBhbGwgVmFsaWRhdG9ycyB0aGF0IHdpc2ggdG8gdXNlIHZlcnNpb24gdHdvIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBtdXN0IHN1YmNsYXNzLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdG9yIHsKLQkKLQlwcml2YXRlIFYyIF9wYXJlbnQ7Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIHJlc291cmNlLiBUaGUgdmFsaWRhdG9yIGlzIGNhbGxlZCBmcm9tIGEgV29ya3NwYWNlSm9iLCBzbwotCSAqIHRoZSB2YWxpZGF0b3IgaXRzZWxmIGRvZXMgbm90IG5lZWQgdG8gZXN0YWJsaXNoIGl0J3Mgb3duIElXb3Jrc3BhY2VSdW5uYWJsZS4KLQkgKiA8cD4KLQkgKiBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgdGhlbiB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgb3RoZXIgdmFsaWRhdGUgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAJCVRoZSByZXNvdXJjZSB0byBiZSB2YWxpZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIGtpbmQKLQkgKiAJCVRoZSB3YXkgdGhlIHJlc291cmNlIGNoYW5nZWQuIEl0IHVzZXMgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSBraW5kCi0JICogCQlwYXJhbWV0ZXIgaW4gSVJlc291cmNlRGVsdGEuCi0JICogCi0JICogQHBhcmFtIHN0YXRlCi0JICogCQlBIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lCi0JICogCQlpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcGhhc2UuCi0JICogCQlBdCB0aGUgZW5kIG9mIHRoZSB2YWxpZGF0aW9uIHBoYXNlLCB0aGlzIG9iamVjdCB3aWxsIGJlIGNsZWFyZWQsCi0JICogCQl0aGVyZWJ5IGFsbG93aW5nIGFueSBvZiB0aGlzIHN0YXRlIGluZm9ybWF0aW9uIHRvIGJlIGdhcmJhZ2VkCi0JICogCQljb2xsZWN0ZWQuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAJCUEgbW9uaXRvciB0aGF0IHlvdSBjYW4gdXNlIHRvIHJlcG9ydCB5b3VyIHByb2dyZXNzLiBUbyBiZSBhIHdlbGwKLQkgKiAJCWJlaGF2ZWQgdmFsaWRhdG9yIHlvdSBuZWVkIHRvIGNoZWNrIHRoZSBpc0NhbmNlbGxlZCgpIG1ldGhvZCBhdAotCSAqIAkJYXBwcm9wcmlhdGUgdGltZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSB2YWxpZGF0aW9uLiBUaGlzIG1heSBiZSwgYnV0IHVzdWFsbHkgaXNuJ3QsIG51bGwuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIHJlc291cmNlLiBUaGUgdmFsaWRhdG9yIGlzIGNhbGxlZCBmcm9tIGEgV29ya3NwYWNlSm9iLCBzbwotCSAqIHRoZSB2YWxpZGF0b3IgaXRzZWxmIGRvZXMgbm90IG5lZWQgdG8gZXN0YWJsaXNoIGl0J3Mgb3duCi0JICogSVdvcmtzcGFjZVJ1bm5hYmxlLgotCSAqIDxwPgotCSAqIElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0aGVuIHlvdSBzaG91bGQgbm90IG92ZXJyaWRlIHRoZSBvdGhlcgotCSAqIHZhbGlkYXRlIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZCBhbmQgd2h5Ci0JICogICAgICAgICAgICBpdCBzaG91bGQgYmUgdmFsaWRhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZQotCSAqICAgICAgICAgICAgQSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZQotCSAqICAgICAgICAgICAgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0byB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uCi0JICogICAgICAgICAgICBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGUgdmFsaWRhdGlvbiBwaGFzZSwgdGhpcyBvYmplY3Qgd2lsbCBiZQotCSAqICAgICAgICAgICAgY2xlYXJlZCwgdGhlcmVieSBhbGxvd2luZyBhbnkgb2YgdGhpcyBzdGF0ZSBpbmZvcm1hdGlvbiB0byBiZQotCSAqICAgICAgICAgICAgZ2FyYmFnZWQgY29sbGVjdGVkLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIG1vbml0b3IgdGhhdCB5b3UgY2FuIHVzZSB0byByZXBvcnQgeW91ciBwcm9ncmVzcy4gVG8gYmUgYQotCSAqICAgICAgICAgICAgd2VsbCBiZWhhdmVkIHZhbGlkYXRvciB5b3UgbmVlZCB0byBjaGVjayB0aGUgaXNDYW5jZWxsZWQoKQotCSAqICAgICAgICAgICAgbWV0aG9kIGF0IGFwcHJvcHJpYXRlIHRpbWVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgdmFsaWRhdGlvbi4gTnVsbCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQuIElmCi0JICogICAgICAgICBudWxsIGlzIHJldHVybmVkIHRoZW4gdGhlIG90aGVyIHZhbGlkYXRlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcwotCSAqICAgICAgICAgd2VsbC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShWYWxpZGF0aW9uRXZlbnQgZXZlbnQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIEEgY2FsbCBiYWNrIG1ldGhvZCB0aGF0IGxldHMgdGhlIHZhbGlkYXRvciBrbm93IHRoYXQgdGhlIHByb2plY3QgaXMgYmVpbmcKLQkgKiBjbGVhbmVkLiBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgdmFsaWRhdG9yIGEgY2hhbmNlIHRvIGRvIGFueSBzcGVjaWFsCi0JICogY2xlYW51cC4gVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgZW50aXJlIHdvcmtzcGFjZSBpcyBiZWluZyBjbGVhbmVkLCB0aGVuIHRoZSBmaXJzdCBjYWxsIHdpbGwgaGF2ZSBhCi0JICogbnVsbCBwcm9qZWN0LCBhbmQgdGhlbiB0aGVyZSB3aWxsIGJlIHN1YnNlcXVlbnQgY2FsbHMgZm9yIGVhY2ggb3BlbgotCSAqIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS48L3A+Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAJCVRoZSBwcm9qZWN0IGJlaW5nIGNsZWFuZWQuIFRoaXMgbWF5IGJlIG51bGwsIHdoaWNoIGlzIGFuIGluZGljYXRpb24KLQkgKiAJCXRoYXQgdGhlIHdvcmtzcGFjZSBpcyBiZWluZyBjbGVhbmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZQotCSAqIAkJQSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZQotCSAqIAkJaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0byB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogCQlUaGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuCi0JICogCQl0YWtlcyBhIGxvbmcgdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbihJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7CQkKLQl9Ci0JCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuIEl0IGFsbG93cwotCSAqIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkgaW5pdGlhbGl6YXRpb24gdGhhdCB0aGV5IG1pZ2h0IG5lZWQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAJCVRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLiBGb3IgdGhlIHZlcnkgZmlyc3QgY2FsbCBpbiB0aGUKLQkgKiAJCXZhbGlkYXRpb24gcGhhc2UsIHRoaXMgd2lsbCBiZSBudWxsLiBBIG51bGwgcHJvamVjdCBpcyB0aGUgc2lnbmFsCi0JICogCQl0aGF0IGEgdG9wIGxldmVsIHZhbGlkYXRpb24gaXMgc3RhcnRpbmcuIFN1YnNlcXVlbnRseSwgdGhlIHByb2plY3QKLQkgKiAJCXdpbGwgYmUgc2V0LCBhcyBlYWNoIG9mIHRoZSBpbmRpdmlkdWFsIHByb2plY3RzIGFyZSB2YWxpZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXRlCi0JICogCQlBIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lCi0JICogCQlpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcGhhc2UuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAJCVRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgaW5pdGlhbGl6YXRpb24KLQkgKiAJCXRha2VzIGEgbG9uZyB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7CQkKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLiBJdCBhbGxvd3MKLQkgKiB2YWxpZGF0b3JzIHRvIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCB0aGV5IG1pZ2h0IG5lZWQgdG8gZG8uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAJCVRoZSBwcm9qZWN0IHRoYXQgd2FzIHZhbGlkYXRlZC4gVGhlIHZlcnkgbGFzdCBjYWxsIGluIHRoZSB2YWxpZGF0aW9uCi0JICogCQlzZXRzIHRoaXMgdG8gbnVsbCBzbyB0aGF0IHRoZSB2YWxpZGF0b3Iga25vd3MgdGhhdCBhbGwgdGhlCi0JICogCQlwcm9qZWN0cyBoYXZlIG5vdyBiZWVuIHZhbGlkYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGUKLQkgKiAJCUEgd2F5IHRvIHBhc3MgYXJiaXRyYXJ5LCB2YWxpZGF0b3Igc3BlY2lmaWMsIGRhdGEgZnJvbSBvbmUKLQkgKiAJCWludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIAkJVGhlIG1vbml0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGlmIHRoZSBjbGVhbnVwCi0JICogCQl0YWtlcyBhIGxvbmcgdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsJCQotCX0KLQkKLQkvKioKLQkgKiBTaG91bGQgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGZpcnN0IGNsZWFyIHRoZSBtYXJrZXJzIHRoYXQgdGhpcwotCSAqIHZhbGlkYXRvciBoYXMgcGxhY2VkIG9uIHRoaXMgcmVzb3VyY2U/IFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5Ci0JICogdmFsaWRhdG9yIGltcGxlbWVudG9ycyB0byBwcm92aWRlIGEgdmFsaWRhdG9yIHNwZWNpZmljIGJlaGF2aW9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHZhbGlkYXRpb24uCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzaG91bGQgZmlyc3QgY2xlYXIgYWxsIHRoZQotCSAqICAgICAgICAgbWFya2VycyB0aGF0IHRoaXMgdmFsaWRhdG9yIHByb2R1Y2VkLiBUaGlzIGlzIHRoZSBkZWZhdWx0Ci0JICogICAgICAgICBiZWhhdmlvci4gUmV0dXJuIGZhbHNlIHRvIGxlYXZlIHRoZSBtYXJrZXJzIHVuY2hhbmdlZC4gSXQgdGhlbgotCSAqICAgICAgICAgYmVjb21lcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHZhbGlkYXRvciB0byBtYW5hZ2UgaXQncyBvd24KLQkgKiAgICAgICAgIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UsIGZvciB0aGlzIHZhbGlkYXRpb24gZXZlbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ2xlYXJNYXJrZXJzKFZhbGlkYXRpb25FdmVudCBldmVudCl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkJCi0JLyoqCi0JICogQW5zd2VyIHRoZSB2YWxpZGF0b3IgdGhhdCB5b3UgYmVsb25nIHRvLiBUaGUgdmFsaWRhdG9yIGNvbnRyb2xzIHRoZQotCSAqIGZpbHRlcnMgYW5kIHZhcmlvdXMgb3RoZXIgc2V0dGluZ3MuCi0JICogCi0JICogQG5vb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgVjIgZ2V0UGFyZW50KCl7Ci0JCXJldHVybiBfcGFyZW50OwotCX0KLQkKLQl2b2lkIHNldFBhcmVudChWMiBwYXJlbnQpewotCQlfcGFyZW50ID0gcGFyZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjFjNjdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLS8qKgotICogQSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCBvbiBhbm90aGVyIHJlc291cmNlLgotICogPHA+Ci0gKiBUaGlzIGlzIHJldHVybmVkIGJ5IHRoZSBJRGVwZW5kZW5jeUluZGV4LgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQG5vZXh0ZW5kCi0gKiBAc2VlIElEZXBlbmRlbmN5SW5kZXgKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbnRSZXNvdXJjZSB7Ci0JcHJpdmF0ZSBJUmVzb3VyY2UgCV9yZXNvdXJjZTsKLQlwcml2YXRlIFZhbGlkYXRvcglfdmFsaWRhdG9yOwotCQotCS8qKgotCSAqIEBub3JlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBEZXBlbmRlbnRSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UsIFZhbGlkYXRvciB2YWxpZGF0b3IpewotCQlfcmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVkIG9uLgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBfcmVzb3VyY2U7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgdmFsaWRhdG9yIHRoYXQgYXNzZXJ0ZWQgdGhlIGRlcGVuZGVuY3kuCi0JICovCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNDY2MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgb25seSB0byBiZSBjYWxsZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFuZCBpdCdzIHRlc3QgY2FzZXMuCi0gKiBUaGlzIGNsYXNzIGlzIE5PVCBwYXJ0IG9mIHRoZSBBUEkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIHNvbWUgaW50ZXJuYWwgbWV0aG9kcy4KLSAqIDwvcD4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmllbmQgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNZXNzYWdlcyhWYWxpZGF0b3IgdmFsaWRhdG9yLCBNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBtYXApIHsKLQkJdmFsaWRhdG9yLnNldE1lc3NhZ2VzKG1hcCk7Ci0JfQotCQotCS8qKgotCSAqIEhhcyB0aGUgdmFsaWRhdG9yJ3MgaW1wbGVtZW50YXRpb24gYmVlbiBsb2FkZWQgeWV0PyBUaGlzIGlzIHVzZWQgYnkgc29tZSB0ZXN0IGNhc2VzIHRvIGVuc3VyZSB0aGF0IAotCSAqIHBsdWctaW5zIGFyZSBub3QgbG9hZGVkIHRvbyBlYXJseS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2FkZWQoVmFsaWRhdG9yIHZhbGlkYXRvcil7Ci0JCXJldHVybiB2YWxpZGF0b3IuaXNMb2FkZWQoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKFZhbGlkYXRvciB2YWxpZGF0b3IsIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpc01hbnVhbCwgYm9vbGVhbiBpc0J1aWxkLCAKLQkJCUNvbnRlbnRUeXBlV3JhcHBlciBjb250ZW50VHlwZVdyYXBwZXIpewotCQlyZXR1cm4gdmFsaWRhdG9yLnNob3VsZFZhbGlkYXRlKHJlc291cmNlLCBpc01hbnVhbCwgaXNCdWlsZCwgY29udGVudFR5cGVXcmFwcGVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKFZhbGlkYXRvciB2YWxpZGF0b3IsIElSZXNvdXJjZSByZXNvdXJjZSwgVmFsVHlwZSB2YWxUeXBlLCAKLQkJQ29udGVudFR5cGVXcmFwcGVyIGNvbnRlbnRUeXBlV3JhcHBlcil7Ci0JCQotCQlyZXR1cm4gdmFsaWRhdG9yLnNob3VsZFZhbGlkYXRlKHJlc291cmNlLCB2YWxUeXBlLCBjb250ZW50VHlwZVdyYXBwZXIpOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNaWdyYXRlZChWYWxpZGF0b3IgdmFsaWRhdG9yLCBib29sZWFuIG1pZ3JhdGVkKXsKLQkJdmFsaWRhdG9yLnNldE1pZ3JhdGVkKG1pZ3JhdGVkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkNDk0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLS8qKgotICogVGhpcyBzZXJ2aWNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVzb3VyY2VzIHRoYXQgYSBwYXJ0aWN1bGFyIHJlc291cmNlIGRlcGVuZHMgb24uCi0gKiA8cD4KLSAqIFRoaXMgaXMgYW4gb3B0aW9uYWwgc2VydmljZSwgdmFsaWRhdG9ycyBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBJbnRlcmZhY2UgYW5kIGNhbiBzaW1wbHkgc3VwcGx5Ci0gKiB0aGVpciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIFZhbGlkYXRpb25SZXN1bHQgcmV0dXJuIHJlc3VsdC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBub2ltcGxlbWVudAotICogQHNlZSBWYWxpZGF0aW9uUmVzdWx0Ci0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZXBlbmRlbmN5SW5kZXggewotCQotCS8qKgotCSAqIEFzc2VydCB0aGF0IG9uZSByZXNvdXJjZSBkZXBlbmRzIG9uIGFub3RoZXIgcmVzb3VyY2UgYXMgcGFydCBvZiBpdCdzIHZhbGlkaXR5LgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBpZiBhbiBYTUwgZmlsZSBpcyBkZXBlbmRlbnQgb24gYW4gWFNEIGZpbGUgdG8gYmUgdmFsaWQsIHRoZQotCSAqIHJlc291cmNlIHRoYXQgaG9sZHMgdGhlIFhNTCBmaWxlIHdvdWxkIGJlIHRoZSBkZXBlbmRlbnQsIGFuZCB0aGUgcmVzb3VyY2UKLQkgKiB0aGF0IGhvbGRzIHRoZSBYU0Qgd291bGQgYmUgdGhlIGRlcGVuZHNPbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQlUaGUgdmFsaWRhdG9yIGlkIHRoYXQgaXMgYXNzZXJ0aW5nIHRoYXQgdGhlIGRlcGVuZGVuY3kgZXhpc3RzLgotCSAqIEBwYXJhbSBkZXBlbmRlbnQKLQkgKiAJCVRoZSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgcmVzb3VyY2UuIEZvciBleGFtcGxlIGEgWE1MIGZpbGUuCi0JICogQHBhcmFtIGRlcGVuZHNPbgotCSAqIAkJVGhlIHJlc291cmNlIHRoYXQgdGhpcyBiZWluZyBkZXBlbmRlZCBvbi4gRm9yIGV4YW1wbGUgYSBYU0QgZmlsZS4KLQkgKi8KLQl2b2lkIGFkZChTdHJpbmcgaWQsIElSZXNvdXJjZSBkZXBlbmRlbnQsIElSZXNvdXJjZSBkZXBlbmRzT24pOwotCQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGRlcGVuZGVuY3kgYXNzZXJ0aW9ucyBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogCQlUaGUgcHJvamVjdCB0aGF0IHdpbGwgaGF2ZSBpdCdzIGRlcGVuZGVuY3kgYXNzZXJ0aW9ucyByZW1vdmVkLgotCSAqLwotCXZvaWQgY2xlYXIoSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UuIEZvciBleGFtcGxlLCBpZgotCSAqIHRoaXMgcmVzb3VyY2Ugd2FzIGEgWFNELCB0aGlzIGNvdWxkIGFuc3dlciBhbGwgdGhlIFhNTCBmaWxlcyB0aGF0Ci0JICogZGVwZW5kZWQgb24gaXQgZm9yIHRoZWlyIHZhbGlkaXR5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIAkJQSByZXNvdXJjZSB0aGF0IG90aGVyIHJlc291cmNlcyBtYXkgZGVwZW5kIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlcGVuZGVudCByZXNvdXJjZXMuCi0JICovCi0JTGlzdDxEZXBlbmRlbnRSZXNvdXJjZT4gZ2V0KElSZXNvdXJjZSByZXNvdXJjZSk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UuIEZvciBleGFtcGxlLCBpZgotCSAqIHRoaXMgcmVzb3VyY2Ugd2FzIGEgWFNELCB0aGlzIGNvdWxkIGFuc3dlciBhbGwgdGhlIFhNTCBmaWxlcyB0aGF0Ci0JICogZGVwZW5kZWQgb24gaXQgZm9yIHRoZWlyIHZhbGlkaXR5LgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAkJVGhlIHZhbGlkYXRvciBpZCB0aGF0IGFzc2VydGVkIHRoYXQgdGhlIGRlcGVuZGVuY3kgZXhpc3RzLgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIAkJQSByZXNvdXJjZSB0aGF0IG90aGVyIHJlc291cmNlcyBtYXkgZGVwZW5kIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlcGVuZGVudCByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCBvciBhbiBlbXB0eSBhcnJheSwgaWYKLQkgKiAJdGhlcmUgYXJlIG5vIGRlcGVuZGVudCByZXNvdXJjZXMuCi0JICovCi0JSVJlc291cmNlW10gZ2V0KFN0cmluZyBpZCwgSVJlc291cmNlIHJlc291cmNlKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiBvdGhlciByZXNvdXJjZXMgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogCQlUaGUgcmVzb3VyY2UgYmVpbmcgdGVzdGVkLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIHZhbGlkYXRvcnMgYXNzZXJ0ZWQgYSBkZXBlbmRlbmN5IG9uIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JYm9vbGVhbiBpc0RlcGVuZGVkT24oSVJlc291cmNlIHJlc291cmNlKTsKLQkKLQkvKioKLQkgKiBSZXBsYWNlIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIGRlcGVuZGVudCBkZXBlbmRzIG9uLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAkJVGhlIHZhbGlkYXRvciBpZCB0aGF0IGlzIGFzc2VydGluZyB0aGF0IHRoZSBkZXBlbmRlbmN5IGV4aXN0cy4KLQkgKiBAcGFyYW0gZGVwZW5kZW50Ci0JICogCQlUaGUgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIG90aGVyIHJlc291cmNlLgotCSAqIEBwYXJhbSBkZXBlbmRzT24KLQkgKiAJCUFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIGRlcGVuZGVkIG9uLiBUaGlzIGNhbiBiZSBudWxsIG9yIGEgemVybwotCSAqIAkJbGVuZ3RoIGFycmF5LiBOdWxsIG9yIGEgemVybyBsZW5ndGggYXJyYXkgcmVtb3ZlcyBhbGwgdGhlIGRlcGVuZGVuY2llcy4KLQkgKi8KLQl2b2lkIHNldChTdHJpbmcgaWQsIElSZXNvdXJjZSBkZXBlbmRlbnQsIElSZXNvdXJjZVtdIGRlcGVuZHNPbik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmI2NjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLS8qKgotICogQSB2YWxpZGF0b3IgdGhhdCBoYXMgZmllbGRzIHRoYXQgY2FuIGJlIHVwZGF0ZWQuCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIHVzZWQgdG8gY2hhbmdlIGEgVmFsaWRhdG9yJ3Mgc2V0dGluZ3MuCi0gKiA8b2w+Ci0gKiA8bGk+QW4gSU11dGFibGVWYWxpZGF0b3IgaXMgcmV0cmlldmVkLjwvbGk+Ci0gKiA8bGk+VGhlIElNdXRhYmxlVmFsaWRhdG9yIGlzIGNoYW5nZWQuPC9saT4KLSAqIDxsaT5UaGUgSU11dGFibGVWYWxpZGF0b3IgaXMgImFjdGl2YXRlZCIuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD5UaGUgbWV0aG9kcyB7QGxpbmsgVmFsaWRhdGlvbkZyYW1ld29yayNnZXRQcm9qZWN0U2V0dGluZ3Mob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpfSBhbmQgCi0gKiB7QGxpbmsgVmFsaWRhdGlvbkZyYW1ld29yayNnZXRXb3Jrc3BhY2VTZXR0aW5ncygpfSBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBJTXV0YWJsZVZhbGlkYXRvcidzLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQG5vZXh0ZW5kIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNdXRhYmxlVmFsaWRhdG9yIHsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHZhbGlkYXRvcidzIGlkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHZhbGlkYXRvcidzIG5hbWUuCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSB2YWxpZGF0b3IncyBjbGFzcyBuYW1lLgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIGlmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi4KLQkgKi8KLQlib29sZWFuIGlzQnVpbGRWYWxpZGF0aW9uKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIGlmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBmb3IgbWFudWFsIGJhc2VkIHZhbGlkYXRpb24uCi0JICovCi0JYm9vbGVhbiBpc01hbnVhbFZhbGlkYXRpb24oKTsKLQkKLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGUgdmFsaWRhdG9yIHNob3VsZCBiZSBlbmFibGVkIGZvciBidWlsZCBiYXNlZCB2YWxpZGF0aW9uLgotCSAqLwotCXZvaWQgc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4gYnVpbGQpOwotCQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoZSB2YWxpZGF0b3Igc2hvdWxkIGJlIGVuYWJsZWQgZm9yIG1hbnVhbCBiYXNlZCB2YWxpZGF0aW9uLgotCSAqLwkKLQl2b2lkIHNldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbiBtYW51YWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NTEyNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQSBzZXJ2aWNlIHRoYXQgY29sbGVjdHMgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gb24gdmFsaWRhdGlvbiBvcGVyYXRpb25zLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQG5vZXh0ZW5kIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBieSBjbGllbnRzLgotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGVyZm9ybWFuY2VNb25pdG9yIHsKLQkKLQkvKioKLQkgKiBUaGUgbGV2ZWwgb2YgaW5mb3JtYXRpb24gdG8gY29sbGVjdC4KLQkgKi8KLQlwdWJsaWMgZW51bSBDb2xsZWN0aW9uTGV2ZWwge05vbmUsIERlZmF1bHR9Ci0JCi0JLyoqIAotCSAqIEFkZCB0aGlzIHBlcmZvcm1hbmNlIGNvdW50ZXIgdG8gdGhlIG1vbml0b3IuIFRoZSBtb25pdG9yIHdpbGwgZGVjaWRlIHdoYXQgdG8gCi0JICogZG8gd2l0aCB0aGUgcmVzdWx0cywgaXQgbWF5IGxvZyB0aGVtIHRvIGEgZmlsZSwgb3IgaXQgbWF5IHNpbXBseSBob2xkIG9uIHRvIHRoZW0uCi0JICogCi0JICogQHBhcmFtIGNvdW50ZXJzCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFBlcmZvcm1hbmNlQ291bnRlcnMgY291bnRlcnMpOwotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGlzIGNvbGxlY3RpbmcgcGVyZm9ybWFuY2UgZXZlbnRzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGluZygpOwotCQotCS8qKiBBbnN3ZXIgdHJ1ZSBpZiBvbmx5IHN1bW1hcnkgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkLiAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VtbWFyeU9ubHkoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHBlcmZvcm1hbmNlIGV2ZW50IGNvbGxlY3Rpb24gbGV2ZWwuIFRoaXMgY29udHJvbHMgd2hpY2gKLQkgKiBwZXJmb3JtYW5jZSBldmVudHMgYXJlIGNvbGxlY3RlZCwgaW5jbHVkaW5nIG5vbmUgb2YgdGhlbS4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAJCVRoZSBsZXZlbCB0byBjb2xsZWN0LiBUaGUgZGVmYXVsdCBpcyB0byBub3QgY29sbGVjdCBhbnl0aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uTGV2ZWwoQ29sbGVjdGlvbkxldmVsIGxldmVsKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGxldmVsIG9mIHBlcmZvcm1hbmNlIGV2ZW50cyB0aGF0IGFyZSBiZWluZyBjb2xsZWN0ZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uTGV2ZWwgZ2V0Q29sbGVjdGlvbkxldmVsKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyB0aGF0IGhhdmUgYmVlbiBjb2xsZWN0ZWQgc28gZmFyLiBTb21lCi0JICogbW9uaXRvcnMgZG8gbm90IHNhdmUgY291bnRlcnMsIGFuZCB0aGV5IHdpbGwgYWx3YXlzIHJldHVybiBhbiBlbXB0eSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBhc1N1bW1hcnkKLQkgKiAJCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIG9ubHkgYW5zd2VyIGEgc3VtbWFyeSBvZiB0aGUgY291bnRlcnMuCi0JICovCi0JcHVibGljIExpc3Q8UGVyZm9ybWFuY2VDb3VudGVycz4gZ2V0UGVyZm9ybWFuY2VDb3VudGVycyhib29sZWFuIGFzU3VtbWFyeSk7Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBjb2xsZWN0ZWQgcGVyZm9ybWFuY2UgY291bnRlcnMuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQZXJmb3JtYW5jZUNvdW50ZXJzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRmZWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogVmFsaWRhdG9ycyBtYXkgd2lzaCB0byBqb2luIHZhbGlkYXRvciBncm91cHMgZm9yIHBlcmZvcm1hbmNlIG9yIG90aGVyCi0gKiByZWFzb25zLiBUaGF0IHdheSBleHBlbnNpdmUgb3BlcmF0aW9ucyBsaWtlIGNyZWF0aW5nIGFuZCByZWxlYXNpbmcgbW9kZWxzIGNhbgotICogYmUgZG9uZSBpbiBhIGNvbW1vbiBsb2NhdGlvbiwgYW5kIGJlIGRvbmUgb25seSBvbmNlIHBlciByZXNvdXJjZS4gR3JvdXAgbGlzdGVuZXJzCi0gKiBhcmUgZGVjbGFyZWQgdmlhIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JHcm91cDwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiBBcyB2YWxpZGF0aW9uIHByb2NlZWRzLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIG9uIGEgcmVzb3VyY2UgYnkgcmVzb3VyY2UKLSAqIGJhc2VzLCBkZXRlcm1pbmVzIGlmIGFueSB2YWxpZGF0b3JzIHRoYXQgYXJlIG1lbWJlcnMgb2YgYSBncm91cCBhcmUKLSAqIGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlLiBJZiB0aGV5IGFyZSwgYmVmb3JlIHRoZSBmaXJzdCB2YWxpZGF0b3IgaW4gdGhlCi0gKiBncm91cCBpcyBjYWxsZWQsIHRoZSA8Y29kZT52YWxpZGF0aW9uU3RhcnRpbmc8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoaXMgbWV0aG9kIHdhcwotICogY2FsbGVkLCB0aGVuIHRoZSA8Y29kZT52YWxpZGF0aW9uRmluaXNoaW5nPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb25jZSBhbGwgdGhlCi0gKiB2YWxpZGF0b3JzIGhhdmUgcHJvY2Vzc2VkIHRoZSByZXNvdXJjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciB7Ci0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCB2YWxpZGF0b3IgaW4gdGhlIGdyb3VwIHRoYXQgaXMgaW50ZXJlc3RlZAotCSAqIGluIHRoZSByZXNvdXJjZSBpcyBjYWxsZWQuIElmIG5vIHZhbGlkYXRvcnMgaW4gdGhlIGdyb3VwIGFyZSBpbnRlcmVzdGVkCi0JICogaW4gdGhlIHJlc291cmNlLCB0aGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyB2YWxpZGF0ZWQuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvciB0aGF0IHRoZSBtZXRob2Qgc2hvdWxkIHVzZS4KLQkgKiBAcGFyYW0gc3RhdGUKLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIHN0YXRlIGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24uCi0JICovCi0Jdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSk7Ci0JCi0JLyoqCi0JICogSWYgdGhlIHZhbGlkYXRpb25TdGFydGluZyBtZXRob2Qgd2FzIGNhbGxlZCBvbiB0aGUgcmVzb3VyY2UsIHRoZW4gdGhpcwotCSAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCB2YWxpZGF0b3IgaGFzIHByb2Nlc3NlZCB0aGUKLQkgKiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAJCVRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIAkJQSBwcm9ncmVzcyBtb25pdG9yIHRoYXQgdGhlIG1ldGhvZCBjYW4gdXNlLgotCSAqIEBwYXJhbSBzdGF0ZQotCSAqIAkJVGhlIHZhbGlkYXRpb24gc3RhdGUgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLQkgKi8KLQl2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYWEzYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWVzc2FnZXM7Ci0KLS8qKgotICogQXNzb2NpYXRlIGEgbWVzc2FnZSBzZXZlcml0eSB3aXRoIGEgbWVzc2FnZSBjYXRlZ29yeS4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBub2V4dGVuZAotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgewotCXB1YmxpYyBlbnVtIFNldmVyaXR5IHsKLQkJRXJyb3IoVmFsTWVzc2FnZXMuU2V2RXJyb3IsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpLAotCQlXYXJuaW5nKFZhbE1lc3NhZ2VzLlNldldhcm5pbmcsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyksCi0JCUlnbm9yZShWYWxNZXNzYWdlcy5TZXZJZ25vcmUsIElNYXJrZXIuU0VWRVJJVFlfSU5GTyk7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBfc2V2ZXJpdHlMYWJlbDsKLQkJcHJpdmF0ZSBTZXZlcml0eShTdHJpbmcgbGFiZWwsIGludCBtYXJrZXJTZXZlcml0eSl7Ci0JCQlfc2V2ZXJpdHlMYWJlbCA9IGxhYmVsOwotCQkJX21hcmtlclNldmVyaXR5ID0gbWFya2VyU2V2ZXJpdHk7Ci0JCX0KLQkJcHJpdmF0ZSBpbnQJCV9tYXJrZXJTZXZlcml0eTsKLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIF9zZXZlcml0eUxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFuc3dlciB0aGUgYXNzb2NpYXRlZCBJTWFya2VyIHNldmVyaXR5LgotCQkgKi8KLQkJcHVibGljIGludCBnZXRNYXJrZXJTZXZlcml0eSgpIHsKLQkJCXJldHVybiBfbWFya2VyU2V2ZXJpdHk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nCQlfaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgCQlfbGFiZWw7Ci0JcHJpdmF0ZSBTZXZlcml0eSAJX2RlZmF1bHQ7Ci0JcHJpdmF0ZSBTZXZlcml0eSAJX2N1cnJlbnQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBsYWJlbCBhbmQgYSBtZXNzYWdlIHNldmVyaXR5LgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAkJQW4gaWQgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcGFydGljdWxhciBzZXR0aW5nLiBUaGlzIG11c3QgYmUKLQkgKiAJCXVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogCQlBbiBlbmQgdXNlciBzdHJpbmcsIHRoYXQgY2FuIGRlc2NyaWJlIGVpdGhlciBhbiBpbmRpdmlkdWFsIG1lc3NhZ2UKLQkgKiAJCW9yIGEgbWVzc2FnZSBjYXRlZ29yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVmYXVsdFNldmVyaXR5Ci0JICogCQlUaGUgZGVmYXVsdCBzZXZlcml0eSBmb3IgdGhpcyBsYWJlbC4gSWYgdGhlIGVuZCB1c2VyIGRvZXNuJ3QgY2hhbmdlCi0JICogCQlhbnl0aGluZyB0aGlzIGlzIHdoYXQgdGhlIHNldmVyaXR5IHdpbGwgYmUuCi0JICovCi0JcHVibGljIE1lc3NhZ2VTZXZlcml0eVNldHRpbmcoU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIFNldmVyaXR5IGRlZmF1bHRTZXZlcml0eSl7Ci0JCV9pZCA9IGlkOwotCQlfbGFiZWwgPSBsYWJlbDsKLQkJX2RlZmF1bHQgPSBkZWZhdWx0U2V2ZXJpdHk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoID0gMDsKLQkJaWYgKF9jdXJyZW50ICE9IG51bGwpaCArPSBfY3VycmVudC5nZXRNYXJrZXJTZXZlcml0eSgpKjEwMDA7Ci0JCWlmIChfaWQgIT0gbnVsbCloICs9IF9pZC5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gX2xhYmVsOwotCX0KLQotCS8qKiBBbnN3ZXIgdGhlIGRlZmF1bHQgc2V2ZXJpdHkgYXMgZGVmaW5lZCBieSB0aGUgdmFsaWRhdG9yIG93bmVyLiAqLwotCXB1YmxpYyBTZXZlcml0eSBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gX2RlZmF1bHQ7Ci0JfQotCi0JLyoqIAotCSAqIEFuc3dlciB0aGUgY3VycmVudCBzZXZlcml0eSBmb3IgdGhlIG1lc3NhZ2UuIFRoZSBlbmQgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHRoaXMgdGhyb3VnaCBhCi0JICogcHJlZmVyZW5jZSBkaWFsb2cuCi0JICovCi0JcHVibGljIFNldmVyaXR5IGdldEN1cnJlbnQoKSB7Ci0JCWlmIChfY3VycmVudCAhPSBudWxsKXJldHVybiBfY3VycmVudDsKLQkJcmV0dXJuIF9kZWZhdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBpZCB0aGF0IHRoZSB2YWxpZGF0b3Igb3duZXIgYXNzaWduZWQgdG8gdGhlIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIF9pZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgbWVzc2FnZSBzZXZlcml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNldHRpbmcgY2hhbmdlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldEN1cnJlbnQoU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKLQkJaWYgKF9jdXJyZW50ID09IHNldmVyaXR5KXJldHVybiBmYWxzZTsKLQkJX2N1cnJlbnQgPSBzZXZlcml0eTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfaWQgKyAiICIgKyBnZXRDdXJyZW50KCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIGNvcHkgb2YgdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgY29weSgpIHsKLQkJTWVzc2FnZVNldmVyaXR5U2V0dGluZyBtcyA9IG5ldyBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nKF9pZCwgX2xhYmVsLCBfZGVmYXVsdCk7Ci0JCW1zLl9jdXJyZW50ID0gX2N1cnJlbnQ7Ci0JCXJldHVybiBtczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiZjIxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBvdmVyYWxsIHByb2plY3QgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgaXMgdXNlZCB0byBjaGFuZ2UgYSBwcm9qZWN0J3MgVmFsaWRhdGlvbiBzZXR0aW5ncy4KLSAqIDxvbD4KLSAqIDxsaT5UaGUgTXV0YWJsZVByb2plY3RTZXR0aW5ncyBhcmUgcmV0cmlldmVkLjwvbGk+Ci0gKiA8bGk+VGhlIE11dGFibGVQcm9qZWN0U2V0dGluZ3MgYXJlIGNoYW5nZWQuPC9saT4KLSAqIDxsaT5UaGUgTXV0YWJsZVByb2plY3RTZXR0aW5ncyBhcmUgImFwcGxpZWQiLjwvbGk+Ci0gKiA8L29sPgotICogPC9wPgotICogPHA+SW4gb3JkZXIgZm9yIGEgcHJvamVjdCdzIHZhbGlkYXRpb24gc2V0dGluZyB0byBiZSBlZmZlY3RpdmUsIGJvdGggCi0gKiB7QGxpbmsgI2dldE92ZXJyaWRlKCl9IGFuZCB7QGxpbmsgTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzI2dldE92ZXJyaWRlKCl9Ci0gKiBtdXN0IGJlIHRydWUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXNlIHNldHRpbmdzIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCB7QGxpbmsgVmFsaWRhdGlvbkZyYW1ld29yayNnZXRQcm9qZWN0U2V0dGluZ3MoSVByb2plY3QpfS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLQotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE11dGFibGVQcm9qZWN0U2V0dGluZ3MgewotCXByaXZhdGUgZmluYWwgSVByb2plY3QJX3Byb2plY3Q7Ci0KLQlwcml2YXRlIGJvb2xlYW4gX292ZXJyaWRlOwotCXByaXZhdGUgYm9vbGVhbglfc3VzcGVuZDsKLQlwcml2YXRlIGZpbmFsIElNdXRhYmxlVmFsaWRhdG9yW10gX3ZhbGlkYXRvcnM7Ci0JCi0JcHVibGljIElNdXRhYmxlVmFsaWRhdG9yW10gZ2V0VmFsaWRhdG9ycygpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3JzOwotCX0KLQotCXB1YmxpYyBNdXRhYmxlUHJvamVjdFNldHRpbmdzKElQcm9qZWN0IHByb2plY3QsIElNdXRhYmxlVmFsaWRhdG9yW10gdmFsaWRhdG9ycyl7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQkJX3ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzOwotCX0KLQotCS8qKgotCSAqIENhbiB0aGlzIHByb2plY3Qgb3ZlcnJpZGUgdGhlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzPwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE92ZXJyaWRlKCkgewotCQlyZXR1cm4gX292ZXJyaWRlOwotCX0KLQotCS8qKgotCSAqIENoYW5nZSB3aGV0aGVyIHRoaXMgcHJvamVjdCBjYW4gb3ZlcnJpZGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3MuCi0JICogQHBhcmFtIG92ZXJyaWRlIFNldCB0byB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIGFsbG93ZWQgdG8gb3ZlcnJpZGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3MuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnJpZGUoYm9vbGVhbiBvdmVycmlkZSkgewotCQlfb3ZlcnJpZGUgPSBvdmVycmlkZTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB2YWxpZGF0aW9uIHN1c3BlbmRlZCBmb3IgdGhpcyBwcm9qZWN0PwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFN1c3BlbmQoKSB7Ci0JCXJldHVybiBfc3VzcGVuZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgaXMgc3VzcGVuZGluZyBpdCdzIHZhbGlkYXRpb24uCi0JICogQHBhcmFtIHN1c3BlbmQgU2V0IHRvIHRydWUsIHRvIHN1c3BlbmQgdmFsaWRhdGlvbiBmb3IgdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1c3BlbmQoYm9vbGVhbiBzdXNwZW5kKSB7Ci0JCV9zdXNwZW5kID0gc3VzcGVuZDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHByb2plY3QgdGhhdCB0aGVzZSBzZXR0aW5ncyBhcmUgZm9yLgotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDE4ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlc1ZhbHVlczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIG92ZXJhbGwgd29ya3NwYWNlIHZhbGlkYXRpb24gc2V0dGluZ3MuCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIHVzZWQgdG8gY2hhbmdlIGEgcHJvamVjdCdzIFZhbGlkYXRpb24gc2V0dGluZ3MuCi0gKiA8b2w+Ci0gKiA8bGk+VGhlIE11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyBhcmUgcmV0cmlldmVkLjwvbGk+Ci0gKiA8bGk+VGhlIE11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyBhcmUgY2hhbmdlZC48L2xpPgotICogPGxpPlRoZSBNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MgYXJlICJhcHBsaWVkIi48L2xpPgotICogPC9vbD4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlc2Ugc2V0dGluZ3MgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHtAbGluayBWYWxpZGF0aW9uRnJhbWV3b3JrI2dldFdvcmtzcGFjZVNldHRpbmdzKCl9LgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIHsKLQotCXByaXZhdGUgZmluYWwgR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMgX3ZhbHVlczsKLQkKLQlwcml2YXRlIGZpbmFsIElNdXRhYmxlVmFsaWRhdG9yW10gX3ZhbGlkYXRvcnM7Ci0JCi0JcHVibGljIElNdXRhYmxlVmFsaWRhdG9yW10gZ2V0VmFsaWRhdG9ycygpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3JzOwotCX0KLQotCXB1YmxpYyBNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MoSU11dGFibGVWYWxpZGF0b3JbXSB2YWxpZGF0b3JzLCBHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcyB2YWx1ZXMpewotCQlfdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7Ci0JCV92YWx1ZXMgPSB2YWx1ZXM7Ci0JfQotCQotCXB1YmxpYyBHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcyBnZXRHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcygpewotCQlyZXR1cm4gX3ZhbHVlczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0QXV0b1NhdmUoKSB7Ci0JCXJldHVybiBfdmFsdWVzLnNhdmVBdXRvbWF0aWNhbGx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF1dG9TYXZlKGJvb2xlYW4gYXV0b1NhdmUpIHsKLQkJX3ZhbHVlcy5zYXZlQXV0b21hdGljYWxseSA9IGF1dG9TYXZlOwotCX0KLQotCS8qKgotCSAqIENhbiB0aGlzIHByb2plY3Qgb3ZlcnJpZGUgdGhlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzPwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE92ZXJyaWRlKCkgewotCQlyZXR1cm4gX3ZhbHVlcy5vdmVycmlkZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgY2FuIG92ZXJyaWRlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzLgotCSAqIEBwYXJhbSBvdmVycmlkZSBTZXQgdG8gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhbGxvd2VkIHRvIG92ZXJyaWRlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKLQkJX3ZhbHVlcy5vdmVycmlkZSA9IG92ZXJyaWRlOwotCX0KLQotCS8qKgotCSAqIElzIHZhbGlkYXRpb24gc3VzcGVuZGVkIGZvciB0aGlzIHByb2plY3Q/Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3VzcGVuZCgpIHsKLQkJcmV0dXJuIF92YWx1ZXMuZGlzYWJsZUFsbFZhbGlkYXRpb247Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHdoZXRoZXIgdGhpcyBwcm9qZWN0IGlzIHN1c3BlbmRpbmcgaXQncyB2YWxpZGF0aW9uLgotCSAqIEBwYXJhbSBzdXNwZW5kIFNldCB0byB0cnVlLCB0byBzdXNwZW5kIHZhbGlkYXRpb24gZm9yIHRoaXMgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXNwZW5kKGJvb2xlYW4gc3VzcGVuZCkgewotCQlfdmFsdWVzLmRpc2FibGVBbGxWYWxpZGF0aW9uID0gc3VzcGVuZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1NzcyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1lc3NhZ2VzOwotCi0vKioKLSAqIFNvbWUgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gZm9yIGEgdmFsaWRhdGlvbiBpbnZvY2F0aW9uLiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAbm9leHRlbmQKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZUNvdW50ZXJzIHsKLQkKLQlwcml2YXRlIGxvbmcJX3doZW47Ci0JcHJpdmF0ZSBTdHJpbmcgCV92YWxpZGF0b3JJZDsKLQlwcml2YXRlIFN0cmluZwlfdmFsaWRhdG9yTmFtZTsKLQlwcml2YXRlIFN0cmluZwlfcmVzb3VyY2VOYW1lOwotCXByaXZhdGUgaW50CQlfbnVtYmVySW52b2NhdGlvbnM7Ci0JcHJpdmF0ZQlsb25nCV9lbGFwc2VkVGltZTsKLQlwcml2YXRlIGxvbmcJX2NwdVRpbWU7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkYXRvcklkCi0JICogQHBhcmFtIHZhbGlkYXRvck5hbWUKLQkgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIAotCSAqIEBwYXJhbSBudW1iZXJJbnZvY2F0aW9ucyBudW1iZXIgb2YgdGltZXMgdGhlIHZhbGlkYXRvciB3YXMgaW52b2tlZAotCSAqIEBwYXJhbSBlbGFwc2VkVGltZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzCi0JICogQHBhcmFtIGNwdVRpbWUgQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMKLQkgKi8KLQlwdWJsaWMgUGVyZm9ybWFuY2VDb3VudGVycyhTdHJpbmcgdmFsaWRhdG9ySWQsIFN0cmluZyB2YWxpZGF0b3JOYW1lLCBTdHJpbmcgcmVzb3VyY2VOYW1lLCAKLQkJaW50IG51bWJlckludm9jYXRpb25zLCBsb25nIGVsYXBzZWRUaW1lLCBsb25nIGNwdVRpbWUpewotCQkKLQkJX3doZW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJX3ZhbGlkYXRvcklkID0gdmFsaWRhdG9ySWQ7Ci0JCV92YWxpZGF0b3JOYW1lID0gdmFsaWRhdG9yTmFtZTsKLQkJX3Jlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKLQkJX251bWJlckludm9jYXRpb25zID0gbnVtYmVySW52b2NhdGlvbnM7Ci0JCV9lbGFwc2VkVGltZSA9IGVsYXBzZWRUaW1lOwotCQlfY3B1VGltZSA9IGNwdVRpbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9ySWQoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9ySWQ7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVySW52b2NhdGlvbnMoKSB7Ci0JCXJldHVybiBfbnVtYmVySW52b2NhdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gCi0JICovCi0JcHVibGljIGxvbmcgZ2V0RWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiBfZWxhcHNlZFRpbWU7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgYW1vdW50IG9mIENQVSB0aW1lIGluIG5hbm9zZWNvbmRzLiBJZiB0aGlzIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwKLQkgKiBhbnN3ZXIgLTEuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0Q3B1VGltZSgpIHsKLQkJcmV0dXJuIF9jcHVUaW1lOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gTkxTLmJpbmQoVmFsTWVzc2FnZXMuTG9nVmFsRW5kVGltZSwJCi0JCQluZXcgT2JqZWN0W117X3ZhbGlkYXRvck5hbWUsIF92YWxpZGF0b3JJZCwgX3Jlc291cmNlTmFtZSwgTWlzYy5nZXRUaW1lTVMoX2VsYXBzZWRUaW1lKX0pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGJvb2xlYW4gYXNTdW1tYXJ5KXsKLQkJaWYgKGFzU3VtbWFyeSl7Ci0JCQlpZiAoX2NwdVRpbWUgIT0gLTEpcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkxvZ1ZhbFN1bW1hcnkyLCAKLQkJCQluZXcgT2JqZWN0W117X3ZhbGlkYXRvck5hbWUsIF92YWxpZGF0b3JJZCwgX251bWJlckludm9jYXRpb25zLCAKLQkJCQkJTWlzYy5nZXRUaW1lTVMoX2VsYXBzZWRUaW1lKSwgTWlzYy5nZXRUaW1lTmFubyhfY3B1VGltZSl9KTsKLQkJCQotCQkJcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkxvZ1ZhbFN1bW1hcnksIAotCQkJCQluZXcgT2JqZWN0W117X3ZhbGlkYXRvck5hbWUsIF92YWxpZGF0b3JJZCwgX251bWJlckludm9jYXRpb25zLCBNaXNjLmdldFRpbWVNUyhfZWxhcHNlZFRpbWUpfSk7Ci0JCX0KLQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JOYW1lKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvck5hbWU7Ci0JfQotCi0JLyoqIAotCSAqIEFuc3dlciB3aGVuIHdhcyB0aGUgZXZlbnQgbG9nZ2VkLiAKLQkgKiAKLQkgKiBAc2VlIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0V2hlbigpIHsKLQkJcmV0dXJuIF93aGVuOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgewotCQlyZXR1cm4gX3Jlc291cmNlTmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg3NmJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLk1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGNsYXNzIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKiA8cD4KLSAqIFRoaXMgaXMgbm90IEFQSS4gCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0ZXJIZWxwZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIgewotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciAJX21vbml0b3I7Ci0JcHJpdmF0ZSBMaXN0PElNZXNzYWdlPgkJX2xpc3QgPSBuZXcgTGlua2VkTGlzdDxJTWVzc2FnZT4oKTsKLQkKLQlwdWJsaWMgUmVwb3J0ZXJIZWxwZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJX21vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciBvcmlnaW4sIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJX2xpc3QuYWRkKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCV9tb25pdG9yLnN1YlRhc2sobWVzc2FnZS5nZXRUZXh0KHZhbGlkYXRvci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJTWVzc2FnZT4gZ2V0TWVzc2FnZXMoKSB7Ci0JCXJldHVybiBfbGlzdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLQkJcmV0dXJuIF9tb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbikgewotCQlfbGlzdC5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3Igb3JpZ2luLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCV9saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlfbGlzdC5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYWtlTWFya2VycygpewotCQlNYXJrZXJNYW5hZ2VyLmdldERlZmF1bHQoKS5tYWtlTWFya2VycyhfbGlzdCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4ZTU4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgd2hpY2ggb2JqZWN0IHNob3VsZCBiZSB2YWxpZGF0ZWQgYW5kIHdoYXQgdHJpZ2dlcmVkIGl0cyB2YWxpZGF0aW9uLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvbkV2ZW50IHsKLQkKLQlwcml2YXRlIElSZXNvdXJjZSAJCV9yZXNvdXJjZTsKLQlwcml2YXRlIGludAkJCQlfa2luZDsKLQlwcml2YXRlIElSZXNvdXJjZURlbHRhIAlfZGVwZW5kc09uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgd2hhdCBzaG91bGQgYmUgdmFsaWRhdGVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC4KLQkgKiBAcGFyYW0ga2luZAotCSAqICAgICAgICAgICAgVGhlIHdheSB0aGUgcmVzb3VyY2UgY2hhbmdlZC4gSXQgdXNlcyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlCi0JICogICAgICAgICAgICBraW5kIHBhcmFtZXRlciBpbiBJUmVzb3VyY2VEZWx0YS4KLQkgKiBAcGFyYW0gZGVwZW5kc09uCi0JICogICAgICAgICAgICBJZiB0aGUgcmVzb3VyY2UgaXMgYmVpbmcgdmFsaWRhdGVkIGJlY2F1c2Ugb25lIG9mIGl0J3MKLQkgKiAgICAgICAgICAgIGRlcGVuZGVuY2llcyBoYXMgY2hhbmdlZCwgdGhhdCBjaGFuZ2UgaXMgZGVzY3JpYmVkIGhlcmUuIFRoaXMKLQkgKiAgICAgICAgICAgIGNhbiBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uRXZlbnQoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgSVJlc291cmNlRGVsdGEgZGVwZW5kc09uKXsKLQkJX3Jlc291cmNlID0gcmVzb3VyY2U7Ci0JCV9raW5kID0ga2luZDsKLQkJX2RlcGVuZHNPbiA9IGRlcGVuZHNPbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdG8gYmUgdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBfcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdheSB0aGUgcmVzb3VyY2UgY2hhbmdlZC4gSXQgdXNlcyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIGtpbmQKLQkgKiBwYXJhbWV0ZXIgaW4gSVJlc291cmNlRGVsdGEuCi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gX2tpbmQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHJlc291cmNlIGlzIGJlaW5nIHZhbGlkYXRlZCBiZWNhdXNlIG9uZSBvZiBpdCdzIGRlcGVuZGVuY2llcyBoYXMgY2hhbmdlZCwgdGhhdCBjaGFuZ2UgaXMgZGVzY3JpYmVkIGhlcmUuCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCB3aGVuIHRoZSB0cmlnZ2VyIGlzIG5vdCBiZWNhdXNlIG9mIGEgZGVwZW5kZW5jeSBjaGFuZ2UuCi0JICovCi0JcHVibGljIElSZXNvdXJjZURlbHRhIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIF9kZXBlbmRzT247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NjNDU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5EZWJ1Z0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5EZXBlbmRlbmN5SW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRGlzYWJsZWRSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRGlzYWJsZWRWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuTWFya2VyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlBlcmZvcm1hbmNlTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0VW5hdmFpbGFibGVFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxQcmVmTWFuYWdlckdsb2JhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxQcmVmTWFuYWdlclByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck11dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWFuYWdlci5Vc2VQcm9qZWN0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuUHJvamVjdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotLyoqCi0gKiBUaGUgY2VudHJhbCBjbGFzcyBvZiB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsuCi0gKiA8cD4KLSAqIFRoaXMgaXMgYSBzaW5nbGV0b24gY2xhc3MgdGhhdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBnZXREZWZhdWx0KCkgbWV0aG9kLiAKLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uRnJhbWV3b3JrIHsKLQkKLQlwcml2YXRlIHZvbGF0aWxlIElEZXBlbmRlbmN5SW5kZXggCV9kZXBlbmRlbmN5SW5kZXg7Ci0JcHJpdmF0ZSBJUGVyZm9ybWFuY2VNb25pdG9yCQkJX3BlcmZvcm1hbmNlTW9uaXRvcjsKLQkKLQlwcml2YXRlIFNldDxJUHJvamVjdD4gCQkJCV9zdXNwZW5kZWRQcm9qZWN0czsKLQlwcml2YXRlIGJvb2xlYW4gCQkJCQlfc3VzcGVuZEFsbFZhbGlkYXRpb247Ci0KLQkvKiogCi0JICogQW5zd2VyIHRoZSBzaW5nbGV0b24sIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25GcmFtZXdvcmsgZ2V0RGVmYXVsdCgpewotCQlyZXR1cm4gU2luZ2xldG9uLnZmOwotCX0KLQkKLQlwcml2YXRlIFZhbGlkYXRpb25GcmFtZXdvcmsoKXt9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSB2YWxpZGF0aW9uIGJ1aWxkZXIgdG8gdGhlIHByb2plY3QsIHNvIHRoYXQgdGhlIHByb2plY3QgY2FuIHN1cHBvcnQKLQkgKiBidWlsZCB0aW1lIHZhbGlkYXRpb24uIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIG1ldGhvZCwgaWYgdGhlIGJ1aWxkZXIgd2FzCi0JICogcHJldmlvdXNseSBhZGRlZCB0byB0aGUgcHJvamVjdC4gSXQgd2lsbCBub3QgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdGhhdCB0aGUgYnVpbGRlciBpcyBhZGRlZCB0by4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0KXsKLQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChwcm9qZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYXIgYW55IHZhbGlkYXRpb24gbWFya2VycyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IHRoaXMgdmFsaWRhdG9yLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIAkJVGhlIHJlc291cmNlIHRoYXQgbWF5IGhhdmUgaXQncyBtYXJrZXJzIGNsZWFyZWQuCi0JICogQHBhcmFtIHZhbGlkYXRvcklkCi0JICogCQlUaGUgaWQgb2YgdmFsaWRhdG9yIHRoYXQgY3JlYXRlZCB0aGUgbWFya2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyTWVzc2FnZXMoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdmFsaWRhdG9ySWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yIHYgPSBnZXRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIG51bGwpOwotCQlpZiAodiAhPSBudWxsKU1hcmtlck1hbmFnZXIuZ2V0RGVmYXVsdCgpLmNsZWFyTWFya2VyKHJlc291cmNlLCB2KTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzYWJsZSBhbGwgdmFsaWRhdGlvbiBmb3IgdGhlIGdpdmVuIHJlc291cmNlLiBUaGlzIG1ldGhvZCBpbnN0cnVjdHMKLQkgKiB0aGUgZnJhbWV3b3JrIHRvIG5vdCBydW4gYW55IHZhbGlkYXRvcnMgb24gdGhlIGdpdmVuIHJlc291cmNlIG9yIGFueSBvZgotCSAqIGl0J3MgY2hpbGRyZW4uIFRoaXMgc2V0dGluZyBpcyBwZXJzaXN0ZW50LiBDdXJyZW50bHkgdGhpcyBvbmx5IHdvcmtzIHdpdGggdmVyc2lvbiAyCi0JICogdmFsaWRhdG9ycy4KLQkgKiA8cD4KLQkgKiBVc2UgdGhlIGVuYWJsZVZhbGlkYXRpb24gbWV0aG9kIHRvIHJlc3RvcmUgdmFsaWRhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdGhhdCBpcyBoYXZpbmcgdmFsaWRhdGlvbiBkaXNhYmxlZC4gSXQgbXVzdCBiZSBhbiBJRm9sZGVyIG9yIGFuIElGaWxlLgotCSAqIAotCSAqIEBzZWUgI2VuYWJsZVZhbGlkYXRpb24oSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2FibGVWYWxpZGF0aW9uKElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCWFzc2VydCByZXNvdXJjZSAhPSBudWxsOwotCQlEaXNhYmxlZFJlc291cmNlTWFuYWdlci5nZXREZWZhdWx0KCkuZGlzYWJsZVZhbGlkYXRpb24ocmVzb3VyY2UpOwotCX0KLQkKLQkvKioKLQkgKiBFbmFibGUgdmFsaWRhdGlvbiBmb3IgdGhlIGdpdmVuIHJlc291cmNlLiBJZiB0aGUgcmVzb3VyY2Ugd2FzIG5vdAotCSAqIHByZXZpb3VzbHkgZGlzYWJsZWQgdGhpcyBtZXRob2QgY2FsbCBoYXMgbm8gZWZmZWN0LiBDdXJyZW50bHkgdGhpcyBvbmx5Ci0JICogd29ya3Mgd2l0aCB2ZXJzaW9uIDIgdmFsaWRhdG9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAJCVRoZSByZXNvdXJjZSB0aGF0IGlzIGhhdmluZyB2YWxpZGF0aW9uIHJlLWVuYWJsZWQuCi0JICogCi0JICogQHNlZSAjZGlzYWJsZVZhbGlkYXRpb24oSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZVZhbGlkYXRpb24oSVJlc291cmNlIHJlc291cmNlKXsKLQkJRGlzYWJsZWRSZXNvdXJjZU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmVuYWJsZVZhbGlkYXRpb24ocmVzb3VyY2UpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGRlcGVuZGVuY3kgaW5kZXguIFZhbGlkYXRvcnMgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGljaCByZXNvdXJjZXMgZGVwZW5kIG9uIHdoaWNoCi0JICogb3RoZXIgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBJRGVwZW5kZW5jeUluZGV4IGdldERlcGVuZGVuY3lJbmRleCgpewotCQkvLyBub3RlIGhvdyB0aGUgX2RlcGVuZGVuY3lJbmRleCBpcyB2b2xhdGlsZSBzbyB0aGF0IHRoaXMgZG91YmxlIGNoZWNraW5nIGFwcHJvYWNoIGNhbiBiZSB1c2VkLgotCQlpZiAoX2RlcGVuZGVuY3lJbmRleCA9PSBudWxsKXsKLQkJCXN5bmNocm9uaXplZCh0aGlzKXsKLQkJCQlpZiAoX2RlcGVuZGVuY3lJbmRleCA9PSBudWxsKV9kZXBlbmRlbmN5SW5kZXggPSBuZXcgRGVwZW5kZW5jeUluZGV4KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9kZXBlbmRlbmN5SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgcGVyZm9ybWFuY2UgbW9uaXRvciBmb3IgdGhlIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJUGVyZm9ybWFuY2VNb25pdG9yIGdldFBlcmZvcm1hbmNlTW9uaXRvcigpewotCQlpZiAoX3BlcmZvcm1hbmNlTW9uaXRvciA9PSBudWxsKXsKLQkJCWJvb2xlYW4gdHJhY2VUaW1lcyA9IE1pc2MuZGVidWdPcHRpb25Bc0Jvb2xlYW4oRGVidWdDb25zdGFudHMuVHJhY2VUaW1lcyk7Ci0JCQlTdHJpbmcgdHJhY2VGaWxlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oRGVidWdDb25zdGFudHMuVHJhY2VUaW1lc0ZpbGUpOwotCQkJYm9vbGVhbiB1c2VEb3VibGVzID0gTWlzYy5kZWJ1Z09wdGlvbkFzQm9vbGVhbihEZWJ1Z0NvbnN0YW50cy5UcmFjZVRpbWVzVXNlRG91Ymxlcyk7Ci0KLQkJCV9wZXJmb3JtYW5jZU1vbml0b3IgPSBQZXJmb3JtYW5jZU1vbml0b3IuY3JlYXRlKHRyYWNlVGltZXMsIHRyYWNlRmlsZSwgdXNlRG91Ymxlcyk7Ci0JCX0KLQkJcmV0dXJuIF9wZXJmb3JtYW5jZU1vbml0b3I7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGhvbGRzIHRoZSBwZXJzaXN0ZWQgZ2xvYmFsIHZhbGlkYXRpb24gc2V0dGluZ3MuCi0JICovCi0JcHVibGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZVN0b3JlKCl7Ci0JCXJldHVybiBuZXcgSW5zdGFuY2VTY29wZSgpLmdldE5vZGUoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQpOwotCX0KLQkKLQlwdWJsaWMgSVJlcG9ydGVyIGdldFJlcG9ydGVyKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCXJldHVybiBuZXcgV29ya2JlbmNoUmVwb3J0ZXIocHJvamVjdCwgbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbGwgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXBwbGljYWJsZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlLiBBIHZhbGlkYXRvciBpcwotCSAqIHN0aWxsIHJldHVybmVkIGV2ZW4gaWYgaXQgaGFzIGJlZW4gdHVybmVkIG9mZiBieSB0aGUgdXNlci4KLQkgKiA8cD4KLQkgKiBUaGUgY2FsbGVyIG1heSBzdGlsbCBuZWVkIHRvIHRlc3QgaWYgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiB0dXJuZWQgb2ZmIGJ5Ci0JICogdGhlIHVzZXIsIGJ5IHVzaW5nIHRoZSBpc0J1aWxkVmFsaWRhdGlvbigpIGFuZCBpc01hbnVhbFZhbGlkYXRpb24oKQotCSAqIG1ldGhvZHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIAkJVGhlIHJlc291cmNlIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWNhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBpc01hbnVhbAotCSAqIAkJSWYgdHJ1ZSB0aGVuIHRoZSB2YWxpZGF0b3IgbXVzdCBiZSB0dXJuZWQgb24gZm9yIG1hbnVhbCB2YWxpZGF0aW9uLgotCSAqIAkJSWYgZmFsc2UgdGhlbiB0aGUgaXNNYW51YWxWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZCB0byBmaWx0ZXIKLQkgKiAJCW91dCB2YWxpZGF0b3JzLgotCSAqIAotCSAqIEBwYXJhbSBpc0J1aWxkCi0JICogCQlJZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgYnVpbGQgYmFzZWQKLQkgKiAJCXZhbGlkYXRpb24uIElmIGZhbHNlIHRoZW4gdGhlIGlzQnVpbGRWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZAotCSAqIAkJdG8gZmlsdGVyIG91dCB2YWxpZGF0b3JzLgotCSAqIAotCSAqIEBzZWUgVmFsaWRhdG9yI2lzQnVpbGRWYWxpZGF0aW9uKCkKLQkgKiBAc2VlIFZhbGlkYXRvciNpc01hbnVhbFZhbGlkYXRpb24oKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzRm9yKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpc01hbnVhbCwgYm9vbGVhbiBpc0J1aWxkKXsKLQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJTGlzdDxWYWxpZGF0b3I+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3I+KCk7Ci0JCUNvbnRlbnRUeXBlV3JhcHBlciBjdHcgPSBuZXcgQ29udGVudFR5cGVXcmFwcGVyKCk7Ci0JCWZvciAoVmFsaWRhdG9yIHZhbCA6IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnMocHJvamVjdCkpewotCQkJaWYgKHZhbC5zaG91bGRWYWxpZGF0ZShyZXNvdXJjZSwgaXNNYW51YWwsIGlzQnVpbGQsIGN0dykpbGlzdC5hZGQodmFsKTsKLQkJfQotCQkKLQkJVmFsaWRhdG9yW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgc2hvdWxkIG5vdCB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UsIGVpdGhlcgotCSAqIGJlY2F1c2UgdGhlaXIgZmlsdGVycyBkb24ndCBzdXBwb3J0IHRoZSByZXNvdXJjZSwgb3IgdGhlIHZhbGlkYXRvciBoYXMKLQkgKiBiZWVuIGRpc2FibGVkIGZvciBib3RoIGJ1aWxkIHZhbGlkYXRpb24gYW5kIG1hbnVhbCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIAkJVGhlIHJlc291cmNlIHRoaXMgaXMgYmVpbmcgdGVzdGVkLgotCSAqLwotCXB1YmxpYyBTZXQ8VmFsaWRhdG9yPiBnZXREaXNhYmxlZFZhbGlkYXRvcnNGb3IoSVJlc291cmNlIHJlc291cmNlKXsKLQkJcmV0dXJuIERpc2FibGVkVmFsaWRhdG9yTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0RGlzYWJsZWRWYWxpZGF0b3JzRm9yKHJlc291cmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBnbG9iYWwgdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KSB3aXRoIGEgbnVsbCBwcm9qZWN0IGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiBudWxsIGlmIHRoZSB2YWxpZGF0b3IgaXMgbm90IGZvdW5kCi0JICovCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkKXsKLQkJcmV0dXJuIFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcldpdGhJZChpZCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGlkIHRoYXQgaXMgaW4gZWZmZWN0IGZvciB0aGUgZ2l2ZW4KLQkgKiBwcm9qZWN0LgotCSAqIDxwPgotCSAqIEluZGl2aWR1YWwgcHJvamVjdHMgbWF5IG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlCi0JICogc2V0dGluZ3MuIElmIHRoaXMgaXMgYWxsb3dlZCBhbmQgaWYgdGhlIHByb2plY3QgaGFzIGl0J3Mgb3duIHNldHRpbmdzLAotCSAqIHRoZW4gdGhvc2UgdmFsaWRhdG9ycyBhcmUgcmV0dXJuZWQgdmlhIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgZm9sbG93aW5nIGFwcHJvYWNoIGlzIHVzZWQuIEZvciB2ZXJzaW9uIDEgdmFsaWRhdG9ycywgdGhlIHZhbGlkYXRvcgotCSAqIGlzIG9ubHkgcmV0dXJuZWQgaWYgaXQgaXMgZGVmaW5lZCB0byBvcGVyYXRlIG9uIHRoaXMgcHJvamVjdCB0eXBlLiBUaGlzCi0JICogaXMgdGhlIHdheSB0aGF0IHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBmcmFtZXdvcmsgZGlkIGl0LiBGb3IgdmVyc2lvbgotCSAqIDIgdmFsaWRhdG9ycywgdGhleSBhcmUgYWxsIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCVZhbGlkYXRvciBpZC4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIAkJVGhpcyBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBhbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycyBhcmUKLQkgKiAJCWNoZWNrZWQuCi0JICogQHJldHVybiBudWxsIGlmIHRoZSB2YWxpZGF0b3IgaXMgbm90IGZvdW5kCi0JICovCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KXsKLQkJcmV0dXJuIFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcldpdGhJZChpZCwgcHJvamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBjb3BpZXMgb2YgYWxsIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMuCi0JICogCi0JICogQHJldHVybiBBbnN3ZXIgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnMoKXsKLQkJcmV0dXJuIFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnNDb3B5KCk7Ci0JfQotCQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBvbiB0aGUKLQkgKiBwcm9qZWN0LiBUbyAiYWN0aXZhdGUiIGFueSBjaGFuZ2VzIHRvIHRoZXNlIHNldHRpbmdzLCB0aGUKLQkgKiB7QGxpbmsgI2FwcGx5Q2hhbmdlcyhNdXRhYmxlUHJvamVjdFNldHRpbmdzLCBib29sZWFuKX0gbWV0aG9kIG5lZWRzIHRvIGJlCi0JICogY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHdobydzIHNldHRpbmdzIHlvdSB3aXNoIHRvIGV4YW1pbmUgb3IgY2hhbmdlLgotCSAqIEByZXR1cm4gVmFsaWRhdGlvbiBzZXR0aW5ncyB0aGF0IGFwcGx5IHRvIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBNdXRhYmxlUHJvamVjdFNldHRpbmdzIGdldFByb2plY3RTZXR0aW5ncyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJUHJvamVjdFByZWZlcmVuY2VzIHBwID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotCQlWYWxpZGF0b3JbXSB2YWxzID0gcHAuZ2V0VmFsaWRhdG9ycygpOwotCQlWYWxpZGF0b3JNdXRhYmxlW10gdm1zID0gbmV3IFZhbGlkYXRvck11dGFibGVbdmFscy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7IGk8dmFscy5sZW5ndGg7IGkrKyl2bXNbaV0gPSBuZXcgVmFsaWRhdG9yTXV0YWJsZSh2YWxzW2ldKTsKLQotCQlNdXRhYmxlUHJvamVjdFNldHRpbmdzIG1wcyA9IG5ldyBNdXRhYmxlUHJvamVjdFNldHRpbmdzKHByb2plY3QsIHZtcyk7Ci0JCW1wcy5zZXRPdmVycmlkZShwcC5nZXRPdmVycmlkZSgpKTsKLQkJbXBzLnNldFN1c3BlbmQocHAuZ2V0U3VzcGVuZCgpKTsKLQkJcmV0dXJuIG1wczsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYXQgdGhlIHdvcmtzcGFjZSBsZXZlbC4KLQkgKiBUbyAiYWN0aXZhdGUiIGFueSBjaGFuZ2VzIHRvIHRoZXNlIHNldHRpbmdzLCB0aGUKLQkgKiB7QGxpbmsgI2FwcGx5Q2hhbmdlcyhNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MsIGJvb2xlYW4pfSBtZXRob2QgbmVlZHMgdG8gYmUKLQkgKiBjYWxsZWQuCi0JICogCi0JICogQHJldHVybiBWYWxpZGF0aW9uIHNldHRpbmdzIHRoYXQgYXBwbHkgdG8gdGhlIGVudGlyZSB3b3Jrc3BhY2UuCi0JICovCi0JcHVibGljIE11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyBnZXRXb3Jrc3BhY2VTZXR0aW5ncygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uewotCQkKLQkJVmFsTWFuYWdlciB2bSA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotCQlHbG9iYWxQcmVmZXJlbmNlcyBncCA9IHZtLmdldEdsb2JhbFByZWZlcmVuY2VzKCk7Ci0JCQotCQlWYWxpZGF0b3JbXSB2YWxzID0gdm0uZ2V0VmFsaWRhdG9ycygpOwkJCi0JCVZhbGlkYXRvck11dGFibGVbXSB2bXMgPSBuZXcgVmFsaWRhdG9yTXV0YWJsZVt2YWxzLmxlbmd0aF07Ci0JCWZvciAoaW50IGk9MDsgaTx2YWxzLmxlbmd0aDsgaSsrKXZtc1tpXSA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlKHZhbHNbaV0pOwotCi0JCU11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyBtd3MgPSBuZXcgTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzKHZtcywgZ3AuYXNWYWx1ZXMoKSk7Ci0JCXJldHVybiBtd3M7Ci0JfQotCQkKLQkvKioKLQkgKiBBcHBseSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBiZWVuIHRvIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBzZXR0aW5ncwotCSAqICAgICAgICAgICAgVGhlIHByb2plY3Qgc2V0dGluZ3MuCi0JICogQHBhcmFtIHBlcnNpc3QKLQkgKiAgICAgICAgICAgIElmIHRydWUgdGhlbiB0aGUgY2hhbmdlcyBhcmUgcGVyc2lzdGVkIHRvIHRoZSBwcm9wZXJ0eSBmaWxlcy4KLQkgKiAgICAgICAgICAgIElmIGZhbHNlIHRoZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIHRoZSB2YWxpZGF0b3JzLCBidXQgYXJlCi0JICogICAgICAgICAgICBub3QgcGVyc2lzdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5Q2hhbmdlcyhNdXRhYmxlUHJvamVjdFNldHRpbmdzIHNldHRpbmdzLCBib29sZWFuIHBlcnNpc3QpewotCQlWYWxQcmVmTWFuYWdlclByb2plY3QgdnBtID0gbmV3IFZhbFByZWZNYW5hZ2VyUHJvamVjdChzZXR0aW5ncy5nZXRQcm9qZWN0KCkpOwotCQl2cG0uc2F2ZVByZWZlcmVuY2VzKHNldHRpbmdzLCBwZXJzaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwbHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gYmVlbiB0byB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gc2V0dGluZ3MKLQkgKiAgICAgICAgICAgIFRoZSB3b3Jrc3BhY2Ugc2V0dGluZ3MuCi0JICogQHBhcmFtIHBlcnNpc3QKLQkgKiAgICAgICAgICAgIElmIHRydWUgdGhlbiB0aGUgY2hhbmdlcyBhcmUgcGVyc2lzdGVkIHRvIHRoZSBwcm9wZXJ0eSBmaWxlcy4KLQkgKiAgICAgICAgICAgIElmIGZhbHNlIHRoZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIHRoZSB2YWxpZGF0b3JzLCBidXQgYXJlCi0JICogICAgICAgICAgICBub3QgcGVyc2lzdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5Q2hhbmdlcyhNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3Mgc2V0dGluZ3MsIGJvb2xlYW4gcGVyc2lzdCl7Ci0JCQotCQlWYWxNYW5hZ2VyIHZtID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCk7Ci0JCUdsb2JhbFByZWZlcmVuY2VzVmFsdWVzIGdwdiA9IHNldHRpbmdzLmdldEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzKCk7Ci0JCXZtLnJlcGxhY2UoZ3B2KTsKLQkJCi0JCUlNdXRhYmxlVmFsaWRhdG9yW10gbXZzID0gc2V0dGluZ3MuZ2V0VmFsaWRhdG9ycygpOwotCQlWYWxpZGF0b3JNdXRhYmxlW10gdmFscyA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlW212cy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7IGk8bXZzLmxlbmd0aDsgaSsrKXZhbHNbaV0gPSAoVmFsaWRhdG9yTXV0YWJsZSltdnNbaV07Ci0JCVZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKS5zYXZlUHJlZmVyZW5jZXModm0uZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKSwgdmFscywgcGVyc2lzdCk7Ci0JCVZhbFByZWZNYW5hZ2VyR2xvYmFsLnNhdmVWMVByZWZlcmVuY2VzKHZhbHMsIHBlcnNpc3QpOwkJCi0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRvcnMgY2FuIHVzZSBwcm9qZWN0IGxldmVsIHNldHRpbmdzIChQcm9qZWN0IG5hdHVyZXMgYW5kIGZhY2V0cykgdG8KLQkgKiBkZXRlcm1pbmUgaWYgdGhleSBhcmUgYXBwbGljYWJsZSB0byB0aGUgcHJvamVjdCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0IHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgYmFzZWQgb24uCi0JICogQHJldHVybiBUaGUgY29waWVzIG9mIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIHRoaXMgcHJvamVjdCBiYXNlZAotCSAqICAgICAgICAgb24gdGhlIHByb2plY3QgbGV2ZWwgc2V0dGluZ3MuCi0JICogQHRocm93cyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvcgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIFByb2plY3RVbmF2YWlsYWJsZUVycm9yIHsKLQkJVmFsaWRhdG9yW10gb3JpZyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdChwcm9qZWN0LCBVc2VQcm9qZWN0UHJlZmVyZW5jZXMuTm9ybWFsKTsKLQkJVmFsaWRhdG9yW10gY29weSA9IG5ldyBWYWxpZGF0b3Jbb3JpZy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7IGk8b3JpZy5sZW5ndGg7IGkrKyljb3B5W2ldID0gb3JpZ1tpXS5jb3B5KCk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWNhYmxlLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzRm9yKElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCUxpc3Q8VmFsaWRhdG9yPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yPigpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogZ2V0VmFsaWRhdG9yc0ZvcihyZXNvdXJjZSwgZmFsc2UsIGZhbHNlKSl7Ci0JCQlpZiAodi5pc0J1aWxkVmFsaWRhdGlvbigpIHx8IHYuaXNNYW51YWxWYWxpZGF0aW9uKCkpbGlzdC5hZGQodik7Ci0JCX0KLQkJVmFsaWRhdG9yW10gdmFscyA9IG5ldyBWYWxpZGF0b3JbbGlzdC5zaXplKCldOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KHZhbHMpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaGFzIGFueSBlbmFibGVkIHZhbGlkYXRvcnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogCQlBIGZpbGUsIGZvbGRlciBvciBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBpc01hbnVhbAotCSAqIAkJSWYgdHJ1ZSB0aGVuIHRoZSB2YWxpZGF0b3IgbXVzdCBiZSB0dXJuZWQgb24gZm9yIG1hbnVhbCB2YWxpZGF0aW9uLgotCSAqIAkJSWYgZmFsc2UgdGhlbiB0aGUgaXNNYW51YWxWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZCB0byBmaWx0ZXIKLQkgKiAJCW91dCB2YWxpZGF0b3JzLgotCSAqIAotCSAqIEBwYXJhbSBpc0J1aWxkCi0JICogCQlJZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgYnVpbGQgYmFzZWQKLQkgKiAJCXZhbGlkYXRpb24uIElmIGZhbHNlIHRoZW4gdGhlIGlzQnVpbGRWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZAotCSAqIAkJdG8gZmlsdGVyIG91dCB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ZhbGlkYXRvcnMoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGlzTWFudWFsLCBib29sZWFuIGlzQnVpbGQpewotCQlyZXR1cm4gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuaGFzVmFsaWRhdG9ycyhyZXNvdXJjZSwgaXNNYW51YWwsIGlzQnVpbGQpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiBhY3RpdmF0ZWQsIGkuZS4gaGFzIHRoZQotCSAqIGJ1bmRsZSB0aGF0IGRlZmluZXMgdGhlIHZhbGlkYXRvciBiZWVuIGxvYWRlZC4gV2UgZG8gbm90IHdhbnQgdG8gY2F1c2UKLQkgKiB1bm5lY2Vzc2FyeSBidW5kbGUgbG9hZGluZywgc28gdGhpcyBjaGVjayBjYW4gYmUgcGVyZm9ybWVkIGJ5IHRoaXJkIHBhcnR5Ci0JICogY2FsbGVycywgdG8gcHJldmVudCBtYWtpbmcgb3RoZXIgY2FsbHMgdGhhdCB3aWxsIGZvcmNlIHRoZSB2YWxpZGF0b3IgdG8KLQkgKiBiZSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHRlc3RlZC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZChWYWxpZGF0b3IgdmFsaWRhdG9yKXsKLQkJcmV0dXJuIHZhbGlkYXRvci5pc0xvYWRlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBXYWl0cyB1bnRpbCBhbGwgdmFsaWRhdGlvbiBqb2JzIGFyZSBmaW5pc2hlZC4gVGhpcyBtZXRob2Qgd2lsbCBibG9jayB0aGUKLQkgKiBjYWxsaW5nIHRocmVhZCB1bnRpbCBhbGwgc3VjaCBqb2JzIGhhdmUgZmluaXNoZWQgZXhlY3V0aW5nLCBvciB1bnRpbCB0aGlzCi0JICogdGhyZWFkIGlzIGludGVycnVwdGVkLiBJZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBqb2JzIHRoYXQgYXJlCi0JICogY3VycmVudGx5IHdhaXRpbmcsIHJ1bm5pbmcsIG9yIHNsZWVwaW5nLCB0aGlzIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LgotCSAqIEZlZWRiYWNrIG9uIGhvdyB0aGUgam9pbiBpcyBwcm9ncmVzc2luZyBpcyBwcm92aWRlZCB0byB0aGUgcHJvZ3Jlc3MKLQkgKiBtb25pdG9yLgotCSAqIDxwPgotCSAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGlsZSB0aGUgam9iIG1hbmFnZXIgaXMgc3VzcGVuZGVkLCBvbmx5IGpvYnMKLQkgKiB0aGF0IGFyZSBjdXJyZW50bHkgcnVubmluZyB3aWxsIGJlIGpvaW5lZC4gT25jZSB0aGVyZSBhcmUgbm8gam9icyBpbiB0aGUKLQkgKiBmYW1pbHkgaW4gdGhlIHtAbGluayBKb2IjUlVOTklOR30gc3RhdGUsIHRoaXMgbWV0aG9kIHJldHVybnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGRlYWRsb2NrIHJpc2sgd2hlbiB1c2luZyBqb2luLiBJZiB0aGUgY2FsbGluZyB0aHJlYWQKLQkgKiBvd25zIGEgbG9jayBvciBvYmplY3QgbW9uaXRvciB0aGF0IHRoZSBqb2luZWQgdGhyZWFkIGlzIHdhaXRpbmcgZm9yLAotCSAqIGRlYWRsb2NrIHdpbGwgb2NjdXIuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIHJlc3VsdCBpbiBzdGFydmF0aW9uIG9mIHRoZQotCSAqIGN1cnJlbnQgdGhyZWFkIGlmIGFub3RoZXIgdGhyZWFkIGNvbnRpbnVlcyB0byBhZGQgam9icyBvZiB0aGUgZ2l2ZW4KLQkgKiBmYW1pbHksIG9yIGlmIGEgam9iIGluIHRoZSBnaXZlbiBmYW1pbHkgcmVzY2hlZHVsZXMgaXRzZWxmIGluIGFuIGluZmluaXRlCi0JICogbG9vcC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAJCVByb2dyZXNzIG1vbml0b3IgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBvbiBob3cgdGhlIHdhaXQgaXMKLQkgKiAJCXByb2dyZXNzaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBtb25pdG9yaW5nIGlzCi0JICogCQlyZXF1aXJlZC4KLQkgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogCQlpZiB0aGlzIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nCi0JICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCSAqIAkJaWYgdGhlIHByb2dyZXNzIG1vbml0b3IgaXMgY2FuY2VsZWQgd2hpbGUgd2FpdGluZwotCSAqLwotCXB1YmxpYyB2b2lkIGpvaW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbW9uaXRvcik7Ci0JCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihWYWxpZGF0aW9uQnVpbGRlci5GQU1JTFlfVkFMSURBVElPTl9KT0IsIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBTdXNwZW5kcywgb3IgdW5kb2VzIHRoZSBzdXNwZW5zaW9uIG9mLCB2YWxpZGF0aW9uIG9uIHRoZSBjdXJyZW50IHByb2plY3QuCi0JICogSWYgPGI+c3VzcGVuZDwvYj4gaXMgdHJ1ZSB0aGVuIHZhbGlkYXRpb24gaXMgc3VzcGVuZGVkIGFuZCBpZiBpdCdzIGZhbHNlCi0JICogdGhlbiB2YWxpZGF0aW9uIGlzIG5vdCBzdXNwZW5kZWQgb24gdGhlIHByb2plY3QuIFRoZSB2YWx1ZSBvZiB0aGlzCi0JICogdmFyaWFibGUgaXMgbm90IHBlcnNpc3RlZC4KLQkgKiA8cD4KLQkgKiBCZSA8Yj52ZXJ5IGNhcmVmdWw8L2I+IHdoZW4geW91IHVzZSB0aGlzIG1ldGhvZCEgVHVybiB2YWxpZGF0aW9uIGJhY2sgb24gaW4gYQotCSAqIGZpbmFsbHkgYmxvY2sgYmVjYXVzZSBpZiB0aGUgY29kZSB3aGljaCBzdXNwZW5kZWQgdmFsaWRhdGlvbiBjcmFzaGVzLCB0aGUKLQkgKiB1c2VyIGhhcyBubyB3YXkgdG8gcmVzZXQgdGhlIHN1c3BlbnNpb24uIFRoZSB1c2VyIHdpbGwgaGF2ZSB0byBzaHV0IGRvd24KLQkgKiBhbmQgcmVzdGFydCB0aGUgd29ya2JlbmNoIHRvIGdldCB2YWxpZGF0aW9uIHRvIHdvcmsgYWdhaW4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogCQlUaGUgcHJvamVjdCB0aGF0IGlzIHRvIGJlIHN1c3BlbmRlZCBvciB1bnN1c3BlbmRlZC4KLQkgKiBAcGFyYW0gc3VzcGVuZAotCSAqIAkJSWYgdHJ1ZSwgdmFsaWRhdGlvbiBvbiB0aGUgcHJvamVjdCB3aWxsIGJlIHN1c3BlbmQuIElmIGZhbHNlIGl0IHdpbGwKLQkgKiAJCW5vdCBiZSBzdXNwZW5kZWQuCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZFZhbGlkYXRpb24oSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBzdXNwZW5kKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpcmV0dXJuOwotCQlpZiAoc3VzcGVuZClnZXRTdXNwZW5kZWRQcm9qZWN0cygpLmFkZChwcm9qZWN0KTsKLQkJZWxzZSBnZXRTdXNwZW5kZWRQcm9qZWN0cygpLnJlbW92ZShwcm9qZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU2V0PElQcm9qZWN0PiBnZXRTdXNwZW5kZWRQcm9qZWN0cygpewotCQlpZiAoX3N1c3BlbmRlZFByb2plY3RzID09IG51bGwpX3N1c3BlbmRlZFByb2plY3RzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0PElQcm9qZWN0PigyMCkpOwotCQlyZXR1cm4gX3N1c3BlbmRlZFByb2plY3RzOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlIHRoZSB2YWxpZGF0b3JzIHNldHRpbmdzIGludG8gdGhlIHBlcnNpc3RlbnQgc3RvcmUsIHRoZXJlIGJ5IG1ha2luZyB0aGVpciBzZXR0aW5ncyB0aGUgYWN0aXZlIHNldHRpbmdzLgotCSAqIDxwPgotCSAqIEEgY29tbW9uIHVzZSBvZiB0aGlzIG1ldGhvZCB3b3VsZCBiZSB0byBjaGFuZ2Ugd2hldGhlciBwYXJ0aWN1bGFyIHZhbGlkYXRvcnMgYXJlIGVuYWJsZWQgb3Igbm90LiBGb3IgZXhhbXBsZQotCSAqIGlmIHlvdSBvbmx5IHdhbnRlZCB0aGUgSlNQIHZhbGlkYXRvciBlbmFibGVkLCB5b3UgY291bGQgdXNlIGNvZGUgc2ltaWxhciB0byB0aGlzOgotCSAqIDxwcmU+Ci0JICogVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCSAqIFZhbGlkYXRvcltdIHZhbHMgPSB2Zi5nZXRWYWxpZGF0b3JzKCk7Ci0JICogZm9yIChWYWxpZGF0b3IgdiA6IHZhbHMpewotCSAqICAgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JICogICBpZiAodi5nZXRWYWxpZGF0b3JDbGFzc25hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEJhdGNoVmFsaWRhdG9yIikpZW5hYmxlZCA9IHRydWU7Ci0JICogICAgIHYuc2V0QnVpbGRWYWxpZGF0aW9uKGVuYWJsZWQpOwotCSAqICAgICB2LnNldE1hbnVhbFZhbGlkYXRpb24oZW5hYmxlZCk7Ci0JICogIH0KLQkgKiB2Zi5zYXZlVmFsaWRhdG9ycyh2YWxzKTsKLQkgKiA8L3ByZT4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0b3JzIFRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IGFyZSBzYXZpbmcuCi0JICogCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVZhbGlkYXRvcnMoVmFsaWRhdG9yW10gdmFsaWRhdG9ycykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb257Ci0JCQotCQkKLQkJVmFsUHJlZk1hbmFnZXJHbG9iYWwgZ3AgPSBWYWxQcmVmTWFuYWdlckdsb2JhbC5nZXREZWZhdWx0KCk7Ci0JCWdwLnNhdmVBc1ByZWZzKHZhbGlkYXRvcnMpOwkKLQkJCi0JCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2MgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkKLQkJTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4gbWFudWFsID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCUxpc3Q8VmFsaWRhdG9yTWV0YURhdGE+IGJ1aWxkID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yTWV0YURhdGE+KCk7Ci0JCWZvciAoVmFsaWRhdG9yIHYgOiB2YWxpZGF0b3JzKXsKLQkJCVYxIHYxID0gdi5hc1YxVmFsaWRhdG9yKCk7Ci0JCQlpZiAodjEgPT0gbnVsbCljb250aW51ZTsKLQkJCWlmICh2MS5pc01hbnVhbFZhbGlkYXRpb24oKSltYW51YWwuYWRkKHYxLmdldFZtZCgpKTsKLQkJCWlmICh2MS5pc0J1aWxkVmFsaWRhdGlvbigpKWJ1aWxkLmFkZCh2MS5nZXRWbWQoKSk7Ci0JCX0KLQkJCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gYXJyYXkgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbWFudWFsLnNpemUoKV07Ci0JCWdjLnNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKG1hbnVhbC50b0FycmF5KGFycmF5KSk7Ci0JCQotCQlhcnJheSA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtidWlsZC5zaXplKCldOwotCQlnYy5zZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGJ1aWxkLnRvQXJyYXkoYXJyYXkpKTsKLQotCQlnYy5wYXNzaXZhdGUoKTsKLQkJZ2Muc3RvcmUoKTsJCQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmRzLCBvciB1bmRvZXMgdGhlIHN1c3BlbnNpb24gb2YsIHZhbGlkYXRpb24gb24gYWxsIHByb2plY3RzIGluIHRoZQotCSAqIHdvcmtiZW5jaC4gSWYgInN1c3BlbmQiIGlzIHRydWUgdGhlbiB2YWxpZGF0aW9uIGlzIHN1c3BlbmRlZCBhbmQgaWYgaXQncwotCSAqICJmYWxzZSIgdGhlbiB2YWxpZGF0aW9uIGlzIG5vdCBzdXNwZW5kZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIGlzCi0JICogbm90IHBlcnNpc3RlZC4KLQkgKiA8cD4KLQkgKiBCZSA8Yj52ZXJ5IGNhcmVmdWw8L2I+IHdoZW4geW91IHVzZSB0aGlzIG1ldGhvZCEgVHVybiB2YWxpZGF0aW9uIGJhY2sgb24gaW4gYQotCSAqIGZpbmFsbHkgYmxvY2sgYmVjYXVzZSBpZiB0aGUgY29kZSB3aGljaCBzdXNwZW5kZWQgdmFsaWRhdGlvbiBjcmFzaGVzLCB0aGUKLQkgKiB1c2VyIGhhcyBubyB3YXkgdG8gcmVzZXQgdGhlIHN1c3BlbnNpb24uIFRoZSB1c2VyIHdpbGwgaGF2ZSB0byBzaHV0IGRvd24KLQkgKiBhbmQgcmVzdGFydCB0aGUgd29ya2JlbmNoIHRvIGdldCB2YWxpZGF0aW9uIHRvIHdvcmsgYWdhaW4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHN1c3BlbmRBbGxWYWxpZGF0aW9uKGJvb2xlYW4gc3VzcGVuZCkgewotCQlfc3VzcGVuZEFsbFZhbGlkYXRpb24gPSBzdXNwZW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmICJzdXNwZW5kIGFsbCIgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VzcGVuZGVkKCkgewotCQlyZXR1cm4gX3N1c3BlbmRBbGxWYWxpZGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHdpbGwgbm90IHJ1biBvbiB0aGUgcHJvamVjdCBiZWNhdXNlIGl0J3MgYmVlbiBzdXNwZW5kZWQuIFRoaXMKLQkgKiBtZXRob2QgY2hlY2tzIG9ubHkgdGhlIHN1c3BlbnNpb24gc3RhdHVzOyBpZiB2YWxpZGF0aW9uIGNhbm5vdCBydW4gZm9yIHNvbWUgb3RoZXIgcmVhc29uIChmb3IKLQkgKiBleGFtcGxlLCB0aGVyZSBhcmUgbm8gZW5hYmxlZCB2YWxpZGF0b3JzKSwgeWV0IHRoZSBJUHJvamVjdCBpcyBub3Qgc3VzcGVuZGVkLCB0aGlzIG1ldGhvZAotCSAqIHdpbGwgcmV0dXJuIHRydWUgZXZlbiB0aG91Z2ggdmFsaWRhdGlvbiB3aWxsIG5vdCBydW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoX3N1c3BlbmRBbGxWYWxpZGF0aW9uKXJldHVybiB0cnVlOwotCQlpZiAocHJvamVjdCA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldFN1c3BlbmRlZFByb2plY3RzKCkuY29udGFpbnMocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgY29kZSB0aGF0IGlzIHByZXBhcmluZyB0byBzdXNwZW5kIHZhbGlkYXRpb24gb24gYQotCSAqIHByb2plY3QuIFJhdGhlciB0aGFuIGNhbGxpbmcgaXNTdXNwZW5kZWQoSVByb2plY3QpLCB3aGljaCB3aWxsIGFsc28gcmV0dXJuIHRydWUgaWYgYWxsIHZhbGlkYXRpb24KLQkgKiBoYXMgYmVlbiBzdXNwZW5kZWQuIAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdGVzdGVkCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHByb2plY3QgaGFzIGJlZW4gc3VzcGVuZGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0U3VzcGVuZGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRTdXNwZW5kZWRQcm9qZWN0cygpLmNvbnRhaW5zKHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgcHJvamVjdHMuIEV4YWN0bHkgb25lIG9mIGlzTWFudWFsIG9yIGlzQnVpbGQgbmVlZHMgdG8gYmUgdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdHMKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0cyB0byBiZSB2YWxpZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIGlzTWFudWFsCi0JICogICAgICAgICAgICBJcyB0aGlzIGJlaW5nIGRvbmUgYXMgcGFydCBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uPyBpLmUuIGRpZAotCSAqICAgICAgICAgICAgdGhlIHVzZXIgc2VsZWN0IHRoZSBWYWxpZGF0ZSBtZW51IGl0ZW0/Ci0JICogCi0JICogQHBhcmFtIGlzQnVpbGQKLQkgKiAgICAgICAgICAgIElzIHRoaXMgYmVpbmcgZG9uZSBhcyBwYXJ0IG9mIGEgYnVpbGQ/Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIHJlc3VsdCB3aGljaCBpcyB0aGUgY29tYmluZWQgcmVzdWx0IGZvciBhbGwgdGhlCi0JICogICAgICAgICByZXNvdXJjZXMgdGhhdCB3ZXJlIHZhbGlkYXRlZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdHMgdmFsaWRhdGUoSVByb2plY3RbXSBwcm9qZWN0cywgZmluYWwgYm9vbGVhbiBpc01hbnVhbCwgZmluYWwgYm9vbGVhbiBpc0J1aWxkLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQlWYWxUeXBlIHR5cGUgPSBWYWxUeXBlLkJ1aWxkOwotCQlpZiAoaXNNYW51YWwpdHlwZSA9IFZhbFR5cGUuTWFudWFsOwotCQlWYWxPcGVyYXRpb24gdm8gPSBWYWxpZGF0aW9uUnVubmVyLnZhbGlkYXRlKGNyZWF0ZU1hcChwcm9qZWN0cyksIHR5cGUsIG1vbml0b3IsIHRydWUpOwotCQlyZXR1cm4gdm8uZ2V0UmVzdWx0cygpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGEgc3BlY2lmaWMgZmlsZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgdG8gYmUgdmFsaWRhdGVkLgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB2YWxpZGF0aW5nIHRoZSBmaWxlLgotCSAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlc3VsdHMgdmFsaWRhdGUoSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLSAgICAgIFZhbE9wZXJhdGlvbiB2byA9IFZhbGlkYXRpb25SdW5uZXIudmFsaWRhdGUoZmlsZSwgVmFsVHlwZS5NYW51YWwsIG1vbml0b3IsIHRydWUpOwotICAgICAgcmV0dXJuIHZvLmdldFJlc3VsdHMoKTsKLSAgICB9Ci0JICAKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHByb2plY3RzIGFzIGEgbWFwLgotCSAqIEBwYXJhbSBwcm9qZWN0cwotCSAqLwotCXByaXZhdGUgTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4gY3JlYXRlTWFwKElQcm9qZWN0W10gcHJvamVjdHMpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQlmaW5hbCBIYXNoTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4gbWFwID0gbmV3IEhhc2hNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PigxMDAwKTsKLQkJCQotCQlmb3IgKElQcm9qZWN0IHAgOiBwcm9qZWN0cyl7Ci0JCQlTZXQ8SVJlc291cmNlPiBzZXQgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KDEwMDApOwotCQkJUmVzb3VyY2VBZGRlciByYSA9IG5ldyBSZXNvdXJjZUFkZGVyKHNldCk7Ci0JCQlwLmFjY2VwdChyYSk7Ci0JCQltYXAucHV0KHAsIHNldCk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUFkZGVyIGltcGxlbWVudHMgSVJlc291cmNlVmlzaXRvciB7Ci0JCQotCQlwcml2YXRlIFNldDxJUmVzb3VyY2U+IF9zZXQ7Ci0JCQotCQkvKioKLQkJICogQSBjbGFzcyB0aGF0IGtub3dzIGhvdyB0byBhZGQgcmVzb3VyY2VzIHRvIGEgc2V0LgotCQkgKiBAcGFyYW0gc2V0IHRoZSBzZXQgd2hlcmUgdGhlIHJlc291cmNlcyBhcmUgYWRkZWQuCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VBZGRlcihTZXQ8SVJlc291cmNlPiBzZXQpewotCQkJX3NldCA9IHNldDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gWzIyNTgzOV0gdGhlIG9sZGVyIHZhbGlkYXRvcnMgb25seSBleHBlY3QgZmlsZXMgYW5kIGZvbGRlcnMuCi0JCQlpbnQgdHlwZSA9IHJlc291cmNlLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IElSZXNvdXJjZS5GSUxFIHx8IHR5cGUgPT0gSVJlc291cmNlLkZPTERFUilfc2V0LmFkZChyZXNvdXJjZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogU3RvcmUgdGhlIHNpbmdsZXRvbiBmb3IgdGhlIFZhbGlkYXRpb25GcmFtZXdvcmsuIFRoaXMgYXBwcm9hY2ggaXMgdXNlZCB0byBhdm9pZCBoYXZpbmcgdG8gc3luY2hyb25pemUgdGhlCi0JICogVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkgbWV0aG9kLgotCSAqIAotCSAqIEBhdXRob3Iga2FyYXNpdWsKLQkgKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNpbmdsZXRvbiB7Ci0JCXN0YXRpYyBWYWxpZGF0aW9uRnJhbWV3b3JrIHZmID0gbmV3IFZhbGlkYXRpb25GcmFtZXdvcmsoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3MTRlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogVGhlIHJlc3VsdCBvZiBydW5uaW5nIGEgdmFsaWRhdGUgb3BlcmF0aW9uLiBWYWxpZGF0b3JzIGNyZWF0ZSBhbmQgcmV0dXJuIHRoaXMgb2JqZWN0cyBhcyBwYXJ0IG9mCi0gKiBwZXJmb3JtaW5nIHRoZWlyIHZhbGlkYXRpb24uCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblJlc3VsdCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PFZhbGlkYXRvck1lc3NhZ2U+IF9tZXNzYWdlcyA9IG5ldyBMaW5rZWRMaXN0PFZhbGlkYXRvck1lc3NhZ2U+KCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVmFsaWRhdG9yTWVzc2FnZVtdIF9ub01lc3NhZ2VzID0gbmV3IFZhbGlkYXRvck1lc3NhZ2VbMF07Ci0JCi0JcHJpdmF0ZSBib29sZWFuCQlfY2FuY2VsZWQ7Ci0JCi0JLyoqIAotCSAqIFRoZSByZXNvdXJjZXMgdGhhdCB0aGUgdmFsaWRhdGVkIHJlc291cmNlIGRlcGVuZHMgb24uIFRoaXMgY2FuIGJlIGxlZnQgbnVsbC4KLQkgKiBGb3IgZXhhbXBsZSwgYW4gWE1MIGZpbGUgbWF5IGRlcGVuZCBvbiBhIFhTRCBpbiBvcmRlciB0byBrbm93IGlmIGl0IGlzIHZhbGlkIG9yIG5vdC4KLQkgKiBJdCB3b3VsZCBwYXNzIGJhY2sgdGhlIFhTRCBmaWxlLiAKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZVtdCV9kZXBlbmRzT247Ci0JCi0JLyoqIAotCSAqIFRoZSBvYmplY3RzIHRoYXQgeW91IHZhbGlkYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHZhbGlkYXRpbmcgdGhpcyBvYmplY3QuIFRoZSBmcmFtZXdvcmsgd2lsbCBub3QKLQkgKiBjYWxsIHlvdSB3aXRoIGFueSBvZiB0aGVzZSBvYmplY3RzIChpbiB0aGlzIHZhbGlkYXRpb24gcnVuKS4gVGhpcyBjYW4gYmUgbGVmdCBudWxsLgotCSAqLwotCXByaXZhdGUgSVJlc291cmNlW10gX3ZhbGlkYXRlZDsKLQkKLQlwcml2YXRlIGludAkJCV9zZXZlcml0eUVycm9yOwotCXByaXZhdGUgaW50CQkJX3NldmVyaXR5V2FybmluZzsKLQlwcml2YXRlIGludAkJCV9zZXZlcml0eUluZm87Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdAlfc3VzcGVuZFZhbGlkYXRpb247Ci0JCi0JLyoqIEEgY291bnQgb2YgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgdGhhdCB3ZXJlIHZhbGlkYXRlZC4gKi8KLQlwcml2YXRlIGludAkJCV9udW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcyA9IDE7Ci0JCi0JcHJpdmF0ZSBSZXBvcnRlckhlbHBlcglfcmVwb3J0ZXI7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uRXhjZXB0aW9uCV92YWxpZGF0aW9uRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFRoaXMgaXMgYW4gb3B0aW9uYWwgbWV0aG9kLCB0aGF0IGEgdmFsaWRhdG9yIGNhbiB1c2UgdG8gcmV0dXJuIGVycm9yCi0JICogbWVzc2FnZXMuIFRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBjb252ZXJ0cyB0aGVzZSBpbnRvIElNYXJrZXJzLgotCSAqIDxwPgotCSAqIFRoZSBzY2VuYXJpbyB0aGF0IG1vdGl2YXRlZCB0aGlzIG1ldGhvZCwgaXMgd2hlbiBhIHZhbGlkYXRvciBpcyB1c2VkIGJvdGgKLQkgKiBmb3IgPGI+YXMgeW91IHR5cGU8L2I+IHZhbGlkYXRpb24gYW5kIDxiPmJ1aWxkPC9iPiB2YWxpZGF0aW9uLiBXaGVuCi0JICogY2FsbGVkIGluIGFzIHlvdSB0eXBlIG1vZGUsIHRoZSB2YWxpZGF0b3IgZG9lc24ndCB3YW50IHRvIGRpcmVjdGx5IGNyZWF0ZSBJTWFya2VycywKLQkgKiBiZWNhdXNlIHRoZSByZXNvdXJjZSBoYXNuJ3QgYmVlbiBzYXZlZCB5ZXQuIEl0IG5lZWRzIHRvIHJldHVybiBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIGFuIElNYXJrZXIuIEJ1dCB3aGVuIGNhbGxlZCBpbiBidWlsZCBtb2RlLCBpdCBkb2VzIHVsdGltYXRlbHkKLQkgKiB3YW50IElNYXJrZXJzLiBCeSByZXR1cm5pbmcgVmFsaWRhdG9yTWVzc2FnZXMsIGl0IG9ubHkgbmVlZHMgdG8gcmV0dXJuCi0JICogb25lIHR5cGUgb2YgbWVzc2FnZSwgYW5kIHRob3NlIG1lc3NhZ2VzIGNhbiBiZSBlaXRoZXIgYmUgZGlyZWN0bHkgdXNlZCBieQotCSAqIHRoZSBjYWxsZXIsIG9yIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIGludG8gSU1hcmtlcnMgYnkgdGhlIHZhbGlkYXRpb24KLQkgKiBmcmFtZXdvcmsuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRvIG1ha2UgbWF0dGVycyBldmVuIG1vcmUgY29tcGxpY2F0ZWQgdGhlcmUgaXMgYSB0aGlyZCB3YXkgdG8gcmV0dXJuCi0JICogbWVzc2FnZXMuIFRvIG1ha2UgaXQgZWFzaWVyIGZvciBvbGQgdmFsaWRhdG9ycyB0byBwb3J0IHRvIHRoZSBuZXcKLQkgKiBmcmFtZXdvcmssIHRoZXkgY2FuIGNvbnRpbnVlIHRvIHVzZSBhbiBJUmVwb3J0ZXIuIElmIGEgdmFsaWRhdG9yIGNhbGxzCi0JICogdGhlIGdldFJlcG9ydGVyKCkgbWV0aG9kIHRoZW4gaXQgaXMgYXNzdW1lZCBieSB0aGUgZnJhbWV3b3JrIHRoYXQgdGhhdCBpcwotCSAqIHRoZSBhcHByb2FjaCB0aGF0IHRoZXkgaGF2ZSBjaG9zZW4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI2dldFJlcG9ydGVyKElQcm9ncmVzc01vbml0b3IpCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAJCUEgdmFsaWRhdGlvbiBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYWxpZGF0b3JNZXNzYWdlIG1lc3NhZ2UpewotCQlfbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYW4gSVJlcG9ydGVyIGZvciBoYW5kaW5nIGVycm9yIG1lc3NhZ2VzLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSB0cmFuc2l0aW9uIG1ldGhvZCwgdG8gaGVscCBvbGQgdmFsaWRhdG9ycyBwb3J0IHRvIHRoZSBuZXcgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIElmIHRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGl0IGlzIGFzc3VtZWQgYnkgdGhlIGZyYW1ld29yaywgdGhhdCB0aGlzIElSZXBvcnRlciB3aWxsIGJlIHVzZWQgYXMgdGhlIG9ubHkgd2F5IG9mIHBhc3NpbmcgbWVzc2FnZXMKLQkgKiBiYWNrIHRvIHRoZSBmcmFtZXdvcmsuCi0JICogCi0JICogQHNlZSAjYWRkKFZhbGlkYXRvck1lc3NhZ2UpCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgSVJlcG9ydGVyIGdldFJlcG9ydGVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCWlmIChfcmVwb3J0ZXIgPT0gbnVsbClfcmVwb3J0ZXIgPSBuZXcgUmVwb3J0ZXJIZWxwZXIobW9uaXRvcik7Ci0JCXJldHVybiBfcmVwb3J0ZXI7Ci0JfQotCQotCVJlcG9ydGVySGVscGVyIGdldFJlcG9ydGVySGVscGVyKCl7Ci0JCXJldHVybiBfcmVwb3J0ZXI7Ci0JfQotCQotCS8qKgotCSAqIE1lcmdlIHRoZSBtZXNzYWdlIGNvdW50cyBhbmQgbWVzc2FnZXMgZnJvbSBhbiBpbmRpdmlkdWFsIHZhbGlkYXRvciBpbnRvIHRoaXMgcmVzdWx0LgotCSAqIEBwYXJhbSByZXN1bHQgaXQgY2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2UgaXQgaXMgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtZXJnZVJlc3VsdHMoVmFsaWRhdGlvblJlc3VsdCByZXN1bHQpewotCQlpZiAocmVzdWx0ID09IG51bGwpcmV0dXJuOwotCQkKLQkJVmFsaWRhdG9yTWVzc2FnZVtdIG1zZ3MgPSByZXN1bHQuZ2V0TWVzc2FnZXMoKTsKLQkJZm9yIChWYWxpZGF0b3JNZXNzYWdlIG0gOiBtc2dzKXsKLQkJCWFkZChtKTsKLQkJCWludCBzZXZlcml0eSA9IG0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIDApOwotCQkJc3dpdGNoIChzZXZlcml0eSl7Ci0JCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfRVJST1I6Ci0JCQkJaW5jcmVtZW50RXJyb3IoMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzoKLQkJCQlpbmNyZW1lbnRXYXJuaW5nKDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX0lORk86Ci0JCQkJaW5jcmVtZW50SW5mbygxKTsKLQkJCQlicmVhazsKLQkJCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCWluY3JlbWVudEVycm9yKHJlc3VsdC5nZXRTZXZlcml0eUVycm9yKCkpOwotCQlpbmNyZW1lbnRXYXJuaW5nKHJlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSk7Ci0JCWluY3JlbWVudEluZm8ocmVzdWx0LmdldFNldmVyaXR5SW5mbygpKTsKLQkJCi0JCV9udW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcyArPSByZXN1bHQuZ2V0TnVtYmVyT2ZWYWxpZGF0ZWRSZXNvdXJjZXMoKTsKLQkJCi0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgdmFsaWRhdGVkIHJlc291cmNlIGRlcGVuZHMgb24uCi0JICovCi0JcHVibGljIElSZXNvdXJjZVtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIF9kZXBlbmRzT247Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRvci4gCi0JICogQHJldHVybiBhbiBhcnJheSBpcyByZXR1cm5lZCBldmVuIGlmIHRoZXJlIGFyZSBubyBtZXNzYWdlcy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWVzc2FnZVtdIGdldE1lc3NhZ2VzKCl7Ci0JCWlmIChfbWVzc2FnZXMgPT0gbnVsbClyZXR1cm4gX25vTWVzc2FnZXM7Ci0JCVZhbGlkYXRvck1lc3NhZ2VbXSBtc2dzID0gbmV3IFZhbGlkYXRvck1lc3NhZ2VbX21lc3NhZ2VzLnNpemUoKV07Ci0JCV9tZXNzYWdlcy50b0FycmF5KG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0JCQotCS8qKgotCSAqIEFuc3dlciBhIGNvcHkgb2YgYW55IHZhbGlkYXRpb24gbWVzc2FnZXMgdGhhdCB3ZXJlIGFkZGVkIGJ5IHRoZSB2YWxpZGF0b3IuIFRoZSBhcnJheSBpcyBhIG5ldwotCSAqIGFycmF5LCBhbmQgZWFjaCBtZXNzYWdlIGlzIGEgY29weS4gCi0JICogQHJldHVybiBhbiBhcnJheSBpcyByZXR1cm5lZCBldmVuIGlmIHRoZXJlIGFyZSBubyBtZXNzYWdlcy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFZhbGlkYXRvck1lc3NhZ2VbXSBnZXRNZXNzYWdlc0FzQ29weSgpewotCQlpZiAoX21lc3NhZ2VzID09IG51bGwpcmV0dXJuIF9ub01lc3NhZ2VzOwotCQlWYWxpZGF0b3JNZXNzYWdlW10gbXNncyA9IG5ldyBWYWxpZGF0b3JNZXNzYWdlW19tZXNzYWdlcy5zaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoVmFsaWRhdG9yTWVzc2FnZSBtc2cgOiBfbWVzc2FnZXMpbXNnc1tpKytdID0gbXNnLmFzQ29weSgpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHJlc291cmNlcyB0aGF0IHRoZSB2YWxpZGF0ZWQgcmVzb3VyY2UgZGVwZW5kcyBvbi4gVGhpcyBjYW4gYmUKLQkgKiBsZWZ0IG51bGwuIEZvciBleGFtcGxlLCBhIFhNTCBmaWxlIG1heSBkZXBlbmQgb24gYSBYU0QgZmlsZSBpbiBvcmRlciB0bwotCSAqIGtub3cgaWYgaXQgaXMgdmFsaWQgb3Igbm90LiBJdCB3b3VsZCBwYXNzIGJhY2sgdGhhdCBYU0QgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVwZW5kc09uCi0JICogCQlJZiB0aGlzIGlzIG51bGwgdGhlbiB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpcyBub3QgdXBkYXRlZC4gVG8KLQkgKiAJCXJlbW92ZSB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiwgYW4gZW1wdHkgYXJyYXkgbmVlZHMgdG8gYmUKLQkgKiAJCXN1cHBsaWVkLiBBIG5vbiBudWxsIHBhcmFtZXRlciwgPGI+cmVwbGFjZXM8L2I+IGFsbCB0aGUgZGVwZW5kZW5jeQotCSAqIAkJaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVzb3VyY2UsIGZvciB0aGlzIHZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBlbmRzT24oSVJlc291cmNlW10gZGVwZW5kc09uKSB7Ci0JCV9kZXBlbmRzT24gPSBkZXBlbmRzT247Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gQWxsIHRoZSByZXNvdXJjZXMgdGhhdCB3ZXJlIHZhbGlkYXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mCi0JICogCXZhbGlkYXRpbmcgdGhlIG1haW4gcmVzb3VyY2UsIG9yIG51bGwgaWYgbm9uZSB3ZXJlLgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRWYWxpZGF0ZWQoKSB7Ci0JCXJldHVybiBfdmFsaWRhdGVkOwotCX0KLQkKLQkvKioKLQkgKiBJbmRpY2F0ZSB0aGF0IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYXMgcGFydCBvZiB0aGlzCi0JICogdmFsaWRhdGUgb3BlcmF0aW9uLiBTb21ldGltZXMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIGEgdmFsaWRhdGlvbiBvbgotCSAqIG9uZSByZXNvdXJjZSBpdCBpcyBuZWNlc3NhcnkgdG8gdmFsaWRhdGUgb3RoZXIgcmVzb3VyY2VzIGFzIHdlbGwuIFRoaXMKLQkgKiBtZXRob2QgaXMgdXNlZCB0byBsZXQgdGhlIGZyYW1ld29yayBrbm93IGFib3V0IHRoZXNlIGFkZGl0aW9uYWwgdmFsaWRhdGVkCi0JICogcmVzb3VyY2VzLCB0byBwb3NzaWJseSBzYXZlIHRoZW0gYmVpbmcgdmFsaWRhdGVkIHJlZHVuZGFudGx5LgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0ZWQKLQkgKiAJCUFueSBhZGRpdGlvbmFsIHJlc291cmNlcyB0aGF0IHdlcmUgdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlZChJUmVzb3VyY2VbXSB2YWxpZGF0ZWQpIHsKLQkJX3ZhbGlkYXRlZCA9IHZhbGlkYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5RXJyb3IoKSB7Ci0JCXJldHVybiBfc2V2ZXJpdHlFcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLQkgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5RXJyb3IoaW50IHNldmVyaXR5RXJyb3IpIHsKLQkJX3NldmVyaXR5RXJyb3IgPSBzZXZlcml0eUVycm9yOwotCX0KLQkKLQotCS8qKgotCSAqIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIE1lc3NhZ2VzIGFkZGVkIHRocm91Z2ggdGhlIGFkZChWYWxpZGF0aW9uTWVzc2FnZSkgbWV0aG9kIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaGVyZSwgYXMgdGhpcwotCSAqIGluZm9ybWF0aW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBWYWxpZGF0aW9uTWVzc2FnZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBudW1iZXIgb2YgZXJyb3JzLgotCSAqLwotCXB1YmxpYyBpbnQgaW5jcmVtZW50RXJyb3IoaW50IGVycm9ycyl7Ci0JCV9zZXZlcml0eUVycm9yICs9IGVycm9yczsKLQkJcmV0dXJuIF9zZXZlcml0eUVycm9yOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eVdhcm5pbmcoKSB7Ci0JCXJldHVybiBfc2V2ZXJpdHlXYXJuaW5nOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0JICogPHA+Ci0JICogTWVzc2FnZXMgYWRkZWQgdGhyb3VnaCB0aGUgYWRkKFZhbGlkYXRpb25NZXNzYWdlKSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBoZXJlLCBhcyB0aGlzCi0JICogaW5mb3JtYXRpb24gd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIFZhbGlkYXRpb25NZXNzYWdlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eVdhcm5pbmcoaW50IHNldmVyaXR5V2FybmluZykgewotCQlfc2V2ZXJpdHlXYXJuaW5nID0gc2V2ZXJpdHlXYXJuaW5nOwotCX0KLQotCS8qKgotCSAqIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0JICogPHA+Ci0JICogTWVzc2FnZXMgYWRkZWQgdGhyb3VnaCB0aGUgYWRkKFZhbGlkYXRpb25NZXNzYWdlKSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBoZXJlLCBhcyB0aGlzCi0JICogaW5mb3JtYXRpb24gd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIFZhbGlkYXRpb25NZXNzYWdlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG51bWJlciBvZiB3YXJuaW5ncy4KLQkgKi8KLQlwdWJsaWMgaW50IGluY3JlbWVudFdhcm5pbmcoaW50IHdhcm5pbmdzKXsKLQkJX3NldmVyaXR5V2FybmluZyArPSB3YXJuaW5nczsKLQkJcmV0dXJuIF9zZXZlcml0eVdhcm5pbmc7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5SW5mbygpIHsKLQkJcmV0dXJuIF9zZXZlcml0eUluZm87Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLQkgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5SW5mbyhpbnQgc2V2ZXJpdHlJbmZvKSB7Ci0JCV9zZXZlcml0eUluZm8gPSBzZXZlcml0eUluZm87Ci0JfQotCi0JLyoqCi0JICogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLQkgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGluZm9ybWF0aW9uYWwgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluY3JlbWVudEluZm8oaW50IGluZm8pewotCQlfc2V2ZXJpdHlJbmZvICs9IGluZm87Ci0JCXJldHVybiBfc2V2ZXJpdHlJbmZvOwotCX0KLQotCS8qKgotCSAqIFdhcyB0aGUgb3BlcmF0aW9uIGNhbmNlbGVkIGJlZm9yZSBpdCBjb21wbGV0ZWQ/IEZvciBleGFtcGxlIGlmIHRoZSB2YWxpZGF0aW9uIGlzIGJlaW5nIHJ1biB0aHJvdWdoIHRoZQotCSAqIHVzZXIgaW50ZXJmYWNlLCB0aGUgZW5kIHVzZXIgY2FuIGNhbmNlbCB0aGUgb3BlcmF0aW9uIHRocm91Z2ggdGhlIHByb2dyZXNzIG1vbml0b3IuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJcmV0dXJuIF9jYW5jZWxlZDsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY2FuY2VsZWQKLQkgKiAJCVNldCB0byB0cnVlIGlmIGl0IHdhcyBjYW5jZWxlZCBhbmQgZmFsc2UgaWYgaXQgd2FzIG5vdCBjYW5jZWxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGNhbmNlbGVkKSB7Ci0JCV9jYW5jZWxlZCA9IGNhbmNlbGVkOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgbnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGF0ZWQuCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcygpIHsKLQkJaWYgKF92YWxpZGF0ZWQgPT0gbnVsbClyZXR1cm4gX251bWJlck9mVmFsaWRhdGVkUmVzb3VyY2VzOwotCQlyZXR1cm4gX251bWJlck9mVmFsaWRhdGVkUmVzb3VyY2VzICsgX3ZhbGlkYXRlZC5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbGlkYXRpb24gZW5kZWQgd2l0aCBhbiBleGNlcHRpb24sIGFuc3dlciBpdC4KLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHZhbGlkYXRvciBkaWQgbm90IGZpbmlzaCB3aXRoIGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkV4Y2VwdGlvbiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRpb25FeGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbGlkYXRpb24gZmFpbGVkIHdpdGggYW4gZXhjZXB0aW9uLCBpdCBjYW4gYmUgcmVjb3JkZWQgaGVyZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBmb3Igb2xkIHZhbGlkYXRvcnMgdG8gZWFzZSB0aGVpciB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgZnJhbWV3b3JrLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gdmFsaWRhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25FeGNlcHRpb24oVmFsaWRhdGlvbkV4Y2VwdGlvbiB2YWxpZGF0aW9uRXhjZXB0aW9uKSB7Ci0JCV92YWxpZGF0aW9uRXhjZXB0aW9uID0gdmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBwcm9qZWN0IHRoYXQgdGhlIHZhbGlkYXRvciB3b3VsZCBsaWtlIHRvIGhhdmUgc3VzcGVuZGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgdG8gc3VzcGVuZCBvciBudWxsLiBUaGUgbm9ybWFsIHJlc3VsdCBpcyBudWxsLCB3aGljaCBtZWFucyB0aGF0Ci0JICogdGhlIHZhbGlkYXRvciB3aXNoZXMgdG8gcmVjZWl2ZSBub3JtYWwgdmFsaWRhdGlvbiByZXF1ZXN0cy4gCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFN1c3BlbmRWYWxpZGF0aW9uKCl7Ci0JCXJldHVybiBfc3VzcGVuZFZhbGlkYXRpb247Ci0JfQotCi0JLyoqCi0JICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGluZm9ybSB0aGUgZnJhbWV3b3JrLCB0aGF0IHRoaXMgdmFsaWRhdG9yIGRvZXMgbm90IHdpc2ggdG8gYmUKLQkgKiBjYWxsZWQgYWdhaW4gZm9yIGFueSByZXNvdXJjZXMgaW4gdGhpcyBwcm9qZWN0LCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0JICogPHA+Ci0JICogU29tZSB2YWxpZGF0b3JzIG1heSBoYXZlIGEgcmljaCBzZXQgb2YgdHJpZ2dlcnMsIGJ1dCBvbmNlIHRoZXkgaGF2ZSBiZWVuIGludm9rZWQgb25jZSwKLQkgKiBkbyBub3QgbmVlZCB0byBiZSBpbnZva2VkIGFnYWluIGR1cmluZyB0aGUgY291cnNlIG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0JICogPC9wPgotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRoYXQgdGhpcyB2YWxpZGF0b3Igbm8gbG9uZ2VyIHdhbnRzIHRvIGJlIG5vdGlmaWVkIG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1c3BlbmRWYWxpZGF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJX3N1c3BlbmRWYWxpZGF0aW9uID0gcHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5NDdmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi0KLS8qKgotICogVGhlIGNvbWJpbmVkIHJlc3VsdHMgb2YgdmFsaWRhdGluZyBtdWx0aXBsZSByZXNvdXJjZXMuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblJlc3VsdHMgewotCQotCXByaXZhdGUgZmluYWwgVmFsaWRhdG9yTWVzc2FnZVtdIF9tZXNzYWdlczsKLQlwcml2YXRlIGZpbmFsIGludCAJX2Vycm9yOwotCXByaXZhdGUgZmluYWwgaW50CV93YXJuOwotCXByaXZhdGUgZmluYWwgaW50CV9pbmZvOwotCQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0cyhWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCl7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCl7Ci0JCQlfbWVzc2FnZXMgPSBuZXcgVmFsaWRhdG9yTWVzc2FnZVswXTsKLQkJCV9lcnJvciA9IDA7Ci0JCQlfd2FybiA9IDA7Ci0JCQlfaW5mbyA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlfbWVzc2FnZXMgPSByZXN1bHQuZ2V0TWVzc2FnZXNBc0NvcHkoKTsKLQkJCV9lcnJvciA9IHJlc3VsdC5nZXRTZXZlcml0eUVycm9yKCk7Ci0JCQlfd2FybiA9IHJlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKTsKLQkJCV9pbmZvID0gcmVzdWx0LmdldFNldmVyaXR5SW5mbygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqIEByZXR1cm4gYW4gYXJyYXkgaXMgcmV0dXJuZWQgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1lc3NhZ2VbXSBnZXRNZXNzYWdlcygpewotCQlyZXR1cm4gX21lc3NhZ2VzOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHlFcnJvcigpIHsKLQkJcmV0dXJuIF9lcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHlJbmZvKCkgewotCQlyZXR1cm4gX2luZm87Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eVdhcm5pbmcoKSB7Ci0JCXJldHVybiBfd2FybjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOTdkZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogS2VlcCB0cmFjayBvZiBhcmJpdHJhcnkgdmFsaWRhdGlvbiBkYXRhLCBkdXJpbmcgdGhlIGNvdXJzZSBvZiBhIHZhbGlkYXRpb24uCi0gKiA8cD4KLSAqIFRvIGVuYWJsZSBtb3JlIGVmZmljaWVudCBjYWNoaW5nLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIGFsbG93cyBpbmRpdmlkdWFsIHZhbGlkYXRvcnMgdG8gY2FjaGUKLSAqIGFyYml0cmFyeSBkYXRhIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLiBVc2Ugb2YgdGhpcyBvYmplY3QgaXMgY29tcGxldGVseSBvcHRpb25hbC4KLSAqIDxwPgotICogU2luY2Ugc29tZSB2YWxpZGF0b3JzIHdpc2ggdG8gc2hhcmUgZGF0YSB3aXRoIG90aGVyIHZhbGlkYXRvcnMsIGFueSB2YWxpZGF0b3IgY2FuIHNlZSB0aGUgc3RhdGUgZGF0YSBmb3IKLSAqIGFueSBvdGhlciB2YWxpZGF0b3IsIHNpbmNlIHRoZSBpZCBpcyBzaW1wbHkgdGhlIHZhbGlkYXRvcidzIGV4dGVuc2lvbiBpZC4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgZnJlZWQgYXQgdGhlIGVuZCBvZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQG5vZXh0ZW5kCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblN0YXRlIHsKLQkKLQkvKioKLQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBpZC4KLQkgKiA8cD4KLQkgKiBJZiBhIHJlc291cmNlIHRoYXQgaXMgZGVwZW5kZWQgb24gYnkgb3RoZXJzIGlzIGNoYW5nZWQsIHRoZW4gdGhlCi0JICogZGVwZW5kZW50IHJlc291cmNlcyBhcmUgdmFsaWRhdGVkLiBUaGUgZGVwZW5kZWQgb24gcmVzb3VyY2UsIHdoaWNoIGlzIHRoZQotCSAqIHJlc291cmNlIHRoYXQgYWN0dWFsbHkgY2hhbmdlZCwgaXMgcGxhY2VkIGludG8gdGhlIFZhbGlkYXRpb25TdGF0ZSB1c2luZwotCSAqIHRoaXMgaWQuCi0JICogPC9wPgotCSAqIEBkZXByZWNhdGVkIFRoaXMgYXBwcm9hY2ggaXMgbm90IHRocmVhZCBzYWZlLCB0aGUgbG9uZ2VyIGZvcm0gb2YgdGhlIEFic3RyYWN0VmFsaWRhdG9yIHZhbGlkYXRlIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotCSAqIEBzZWUgQWJzdHJhY3RWYWxpZGF0b3IjdmFsaWRhdGUoVmFsaWRhdGlvbkV2ZW50LCBWYWxpZGF0aW9uU3RhdGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRyaWdnZXJSZXNvdXJjZSA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEICsgIi5UcmlnZ2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSSBjYW4ndCB1c2UgYSBDb25uY3VycmVudEhhc2hNYXAgYmVjYXVzZSBzb21lIG9mIHRoZSBjbGllbnRzIHN0b3JlIG51bGxzLgotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBfbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KDUwKTsKLQkKLQlwdWJsaWMgVmFsaWRhdGlvblN0YXRlKCl7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgc29tZSBzdGF0ZSBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCUJ5IGNvbnZlbnRpb24gdGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhbGlkYXRvciBleHRlbnNpb24gaWQuCi0JICogCQlGb3IgZXhhbXBsZTogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuSFRNTFZhbGlkYXRvcgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIAkJQW55IGFyYml0cmFyeSBkYXRhIHRoYXQgdGhlIHZhbGlkYXRvciBtaWdodCBmaW5kIHVzZWZ1bC4gVGhlCi0JICogCQl2YWxpZGF0aW9uIGZyYW1ld29yayBkb2Vzbid0IGRvIGFueXRoaW5nIHdpdGggdGhpcyBvYmplY3QgZXhjZXB0Ci0JICogCQlwYXNzIGl0IGFsb25nIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdXQoU3RyaW5nIGlkLCBPYmplY3QgdmFsdWUpewotCQlfbWFwLnB1dChpZCwgdmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHN0YXRlIGRhdGEgZm9yIHRoZSBnaXZlbiB2YWxpZGF0b3IuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQlCeSBjb252ZW50aW9uIHRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50Ci0JICogCQlpZC4gRm9yIGV4YW1wbGUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuSFRNTFZhbGlkYXRvcgotCSAqIAotCSAqIEByZXR1cm4gYW55IGFyYml0cmFyeSBkYXRhIHRoYXQgdGhlIHZhbGlkYXRvciBtaWdodCBmaW5kIHVzZWZ1bCwKLQkgKiAJaW5jbHVkaW5nIG51bGwuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0KFN0cmluZyBpZCl7Ci0JCXJldHVybiBfbWFwLmdldChpZCk7Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTlkYTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50VHlwZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRXh0ZW5zaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLk1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5OdWxsVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlN1bW1hcnlSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFByZWZNYW5hZ2VyR2xvYmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFByZWZNYW5hZ2VyUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckV4dGVuc2lvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRvckxhdW5jaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLlZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckV4dGVuZGVyOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSB2YWxpZGF0b3IuIFRoaXMgZ2V0cyBpbnN0YW50aWF0ZWQgdGhyb3VnaCBvbmUgb2YgdGhlIHZhbGlkYXRvciBleHRlbnNpb24gcG9pbnRzLgotICogPHA+Ci0gKiA8Yj5UaGlzIGNsYXNzIGlzIG5vdCBBUEk8L2I+LgotICogPC9wPgotICogCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgQ29tcGFyYWJsZTxWYWxpZGF0b3I+IHsKLQkvLyBSZW1lbWJlciBpZiB5b3UgYWRkIGEgbmV3IGluc3RhbmNlIHZhcmlhYmxlLCBtYWtlIHN1cmUgdGhhdCB5b3UgdXBkYXRlIHRoZSBjb3B5IGFuZCBiZWNvbWUgbWV0aG9kcwotCQotCS8qKgotCSAqIFRoZSBsZXZlbCBvZiBjb25maWd1cmF0aW9uIGZvciB0aGUgdmFsaWRhdG9yLgotCSAqIDx1bD4KLQkgKiA8bGk+RXh0ZW5zaW9uIC0gRGVmaW5lZCBieSBhbiBleHRlbnNpb24gcG9pbnQuPC9saT4KLQkgKiA8bGk+R2xvYmFsIC0gRGVmaW5lZCBieSBhIGdsb2JhbCBwcmVmZXJlbmNlLjwvbGk+Ci0JICogPGxpPlByb2plY3QgLSBEZWZpbmVkIGJ5IGEgcHJvamVjdCBwcm9wZXJ0eS48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIGVudW0gTGV2ZWwge0V4dGVuc2lvbiwgR2xvYmFsLCBQcm9qZWN0fTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbglfYnVpbGRWYWxpZGF0aW9uID0gdHJ1ZTsKLQkKLQkvKiogSWYgdGhpcyBpcyBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yLCB0aGVuIHRoaXMgZmllbGQgaG9sZHMgdGhlIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgZGVsZWdhdGVkIHRvLiAqLwotCXByaXZhdGUgU3RyaW5nIAkJX2RlbGVnYXRpbmdJZDsKLQkKLQkvKiogCi0JICogSWYgdGhpcyB2YWxpZGF0b3IgaXMgYWxzbyB1c2VkIHRvIGNvbnRyb2wgYW4gSVNvdXJjZSB2YWxpZGF0b3IsIHRoZSBpZCBvZiB0aGUgSVNvdXJjZSB2YWxpZGF0b3IgaXMKLQkgKiByZWdpc3RlcmVkIGhlcmUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcJCV9zb3VyY2VJZDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiAJX21hbnVhbFZhbGlkYXRpb24gPSB0cnVlOwotCQotCS8qKiBBbiBvcHRpb25hbCBjdXN0b21pemVkIG1hcmtlciBpZCBmb3IgdGhpcyB2YWxpZGF0b3IuICovCi0JcHJpdmF0ZSBTdHJpbmcgCQlfbWFya2VySWQ7Ci0JCi0JLyoqIAotCSAqIFZlcnNpb24gb2YgdGhlIGZpbHRlciBkZWZpbml0aW9uLiBCeSBpbmNyZWFzaW5nIHRoaXMgbnVtYmVyIHRoZSBmcmFtZXdvcmsgY2FuIGtub3cgdGhhdCBhIHBsdWctaW4gaGFzIAotCSAqIGNoYW5nZWQgaXQncyBmaWx0ZXJzLgotCSAqLwotCXByaXZhdGUgaW50CQkJX3ZlcnNpb24gPSAxOwotCQotCS8qKiBNYXAgc2ltcGxlIG1lc3NhZ2UgaWQncyB0byBtZXNzYWdlIHNldHRpbmdzLiAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4gX21lc3NhZ2VTZXR0aW5nczsKLQkKLQkvKiogVGhlIHByb2plY3QgdGhhdCB5b3UgYXJlIGRlZmluZWQgaW4uIFRoaXMgY2FuIGJlIG51bGwgd2hpY2ggbWVhbnMgdGhhdCB5b3UgYXJlIGEgZ2xvYmFsIHZhbGlkYXRvci4gKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QJX3Byb2plY3Q7Ci0JCQotCS8qKiBIb3cgbWFueSB0aW1lcyBoYXMgYSBnbG9iYWwgZmllbGQgaW4gdGhpcyB2YWxpZGF0b3IgYmVlbiBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBjcmVhdGVkIChvciBjb3BpZWQpPyAqLwotCXByb3RlY3RlZCB0cmFuc2llbnQgaW50IF9jaGFuZ2VDb3VudEdsb2JhbDsKLQkKLQkvKiogSG93IG1hbnkgdGltZXMgaGFzIGEgbWVzc2FnZSBmaWVsZCBpbiB0aGlzIHZhbGlkYXRvciBiZWVuIGNoYW5nZWQgc2luY2UgaXQgd2FzIGNyZWF0ZWQgKG9yIGNvcGllZCk/ICovCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBpbnQgX2NoYW5nZUNvdW50TWVzc2FnZXM7Ci0JCi0JLyoqIEhhcyB0aGUgdmFsaWRhdG9yIGJlZW4gbWlncmF0ZWQgZnJvbSBhbiBlYXJsaWVyIHZlcnNpb24gaW4gdGhpcyBzZXNzaW9uLCBidXQgbm90IHlldCBzYXZlZD8gKi8KLQlwcml2YXRlIGJvb2xlYW4gX21pZ3JhdGVkOwotCQotCXB1YmxpYyBWYWxpZGF0b3IoSVByb2plY3QgcHJvamVjdCl7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JCQotCXZvaWQgc2V0TWlncmF0ZWQoYm9vbGVhbiBtaWdyYXRlZCl7Ci0JCV9taWdyYXRlZCA9IG1pZ3JhdGVkOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmFsaWRhdG9yIGJhc2VkIG9uIGEgYWJzdHJhY3QgdmFsaWRhdG9yLgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0b3IgdGhhdCBpcyBiZWluZyB3cmFwcGVkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdCB0aGF0IHlvdSBhcmUgZGVmaW5lZCBpbi4gVGhpcyBjYW4gYmUgbnVsbCB3aGljaAotCSAqICAgICAgICAgICAgbWVhbnMgdGhhdCB5b3UgYXJlIGEgZ2xvYmFsIHZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvciBjcmVhdGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCkgewotCQlWMiB2MiA9IG5ldyBWMih2YWxpZGF0b3IsIHByb2plY3QpOwotCQlyZXR1cm4gdjI7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyB2YWxpZGF0b3IgYmFzZWQgb24gdmFsaWRhdG9yIG1ldGEgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QgdGhhdCB5b3UgYXJlIGRlZmluZWQgaW4uIFRoaXMgY2FuIGJlIG51bGwgd2hpY2gKLQkgKiAgICAgICAgICAgIG1lYW5zIHRoYXQgeW91IGFyZSBhIGdsb2JhbCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3IgY3JlYXRlKFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnLCBJUHJvamVjdCBwcm9qZWN0KXsKLQkJVjEgdjEgPSBuZXcgVjEodm1kLCBjb25maWcsIHByb2plY3QpOwotCQlyZXR1cm4gdjE7Ci0JfQotCQotCS8qKgotCSAqIElmIHlvdSBhcmUgYSB2ZXJzaW9uIDEgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuCi0JICovCi0JcHVibGljIFYxIGFzVjFWYWxpZGF0b3IoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIElmIHlvdSBhcmUgYSB2ZXJzaW9uIDIgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuCi0JICovCi0JcHVibGljIFYyIGFzVjJWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgcHJvamVjdCBpcyBiZWluZyBjbGVhbmVkLCB0aGlzIG1ldGhvZCBnaXZlcyB0aGUgdmFsaWRhdG9yIGEgY2hhbmNlIHRvIGRvIGFueSBzcGVjaWFsIGNsZWFudXAuCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBiZWluZyBidWlsdC4KLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JfQkKLQkKLQkvKioKLQkgKiBDb21wYXJlIHlvdXJzZWxmIGJhc2VkIG9uIFZhbGlkYXRvciBuYW1lLgotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJcmV0dXJuIGdldE5hbWUoKS5jb21wYXJlVG8odmFsaWRhdG9yLmdldE5hbWUoKSk7CQkJCi0JfQotCQotCS8qKiBBbnN3ZXIgYSBkZWVwIGNvcHkgb2YgeW91cnNlbGYuICovCi0JcHVibGljIFZhbGlkYXRvciBjb3B5KCl7Ci0JCXJldHVybiBjb3B5KGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFZhbGlkYXRvciBjb3B5KGJvb2xlYW4gaW5jbHVkZUNoYW5nZUNvdW50cyk7Ci0JCi0JLyoqCi0JICogVXBkYXRlIHlvdXIgZGlyZWN0LCBub24gdHJhbnNpZW50IGZpZWxkcyBmcm9tIHRoZSBmaWVsZHMgaW4gdi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TG9jYWwoVmFsaWRhdG9yIHYsIGJvb2xlYW4gaW5jbHVkZUNoYW5nZUNvdW50cyl7Ci0JCV9idWlsZFZhbGlkYXRpb24gPSB2Ll9idWlsZFZhbGlkYXRpb247Ci0JCV9kZWxlZ2F0aW5nSWQgPSB2Ll9kZWxlZ2F0aW5nSWQ7Ci0JCV9tYW51YWxWYWxpZGF0aW9uID0gdi5fbWFudWFsVmFsaWRhdGlvbjsKLQkJX21hcmtlcklkID0gdi5fbWFya2VySWQ7Ci0JCV9tZXNzYWdlU2V0dGluZ3MgPSB2Ll9tZXNzYWdlU2V0dGluZ3M7Ci0JCV9zb3VyY2VJZCA9IHYuX3NvdXJjZUlkOwotCQlfdmVyc2lvbiA9IHYuX3ZlcnNpb247Ci0JCV9taWdyYXRlZCA9IHYuX21pZ3JhdGVkOwotCQkKLQkJaWYgKGluY2x1ZGVDaGFuZ2VDb3VudHMpewotCQkJX2NoYW5nZUNvdW50R2xvYmFsID0gdi5fY2hhbmdlQ291bnRHbG9iYWw7Ci0JCQlfY2hhbmdlQ291bnRNZXNzYWdlcyA9IHYuX2NoYW5nZUNvdW50TWVzc2FnZXM7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2hvdWxkIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBmaXJzdCBjbGVhciB0aGUgbWFya2VycyB0aGF0IHRoaXMKLQkgKiB2YWxpZGF0b3IgaGFzIHBsYWNlZCBvbiB0aGlzIHJlc291cmNlPyBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieQotCSAqIHZhbGlkYXRvciBpbXBsZW1lbnRvcnMgdG8gcHJvdmlkZSBhIHZhbGlkYXRvciBzcGVjaWZpYyBiZWhhdmlvci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSB2YWxpZGF0aW9uLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc2hvdWxkIGZpcnN0IGNsZWFyIGFsbCB0aGUKLQkgKiAgICAgICAgIG1hcmtlcnMgdGhhdCB0aGlzIHZhbGlkYXRvciBwcm9kdWNlZC4gVGhpcyBpcyB0aGUgZGVmYXVsdAotCSAqICAgICAgICAgYmVoYXZpb3IuIFJldHVybiBmYWxzZSB0byBsZWF2ZSB0aGUgbWFya2VycyB1bmNoYW5nZWQuIEl0IHRoZW4KLQkgKiAgICAgICAgIGJlY29tZXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB2YWxpZGF0b3IgdG8gbWFuYWdlIGl0J3Mgb3duCi0JICogICAgICAgICBtYXJrZXJzIGZvciB0aGlzIHJlc291cmNlLCBmb3IgdGhpcyB2YWxpZGF0aW9uIGV2ZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZENsZWFyTWFya2VycyhWYWxpZGF0aW9uRXZlbnQgZXZlbnQpewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlCi0JICogdGhpcyByZXNvdXJjZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIGdsb2JhbCB2YWxpZGF0aW9uIG9yCi0JICogcHJvamVjdCB2YWxpZGF0aW9uIGhhcyBiZWVuIHN1c3BlbmRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gaXNNYW51YWwKLQkgKiAgICAgICAgICAgIElmIHRydWUgdGhlbiB0aGlzIHZhbGlkYXRvciBtdXN0IGFsc28gYmUgZW5hYmxlZCBmb3IgbWFudWFsCi0JICogICAgICAgICAgICB2YWxpZGF0aW9uLgotCSAqIEBwYXJhbSBpc0J1aWxkCi0JICogICAgICAgICAgICBJZiB0cnVlIHRoZW4gdGhpcyB2YWxpZGF0b3IgbXVzdCBhbHNvIGJlIGVuYWJsZWQgZm9yIGJ1aWxkZXIKLQkgKiAgICAgICAgICAgIGJhc2VkIHZhbGlkYXRpb24uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpc01hbnVhbCwgYm9vbGVhbiBpc0J1aWxkKXsKLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlKHJlc291cmNlLCBpc01hbnVhbCwgaXNCdWlsZCwgbmV3IENvbnRlbnRUeXBlV3JhcHBlcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlCi0JICogdGhpcyByZXNvdXJjZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIGdsb2JhbCB2YWxpZGF0aW9uIG9yCi0JICogcHJvamVjdCB2YWxpZGF0aW9uIGhhcyBiZWVuIHN1c3BlbmRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gaXNNYW51YWwKLQkgKiAgICAgICAgICAgIElmIHRydWUgdGhlbiB0aGlzIHZhbGlkYXRvciBtdXN0IGFsc28gYmUgZW5hYmxlZCBmb3IgbWFudWFsCi0JICogICAgICAgICAgICB2YWxpZGF0aW9uLgotCSAqIEBwYXJhbSBpc0J1aWxkCi0JICogICAgICAgICAgICBJZiB0cnVlIHRoZW4gdGhpcyB2YWxpZGF0b3IgbXVzdCBhbHNvIGJlIGVuYWJsZWQgZm9yIGJ1aWxkZXIKLQkgKiAgICAgICAgICAgIGJhc2VkIHZhbGlkYXRpb24uCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlV3JhcHBlciAKLQkgKiAgICAgICAgICAgIEZvciByZXBlYXRlZCBjYWxscyBvbiB0aGUgc2FtZSByZXNvdXJjZSwgaXQgaXMgbW9yZSBlZmZpY2llbnQKLQkgKiAgICAgICAgICAgIHRvIHJlbWVtYmVyIHRoZSBjb250ZW50IHR5cGUuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgdmFsaWRhdGVkLgotCSAqIEBzZWUgRnJpZW5kI3Nob3VsZFZhbGlkYXRlKFZhbGlkYXRvciwgSVJlc291cmNlLCBib29sZWFuLCBib29sZWFuLCBDb250ZW50VHlwZVdyYXBwZXIpCi0JICovCi0JYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaXNNYW51YWwsIGJvb2xlYW4gaXNCdWlsZCwgCi0JCUNvbnRlbnRUeXBlV3JhcHBlciBjb250ZW50VHlwZVdyYXBwZXIpewotCQkKLQkJaWYgKGlzTWFudWFsICYmICFfbWFudWFsVmFsaWRhdGlvbilyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0J1aWxkICYmICFfYnVpbGRWYWxpZGF0aW9uKXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBzaG91bGRWYWxpZGF0ZShyZXNvdXJjZSwgY29udGVudFR5cGVXcmFwcGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlCi0JICogdGhpcyByZXNvdXJjZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIGdsb2JhbCB2YWxpZGF0aW9uIG9yCi0JICogcHJvamVjdCB2YWxpZGF0aW9uIGhhcyBiZWVuIHN1c3BlbmRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gdmFsVHlwZQotCSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gcGVyZm9ybWluZyB0aGUgY2hlY2suCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgVmFsVHlwZSB2YWxUeXBlKXsKLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlKHJlc291cmNlLCB2YWxUeXBlLCBuZXcgQ29udGVudFR5cGVXcmFwcGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUKLQkgKiB0aGlzIHJlc291cmNlLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZ2xvYmFsIHZhbGlkYXRpb24gb3IKLQkgKiBwcm9qZWN0IHZhbGlkYXRpb24gaGFzIGJlZW4gc3VzcGVuZGVkIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0byBiZSBjaGVja2VkLgotCSAqIEBwYXJhbSB2YWxUeXBlCi0JICogICAgICAgICAgICBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBwZXJmb3JtaW5nIHRoZSBjaGVjay4KLQkgKiBAcGFyYW0gY29udGVudFR5cGVXcmFwcGVyCi0JICogICAgICAgICAgICBGb3IgcmVwZWF0ZWQgY2FsbHMgb24gdGhlIHNhbWUgcmVzb3VyY2UsIGl0IGlzIG1vcmUgZWZmaWNpZW50Ci0JICogICAgICAgICAgICB0byByZW1lbWJlciB0aGUgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2Ugc2hvdWxkIGJlIHZhbGlkYXRlZC4KLQkgKiAKLQkgKiBAc2VlIEZyaWVuZCNzaG91bGRWYWxpZGF0ZShWYWxpZGF0b3IsIElSZXNvdXJjZSwgVmFsVHlwZSwgQ29udGVudFR5cGVXcmFwcGVyKQotCSAqLwotCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBWYWxUeXBlIHZhbFR5cGUsIENvbnRlbnRUeXBlV3JhcHBlciBjb250ZW50VHlwZVdyYXBwZXIpewotCQlpZiAoVHJhY2luZy5tYXRjaGVzRXh0cmFEZXRhaWwoZ2V0SWQoKSkpewotCQkJVHJhY2luZy5sb2coIlZhbGlkYXRvci0wMTogY2hlY2tpbmcgaWYgIiArIGdldElkKCkgKyAiIHNob3VsZCB2YWxpZGF0ZSAiICsgcmVzb3VyY2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAodmFsVHlwZSA9PSBWYWxUeXBlLk1hbnVhbCAmJiAhX21hbnVhbFZhbGlkYXRpb24pcmV0dXJuIGZhbHNlOwotCQlpZiAodmFsVHlwZSA9PSBWYWxUeXBlLkJ1aWxkICYmICFfYnVpbGRWYWxpZGF0aW9uKXJldHVybiBmYWxzZTsKLQkJCi0JCWJvb2xlYW4gcmVzdWx0ID0gc2hvdWxkVmFsaWRhdGUocmVzb3VyY2UsIGNvbnRlbnRUeXBlV3JhcHBlcik7Ci0JCWlmIChUcmFjaW5nLm1hdGNoZXNFeHRyYURldGFpbChnZXRJZCgpKSl7Ci0JCQlUcmFjaW5nLmxvZygiVmFsaWRhdG9yLTAyOiByZXN1bHQgPSAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUgdGhpcyBwcm9qZWN0LiBUaGlzIG1ldGhvZAotCSAqIGRvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiBnbG9iYWwgdmFsaWRhdGlvbiBvciBwcm9qZWN0IHZhbGlkYXRpb24gaGFzIGJlZW4gc3VzcGVuZGVkIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdmFsaWRhdGlvbiByZXF1ZXN0Ci0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB2YWxpZGF0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFZhbFR5cGUgdHlwZSl7Ci0JCXJldHVybiBzaG91bGRWYWxpZGF0ZVByb2plY3QocHJvamVjdCwgdHlwZSA9PSBWYWxUeXBlLk1hbnVhbCwgdHlwZSA9PSBWYWxUeXBlLkJ1aWxkKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlIHRoaXMgcHJvamVjdC4gVGhpcyBtZXRob2QKLQkgKiBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZ2xvYmFsIHZhbGlkYXRpb24gb3IgcHJvamVjdCB2YWxpZGF0aW9uIGhhcyBiZWVuIHN1c3BlbmRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gYmUgY2hlY2tlZAotCSAqIEBwYXJhbSBpc01hbnVhbCBpZiB0cnVlIHRoZW4gdGhpcyB2YWxpZGF0b3IgbXVzdCBhbHNvIGJlIGVuYWJsZWQgZm9yIG1hbnVhbCB2YWxpZGF0aW9uLgotCSAqIEBwYXJhbSBpc0J1aWxkIGlmIHRydWUgdGhlbiB0aGlzIHZhbGlkYXRvciBtdXN0IGFsc28gYmUgZW5hYmxlZCBmb3IgYnVpbGRlciBiYXNlZCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBzaG91bGQgYmUgdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzTWFudWFsLCBib29sZWFuIGlzQnVpbGQpewotCQlpZiAoVHJhY2luZy5tYXRjaGVzRXh0cmFEZXRhaWwoZ2V0SWQoKSkpewotCQkJVHJhY2luZy5sb2coIlZhbGlkYXRvci0wMzogY2hlY2tpbmcgaWYgIiArIGdldElkKCkgKyAiIHNob3VsZCB2YWxpZGF0ZSAiICsgcHJvamVjdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChpc01hbnVhbCAmJiAhX21hbnVhbFZhbGlkYXRpb24pcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNCdWlsZCAmJiAhX2J1aWxkVmFsaWRhdGlvbilyZXR1cm4gZmFsc2U7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNPcGVuKCkpcmV0dXJuIGZhbHNlOwotCQlib29sZWFuIHJlc3VsdCA9IHNob3VsZFZhbGlkYXRlUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKFRyYWNpbmcubWF0Y2hlc0V4dHJhRGV0YWlsKGdldElkKCkpKXsKLQkJCVRyYWNpbmcubG9nKCJWYWxpZGF0b3ItMDQ6IHJlc3VsdCAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0byBiZSB2YWxpZGF0ZWQuCi0JICogQHBhcmFtIGtpbmQKLQkgKiAgICAgICAgICAgIFRoZSBraW5kIG9mIHJlc291cmNlIGNoYW5nZSwgc2VlIElSZXNvdXJjZURlbHRhIGZvciB2YWx1ZXMuCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdmFsaWRhdGlvbiBpcyBydW5uaW5nIHVuZGVyLiBUaGlzIGNhbgotCSAqICAgICAgICAgICAgYmUgbnVsbC4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSB3YXkgdG8gcmVwb3J0IHByb2dyZXNzLiBUaGlzIGNhbiBiZSBudWxsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBkb2luZyB0aGUgdmFsaWRhdGlvbiwgaXQgY2FuIGJlLCBidXQgdXN1YWxseSBpc24ndAotCSAqICAgICAgICAgbnVsbC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0byBiZSB2YWxpZGF0ZWQuCi0JICogQHBhcmFtIGtpbmQKLQkgKiAgICAgICAgICAgIFRoZSBraW5kIG9mIHJlc291cmNlIGNoYW5nZSwgc2VlIElSZXNvdXJjZURlbHRhIGZvciB2YWx1ZXMuCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdmFsaWRhdGlvbiBpcyBydW5uaW5nIHVuZGVyLiBUaGlzIGNhbgotCSAqICAgICAgICAgICAgYmUgbnVsbC4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSB3YXkgdG8gcmVwb3J0IHByb2dyZXNzLiBUaGlzIGNhbiBiZSBudWxsLgotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgQW4gZXZlbnQgdGhhdCBkZXNjcmliZXMgaW4gbW9yZSBkZXRhaWwgd2hhdCBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIHZhbGlkYXRlZCBhbmQgd2h5IGl0IHNob3VsZCBiZSB2YWxpZGF0ZWQuIFRoaXMgY2FuIGJlIG51bGwuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGRvaW5nIHRoZSB2YWxpZGF0aW9uLCBpdCBjYW4gYmUsIGJ1dCB1c3VhbGx5IGlzbid0Ci0JICogICAgICAgICBudWxsLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdGlvbkV2ZW50IGV2ZW50KXsKLQkJLy8gVGhlIHJlYXNvbiB0aGF0IHRoZSByZXNvdXJjZSBhbmQga2luZCBhcmUgc3RpbGwgc3BlY2lmaWVkLCBpcyB0aGF0IEkgZGlkbid0IHdhbnQgdG8gcmVtb3ZlIGEgcHVibGljIG1ldGhvZCBpbiB0aGUgc2VydmljZQotCQkvLyBzdHJlYW0uIAotCQlyZXR1cm4gdmFsaWRhdGUocmVzb3VyY2UsIGtpbmQsIG9wZXJhdGlvbiwgbW9uaXRvcik7CQkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuIEl0IGFsbG93cyB2YWxpZGF0b3JzIHRvIHBlcmZvcm0gYW55Ci0JICogaW5pdGlhbGl6YXRpb24gdGhhdCB0aGV5IG1pZ2h0IG5lZWQuIAotCSAqICAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4gRm9yIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgaW4gdGhlIHZhbGlkYXRpb24gcGhhc2UsCi0JICogdGhpcyB3aWxsIGJlIG51bGwuIFRoYXQgaXMgdGhlIHNpZ25hbCB0byB0aGUgdmFsaWRhdG9yIHRoYXQgYSB0b3AgbGV2ZWwgdmFsaWRhdGlvbiBpcyBzdGFydGluZy4KLQkgKiBTdWJzZXF1ZW50bHksIHRoZSBwcm9qZWN0IHdpbGwgYmUgc2V0LCBhcyBlYWNoIG9mIHRoZSBpbmRpdmlkdWFsIHByb2plY3RzIGFyZSB2YWxpZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXRlIGEgd2F5IHRvIHBhc3MgYXJiaXRyYXJ5LCB2YWxpZGF0b3Igc3BlY2lmaWMsIGRhdGEgZnJvbSBvbmUgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0bwotCSAqIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcGhhc2UuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGlmIHRoZSBjbGVhbiB0YWtlcyBhIGxvbmcgdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQkvLyBzdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcywgaWYgdGhleSB3aXNoIHRvIGxldCB0aGVpciB2YWxpZGF0b3JzIGtub3cgYWJvdXQgdGhpcyBldmVudAotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuIEl0IGFsbG93cyB2YWxpZGF0b3JzIHRvIHBlcmZvcm0gYW55Ci0JICogY2xlYW51cCB0aGF0IHRoZXkgbWlnaHQgbmVlZCB0byBkby4gIAotCSAqICAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IHdhcyB2YWxpZGF0ZWQuIFRoZSB2ZXJ5IGxhc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbiB3aWxsIHNldCB0aGlzIHRvIAotCSAqIG51bGwgc28gdGhhdCB0aGUgdmFsaWRhdG9yIGtub3dzIHRoYXQgYWxsIHRoZSBwcm9qZWN0cyBoYXZlIG5vdyBiZWVuIHZhbGlkYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGUgYSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZSBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvCi0JICogdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewkJCi0JCS8vIHN1YmNsYXNzZXMgbmVlZCB0byBvdmVycmlkZSB0aGlzLCBpZiB0aGV5IHdpc2ggdG8gbGV0IHRoZWlyIHZhbGlkYXRvcnMga25vdyBhYm91dCB0aGlzIGV2ZW50Ci0JfQotCQotCXZvaWQgYWRkKE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbWVzc2FnZSl7Ci0JCS8vIEkgY2FuJ3QgdXNlIGdldE1lc3NhZ2VTZXR0aW5ncygpIGhlcmUsIGFzIHRoYXQgd2lsbCBwdXQgdXMgaW50byBhbiBpbmZpbml0ZSBsb29wCi0JCWlmIChfbWVzc2FnZVNldHRpbmdzID09IG51bGwpewotCQkJX21lc3NhZ2VTZXR0aW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4oMTApOwotCQl9Ci0JCV9tZXNzYWdlU2V0dGluZ3MucHV0KG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZSk7Ci0JCWJ1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzKCk7Ci0JfQotCQotCXB1YmxpYyBJVmFsaWRhdG9yIGFzSVZhbGlkYXRvcigpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBDb250ZW50VHlwZVdyYXBwZXIgY29udGVudFR5cGVXcmFwcGVyKTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0JCQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkKCk7Ci0JCi0JcHVibGljIE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgZ2V0TWVzc2FnZShTdHJpbmcgaWQpewotCQlyZXR1cm4gZ2V0TWVzc2FnZVNldHRpbmdzKCkuZ2V0KGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgbWVzc2FnZSBzZXR0aW5ncyB0aGF0IHRoaXMgdmFsaWRhdG9yIGhhcyBkZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZW1wdHkgbWFwIGlmIHRoZSB2YWxpZGF0b3IgZGlkIG5vdCBkZWZpbmUgYW55IG1lc3NhZ2Ugc2V0dGluZ3MuCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IGdldE1lc3NhZ2VTZXR0aW5ncygpewotCQlNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBzZXR0aW5ncyA9IF9tZXNzYWdlU2V0dGluZ3M7Ci0JCWlmIChzZXR0aW5ncyA9PSBudWxsKXsKLQkJCXNldHRpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPigxMCk7Ci0JCQlpbml0KHNldHRpbmdzKTsKLQkJCWlmIChWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5tdXN0VXNlR2xvYmFsVmFsaWRhdG9ycyhnZXRQcm9qZWN0KCkpKXsKLQkJCQlWYWxQcmVmTWFuYWdlckdsb2JhbCBncCA9IFZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKTsKLQkJCQlncC5sb2FkTWVzc2FnZXModGhpcywgc2V0dGluZ3MpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0IHZwID0gbmV3IFZhbFByZWZNYW5hZ2VyUHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQkJCXZwLmxvYWRNZXNzYWdlcyh0aGlzLCBzZXR0aW5ncyk7CQkJCQotCQkJfQotCQkJX21lc3NhZ2VTZXR0aW5ncyA9IHNldHRpbmdzOwotCQl9Ci0JCXJldHVybiBzZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgaGFzaCBjb2RlIGZvciB0aGUgY29uZmlndXJhYmxlIGZpZWxkcyBzbyB0aGF0IHdlIGNhbiBxdWlja2x5IGRldGVybWluZSBpZiB0d28KLQkgKiB2YWxpZGF0b3JzIGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlRm9yQ29uZmlnKCl7Ci0JCWludCBoID0gMDsKLQkJaWYgKF9idWlsZFZhbGlkYXRpb24paCArPSAxMDE7Ci0JCWlmIChfZGVsZWdhdGluZ0lkICE9IG51bGwpaCArPSBfZGVsZWdhdGluZ0lkLmhhc2hDb2RlKCk7Ci0JCWlmIChfbWFudWFsVmFsaWRhdGlvbiloICs9IDIwMTsKLQkJaWYgKF9tZXNzYWdlU2V0dGluZ3MgIT0gbnVsbCl7Ci0JCQlmb3IgKE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbXMgOiBfbWVzc2FnZVNldHRpbmdzLnZhbHVlcygpKWggKz0gbXMuaGFzaENvZGUoKTsKLQkJfQotCQlpZiAoX3NvdXJjZUlkICE9IG51bGwpaCArPSBfc291cmNlSWQuaGFzaENvZGUoKTsKLQkJaCArPSBfdmVyc2lvbjsKLQkJcmV0dXJuIGg7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IHNldHRpbmdzKSB7Ci0JCWZvciAoTWVzc2FnZVNldmVyaXR5U2V0dGluZyBtcyA6IFZhbGlkYXRvckV4dGVuc2lvblJlYWRlci5nZXREZWZhdWx0KCkuYWRkTWVzc2FnZXModGhpcykpewotCQkJc2V0dGluZ3MucHV0KG1zLmdldElkKCksIG1zKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBwcm9qZWN0IHRoYXQgeW91IHdlcmUgZW5hYmxlZCBvbi4gCi0JICogCi0JICogQHJldHVybiBudWxsIGlmIHlvdSBhcmUgYSBnbG9iYWwgKGkuZS4gd29ya3NwYWNlIGxldmVsKSB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKXsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkJCi0JLyoqCi0JICogQW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzbmFtZSgpOwotCQotCS8qKgotCSAqIElzIHRoaXMgdmFsaWRhdG9yIGN1cnJlbnRseSBlbmFibGVkIGZvciB2YWxpZGF0aW9ucyB0aGF0IGFyZSB0cmlnZ2VyZWQgbWFudWFsbHk/IAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFudWFsVmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIF9tYW51YWxWYWxpZGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYXMgcGFydCBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtYW51YWxWYWxpZGF0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBzZXR0aW5nIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuIG1hbnVhbFZhbGlkYXRpb24pIHsKLQkJcmV0dXJuIHNldE1hbnVhbFZhbGlkYXRpb24yKG1hbnVhbFZhbGlkYXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzZXRNYW51YWxWYWxpZGF0aW9uMihib29sZWFuIG1hbnVhbFZhbGlkYXRpb24pIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCWlmIChfbWFudWFsVmFsaWRhdGlvbiAhPSBtYW51YWxWYWxpZGF0aW9uKXsKLQkJCWJ1bXBDaGFuZ2VDb3VudEdsb2JhbCgpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlfbWFudWFsVmFsaWRhdGlvbiA9IG1hbnVhbFZhbGlkYXRpb247Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyB2YWxpZGF0b3IgY3VycmVudGx5IGVuYWJsZWQgZm9yIHZhbGlkYXRpb25zIHRoYXQgYXJlIHRyaWdnZXJlZCBieSBidWlsZHM/IAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQnVpbGRWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gX2J1aWxkVmFsaWRhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogSGFzIHRoZSB2YWxpZGF0b3IgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBjcmVhdGVkIG9yIGNvcGllZD8gT3Igd2FzIGl0IG1pZ3JhdGVkIGZyb20gYW4gZWFybGllciB2ZXJzaW9uLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWQoKXsKLQkJaWYgKF9jaGFuZ2VDb3VudEdsb2JhbCA+IDAgfHwgX2NoYW5nZUNvdW50TWVzc2FnZXMgPiAwIHx8IF9taWdyYXRlZClyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBIYXMgdGhlIHZhbGlkYXRvcidzIGltcGxlbWVudGF0aW9uIGJlZW4gbG9hZGVkIHlldD8gVGhpcyBpcyB1c2VkIGJ5IHNvbWUgdGVzdCBjYXNlcyB0byBlbnN1cmUgdGhhdCAKLQkgKiBwbHVnLWlucyBhcmUgbm90IGxvYWRlZCB0b28gZWFybHkuCi0JICovCi0JYWJzdHJhY3QgYm9vbGVhbiBpc0xvYWRlZCgpOwotCQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBieSB0aGUgYnVpbGQgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRWYWxpZGF0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBzZXR0aW5nIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4gYnVpbGRWYWxpZGF0aW9uKSB7Ci0JCXJldHVybiBzZXRCdWlsZFZhbGlkYXRpb24yKGJ1aWxkVmFsaWRhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHNldEJ1aWxkVmFsaWRhdGlvbjIoYm9vbGVhbiBidWlsZFZhbGlkYXRpb24pIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCWlmIChfYnVpbGRWYWxpZGF0aW9uICE9IGJ1aWxkVmFsaWRhdGlvbil7Ci0JCQlidW1wQ2hhbmdlQ291bnRHbG9iYWwoKTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJX2J1aWxkVmFsaWRhdGlvbiA9IGJ1aWxkVmFsaWRhdGlvbjsKLQkJfQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGlkIG9mIHRoZSAicmVhbCIgdmFsaWRhdG9yLCB0aGF0IGlzIHRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoaXMgZGVsZWdhdGluZwotCSAqIHZhbGlkYXRvciBpcyBhc2tlZCB0byB2YWxpZGF0ZSBzb21ldGhpbmcuIElmIHRoaXMgaXNuJ3QgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvciBhbnN3ZXIgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlbGVnYXRpbmdJZCgpIHsKLQkJcmV0dXJuIF9kZWxlZ2F0aW5nSWQ7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgaWQgb2YgdGhlICJyZWFsIiB2YWxpZGF0b3IsIHRoYXQgaXMgdGhlIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBkZWxlZ2F0aW5nCi0JICogdmFsaWRhdG9yIGlzIGFza2VkIHRvIHZhbGlkYXRlIHNvbWV0aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZWdhdGluZyB0aGUgaWQgb2YgdGhlIHZhbGlkYXRvciB0aGF0IGlzIGFjdHVhbGx5IGdvaW5nIHRvIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZWdhdGluZ0lkKFN0cmluZyBkZWxlZ2F0aW5nKSB7Ci0JCWlmICghTWlzYy5zYW1lKF9kZWxlZ2F0aW5nSWQsIGRlbGVnYXRpbmcpKXsKLQkJCV9kZWxlZ2F0aW5nSWQgPSBkZWxlZ2F0aW5nOwotCQkJYnVtcENoYW5nZUNvdW50R2xvYmFsKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gX3ZlcnNpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb24pIHsKLQkJaWYgKF92ZXJzaW9uICE9IHZlcnNpb24pewotCQkJX3ZlcnNpb24gPSB2ZXJzaW9uOwotCQkJYnVtcENoYW5nZUNvdW50R2xvYmFsKCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0JCQotLyoqCi0gKiBBIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAxIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8gCi1wdWJsaWMgc3RhdGljIGNsYXNzIFYxIGV4dGVuZHMgVmFsaWRhdG9yIHsKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHZlcnNpb24gMSB2YWxpZGF0b3IuIAotCSAqIEBwYXJhbSB2bWQKLQkgKiBAcGFyYW0gY29uZmlnIHRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIGdsb2JhbCBlbmFibGVtZW50IG9wdGlvbnMuIEluIHNvbWUgY2FzZSB0aGlzIGNhbiBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBWMShWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZywgSVByb2plY3QgcHJvamVjdCl7Ci0JCXN1cGVyKHByb2plY3QpOwotCQlfdm1kID0gdm1kOwotCQlpZiAoY29uZmlnICE9IG51bGwpewotCQkJc2V0QnVpbGRWYWxpZGF0aW9uKGNvbmZpZy5pc0J1aWxkRW5hYmxlZCh2bWQpKTsKLQkJCXNldE1hbnVhbFZhbGlkYXRpb24oY29uZmlnLmlzTWFudWFsRW5hYmxlZCh2bWQpKTsKLQkJfQotCQlzZXREZWxlZ2F0aW5nSWQoVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RGVsZWdhdGUoX3ZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpKTsKLQkJaWYgKF92bWQuZ2V0TWFya2VySWRzKCkgIT0gbnVsbCAmJiBfdm1kLmdldE1hcmtlcklkcygpLmxlbmd0aCA+IDApc2V0TWFya2VySWQoX3ZtZC5nZXRNYXJrZXJJZHMoKVswXSk7Ci0JCXJlc2V0Q2hhbmdlQ291bnRlcnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJVmFsaWRhdG9yIHYgPSBhc0lWYWxpZGF0b3IoKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgSVZhbGlkYXRvckV4dGVuZGVyKSB7Ci0JCQkJSVZhbGlkYXRvckV4dGVuZGVyIHZFeHQgPSAoSVZhbGlkYXRvckV4dGVuZGVyKSB2OwotCQkJCXZFeHQudmFsaWRhdGlvbkZpbmlzaGluZyhwcm9qZWN0LCBzdGF0ZSwgbW9uaXRvcik7Ci0JCQl9CQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElWYWxpZGF0b3IgYXNJVmFsaWRhdG9yKCkgewotCQlJVmFsaWRhdG9yIHYgPSBudWxsOwotCQl0cnkgewotCQkJdiA9IF92bWQuZ2V0VmFsaWRhdG9yKCk7Ci0JCX0KLQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQkKLQlwdWJsaWMgVjEgYXNWMVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQkJCi0JcHVibGljIFZhbGlkYXRvciBjb3B5KGJvb2xlYW4gaW5jbHVkZUNoYW5nZUNvdW50cykgewotCQlWMSB2ID0gbmV3IFYxQ29weShfdm1kLCBudWxsLCBfcHJvamVjdCk7Ci0JCXYuY29weUxvY2FsKHRoaXMsIGluY2x1ZGVDaGFuZ2VDb3VudHMpOwotCQkJCQotCQlyZXR1cm4gdjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gX3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0Vm1kKCl7Ci0JCXJldHVybiBfdm1kOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzbmFtZSgpewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQluYW1lID0gX3ZtZC5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy8gZWF0IGl0Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBfdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBpc0xvYWRlZCgpIHsKLQkJcmV0dXJuIF92bWQuaXNBY3RpdmUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4gYnVpbGRWYWxpZGF0aW9uKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IHN1cGVyLnNldEJ1aWxkVmFsaWRhdGlvbihidWlsZFZhbGlkYXRpb24pOwotCQlfdm1kLnNldEJ1aWxkVmFsaWRhdGlvbihidWlsZFZhbGlkYXRpb24pOwotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuIG1hbnVhbFZhbGlkYXRpb24pIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gc3VwZXIuc2V0TWFudWFsVmFsaWRhdGlvbihtYW51YWxWYWxpZGF0aW9uKTsKLQkJX3ZtZC5zZXRNYW51YWxWYWxpZGF0aW9uKG1hbnVhbFZhbGlkYXRpb24pOwotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIENvbnRlbnRUeXBlV3JhcHBlciBjb250ZW50VHlwZVdyYXBwZXIpIHsKLQkJcmV0dXJuIF92bWQuaXNBcHBsaWNhYmxlVG8ocmVzb3VyY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFZhbGlkYXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIFRPRE8gZGV0ZXJtaW5lIGlmIHRoaXMgY2FuIGJlIG9wdGltaXplZAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCAKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlpZiAobW9uaXRvciA9PSBudWxsKW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkKLQkJVmFsaWRhdGlvblJlc3VsdCB2ciA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCUlWYWxpZGF0b3IgdiA9IGFzSVZhbGlkYXRvcigpOwotCQlpZiAodiA9PSBudWxsKXJldHVybiBudWxsOwotCQkKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlTdW1tYXJ5UmVwb3J0ZXIgcmVwb3J0ZXIgPSBuZXcgU3VtbWFyeVJlcG9ydGVyKHByb2plY3QsIG1vbml0b3IpOwotCQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gX3ZtZC5nZXRIZWxwZXIocHJvamVjdCk7Ci0JCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgV29ya2JlbmNoQ29udGV4dCl7Ci0JCQkJV29ya2JlbmNoQ29udGV4dCB3YyA9IChXb3JrYmVuY2hDb250ZXh0KWhlbHBlcjsKLQkJCQlMaXN0PFN0cmluZz4gZmlsZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCQkJLy8gWzIxMzYzMV0gVGhlIEpTUCB2YWxpZGF0b3IgZXhwZWN0cyBmdWxsIHBhdGhzIG5vdCByZWxhdGl2ZSBwYXRocywgYnV0IHRoZSBYTUwgdmFsaWRhdG9yCi0JCQkJLy8gZXhwZWN0cyByZWxhdGl2ZSBwYXRocy4KLQkJCQlmaWxlcy5hZGQod2MuZ2V0UG9ydGFibGVOYW1lKHJlc291cmNlKSk7Ci0JCQkJd2Muc2V0VmFsaWRhdGlvbkZpbGVVUklzKGZpbGVzKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdG9yTGF1bmNoZXIuZ2V0TGF1bmNoZXIoKS5zdGFydChoZWxwZXIsIHYsIHJlcG9ydGVyKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCXYuY2xlYW51cChyZXBvcnRlcik7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQloZWxwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl2ci5pbmNyZW1lbnRFcnJvcihyZXBvcnRlci5nZXRTZXZlcml0eUhpZ2goKSk7Ci0JCQl2ci5pbmNyZW1lbnRXYXJuaW5nKHJlcG9ydGVyLmdldFNldmVyaXR5Tm9ybWFsKCkpOwotCQkJdnIuaW5jcmVtZW50SW5mbyhyZXBvcnRlci5nZXRTZXZlcml0eUxvdygpKTsKLQkJCQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gdnI7Ci0JfQotCQotCS8qCi0JICogR1JLIC0gQmVjYXVzZSBJIGRpZG4ndCB3YW50IHRvIHRyeSB0byBtYWtlIGEgdHJ1ZSBjb3B5IG9mIHRoZSBWMSB2YWxpZGF0b3IsIChiZWNhdXNlIEkgZGlkbid0Ci0JICogd2FudCB0byBjb3B5IHRoZSB2bWQgb2JqZWN0KSwgSSBjYW1lIHVwIHdpdGggdGhpcyBhcHByb2FjaCB0byBvbmx5IGNvcHkgdGhlIGZpZWxkcyB0aGF0Ci0JICogdGhlIHByZWZlcmVuY2UgcGFnZSB3YXMgd29ycmllZCBhYm91dC4gCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBWMUNvcHkgZXh0ZW5kcyBWMSB7Ci0JCXB1YmxpYyBWMUNvcHkoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2YywgSVByb2plY3QgcHJvamVjdCl7Ci0JCQlzdXBlcih2bWQsIHZjLCBwcm9qZWN0KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHNldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbiBib29sKSB7Ci0JCQlyZXR1cm4gc2V0TWFudWFsVmFsaWRhdGlvbjIoYm9vbCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbiBib29sKSB7Ci0JCQlyZXR1cm4gc2V0QnVpbGRWYWxpZGF0aW9uMihib29sKTsKLQkJfQotCQkJCQotCX0KLQkJCi19Ci0KLS8qKgotICogQSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFYyIGV4dGVuZHMgVmFsaWRhdG9yIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JcHJpdmF0ZSBBYnN0cmFjdFZhbGlkYXRvcglfdmFsaWRhdG9yOwotCQotCXByaXZhdGUgTGlzdDxGaWx0ZXJHcm91cD4JX2dyb3VwcyA9IG5ldyBMaW5rZWRMaXN0PEZpbHRlckdyb3VwPigpOwotCXByaXZhdGUgRmlsdGVyR3JvdXBbXQkJX2dyb3Vwc0FycmF5OwotCQotCS8qKiBUaGUgZnVsbCBpZCBvZiB0aGUgZXh0ZW5zaW9uLiAqLwotCXByaXZhdGUgU3RyaW5nCQkJX2lkOwotCQotCS8qKiBOYW1lIG9mIHRoZSB2YWxpZGF0b3IuICovCi0JcHJpdmF0ZSBTdHJpbmcJCQlfbmFtZTsKLQkKLQkvKiogCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgdGhlIHZhbGlkYXRvciB0b28gZWFybHksIGFzIGl0IG1heSB0cmlnZ2VyIG5ldyBwbHVnLWlucyB0byBiZSBsb2FkZWQuCi0JICogV2UgZGVsYXkgdGhhdCBhcyBsb25nIGFzIHBvc3NpYmxlLCBieSBzdGFydGluZyB3aXRoIGp1c3QgdGhlIGNvbmZpZyBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IF92YWxpZGF0b3JDb25maWdFbGVtZW50OwotCQotCXByaXZhdGUgU3RyaW5nCV92YWxpZGF0b3JDbGFzc05hbWU7Ci0JCi0JLyoqCi0JICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsaWRhdG9yIGdyb3VwIElEcyBmb3Igd2hpY2ggdGhpcyB2YWxpZGF0b3IgaXMgYSBtZW1iZXIuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBfdmFsaWRhdG9yR3JvdXBJZHM7Ci0JCQotCS8qKiAKLQkgKiBJZiB0aGlzIHZhbGlkYXRvciBpcyBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yLCB0aGVuIHRoaXMgaXMgdGhlICJyZWFsIiB2YWxpZGF0b3IgKGkuZS4gdGhlIG9uZSB0aGF0Ci0JICogZG9lcyB0aGUgd29yaykuCi0JICovCi0JcHJpdmF0ZSBBYnN0cmFjdFZhbGlkYXRvcglfZGVsZWdhdGVkOwotCQkKLQkvKiogSG93IG1hbnkgdGltZXMgaGFzIGEgZ3JvdXAgZmllbGQgaW4gdGhpcyB2YWxpZGF0b3IgYmVlbiBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBjcmVhdGVkIChvciBjb3BpZWQpPyAqLwotCXByb3RlY3RlZCB0cmFuc2llbnQgaW50IF9jaGFuZ2VDb3VudEdyb3VwczsKLQkJCi0JcHJpdmF0ZSBMZXZlbCBfbGV2ZWw7Ci0JCi0JLyoqCi0JICogRG8gd2Ugc3RpbGwgbmVlZCB0byBpbnZva2UgdGhlIHZhbGlkYXRlU3RhcnRpbmcgbWV0aG9kIGZvciB0aGlzIHZhbGlkYXRvciwgZm9yIHRoZSBudWxsIHByb2plY3Q/Ci0JICogCi0JICogQmVjYXVzZSB3ZSBkbyBub3Qgd2FudCB0byBhY3RpdmF0ZSBhIHZhbGlkYXRvcidzIHBsdWctaW4gdG9vIHNvb24sIHdlIGRvIG5vdCBhY3RpdmF0ZSB0aGUgdmFsaWRhdG9yCi0JICogYXMgYSByZWFjdGlvbiB0byB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gc3RhcnRpbmcgZXZlbnQuIEluc3RlYWQgd2UgbWFyayBpdCBwZW5kaW5nLCBhbmQgd2FpdCB1bnRpbAotCSAqIHdlIGFyZSBzdXJlIHRoYXQgd2UgaGF2ZSBzb21ldGhpbmcgdG8gdmFsaWRhdGUuCi0JICogCi0JICogSWYgdGhpcyBmbGFnIGlzIHRydWUsIGl0IG1lYW5zIHRoYXQgdGhlIHZhbGlkYXRlU3RhcnRpbmcgbWV0aG9kIHN0aWxsIG5lZWRzIHRvIGJlIGNhbGxlZCBmb3IgdGhpcyB2YWxpZGF0b3IuCi0JICovCi0JcHJpdmF0ZSBBdG9taWNCb29sZWFuIF9wZW5kaW5nVmFsaWRhdGlvblN0YXJ0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbigpOwotCQotCVYyKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBJUHJvamVjdCBwcm9qZWN0KXsKLQkJc3VwZXIocHJvamVjdCk7Ci0JCWFzc2VydCBjb25maWdFbGVtZW50ICE9IG51bGw7Ci0JCV92YWxpZGF0b3JDb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudDsKLQkJX3ZhbGlkYXRvckNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5BdHRyaWJDbGFzcyk7Ci0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ3JvdXBSZWZlcmVuY2VFbGVtZW50cyA9IGNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oRXh0ZW5zaW9uQ29uc3RhbnRzLkdyb3VwLmVsZW1lbnRHcm91cCk7Ci0JCUxpc3Q8U3RyaW5nPiB2YWxpZGF0b3JHcm91cElEcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBncm91cEVsZW1lbnQgOiBncm91cFJlZmVyZW5jZUVsZW1lbnRzKSB7Ci0JCQlTdHJpbmcgaWQgPSBncm91cEVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5Hcm91cC5hdHRJZCk7Ci0JCQlpZiAoaWQgIT0gbnVsbCl2YWxpZGF0b3JHcm91cElEcy5hZGQoaWQpOwotCQl9Ci0JCV92YWxpZGF0b3JHcm91cElkcyA9IHZhbGlkYXRvckdyb3VwSURzLnRvQXJyYXkobmV3IFN0cmluZ1t2YWxpZGF0b3JHcm91cElEcy5zaXplKCldKTsKLQkJCQotCQlpbml0KCk7Ci0JfQotCQotCXByaXZhdGUgVjIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSwgQWJzdHJhY3RWYWxpZGF0b3IgdmFsaWRhdG9yKXsKLQkJc3VwZXIocHJvamVjdCk7Ci0JCWFzc2VydCB2YWxpZGF0b3IgIT0gbnVsbDsKLQkJCi0JCV92YWxpZGF0b3JDbGFzc05hbWUgPSB2YWxpZGF0b3JDbGFzc05hbWU7Ci0JCV92YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCWluaXQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXQoKXsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpZCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKF9wcm9qZWN0KS5nZXREZWxlZ2F0ZUZvclRhcmdldChfdmFsaWRhdG9yQ2xhc3NOYW1lKTsKLQkJCWlmIChpZCA9PSBudWxsKSBpZCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdERlbGVnYXRlKF92YWxpZGF0b3JDbGFzc05hbWUpOwotCQkJc2V0RGVsZWdhdGluZ0lkKGlkKTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJlc2V0Q2hhbmdlQ291bnRlcnMoKTsJCQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoRmlsdGVyR3JvdXAgZmcpIHsKLQkJYXNzZXJ0IGZnICE9IG51bGw7Ci0JCV9ncm91cHNBcnJheSA9IG51bGw7Ci0JCV9ncm91cHMuYWRkKGZnKTsKLQkJYnVtcENoYW5nZUNvdW50R3JvdXBzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJVmFsaWRhdG9yIGFzSVZhbGlkYXRvcigpIHsKLQkJQWJzdHJhY3RWYWxpZGF0b3IgYXYgPSBnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKTsKLQkJaWYgKGF2IGluc3RhbmNlb2YgSVZhbGlkYXRvcilyZXR1cm4gKElWYWxpZGF0b3IpYXY7Ci0JCXJldHVybiBzdXBlci5hc0lWYWxpZGF0b3IoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFYyIGFzVjJWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBMZXQgdGhlIHZhbGlkYXRvciBrbm93IHRoYXQgYSBjbGVhbiBpcyBhYm91dCB0byBoYXBwZW4uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyBjbGVhbmVkLiBUaGlzIGNhbiBiZSBudWxsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHdvcmtzcGFjZQotCSAqIGlzIGJlaW5nIGNsZWFuZWQgKGluIHdoaWNoIGNhc2UgYSBzZXBhcmF0ZSBjYWxsIHdpbGwgYmUgbWFkZSBmb3IgZWFjaCBvcGVuIHByb2plY3QpLgotCSAqIAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKS5jbGVhbihwcm9qZWN0LCBvcGVyYXRpb24uZ2V0U3RhdGUoKSwgbW9uaXRvcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0b3IgY29weShib29sZWFuIGluY2x1ZGVDaGFuZ2VDb3VudHMpIHsKLQkJVjIgdiA9IG51bGw7Ci0JCWlmIChfdmFsaWRhdG9yQ29uZmlnRWxlbWVudCAhPSBudWxsKXYgPSBuZXcgVjIoX3ZhbGlkYXRvckNvbmZpZ0VsZW1lbnQsIF9wcm9qZWN0KTsKLQkJZWxzZSB2ID0gbmV3IFYyKF9wcm9qZWN0LCBfdmFsaWRhdG9yQ2xhc3NOYW1lLCBfdmFsaWRhdG9yKTsKLQkJdi5jb3B5TG9jYWwodGhpcywgaW5jbHVkZUNoYW5nZUNvdW50cyk7Ci0JCQotCQlpZiAoaW5jbHVkZUNoYW5nZUNvdW50cyl2Ll9jaGFuZ2VDb3VudEdyb3VwcyA9IF9jaGFuZ2VDb3VudEdyb3VwczsKLQkJCi0JCUZpbHRlckdyb3VwW10gZ3JvdXBzID0gZ2V0R3JvdXBzKCk7Ci0JCXYuX2dyb3Vwc0FycmF5ID0gbmV3IEZpbHRlckdyb3VwW2dyb3Vwcy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7IGk8Z3JvdXBzLmxlbmd0aDsgaSsrKXsKLQkJCXYuX2dyb3Vwc0FycmF5W2ldID0gZ3JvdXBzW2ldOwotCQkJdi5fZ3JvdXBzLmFkZChncm91cHNbaV0pOwotCQl9Ci0KLQkJdi5faWQgPSBfaWQ7Ci0JCXYuX25hbWUgPSBfbmFtZTsKLQkJdi5fdmFsaWRhdG9yR3JvdXBJZHMgPSBfdmFsaWRhdG9yR3JvdXBJZHM7Ci0JCXYuX3BlbmRpbmdWYWxpZGF0aW9uU3RhcnRlZCA9IF9wZW5kaW5nVmFsaWRhdGlvblN0YXJ0ZWQ7Ci0JCQkJCi0JCXJldHVybiB2OwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENoYW5nZUNvdW50R3JvdXBzKCl7Ci0JCXJldHVybiBfY2hhbmdlQ291bnRHcm91cHM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJ1bXBDaGFuZ2VDb3VudEdyb3VwcygpewotCQlfY2hhbmdlQ291bnRHcm91cHMrKzsKLQl9Ci0JCi0JcHVibGljIExldmVsIGdldExldmVsKCkgewotCQlyZXR1cm4gX2xldmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExldmVsKExldmVsIGxldmVsKSB7Ci0JCWFzc2VydCBfbGV2ZWwgPT0gbnVsbDsKLQkJX2xldmVsID0gbGV2ZWw7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgYWN0dWFsIHZhbGlkYXRvciB0aGF0IGlzIGdvaW5nIHRvIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24uIElmIHRoaXMgaXMgYSBub3JtYWwgdmFsaWRhdG9yIHRoaXMKLQkgKiBtZXRob2Qgd2lsbCBzaW1wbHkgYW5zd2VyIGl0c2VsZi4gSG93ZXZlciBpZiB0aGlzIGlzIGEgZGVsZWdhdGluZyB2YWxpZGF0b3IsIHRoZW4gdGhpcyB3aWxsIGFuc3dlciB0aGUKLQkgKiAicmVhbCIgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRvciBnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKXsKLQkJQWJzdHJhY3RWYWxpZGF0b3IgZGVsZWdhdGVkID0gX2RlbGVnYXRlZDsKLQkJaWYgKGRlbGVnYXRlZCAhPSBudWxsKXJldHVybiBkZWxlZ2F0ZWQ7Ci0JCWVsc2UgaWYgKGdldERlbGVnYXRpbmdJZCgpID09IG51bGwpcmV0dXJuIGdldFZhbGlkYXRvcigpOwotCQl0cnkgewotCQkJVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIHZkZCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0RGVzY3JpcHRvcihnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSwgZ2V0RGVsZWdhdGluZ0lkKCkpOwotCQkJaWYgKHZkZCA9PSBudWxsKXJldHVybiBnZXRWYWxpZGF0b3IoKTsKLQkJCWRlbGVnYXRlZCA9IHZkZC5nZXRWYWxpZGF0b3IyKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJZGVsZWdhdGVkID0gbmV3IE51bGxWYWxpZGF0b3IoKTsKLQkJfQotCQlkZWxlZ2F0ZWQuc2V0UGFyZW50KHRoaXMpOwotCQlfZGVsZWdhdGVkID0gZGVsZWdhdGVkOwotCQlyZXR1cm4gZGVsZWdhdGVkOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIF9pZDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSB2YWxpZGF0b3IncyBmaWx0ZXIgZ3JvdXBzLgotCSAqIEByZXR1cm4gYW4gZW1wdHkgYXJyYXkgaWYgdGhlIHZhbGlkYXRvciBkb2VzIG5vdCBoYXZlIGFueSBmaWx0ZXIgZ3JvdXBzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRmlsdGVyR3JvdXBbXSBnZXRHcm91cHMoKXsKLQkJRmlsdGVyR3JvdXBbXSBncm91cHMgPSBfZ3JvdXBzQXJyYXk7Ci0JCWlmIChncm91cHMgPT0gbnVsbCl7Ci0JCQlncm91cHMgPSBuZXcgRmlsdGVyR3JvdXBbX2dyb3Vwcy5zaXplKCldOwotCQkJX2dyb3Vwcy50b0FycmF5KGdyb3Vwcyk7Ci0JCQlfZ3JvdXBzQXJyYXkgPSBncm91cHM7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gX25hbWU7Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmIChfdmFsaWRhdG9yID09IG51bGwpewotCQkJdHJ5IHsKLQkJCQlfdmFsaWRhdG9yID0gKEFic3RyYWN0VmFsaWRhdG9yKV92YWxpZGF0b3JDb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oRXh0ZW5zaW9uQ29uc3RhbnRzLkF0dHJpYkNsYXNzKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJSUNvbnRyaWJ1dG9yIGNvbnRyaWIgPSBfdmFsaWRhdG9yQ29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpOwotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoVmFsTWVzc2FnZXMuRXJyQ29uZmlnLCBjb250cmliLmdldE5hbWUoKSk7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwotCQkJCV92YWxpZGF0b3IgPSBuZXcgTnVsbFZhbGlkYXRvcigpOwotCQkJfQotCQkJX3ZhbGlkYXRvci5zZXRQYXJlbnQodGhpcyk7Ci0JCQlfdmFsaWRhdG9yQ29uZmlnRWxlbWVudCA9IG51bGw7Ci0KLQkJfQotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzc25hbWUoKXsKLQkJcmV0dXJuIF92YWxpZGF0b3JDbGFzc05hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0b3JHcm91cHMoKXsKLQkJcmV0dXJuIF92YWxpZGF0b3JHcm91cElkczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZUZvckNvbmZpZygpIHsKLQkJaW50IGggPSAgc3VwZXIuaGFzaENvZGVGb3JDb25maWcoKTsKLQkJaWYgKF9pZCAhPSBudWxsKWggKz0gX2lkLmhhc2hDb2RlKCk7Ci0JCWlmIChfZ3JvdXBzICE9IG51bGwpewotCQkJZm9yIChGaWx0ZXJHcm91cCBmZyA6IF9ncm91cHMpaCArPSBmZy5oYXNoQ29kZUZvckNvbmZpZygpOwotCQl9Ci0JCXJldHVybiBoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWQoKSB7Ci0JCWlmIChfY2hhbmdlQ291bnRHcm91cHMgPiAwKXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuaXNDaGFuZ2VkKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCWJvb2xlYW4gaXNMb2FkZWQoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yICE9IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNob3VsZENsZWFyTWFya2VycyhWYWxpZGF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcigpLnNob3VsZENsZWFyTWFya2VycyhldmVudCk7Ci0JfQotCQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUgdGhpcyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlc291cmNlIHNob3VsZCBiZSB2YWxpZGF0ZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBDb250ZW50VHlwZVdyYXBwZXIgY29udGVudFR5cGVXcmFwcGVyKSB7Ci0JICAgIGlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSl7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JCUZpbHRlckdyb3VwW10gZ3JvdXBzID0gZ2V0R3JvdXBzKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCWZvciAoRmlsdGVyR3JvdXAgZ3JvdXAgOiBncm91cHMpewotCQkJaWYgKCFncm91cC5zaG91bGRWYWxpZGF0ZShwcm9qZWN0LCByZXNvdXJjZSwgY29udGVudFR5cGVXcmFwcGVyKSlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldERlbGVnYXRpbmdJZChTdHJpbmcgZGVsZWdhdGluZykgewotCQlzdXBlci5zZXREZWxlZ2F0aW5nSWQoZGVsZWdhdGluZyk7Ci0JCV9kZWxlZ2F0ZWQgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0R3JvdXBzKExpc3Q8RmlsdGVyR3JvdXA+IGdyb3Vwcyl7Ci0JCV9ncm91cHMgPSBncm91cHM7Ci0JCV9ncm91cHNBcnJheSA9IG51bGw7Ci0JCWJ1bXBDaGFuZ2VDb3VudEdyb3VwcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQlpZiAoIU1pc2Muc2FtZShfaWQsIGlkKSl7Ci0JCQlfaWQgPSBpZDsKLQkJCWJ1bXBDaGFuZ2VDb3VudEdsb2JhbCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCFNaXNjLnNhbWUoX25hbWUsIG5hbWUpKXsKLQkJCV9uYW1lID0gbmFtZTsKLQkJCWJ1bXBDaGFuZ2VDb3VudEdsb2JhbCgpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCXJldHVybiB2YWxpZGF0ZShyZXNvdXJjZSwga2luZCwgb3BlcmF0aW9uLCBtb25pdG9yLCBudWxsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxpZGF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJVmFsaWRhdGlvblJlc3VsdCB2ciA9IG51bGw7Ci0JCWlmIChvcGVyYXRpb24gPT0gbnVsbClvcGVyYXRpb24gPSBuZXcgVmFsT3BlcmF0aW9uKCk7Ci0JCWlmIChtb25pdG9yID09IG51bGwpbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbClldmVudCA9IG5ldyBWYWxpZGF0aW9uRXZlbnQocmVzb3VyY2UsIGtpbmQsIG51bGwpOwotCQkJdnIgPSBnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKS52YWxpZGF0ZShldmVudCwgb3BlcmF0aW9uLmdldFN0YXRlKCksIG1vbml0b3IpOwotCQkJaWYgKHZyID09IG51bGwpdnIgPSBnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKS52YWxpZGF0ZShyZXNvdXJjZSwga2luZCwgb3BlcmF0aW9uLmdldFN0YXRlKCksIG1vbml0b3IpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChWYWxNZXNzYWdlcy5Mb2dWYWxFbmQsIGdldE5hbWUoKSwgcmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKSk7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5sb2dNZXNzYWdlKElTdGF0dXMuRVJST1IsIG1zZyk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUyICl7Ci0JCQkJLy8gaWdub3JlIGl0Ci0JCQl9Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJaWYgKHZyICE9IG51bGwpewotCQkJaWYgKHZyLmdldFZhbGlkYXRpb25FeGNlcHRpb24oKSAhPSBudWxsKXsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbih2ci5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uKCkpOwotCQkJfQotCQkJdXBkYXRlUmVzdWx0cyh2cik7Ci0JCQlpZiAodnIuZ2V0RGVwZW5kc09uKCkgIT0gbnVsbCl7Ci0JCQkJVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0RGVwZW5kZW5jeUluZGV4KCkuc2V0KGdldElkKCksIHJlc291cmNlLCB2ci5nZXREZXBlbmRzT24oKSk7Ci0JCQl9Ci0JCQlJUmVzb3VyY2VbXSB2YWxpZGF0ZWQgPSB2ci5nZXRWYWxpZGF0ZWQoKTsKLQkJCWlmICh2YWxpZGF0ZWQgIT0gbnVsbCl7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHZhbGlkYXRlZC5sZW5ndGg7IGkrKyl7Ci0JCQkJCW9wZXJhdGlvbi5hZGRWYWxpZGF0ZWQoZ2V0SWQoKSwgdmFsaWRhdGVkW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVZhbGlkYXRvck1lc3NhZ2VbXSBtc2dzID0gdnIuZ2V0TWVzc2FnZXMoKTsKLS8vCQkJaWYgKHNhbml0eVRlc3QobXNncy5sZW5ndGgsIHJlc291cmNlKSl7Ci0JCQkJTWFya2VyTWFuYWdlciBtbSA9IE1hcmtlck1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotCQkJCWZvciAoVmFsaWRhdG9yTWVzc2FnZSBtIDogbXNncyl7Ci0JCQkJCW1tLmNyZWF0ZU1hcmtlcihtLCBnZXRJZCgpKTsKLQkJCQl9Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQlzZXRCdWlsZFZhbGlkYXRpb24oZmFsc2UpOwotLy8JCQkJc2V0TWFudWFsVmFsaWRhdGlvbihmYWxzZSk7Ci0vLwkJCX0KLQkJfQotCQlyZXR1cm4gdnI7CQkKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybSBhIHNpbXBsZSBzYW5pdHkgdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgdmFsaWRhdG9yIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5LgotCSAqIEBwYXJhbSBudW1iZXJvZk1lc3NhZ2VzIG51bWJlciBvZiBtZXNzYWdlcyB0aGF0IHRoZSB2YWxpZGF0b3IgcHJvZHVjZWQuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB0ZXN0IHBhc3NlZAotCSAqLwotLy8JcHJpdmF0ZSBib29sZWFuIHNhbml0eVRlc3QoaW50IG51bWJlcm9mTWVzc2FnZXMsIElSZXNvdXJjZSByZXNvdXJjZSkgewotLy8JCWlmIChudW1iZXJvZk1lc3NhZ2VzIDwgMjAxKXJldHVybiB0cnVlOwotLy8JCQotLy8JCVN0cmluZyByZXNOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQlpZiAocmVzb3VyY2UgIT0gbnVsbClyZXNOYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotLy8JCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoVmFsTWVzc2FnZXMuQ29uZmlnRXJyb3IsIG5ldyBPYmplY3RbXXsKLS8vCQkJCWdldE5hbWUoKSwgZ2V0SWQoKSwgU3RyaW5nLnZhbHVlT2YobnVtYmVyb2ZNZXNzYWdlcyksIHJlc05hbWV9KTsKLS8vCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0vLwkJCi0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbGlkYXRvciBpcyB1c2luZyBhIHJlcG9ydCBoZWxwZXIgdGhlbiB1cGRhdGUgaXQgd2l0aCBhbnkgb2YgdGhlIG1lc3NhZ2VzIHRoYXQgd2VyZQotCSAqIGFkZGVkIGRpcmVjdGx5IHRvIHRoZSB2YWxpZGF0aW9uIHJlc3VsdC4KLQkgKiBAcGFyYW0gdnIKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUmVzdWx0cyhWYWxpZGF0aW9uUmVzdWx0IHZyKSB7Ci0JCVJlcG9ydGVySGVscGVyIHJoID0gdnIuZ2V0UmVwb3J0ZXJIZWxwZXIoKTsKLQkJaWYgKHJoID09IG51bGwpcmV0dXJuOwotCQlDbGFzc0xvYWRlciBjbGFzc2xvYWRlciA9IGdldERlbGVnYXRlZFZhbGlkYXRvcigpLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJZm9yIChJTWVzc2FnZSBtZXNzYWdlIDogcmguZ2V0TWVzc2FnZXMoKSl7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKTsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCl7Ci0JCQkJSVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSlyZXMgPSAoSVJlc291cmNlKXRhcmdldDsKLQkJCQlpZiAocmVzID09IG51bGwpewotCQkJCQl0YXJnZXQgPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShJTWVzc2FnZS5UYXJnZXRSZXNvdXJjZSk7Ci0JCQkJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpcmVzID0gKElSZXNvdXJjZSl0YXJnZXQ7Ci0JCQkJfQotCQkJCWlmIChyZXMgIT0gbnVsbCl7Ci0JCQkJCQotCQkJCQlWYWxpZGF0b3JNZXNzYWdlIHZtID0gVmFsaWRhdG9yTWVzc2FnZS5jcmVhdGUobWVzc2FnZS5nZXRUZXh0KGNsYXNzbG9hZGVyKSwgcmVzKTsKLQkJCQkJaWYgKGdldE1hcmtlcklkKCkgIT0gbnVsbCl2bS5zZXRUeXBlKGdldE1hcmtlcklkKCkpOwotCQkJCQl2ci5hZGQodm0pOwotCQkJCQlpbnQgbWFya2VyU2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0JCQkJCWludCBzZXYgPSBtZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0JCQkJCWlmICgoc2V2ICYgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgIT0gMCltYXJrZXJTZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfRVJST1I7Ci0JCQkJCWVsc2UgaWYgKChzZXYgJiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpICE9IDApbWFya2VyU2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCQkJCXZtLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBtYXJrZXJTZXZlcml0eSk7Ci0JCQkJCXZtLnNldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCBtZXNzYWdlLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCWludCBvZmZzZXQgPSBtZXNzYWdlLmdldE9mZnNldCgpOwotCQkJCQlpZiAob2Zmc2V0ICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCl7Ci0JCQkJCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCBvZmZzZXQpOwotCQkJCQkJaW50IGxlbiA9IG1lc3NhZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCl7Ci0JCQkJCQkJdm0uc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgb2Zmc2V0KTsKLQkJCQkJCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgb2Zmc2V0K2xlbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGdyb3VwTmFtZSA9IG1lc3NhZ2UuZ2V0R3JvdXBOYW1lKCk7Ci0JCQkJCWlmIChncm91cE5hbWUgIT0gbnVsbCl7Ci0JCQkJCQl2bS5zZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9HUk9VUCwgZ3JvdXBOYW1lKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJY29weUF0dHJpYnV0ZXMobWVzc2FnZSwgdm0pOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIGNvcHlBdHRyaWJ1dGVzKElNZXNzYWdlIG1lc3NhZ2UsIFZhbGlkYXRvck1lc3NhZ2Ugdm0pIHsKLQkJLy8gSSBtYWRlIHRoaXMgYSBzZXBhcmF0ZSBtZXRob2QsIHNvIHRoYXQgSSBjb3VsZCBsb2NhbGl6ZSB0aGUgc3VwcHJlc3Npb24gb2YgdW5jaGVja2VkIHdhcm5pbmdzLgotCQlNYXAgYXR0cmlidXRlcyA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKXsJCQkJCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkJTWFwLkVudHJ5IG1lID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpbWUuZ2V0S2V5KCk7Ci0JCQkJdm0uc2V0QXR0cmlidXRlKGtleSwgbWUuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpX3BlbmRpbmdWYWxpZGF0aW9uU3RhcnRlZC5zZXQodHJ1ZSk7Ci0JCWVsc2UgewotCQkJQWJzdHJhY3RWYWxpZGF0b3IgdmFsID0gZ2V0RGVsZWdhdGVkVmFsaWRhdG9yKCk7Ci0JCQlpZiAoX3BlbmRpbmdWYWxpZGF0aW9uU3RhcnRlZC5nZXRBbmRTZXQoZmFsc2UpKXsKLQkJCQl2YWwudmFsaWRhdGlvblN0YXJ0aW5nKG51bGwsIHN0YXRlLCBtb25pdG9yKTsKLQkJCX0KLQkJCXZhbC52YWxpZGF0aW9uU3RhcnRpbmcocHJvamVjdCwgc3RhdGUsIG1vbml0b3IpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCl7Ci0JCQlpZiAoIV9wZW5kaW5nVmFsaWRhdGlvblN0YXJ0ZWQuZ2V0QW5kU2V0KGZhbHNlKSlnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKS52YWxpZGF0aW9uRmluaXNoaW5nKG51bGwsIHN0YXRlLCBtb25pdG9yKTsKLQkJfQotCQllbHNlIGdldERlbGVnYXRlZFZhbGlkYXRvcigpLnZhbGlkYXRpb25GaW5pc2hpbmcocHJvamVjdCwgc3RhdGUsIG1vbml0b3IpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShGaWx0ZXJHcm91cCBncm91cCkgewotCQlfZ3JvdXBzLnJlbW92ZShncm91cCk7Ci0JCV9ncm91cHNBcnJheSA9IG51bGw7CQotCQlidW1wQ2hhbmdlQ291bnRHcm91cHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVzZXRDaGFuZ2VDb3VudGVycygpIHsKLQkJc3VwZXIucmVzZXRDaGFuZ2VDb3VudGVycygpOwotCQlfY2hhbmdlQ291bnRHcm91cHMgPSAwOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFZhbGlkYXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUZpbHRlckdyb3VwW10gZ3JvdXBzID0gZ2V0R3JvdXBzKCk7Ci0JCUNvbnRlbnRUeXBlV3JhcHBlciBjdHcgPSBuZXcgQ29udGVudFR5cGVXcmFwcGVyKCk7Ci0JCWZvciAoRmlsdGVyR3JvdXAgZ3JvdXAgOiBncm91cHMpewotCQkJaWYgKCFncm91cC5zaG91bGRWYWxpZGF0ZShwcm9qZWN0LCBudWxsLCBjdHcpKXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlcGxhY2VGaWx0ZXJHcm91cChGaWx0ZXJHcm91cCBleGlzdGluZywgRmlsdGVyR3JvdXAgbWVyZ2VkKSB7Ci0JCXJlbW92ZShleGlzdGluZyk7Ci0JCWFkZChtZXJnZWQpOwotCX0KLQotfQotCi1wdWJsaWMgU3RyaW5nIGdldFNvdXJjZUlkKCkgewotCXJldHVybiBfc291cmNlSWQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNvdXJjZUlkKFN0cmluZyBzb3VyY2VJZCkgewotCWlmICghTWlzYy5zYW1lKF9zb3VyY2VJZCwgc291cmNlSWQpKXsKLQkJX3NvdXJjZUlkID0gc291cmNlSWQ7Ci0JCWJ1bXBDaGFuZ2VDb3VudEdsb2JhbCgpOwotCX0KLX0KLQotCi12b2lkIHNldE1lc3NhZ2VzKE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IG1hcCkgewotCV9tZXNzYWdlU2V0dGluZ3MgPSBtYXA7Ci0JYnVtcENoYW5nZUNvdW50TWVzc2FnZXMoKTsKLX0KLQotcHVibGljIGludCBnZXRDaGFuZ2VDb3VudEdsb2JhbCgpIHsKLQlyZXR1cm4gX2NoYW5nZUNvdW50R2xvYmFsOwotfQotCi1wdWJsaWMgYm9vbGVhbiBoYXNHbG9iYWxDaGFuZ2VzKCl7Ci0JcmV0dXJuIF9taWdyYXRlZCB8fCBfY2hhbmdlQ291bnRHbG9iYWwgPiAwOwotfQotCi1wdWJsaWMgaW50IGdldENoYW5nZUNvdW50TWVzc2FnZXMoKSB7Ci0JcmV0dXJuIF9jaGFuZ2VDb3VudE1lc3NhZ2VzOwotfQotCi1wdWJsaWMgdm9pZCBidW1wQ2hhbmdlQ291bnRNZXNzYWdlcygpewotCV9jaGFuZ2VDb3VudE1lc3NhZ2VzKys7Ci19Ci0KLXB1YmxpYyB2b2lkIHJlc2V0Q2hhbmdlQ291bnRlcnMoKSB7Ci0JX2NoYW5nZUNvdW50R2xvYmFsID0gMDsKLQlfY2hhbmdlQ291bnRNZXNzYWdlcyA9IDA7Ci19Ci0KLXB1YmxpYyB2b2lkIGJ1bXBDaGFuZ2VDb3VudEdsb2JhbCgpewotCV9jaGFuZ2VDb3VudEdsb2JhbCsrOwotfQotCi0vKioKLSAqIEFuc3dlciB0cnVlIGlmIHlvdSBoYXZlIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYXMgdmFsaWRhdG9yLgotICogQHBhcmFtIHZhbGlkYXRvciB0aGlzIGNhbiBiZSBudWxsLgotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQ29uZmlnKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQlpZiAodmFsaWRhdG9yID09IG51bGwpcmV0dXJuIGZhbHNlOwotCXJldHVybiBoYXNoQ29kZUZvckNvbmZpZygpID09IHZhbGlkYXRvci5oYXNoQ29kZUZvckNvbmZpZygpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldE1hcmtlcklkKCkgewotCXJldHVybiBfbWFya2VySWQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1hcmtlcklkKFN0cmluZyBtYXJrZXJJZCkgewotCV9tYXJrZXJJZCA9IG1hcmtlcklkOwotCWlmIChtYXJrZXJJZCAhPSBudWxsKU1hcmtlck1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldE1hcmtlcnMoKS5hZGQobWFya2VySWQpOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNmMyNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd2F5IGZvciBhIHZhbGlkYXRvciB0byByZXR1cm4gbWVzc2FnZXMsIHRoYXQgYXJlIGVhc2lseQotICogY29udmVydGVkIGludG8gSU1hcmtlcnMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgY29tcGxldGVseSBvcHRpb25hbCBmb3IgdmFsaWRhdG9ycy4gQSB2YWxpZGF0b3IgY2FuIGNob29zZSB0bwotICogZGlyZWN0bHkgbWFuYWdlIElNYXJrZXJzLiBIb3dldmVyLCBzb21lIHZhbGlkYXRvcnMgd2FudCB0byBiZSB1c2VkIGluCi0gKiBtdWx0aXBsZSBjb250ZXh0cywgZm9yIGV4YW1wbGUgYXMteW91LXR5cGUgdmFsaWRhdGlvbiBhbmQgYnVpbGQgYmFzZWQKLSAqIHZhbGlkYXRpb24uIEZvciB0aGVzZSB0eXBlcyBvZiB2YWxpZGF0b3JzIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlbSB0byB1c2UKLSAqIG9ubHkgSU1hcmtlcnMsIGJlY2F1c2Ugb2Z0ZW4gdGhlIFJlc291cmNlIGhhcyBub3QgYmVlbiBzYXZlZCB5ZXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdAotICogaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZQotICogcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQKLSAqIGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQKLSAqIHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSQotICogZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvck1lc3NhZ2UgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZhbGlkYXRpb25JZCA9ICJWYWxpZGF0aW9uSWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIEFzc29jaWF0ZSBzb21lIGFyYml0cmFyeSBhdHRyaWJ1dGVzIHdpdGggYSBtZXNzYWdlLiAqLwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PglfbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KDUpOwotCQotCXByaXZhdGUgSVJlc291cmNlCV9yZXNvdXJjZTsKLQkKLQkvKiogVGhlIHR5cGUgb2YgbWFya2VyLiAqLwotCXByaXZhdGUgU3RyaW5nCQlfdHlwZTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmFsaWRhdGlvbiBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogCQlUaGUgbG9jYWxpemVkIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAJCVRoZSByZXNvdXJjZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvck1lc3NhZ2UgY3JlYXRlKFN0cmluZyBtZXNzYWdlLCBJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlWYWxpZGF0b3JNZXNzYWdlIG1zZyA9IG5ldyBWYWxpZGF0b3JNZXNzYWdlKCk7Ci0JCW1zZy5fdHlwZSA9IFZhbENvbnN0YW50cy5Qcm9ibGVtTWFya2VyOwotCQltc2cuX3Jlc291cmNlID0gcmVzb3VyY2U7Ci0JCW1zZy5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmlzRGVidWdnaW5nKCkgPyAKLQkJCVRyYWNpbmcudGltZXN0YW1wSXQobWVzc2FnZSk6IG1lc3NhZ2UpOwotCQlyZXR1cm4gbXNnOwotCX0KLQkKLQlwcml2YXRlIFZhbGlkYXRvck1lc3NhZ2UoKXt9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgY29weSBvZiB5b3Vyc2VsZi4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWVzc2FnZSBhc0NvcHkoKXsKLQkJVmFsaWRhdG9yTWVzc2FnZSBtc2cgPSBuZXcgVmFsaWRhdG9yTWVzc2FnZSgpOwotCQltc2cuX3Jlc291cmNlID0gX3Jlc291cmNlOwotCQltc2cuX3R5cGUgPSBfdHlwZTsKLQkJbXNnLl9tYXAucHV0QWxsKF9tYXApOwotCQlyZXR1cm4gbXNnOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gVGhlIHJlc3VsdCBpcyBhbiBpbnN0YW5jZSBvZgotCSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6IDxjb2RlPlN0cmluZzwvY29kZT4sIDxjb2RlPkludGVnZXI8L2NvZGU+LAotCSAqIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgaXMKLQkgKiB1bmRlZmluZWQuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiAJCVRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKXsKLQkJcmV0dXJuIF9tYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBSZXR1cm5zIHRoZQotCSAqIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyB1bmRlZmluZWQgb3IgdGhlIG1hcmtlciBkb2VzIG5vdAotCSAqIGV4aXN0IG9yIGlzIG5vdCBhbiBpbnRlZ2VyIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICogCQlUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAJCVRoZSB2YWx1ZSB0byB1c2UgaWYgbm8gaW50ZWdlciB2YWx1ZSBpcyBmb3VuZC4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBubyBpbnRlZ2VyIHZhbHVlIHdhcyBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IGRlZmF1bHRWYWx1ZSl7Ci0JCUludGVnZXIgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJdmFsdWUgPSAoSW50ZWdlcilfbWFwLmdldChhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy8gZWF0IGl0Ci0JCX0KLQkJaWYgKHZhbHVlID09IG51bGwpcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gUmV0dXJucyB0aGUKLQkgKiBnaXZlbiBkZWZhdWx0IHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgdW5kZWZpbmVkIG9yIHRoZSBtYXJrZXIgZG9lcyBub3QKLQkgKiBleGlzdCBvciBpcyBub3QgYSBzdHJpbmcgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiAJCVRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqIAkJVGhlIHZhbHVlIHRvIHVzZSBpZiBubyB2YWx1ZSBpcyBmb3VuZC4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBubyB2YWx1ZSB3YXMgZm91bmQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJdmFsdWUgPSAoU3RyaW5nKV9tYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkvLyBlYXQgaXQKLQkJfQotCQlpZiAodmFsdWUgPT0gbnVsbClyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQlyZXR1cm4gdmFsdWU7Ci0JCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBSZXR1cm5zIHRoZQotCSAqIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyB1bmRlZmluZWQgb3IgdGhlIG1hcmtlciBkb2VzIG5vdAotCSAqIGV4aXN0IG9yIGlzIG5vdCBhIGJvb2xlYW4gdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiAJCVRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqIAkJVGhlIHZhbHVlIHRvIHVzZSBpZiBubyB2YWx1ZSBpcyBmb3VuZC4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBubyB2YWx1ZSB3YXMgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIGRlZmF1bHRWYWx1ZSl7Ci0JCUJvb2xlYW4gdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJdmFsdWUgPSAoQm9vbGVhbilfbWFwLmdldChhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy8gZWF0IGl0Ci0JCX0KLQkJaWYgKHZhbHVlID09IG51bGwpcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJcmV0dXJuIHZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIHdpdGggYWxsIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgbWFya2VyLiBJZiB0aGUgbWFya2VyIGhhcwotCSAqIG5vIGF0dHJpYnV0ZXMgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIGF0dHJpYnV0ZSBrZXlzIGFuZCB2YWx1ZXMgKGtleSB0eXBlIDoKLQkgKiAJPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSB0eXBlIDogPGNvZGU+U3RyaW5nPC9jb2RlPiwKLQkgKiAJPGNvZGU+SW50ZWdlcjwvY29kZT4sIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+KSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBfbWFwOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugd2l0aCB3aGljaCB0aGlzIG1hcmtlciBpcyBhc3NvY2lhdGVkLiAKLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIHdpdGggd2hpY2ggdGhpcyBtYXJrZXIgaXMgYXNzb2NpYXRlZAotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKXsKLQkJcmV0dXJuIF9yZXNvdXJjZTsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtYXJrZXIuIFRoZSByZXR1cm5lZCBtYXJrZXIgdHlwZSB3aWxsIG5vdCBiZSAKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBtYXJrZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBfdHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWFya2VyIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhlIG1hcmtlciBpZCB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgbWFya2Vycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKXsKLQkJYXNzZXJ0IHR5cGUgIT0gbnVsbDsKLQkJX3R5cGUgPSB0eXBlOwotCX0KLQkJCi0JLyoqCi0JICogU2V0cyB0aGUgaW50ZWdlciB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2hhbmdlcyByZXNvdXJjZXM7IHRoZXNlIGNoYW5nZXMgd2lsbCBiZSByZXBvcnRlZCBpbiBhCi0JICogc3Vic2VxdWVudCByZXNvdXJjZSBjaGFuZ2UgZXZlbnQsIGluY2x1ZGluZyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhpcwotCSAqIG1hcmtlciBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiAJCVRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIHZhbHVlCi0JICogCQlUaGUgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgdmFsdWUpewotCQlfbWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBuZXcgSW50ZWdlcih2YWx1ZSkpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gVGhlIHZhbHVlIG11c3QgYmUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgotCSAqIDxjb2RlPlN0cmluZzwvY29kZT4sIDxjb2RlPkludGVnZXI8L2NvZGU+LCBvciA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIAkJVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAJCVRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZSBpcyB0byBiZSB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBPYmplY3QgdmFsdWUpewotCQlfbWFwLnB1dChhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYm9vbGVhbiB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiAJCVRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIHZhbHVlCi0JICogCQlUaGUgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKXsKLQkJX21hcC5wdXQoYXR0cmlidXRlTmFtZSwgdmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsJCQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIGF0dHJpYnV0ZSBrZXktdmFsdWUgcGFpcnMgb24gdGhpcyBtYXJrZXIuIFRoZSB2YWx1ZXMgbXVzdAotCSAqIGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6Ci0JICogPGNvZGU+U3RyaW5nPC9jb2RlPiwgPGNvZGU+SW50ZWdlcjwvY29kZT4sIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+LiBJZiBhCi0JICogdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyBjb25zaWRlcmVkCi0JICogdG8gYmUgdW5kZWZpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lcwotCSAqIAkJQW4gYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzLgotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiAJCUFuIGFycmF5IG9mIGF0dHJpYnV0ZSB2YWx1ZXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lcywgT2JqZWN0W10gdmFsdWVzKXsKLQkJQXNzZXJ0LmlzVHJ1ZShhdHRyaWJ1dGVOYW1lcy5sZW5ndGggPT0gdmFsdWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhdHRyaWJ1dGVOYW1lcy5sZW5ndGg7IGkrKyl7Ci0JCQlzZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZXNbaV0sIHZhbHVlc1tpXSk7CQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIG1hcmtlciB0byBiZSB0aGUgb25lcyBjb250YWluZWQgaW4gdGhlIGdpdmVuCi0JICogdGFibGUuIFRoZSB2YWx1ZXMgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgotCSAqIDxjb2RlPlN0cmluZzwvY29kZT4sIDxjb2RlPkludGVnZXI8L2NvZGU+LCBvciA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiBBdHRyaWJ1dGVzIHByZXZpb3VzbHkgc2V0IG9uIHRoZSBtYXJrZXIgYnV0IG5vdCBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gbWFwCi0JICogYXJlIGNvbnNpZGVyZWQgdG8gYmUgcmVtb3ZhbHMuIFRoaXMgaW5jbHVkZXMgdGhlIHRleHQgb2YgdGhlIG1lc3NhZ2UuCi0JICogU2V0dGluZyB0aGUgZ2l2ZW4gbWFwIHRvIGJlCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyBhbGwgbWFya2VyIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAJCUEgbWFwIG9mIGF0dHJpYnV0ZSBuYW1lcyB0byBhdHRyaWJ1dGUgdmFsdWVzIChrZXkgdHlwZSA6Ci0JICogCQk8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIHR5cGUgOiA8Y29kZT5TdHJpbmc8L2NvZGU+LAotCSAqIAkJPGNvZGU+SW50ZWdlcjwvY29kZT4sIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+KSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcykgewotCQlfbWFwLmNsZWFyKCk7Ci0JCV9tYXAucHV0QWxsKGF0dHJpYnV0ZXMpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2RvYy1maWxlcy9mYXEuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2RvYy1maWxlcy9mYXEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5NmQwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9kb2MtZmlsZXMvZmFxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlZhbGlkYXRpb24gRnJhbWV3b3JrIC0gRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+VmFsaWRhdGlvbiBGcmFtZXdvcmsgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvaDE+Ci08aDM+SG93IGRvIEkgY3JlYXRlIFByb2JsZW0gTWFya2Vycz88L2gzPgotPHA+VGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCB3YXlzIHRvIGNyZWF0ZSBwcm9ibGVtIG1hcmtlcnMuPC9wPgotPG9sPgotCTxsaT5Vc2UgdGhlIG5hdGl2ZSBzdXBwb3J0IGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L2xpPgotCTxsaT5NYW5hZ2UgeW91ciBvd24gbWFya2Vycy48L2xpPgotCTxsaT5Vc2UgdGhlIHN1cHBvcnQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvbGk+Ci08L29sPgotPHA+VGhlIGZpcnN0IGFwcHJvYWNoLCBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2guPC9wPgotCi08aDQ+MS4gVXNlIHRoZSBuYXRpdmUgc3VwcG9ydCBpbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcms8L2g0PgotPHA+QWZ0ZXIgeW91IGhhdmUgZmluaXNoZWQgcGVyZm9ybWluZyB5b3VyIHZhbGlkYXRpb24sIGFuZCBhcmUgcmV0dXJuaW5nIGNvbnRyb2wgYmFjayB0bwotdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBhZGQgeW91ciBtZXNzYWdlcyBpbnRvIHRoZSAKLTxhIGhyZWY9Ii4uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCI+VmFsaWRhdGlvblJlc3VsdDwvYT4gYnkgdXNpbmcKLXRoZSA8YSBocmVmPSIuLi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjYWRkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2UpIj5hZGQoVmFsaWRhdG9yTWVzc2FnZSBtZXNzYWdlKTwvYT4gbWV0aG9kLgotCi08aDQ+Mi4gTWFuYWdlIHlvdXIgb3duIG1hcmtlcnM8L2g0PgotCi08cD5DcmVhdGUgYW5kIHJlbW92ZSB5b3VyIG93biBtYXJrZXJzLiBTbyB0aGF0IHN1bW1hcnkgaW5mb3JtYXRpb24gY2FuIHN0aWxsIGJlIGRpc3BsYXllZCwgc2V0IHRoZSBjb3VudHMgb2YgYW55IG5ld2x5Ci1jcmVhdGVkIG1hcmtlcnMgaW4gdGhlIDxhIGhyZWY9Ii4uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCI+VmFsaWRhdGlvblJlc3VsdDwvYT4gYnkgdXNpbmcgdGhlIHNldFNldmVyaXR5WFhYKCkgbWV0aG9kcy4KLUZvciBleGFtcGxlLCBpZiB0aGlzIHZhbGlkYXRpb24gcGFzcyBnZW5lcmF0ZWQgdHdvIGVycm9yIG1hcmtlcnMsIHlvdSB3b3VsZCBjYWxsIAotPGEgaHJlZj0iLi4vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldFNldmVyaXR5RXJyb3IoaW50KSI+c2V0U2V2ZXJpdHlFcnJvcigyKTwvYT4uIAotPC9wPgotCi08aDQ+My4gVXNlIHRoZSBzdXBwb3J0IGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yazwvaDQ+Ci0KLTxwPklmIHlvdSBhcmUgcG9ydGluZyBhIHZhbGlkYXRvciB0aGF0IHVzZWQgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBhbmQgeW91IHdpc2ggdG8gY29udGludWUgdG8gdXNlIGFuCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIj5JUmVwb3J0ZXI8L2E+IHRvCi1yZXBvcnQgeW91ciBtYXJrZXJzLCB5b3UgY2FuIGNvbnRpbnVlIHRvIGRvIHNvLjwvcD4KLTxwPkZvciB0aGlzIGFwcHJvYWNoLCB1c2UgdGhlCi08YSBocmVmPSIuLi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvcikiPmdldFJlcG9ydGVyKElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvYT4gbWV0aG9kLAotYW5kIHJldHVybiB5b3VyIG1lc3NhZ2VzIHRocm91Z2ggdGhlIElSZXBvcnRlci4gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGl0IGlzIGFzc3VtZWQgYnkgdGhlIGZyYW1ld29yaywgCi10aGF0IHRoaXMgSVJlcG9ydGVyIHdpbGwgYmUgdXNlZCBhcyB0aGUgb25seSB3YXkgb2YgcGFzc2luZyBtZXNzYWdlcyBiYWNrIHRvIHRoZSBmcmFtZXdvcmsuIAotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRlbnRUeXBlV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudFR5cGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZGQwNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudFR5cGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogU2luY2UgaXQgY2FuIGJlIGV4cGVuc2UgdG8gZGV0ZXJtaW5lIGEgY29udGVudCB0eXBlLCB3ZSBwcm92aWRlIGEgd3JhcHBlciBzbyB0aGF0IHdlIG9ubHkKLSAqIG5lZWQgdG8gZ2V0IGl0IG9uY2UsIGFzIHdlIHZhbGlkYXRlIGEgcmVzb3VyY2UuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVXcmFwcGVyIHsKLQkKLQlwcml2YXRlIElDb250ZW50VHlwZSBfdHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gCV9pbml0aWFsaXplZDsKLQkKLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKElGaWxlIGZpbGUpewotCQlpZiAoX2luaXRpYWxpemVkKXJldHVybiBfdHlwZTsKLQkJCi0JCUlDb250ZW50RGVzY3JpcHRpb24gY2QgPSBudWxsOwotCQl0cnkgewotCQkJY2QgPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJY2QgPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpewotCQkJCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUyKTsKLQkJCX0KLQkJfQotCQlpZiAoY2QgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQkJX3R5cGUgPSBjZC5nZXRDb250ZW50VHlwZSgpOwotCQlfaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQlyZXR1cm4gX3R5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZWJ1Z0NvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGVidWdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2NjI0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZWJ1Z0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRGVidWdDb25zdGFudHMgewotCQotCS8qKiBtYXRjaGVzIC0gdHJhY2UgZmlsdGVyIG1hdGNoZXMuICovCi0JU3RyaW5nIFRyYWNlTWF0Y2hlcyA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKyIvbWF0Y2hlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdGltaW5ncyAtIHRyYWNlIHRoZSB0aW1lcyBvZiB0aGUgdmFsaWRhdG9ycy4gKi8KLQlTdHJpbmcgVHJhY2VUaW1lcyA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKyIvdGltaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdjEgLSB0cmFjZSB0aGUgdjEgdmFsaWRhdG9ycy4gKi8KLQlTdHJpbmcgVHJhY2VWMSA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKyIvdjEiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRpbWluZ3MvdHJhY2VmaWxlIC0gZmlsZSB0aGF0IHN0b3JlcyB0aGUgdHJhY2UgZXZlbnRzICovCi0JU3RyaW5nIFRyYWNlVGltZXNGaWxlID0gVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQrIi90aW1pbmdzL3RyYWNlZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogCi0JICogdGltaW5ncy91c2VEb3VibGVzIC0gQnkgZGVmYXVsdCB0aW1lcyB0aGF0IGFyZSB3cml0dGVuIHRvIHRoZSB0cmFjZSBmaWxlIGFyZQotCSAqIGluIG1pbGxpc2Vjb25kcyBmb3IgZWxhcHNlZCB0aW1lIGFuZCBuYW5vc2Vjb25kcyBmb3IgY3B1IHRpbWUuIAotCSAqIElmIHlvdSBmaW5kIHRoZXNlIHRpbWVzIGVhc2llciB0byByZWFkIGFzIHNlY29uZHMgYXMgZXhwcmVzc2VkIGJ5IGEgZG91YmxlLCAKLQkgKiB0aGUgZm9sbG93aW5nIGZsYWcgY2FuIGJlIHR1cm5lZCBvbi4KLQkgKi8KLQlTdHJpbmcgVHJhY2VUaW1lc1VzZURvdWJsZXMgPSBWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCsiL3RpbWluZ3MvdXNlRG91YmxlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogCi0JICogZXh0cmFWYWxEZXRhaWwgLSBJZiBleHRyYSBkZXRhaWwgaXMgbmVlZGVkIGZvciBhIHBhcnRpY3VsYXIgdmFsaWRhdG9yIGl0J3MgaWQgY2FuIGJlIHNwZWNpZmllZCBoZXJlLiAKLQkgKiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCBtb3JlIGRldGFpbCBvbiB0aGUgWE1MIHZhbGlkYXRvciB5b3Ugd291bGQgdXNlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWwgCi0JICovCi0JU3RyaW5nIEV4dHJhVmFsRGV0YWlsID0gVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQrIi9leHRyYVZhbERldGFpbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogCi0JICogZmlsdGVyL2FsbEV4Y2VwdCAtIElmIHN1cHBsaWVkLCBpdCBpcyBhcyBpZiB0aGlzIGlzIHRoZSBvbmx5IHZhbGlkYXRvciB0aGF0IGdldHMgZGVmaW5lZCB2aWEKLQkgKiB0aGUgZXh0ZW5zaW9uIHBvaW50LiBBbGwgdGhlIG90aGVyIHZhbGlkYXRvcnMgYXJlIGlnbm9yZWQuCi0JICovCi0JU3RyaW5nIEZpbHRlckFsbEV4Y2VwdCA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKyIvZmlsdGVyL2FsbEV4Y2VwdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiB0cmFjZS9sZXZlbCAtIFRoZSB0cmFjaW5nIGxldmVsLiBJZiBub3Qgc3VwcGxpZWQgYSBkZWZhdWx0IG9mIHplcm8gaXMgdXNlZC4gVGhlIGhpZ2hlciB0aGUgbnVtYmVyIHRoZQotCSAqIG1vcmUgdmVyYm9zZSB0aGUgdHJhY2luZy4KLQkgKi8KLQlTdHJpbmcgVHJhY2VMZXZlbCA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKyIvdHJhY2UvbGV2ZWwiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0RlcGVuZGVuY3lJbmRleC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGVwZW5kZW5jeUluZGV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMWRiMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGVwZW5kZW5jeUluZGV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkRlcGVuZGVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklEZXBlbmRlbmN5SW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJRGVwZW5kZW5jeUluZGV4LiBUaGlzIHdpbGwgcHJvYmFibHkgYmUKLSAqIHJlcGxhY2VkIHdpdGggYSBoaWdoZXIgcGVyZm9ybWFuY2UsIG1vcmUgcm9idXN0IGluZGV4LCBhdCBzb21lIHBvaW50IGluIHRoZQotICogZnV0dXJlLgotICogPHA+Ci0gKiBUaGUgZm9ybWF0IG9mIHRoZSBpbmRleCBpczoKLSAqIAotICogPHByZT4KLSAqIFZlcnNpb24gbnVtYmVyCi0gKiBOdW1iZXIgb2YgZGVwZW5kcyBvbiBlbnRyaWVzCi0gKiAgIGRlcGVuZHMgb24gZmlsZSBuYW1lCi0gKiAgIG51bWJlciBvZiBkZXBlbmRlbnQgZW50cmllcwotICogICAgIGRlcGVuZGVudCBmaWxlIG5hbWUKLSAqICAgICBudW1iZXIgb2YgdmFsaWRhdG9ycwotICogICAgICAgdmFsaWRhdG9yIGlkCi0gKiA8L3ByZT4KLSAqIAotICogQGF1dGhvciBrYXJhc2l1awotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUluZGV4IGltcGxlbWVudHMgSURlcGVuZGVuY3lJbmRleCwgSVNhdmVQYXJ0aWNpcGFudCB7Ci0JCi0JLyoqCi0JICogQW4gaW5kZXggc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIHdoaWNoIHRoaW5ncyBkZXBlbmQgb24gdGhpcyByZXNvdXJjZS4KLQkgKi8KLQlwcml2YXRlIE1hcDxJUmVzb3VyY2UsU2V0PERlcGVuZHM+PgkJX2RlcGVuZHNPbjsKLQkKLQkvKioKLQkgKiBBbiBpbmRleCBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgd2hvIHRoZSByZXNvdXJjZSBkZXBlbmRzIG9uLgotCSAqLwotCXByaXZhdGUgTWFwPElSZXNvdXJjZSxTZXQ8RGVwZW5kcz4+CQlfZGVwZW5kZW50czsKLQlwcml2YXRlIGJvb2xlYW4gX2RpcnR5OwotCQotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZVtdIEVtcHR5UmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVswXTsKLQkKLQkvKiogVmVyc2lvbiBvZiB0aGUgcGVyc2lzdGVudCBpbmRleC4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ3VycmVudFZlcnNpb24gPSAxOwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChTdHJpbmcgaWQsIElSZXNvdXJjZSBkZXBlbmRlbnQsIElSZXNvdXJjZSBkZXBlbmRzT24pIHsKLQkJaW5pdCgpOwotCQlpZiAoZGVwZW5kc09uID09IG51bGwgfHwgZGVwZW5kZW50ID09IG51bGwpcmV0dXJuOwotCQlEZXBlbmRzIGQgPSBnZXRPckNyZWF0ZURlcGVuZHMoZGVwZW5kZW50LCBkZXBlbmRzT24pOwotCQlpZiAoZC5nZXRWYWxpZGF0b3JzKCkuYWRkKGlkKSlfZGlydHkgPSB0cnVlOwotCX0KLQkKLQlwcml2YXRlIERlcGVuZHMgZ2V0T3JDcmVhdGVEZXBlbmRzKElSZXNvdXJjZSBkZXBlbmRlbnQsIElSZXNvdXJjZSBkZXBlbmRzT24pIHsKLQkJU2V0PERlcGVuZHM+IHNldCA9IGdldFNldChfZGVwZW5kZW50cywgZGVwZW5kZW50KTsKLQkJZm9yIChEZXBlbmRzIGQgOiBzZXQpewotCQkJaWYgKGQuZ2V0RGVwZW5kc09uKCkgIT0gbnVsbCAmJiBkLmdldERlcGVuZHNPbigpLmVxdWFscyhkZXBlbmRzT24pKSByZXR1cm4gZDsKLQkJfQotCQlEZXBlbmRzIGQgPSBuZXcgRGVwZW5kcyhkZXBlbmRlbnQsIGRlcGVuZHNPbik7Ci0JCV9kaXJ0eSA9IHRydWU7Ci0JCXNldC5hZGQoZCk7Ci0JCQotCQlnZXRTZXQoX2RlcGVuZHNPbiwgZGVwZW5kc09uKS5hZGQoZCk7Ci0JCXJldHVybiBkOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgc2V0IGZvciB0aGUgcmVzb3VyY2UsIGNyZWF0aW5nIGl0IGlmIHlvdSBuZWVkIHRvLgotCSAqLwotCXByaXZhdGUgU2V0PERlcGVuZHM+IGdldFNldChNYXA8SVJlc291cmNlLCBTZXQ8RGVwZW5kcz4+IG1hcCwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVNldDxEZXBlbmRzPiBzZXQgPSBtYXAuZ2V0KHJlc291cmNlKTsKLQkJaWYgKHNldCA9PSBudWxsKXsKLQkJCXNldCA9IG5ldyBIYXNoU2V0PERlcGVuZHM+KDUpOwotCQkJbWFwLnB1dChyZXNvdXJjZSwgc2V0KTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdGhlIGRlcGVuZGVuY3kgaW5kZXguIFNlZSB0aGUgY2xhc3MgY29tbWVudCBmb3IgdGhlIHN0cnVjdHVyZS4KLQkgKi8JCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWlmIChfZGVwZW5kc09uICE9IG51bGwpcmV0dXJuOwotCQkKLQkJYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCQlGaWxlIGYgPSBnZXRJbmRleExvY2F0aW9uKCk7Ci0JCWlmICghZi5leGlzdHMoKSl7Ci0JCQlfZGVwZW5kc09uID0gbmV3IEhhc2hNYXA8SVJlc291cmNlLFNldDxEZXBlbmRzPj4oMTAwKTsKLQkJCV9kZXBlbmRlbnRzID0gbmV3IEhhc2hNYXA8SVJlc291cmNlLFNldDxEZXBlbmRzPj4oMTAwKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBWYWxNZXNzYWdlcy5FcnJvcjIxOyAKLQkJCURhdGFJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKLQkJCQkKLQkJCQlpbnQgdmVyc2lvbiA9IGluLnJlYWRJbnQoKTsKLQkJCQlpZiAodmVyc2lvbiAhPSBDdXJyZW50VmVyc2lvbil7Ci0JCQkJCWVycm9yID0gdHJ1ZTsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkVyckRlcGVuZGVuY3lWZXJzaW9uLCBDdXJyZW50VmVyc2lvbik7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obXNnKTsKLQkJCQl9Ci0JCQkJaW50IG51bURlcGVuZHNPbiA9IGluLnJlYWRJbnQoKTsKLQkJCQlfZGVwZW5kc09uID0gbmV3IEhhc2hNYXA8SVJlc291cmNlLFNldDxEZXBlbmRzPj4obnVtRGVwZW5kc09uKzEwMCk7Ci0JCQkJX2RlcGVuZGVudHMgPSBuZXcgSGFzaE1hcDxJUmVzb3VyY2UsU2V0PERlcGVuZHM+PihudW1EZXBlbmRzT24rMTAwKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8bnVtRGVwZW5kc09uOyBpKyspewotCQkJCQlTdHJpbmcgdiA9IGluLnJlYWRVVEYoKTsKLQkJCQkJSVJlc291cmNlIGRlcGVuZHNPbiA9IHJvb3QuZmluZE1lbWJlcih2KTsKLQkJCQkJaWYgKGRlcGVuZHNPbiA9PSBudWxsKXsKLQkJCQkJCVRyYWNpbmcubG9nKE5MUy5iaW5kKGVycm9yTWVzc2FnZSwgdikpOwotCQkJCQl9Ci0JCQkJCWludCBudW1EZXBlbmRlbnRzID0gaW4ucmVhZEludCgpOwotCQkJCQlmb3IgKGludCBqPTA7IGo8bnVtRGVwZW5kZW50czsgaisrKXsKLQkJCQkJCXYgPSBpbi5yZWFkVVRGKCk7Ci0JCQkJCQlJUmVzb3VyY2UgZGVwZW5kZW50ID0gcm9vdC5maW5kTWVtYmVyKHYpOwotCQkJCQkJaWYgKGRlcGVuZGVudCA9PSBudWxsKXsKLQkJCQkJCQlUcmFjaW5nLmxvZyhOTFMuYmluZChlcnJvck1lc3NhZ2UsIHYpKTsKLQkJCQkJCX0KLQkJCQkJCWludCBudW1WYWwgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCQlmb3IgKGludCBrPTA7IGs8bnVtVmFsOyBrKyspewotCQkJCQkJCVN0cmluZyBpZCA9IGluLnJlYWRVVEYoKTsKLQkJCQkJCQlpZiAoZGVwZW5kZW50ICE9IG51bGwgJiYgZGVwZW5kc09uICE9IG51bGwpYWRkKGlkLCBkZXBlbmRlbnQsIGRlcGVuZHNPbik7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCX0JCQkJCi0JCQl9Ci0JCQljYXRjaCAoRU9GRXhjZXB0aW9uIGUpewotCQkJCVRyYWNpbmcubG9nKCJVbmFibGUgdG8gcmVhZCB0aGUgZGVwZW5kZW5jeSBpbmRleCBmaWxlIGJlY2F1c2Ugb2YgRU9GIGV4Y2VwdGlvbiIpOyAKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCQllcnJvciA9IHRydWU7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlNaXNjLmNsb3NlKGluKTsKLQkJCQlpZiAoZXJyb3IpewotCQkJCQlfZGVwZW5kc09uID0gbmV3IEhhc2hNYXA8SVJlc291cmNlLFNldDxEZXBlbmRzPj4oMTAwKTsKLQkJCQkJX2RlcGVuZGVudHMgPSBuZXcgSGFzaE1hcDxJUmVzb3VyY2UsU2V0PERlcGVuZHM+PigxMDApOwotCQkJCQlmLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWluaXQoKTsKLQkJZm9yIChNYXAuRW50cnk8SVJlc291cmNlLFNldDxEZXBlbmRzPj4gbWUgOiBfZGVwZW5kZW50cy5lbnRyeVNldCgpKXsKLQkJCWlmIChtZS5nZXRLZXkoKS5nZXRQcm9qZWN0KCkgPT0gcHJvamVjdCl7Ci0JCQkJZm9yIChEZXBlbmRzIGQgOiBtZS5nZXRWYWx1ZSgpKXsKLQkJCQkJaWYgKGQuZGVsZXRlKCkpX2RpcnR5ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElSZXNvdXJjZVtdIGdldChTdHJpbmcgdmFsaWRhdG9ySWQsIElSZXNvdXJjZSBkZXBlbmRzT24pIHsKLQkJaW5pdCgpOwotCQlMaXN0PElSZXNvdXJjZT4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PElSZXNvdXJjZT4oKTsKLQkJU2V0PERlcGVuZHM+IHNldCA9IGdldFNldChfZGVwZW5kc09uLCBkZXBlbmRzT24pOwotCQlmb3IgKERlcGVuZHMgZCA6IHNldCl7Ci0JCQlmb3IgKFN0cmluZyBpZCA6IGQuZ2V0VmFsaWRhdG9ycygpKXsKLQkJCQlpZiAodmFsaWRhdG9ySWQuZXF1YWxzKGlkKSlsaXN0LmFkZChkLmdldERlcGVuZGVudCgpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGxpc3Quc2l6ZSgpID09IDApcmV0dXJuIEVtcHR5UmVzb3VyY2VzOwotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc291cmNlcyk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JCi0JcHVibGljIHN5bmNocm9uaXplZCBMaXN0PERlcGVuZGVudFJlc291cmNlPiBnZXQoSVJlc291cmNlIGRlcGVuZHNPbikgewotCQlpbml0KCk7Ci0JCUxpc3Q8RGVwZW5kZW50UmVzb3VyY2U+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxEZXBlbmRlbnRSZXNvdXJjZT4oKTsKLQkJU2V0PERlcGVuZHM+IHNldCA9IGdldFNldChfZGVwZW5kc09uLCBkZXBlbmRzT24pOwotCQlWYWxNYW5hZ2VyIHZtID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCk7Ci0JCWZvciAoRGVwZW5kcyBkIDogc2V0KXsKLQkJCWZvciAoU3RyaW5nIGlkIDogZC5nZXRWYWxpZGF0b3JzKCkpewotCQkJCVZhbGlkYXRvciB2ID0gdm0uZ2V0VmFsaWRhdG9yKGlkLCBkLmdldERlcGVuZGVudCgpLmdldFByb2plY3QoKSk7Ci0JCQkJaWYgKHYgIT0gbnVsbClsaXN0LmFkZChuZXcgRGVwZW5kZW50UmVzb3VyY2UoZC5nZXREZXBlbmRlbnQoKSwgdikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldChTdHJpbmcgaWQsIElSZXNvdXJjZSBkZXBlbmRlbnQsIElSZXNvdXJjZVtdIGRlcGVuZHNPbikgewotCQlpbml0KCk7Ci0JCVNldDxEZXBlbmRzPiBzZXQgPSBnZXRTZXQoX2RlcGVuZGVudHMsIGRlcGVuZGVudCk7Ci0JCWZvciAoRGVwZW5kcyBkIDogc2V0KXsKLQkJCWlmIChkLmRlbGV0ZShpZCkpX2RpcnR5ID0gdHJ1ZTsKLQkJfQotCQlpZiAoZGVwZW5kc09uICE9IG51bGwpewotCQkJZm9yIChJUmVzb3VyY2UgZCA6IGRlcGVuZHNPbilhZGQoaWQsIGRlcGVuZGVudCwgZCk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZWRPbihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaW5pdCgpOwotCQlTZXQ8RGVwZW5kcz4gc2V0ID0gX2RlcGVuZHNPbi5nZXQocmVzb3VyY2UpOwotCQlpZiAoc2V0ID09IG51bGwgfHwgc2V0LnNpemUoKSA9PSAwKXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9uZVNhdmluZyhJU2F2ZUNvbnRleHQgY29udGV4dCkgewkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJlcGFyZVRvU2F2ZShJU2F2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcm9sbGJhY2soSVNhdmVDb250ZXh0IGNvbnRleHQpIHsKLQl9Ci0JCi0JLyoqCi0JICogUGVyc2lzdCB0aGUgZGVwZW5kZW5jeSBpbmRleC4gU2VlIHRoZSBjbGFzcyBjb21tZW50IGZvciB0aGUgc3RydWN0dXJlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzYXZpbmcoSVNhdmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFfZGlydHkpcmV0dXJuOwotCQlfZGlydHkgPSBmYWxzZTsKLQkJYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCUZpbGUgZiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmID0gZ2V0SW5kZXhMb2NhdGlvbigpOwotCQkJb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpOwotCQkJb3V0LndyaXRlSW50KEN1cnJlbnRWZXJzaW9uKTsKLQkJCU1hcDxTdHJpbmcsIFNldDxEZXBlbmRzUmVzb2x2ZWQ+PiBtYXAgPSBjb21wcmVzcyhfZGVwZW5kc09uKTsKLQkJCW91dC53cml0ZUludChtYXAuc2l6ZSgpKTsKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU2V0PERlcGVuZHNSZXNvbHZlZD4+IG1lIDogbWFwLmVudHJ5U2V0KCkpewotCQkJCW91dC53cml0ZVVURihtZS5nZXRLZXkoKSk7Ci0JCQkJU2V0PERlcGVuZHNSZXNvbHZlZD4gc2V0ID0gbWUuZ2V0VmFsdWUoKTsKLQkJCQlvdXQud3JpdGVJbnQoc2V0LnNpemUoKSk7Ci0JCQkJZm9yIChEZXBlbmRzUmVzb2x2ZWQgZCA6IHNldCl7Ci0JCQkJCW91dC53cml0ZVVURihkLnJlc291cmNlKTsKLQkJCQkJb3V0LndyaXRlSW50KGQudmFsaWRhdG9ycy5zaXplKCkpOwotCQkJCQlmb3IgKFN0cmluZyBpZCA6IGQudmFsaWRhdG9ycyl7Ci0JCQkJCQlvdXQud3JpdGVVVEYoaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewkJCi0JCQlNaXNjLmNsb3NlKG91dCk7Ci0JCQlpZiAoZXJyb3IpZi5kZWxldGUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTWFwPFN0cmluZywgU2V0PERlcGVuZHNSZXNvbHZlZD4+IGNvbXByZXNzKE1hcDxJUmVzb3VyY2UsIFNldDxEZXBlbmRzPj4gZGVwZW5kc09uKSB7Ci0JCU1hcDxTdHJpbmcsIFNldDxEZXBlbmRzUmVzb2x2ZWQ+PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxEZXBlbmRzUmVzb2x2ZWQ+PihkZXBlbmRzT24uc2l6ZSgpKTsKLQkJZm9yIChNYXAuRW50cnk8SVJlc291cmNlLCBTZXQ8RGVwZW5kcz4+IG1lIDogZGVwZW5kc09uLmVudHJ5U2V0KCkpewotCQkJU2V0PERlcGVuZHNSZXNvbHZlZD4gc2V0ID0gbmV3IEhhc2hTZXQ8RGVwZW5kc1Jlc29sdmVkPihtZS5nZXRWYWx1ZSgpLnNpemUoKSk7Ci0JCQlmb3IgKERlcGVuZHMgZCA6IG1lLmdldFZhbHVlKCkpewotCQkJCUlQYXRoIHBhdGggPSBkLmdldERlcGVuZGVudCgpLmdldEZ1bGxQYXRoKCk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCl7Ci0JCQkJCURlcGVuZHNSZXNvbHZlZCBkciA9IG5ldyBEZXBlbmRzUmVzb2x2ZWQoKTsKLQkJCQkJZHIucmVzb3VyY2UgPSBwYXRoLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQkJaWYgKGQuZ2V0VmFsaWRhdG9ycygpLnNpemUoKSA+IDApewotCQkJCQkJZHIudmFsaWRhdG9ycyA9IGQuZ2V0VmFsaWRhdG9ycygpOwotCQkJCQkJc2V0LmFkZChkcik7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQkJaWYgKHNldC5zaXplKCkgPiAwKXsKLQkJCQlJUmVzb3VyY2UgcmVzID0gbWUuZ2V0S2V5KCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKXsKLQkJCQkJSVBhdGggcGF0aCA9IHJlcy5nZXRGdWxsUGF0aCgpOwotCQkJCQlpZiAocGF0aCAhPSBudWxsKW1hcC5wdXQocGF0aC50b1BvcnRhYmxlU3RyaW5nKCksIHNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldEluZGV4TG9jYXRpb24oKSB7Ci0JCUlQYXRoIHBhdGggPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoImRlcC5pbmRleCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXRoLnRvRmlsZSgpOwotCX0KLQotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIGRlcGVuZGVudCBhbmQgdGhlIHRoaW5nIHRoYXQgaXQKLQkgKiBkZXBlbmRzIG9uLgotCSAqIAotCSAqIEBhdXRob3Iga2FyYXNpdWsKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBlbmRzIHsKLQotCQkvKiogVGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgZGVwZW5kZWQgb24sIGZvciBleGFtcGxlIGEueHNkICovCi0JCXByaXZhdGUgSVJlc291cmNlIF9kZXBlbmRzT247Ci0KLQkJLyoqIFRoZSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCwgZm9yIGV4YW1wbGUgYS54bWwgKi8KLQkJcHJpdmF0ZSBJUmVzb3VyY2UgX2RlcGVuZGVudDsKLQotCQkvKiogVGhlIGlkJ3Mgb2YgdGhlIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGFzc2VydGVkIHRoZSBkZXBlbmRlbmN5LiAqLwotCQlwcml2YXRlIFNldDxTdHJpbmc+IF92YWxpZGF0b3JzOwotCi0JCXB1YmxpYyBEZXBlbmRzKElSZXNvdXJjZSBkZXBlbmRlbnQsIElSZXNvdXJjZSBkZXBlbmRzT24pIHsKLQkJCV9kZXBlbmRlbnQgPSBkZXBlbmRlbnQ7Ci0JCQlfZGVwZW5kc09uID0gZGVwZW5kc09uOwotCQkJX3ZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBpZCB3YXMgZGVsZXRlZC4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGRlbGV0ZShTdHJpbmcgaWQpIHsKLQkJCXJldHVybiBfdmFsaWRhdG9ycy5yZW1vdmUoaWQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERlbGV0ZSBhbGwgdGhlIGRlcGVuZGVuY3kgYXNzZXJ0aW9ucyBmb3IgYWxsIG9mIHlvdXIgdmFsaWRhdG9ycy4KLQkJICogQHJldHVybiBmYWxzZSBpZiB0aGVyZSB3YXMgbm90aGluZyB0byBkZWxldGUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGRlbGV0ZSgpIHsKLQkJCWJvb2xlYW4gZGVsZXRlZCA9IF92YWxpZGF0b3JzLnNpemUoKSA+IDA7Ci0JCQlpZiAoZGVsZXRlZClfdmFsaWRhdG9ycy5jbGVhcigpOwotCQkJcmV0dXJuIGRlbGV0ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgSVJlc291cmNlIGdldERlcGVuZHNPbigpIHsKLQkJCXJldHVybiBfZGVwZW5kc09uOwotCQl9Ci0KLQkJcHVibGljIElSZXNvdXJjZSBnZXREZXBlbmRlbnQoKSB7Ci0JCQlyZXR1cm4gX2RlcGVuZGVudDsKLQkJfQotCi0JCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRWYWxpZGF0b3JzKCkgewotCQkJcmV0dXJuIF92YWxpZGF0b3JzOwotCQl9Ci19Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBlbmRzUmVzb2x2ZWQgewotCQlTdHJpbmcgCQlyZXNvdXJjZTsKLQkJU2V0PFN0cmluZz4gdmFsaWRhdG9yczsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGVzZXJpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZXNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhZjk2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZXNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotLyoqCi0gKiBBIHNpbXBsZSBkZXNlcmlhbGl6ZXIgdGhhdCBrbm93cyBob3cgdG8gcmV0cmlldmUgYm9vbGVhbnMsIGludGVnZXJzIGFuZCBzdHJpbmdzLCBmcm9tIGEgc3RyaW5nCi0gKiB0aGF0IHdhcyBlbmNvZGVkIGJ5IHRoZSBTZXJpYWxpemVyIGNsYXNzLgotICogCi0gKiAgQHNlZSBTZXJpYWxpemVyCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVzZXJpYWxpemVyIHsKLQlwcml2YXRlIGNoYXJbXSAJX2J1ZmZlcjsKLQlwcml2YXRlIGludAkJX3Bvc247Ci0JCi0JcHVibGljIERlc2VyaWFsaXplcihTdHJpbmcgdmFsdWUpewotCQlfYnVmZmVyID0gdmFsdWUudG9DaGFyQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigpewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoX2J1ZmZlcltfcG9zbl0gPT0gJ1QnKXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKF9idWZmZXJbX3Bvc25dID09ICdGJylyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFZhbE1lc3NhZ2VzLkRlY29kZUVycm9yMSk7Ci0JCQotCQlfcG9zbisrOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpewotCQlpbnQgbGVuID0gZ2V0SW50KCk7Ci0JCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKF9idWZmZXIsIF9wb3NuLCBsZW4pOwotCQlfcG9zbiArPSBsZW47Ci0JCXJldHVybiByZXN1bHQ7CQkKLQl9Ci0JCi0JcHVibGljIGludCBnZXRJbnQoKXsKLQkJSW50ZWdlciBsZW4gPSBuZXcgSW50ZWdlcihTdHJpbmcudmFsdWVPZihfYnVmZmVyW19wb3NuXSkpOwotCQlfcG9zbisrOwotCQkKLQkJU3RyaW5nIHMgPSBTdHJpbmcudmFsdWVPZihfYnVmZmVyLCBfcG9zbiwgbGVuKzEpOwotCQlfcG9zbiArPSBsZW4rMTsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQocyk7Ci0JfQotCi0JLyoqCi0JICogQXJlIHRoZXJlIGFueSBtb3JlIGl0ZW1zPwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlpZiAoX3Bvc24gPj0gX2J1ZmZlci5sZW5ndGgpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EaXNhYmxlZFJlc291cmNlTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGlzYWJsZWRSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwMTgwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EaXNhYmxlZFJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFZhbGlkYXRvcnMgY2FuIGFzc2VydCB0aGF0IGNlcnRhaW4gcmVzb3VyY2VzICh1c3VhbGx5IGZvbGRlcnMpIGFyZSBub3QgdmFsaWRhdGVkLiBUaGlzIGNsYXNzIGtlZXBzIHRyYWNrIG9mIHRob3NlCi0gKiBhc3NlcnRpb25zLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIERpc2FibGVkUmVzb3VyY2VNYW5hZ2VyIGltcGxlbWVudHMgSVByb2plY3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCi0JcHVibGljIHN0YXRpYyBEaXNhYmxlZFJlc291cmNlTWFuYWdlciBnZXREZWZhdWx0KCl7Ci0JCXJldHVybiBTaW5nbGV0b24uZGlzYWJsZWRSZXNvdXJjZU1hbmFnZXI7Ci0JfQotCQotCXByaXZhdGUgU2V0PElSZXNvdXJjZT4gX2Rpc2FibGVkID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigxMDApOwotCXByaXZhdGUgU2V0PElQcm9qZWN0PglfbG9hZGVkUHJvamVjdHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdD4oNDApOwotCQotCXByaXZhdGUgRGlzYWJsZWRSZXNvdXJjZU1hbmFnZXIoKXsKLQkJRXZlbnRNYW5hZ2VyLmdldE1hbmFnZXIoKS5hZGRQcm9qZWN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc2FibGVWYWxpZGF0aW9uKElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCS8vIFdlIGNoZWNrIGZvciB0d28gcmVhc29ucywgMSkgd2UgbWF5IHNhdmUgc29tZSB3b3JrLCAyKSB3ZSBmb3JjZSB0aGUgcHJvamVjdCB0byBiZSBsb2FkZWQgCi0JCWlmIChpc0Rpc2FibGVkKHJlc291cmNlKSlyZXR1cm47Ci0JCQotCQlTZXQ8SVJlc291cmNlPiBjb3B5ID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPihfZGlzYWJsZWQuc2l6ZSgpKzIpOwotCQljb3B5LmFkZEFsbChfZGlzYWJsZWQpOwotCQljb3B5LmFkZChyZXNvdXJjZSk7Ci0JCXNhdmUoY29weSwgcmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJX2Rpc2FibGVkID0gY29weTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZW5hYmxlVmFsaWRhdGlvbihJUmVzb3VyY2UgcmVzb3VyY2UpewotCQkvLyBXZSBjaGVjayBmb3IgdHdvIHJlYXNvbnMsIDEpIHdlIG1heSBzYXZlIHNvbWUgd29yaywgMikgd2UgZm9yY2UgdGhlIHByb2plY3QgdG8gYmUgbG9hZGVkIAotCQlpZiAoIWlzRGlzYWJsZWQocmVzb3VyY2UpKXJldHVybjsKLQkJCi0JCVNldDxJUmVzb3VyY2U+IGNvcHkgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KF9kaXNhYmxlZC5zaXplKCkrMik7Ci0JCWNvcHkuYWRkQWxsKF9kaXNhYmxlZCk7Ci0JCWNvcHkucmVtb3ZlKHJlc291cmNlKTsKLQkJc2F2ZShjb3B5LCByZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQlfZGlzYWJsZWQgPSBjb3B5OwkJCi0JfQotCQkKLQlwcml2YXRlIHZvaWQgc2F2ZShTZXQ8SVJlc291cmNlPiBkaXNhYmxlZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlTZXJpYWxpemVyIHNlciA9IG5ldyBTZXJpYWxpemVyKDIwMCk7Ci0JCWZvciAoSVJlc291cmNlIHJlc291cmNlIDogZGlzYWJsZWQpewotCQkJaWYgKHByb2plY3QgPT0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpKXsKLQkJCQlzZXIucHV0KHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCVByZWZlcmVuY2VzV3JhcHBlciBwcmVmcyA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBudWxsKTsKLQkJcHJlZnMucHV0KFByZWZDb25zdGFudHMuZGlzYWJsZWQsIHNlci50b1N0cmluZygpKTsKLQkJdHJ5IHsKLQkJCXByZWZzLmZsdXNoKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkKElQcm9qZWN0IHByb2plY3QpewotCQlTZXQ8SVJlc291cmNlPiBjb3B5ID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPihfZGlzYWJsZWQuc2l6ZSgpKzEwKTsKLQkJY29weS5hZGRBbGwoX2Rpc2FibGVkKTsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWZzID0gUHJlZmVyZW5jZXNXcmFwcGVyLmdldFByZWZlcmVuY2VzKHByb2plY3QsIG51bGwpOwotCQlTdHJpbmcgZGlzYWJsZWQgPSBwcmVmcy5nZXQoUHJlZkNvbnN0YW50cy5kaXNhYmxlZCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkaXNhYmxlZC5sZW5ndGgoKSA+IDApewotCQkJRGVzZXJpYWxpemVyIGRlcyA9IG5ldyBEZXNlcmlhbGl6ZXIoZGlzYWJsZWQpOwotCQkJd2hpbGUoZGVzLmhhc05leHQoKSl7Ci0JCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBkZXMuZ2V0U3RyaW5nKCk7Ci0JCQkJSVBhdGggcGF0aCA9IFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKHBhdGhTdHJpbmcpOwotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHByb2plY3QuZmluZE1lbWJlcihwYXRoKTsKLQkJCQljb3B5LmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJX2Rpc2FibGVkID0gY29weTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCl7Ci0JCUV2ZW50TWFuYWdlci5nZXRNYW5hZ2VyKCkucmVtb3ZlUHJvamVjdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIHJlc291cmNlIHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBzaG91bGQgbm90IGJlIHZhbGlkYXRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVkKElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChfbG9hZGVkUHJvamVjdHMuY29udGFpbnMocHJvamVjdCkpcmV0dXJuIF9kaXNhYmxlZC5jb250YWlucyhyZXNvdXJjZSk7Ci0JCXJldHVybiBpc0Rpc2FibGVkKHJlc291cmNlLCBwcm9qZWN0KTsgCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Rpc2FibGVkKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2plY3QgcHJvamVjdCl7Ci0JCWlmICghX2xvYWRlZFByb2plY3RzLmNvbnRhaW5zKHByb2plY3QpKXsKLQkJCWxvYWQocHJvamVjdCk7Ci0JCQlfbG9hZGVkUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBfZGlzYWJsZWQuY29udGFpbnMocmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGREaXNhYmxlZChJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlfZGlzYWJsZWQuYWRkKHJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0Q2hhbmdlZChJUHJvamVjdCBwcm9qZWN0LCBpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBJUHJvamVjdENoYW5nZUxpc3RlbmVyLlByb2plY3REZWxldGVkOgotCQljYXNlIElQcm9qZWN0Q2hhbmdlTGlzdGVuZXIuUHJvamVjdENsb3NlZDoKLQkJCXByb2plY3RSZW1vdmVkKHByb2plY3QpOwotCQkJYnJlYWs7Ci0JCQkKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBwcm9qZWN0UmVtb3ZlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCV9sb2FkZWRQcm9qZWN0cy5yZW1vdmUocHJvamVjdCk7Ci0JCVNldDxJUmVzb3VyY2U+IGNvcHkgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KDEwMCk7Ci0JCWZvciAoSVJlc291cmNlIHJlc291cmNlIDogX2Rpc2FibGVkKXsKLQkJCWlmIChyZXNvdXJjZS5nZXRQcm9qZWN0KCkgIT0gcHJvamVjdCljb3B5LmFkZChyZXNvdXJjZSk7Ci0JCX0KLQkJX2Rpc2FibGVkID0gY29weTsKLQl9Ci0JCi0JLyoqCi0JICogU3RvcmUgdGhlIHNpbmdsZXRvbiBmb3IgdGhlIERpc2FibGVkUmVzb3VyY2VNYW5hZ2VyLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIHRvIHN5bmNocm9uaXplIHRoZQotCSAqIERpc2FibGVkUmVzb3VyY2VNYW5hZ2VyLmdldERlZmF1bHQoKSBtZXRob2QuCi0JICogCi0JICogQGF1dGhvciBrYXJhc2l1awotCSAqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2luZ2xldG9uIHsKLQkJc3RhdGljIERpc2FibGVkUmVzb3VyY2VNYW5hZ2VyIGRpc2FibGVkUmVzb3VyY2VNYW5hZ2VyID0gbmV3IERpc2FibGVkUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0Rpc2FibGVkVmFsaWRhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGlzYWJsZWRWYWxpZGF0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMTQxYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGlzYWJsZWRWYWxpZGF0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuSVZhbGlkYXRvclZpc2l0b3I7Ci0KLS8qKgotICogS2VlcCB0cmFjayBvZiB0aGUgZGlzYWJsZWQgdmFsaWRhdG9ycy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaXNhYmxlZFZhbGlkYXRvck1hbmFnZXIgaW1wbGVtZW50cyBJVmFsQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIF9jb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ2FjaGVTaXplID0gNTsKLQkKLQlwcml2YXRlIGZpbmFsIE1hcDxJUmVzb3VyY2UsIExSVVNldD4gX21hcCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxJUmVzb3VyY2UsIExSVVNldD4oNSkpOwotCQotCXB1YmxpYyBzdGF0aWMgRGlzYWJsZWRWYWxpZGF0b3JNYW5hZ2VyIGdldERlZmF1bHQoKXsKLQkJcmV0dXJuIFNpbmdsZXRvbi5kaXNhYmxlZFZhbGlkYXRvck1hbmFnZXI7Ci0JfQotCQotCXByaXZhdGUgRGlzYWJsZWRWYWxpZGF0b3JNYW5hZ2VyKCl7Ci0JCVZhbFByZWZNYW5hZ2VyUHJvamVjdC5hZGRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyoKLQkgKiBBbHRob3VnaCB0aGlzIGlzIGN1cnJlbnRseSBub3QgY2FsbGVkLCBpdCBzaG91bGQgYmUgaWYgdGhpcyBldmVyIHN0b3BzIGJlaW5nIGEgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXsKLQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTZXQ8VmFsaWRhdG9yPiBnZXREaXNhYmxlZFZhbGlkYXRvcnNGb3IoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUxSVVNldCBzZXQgPSBfbWFwLmdldChyZXNvdXJjZSk7Ci0JCWlmIChzZXQgIT0gbnVsbCl7Ci0JCQlzZXQuY291bnRlciA9IF9jb3VudGVyLmdldEFuZEluY3JlbWVudCgpOwotCQkJcmV0dXJuIHNldC52YWxpZGF0b3JzOwotCQl9Ci0JCQotCQlEaXNhYmxlZFZhbGlkYXRpb25GaW5kZXIgZHZmID0gbmV3IERpc2FibGVkVmFsaWRhdGlvbkZpbmRlcigpOwotCQlTZXQ8VmFsaWRhdG9yPiB2c2V0ID0gZHZmLmZpbmREaXNhYmxlZFZhbGlkYXRvcnNGb3IocmVzb3VyY2UpOwotCQlpbnNlcnQocmVzb3VyY2UsIHZzZXQpOwotCQlyZXR1cm4gdnNldDsJCQotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluc2VydChJUmVzb3VyY2UgcmVzb3VyY2UsIFNldDxWYWxpZGF0b3I+IHZzZXQpIHsKLQkJaWYgKF9tYXAuc2l6ZSgpID49IENhY2hlU2l6ZSApewotCQkJSVJlc291cmNlIG9sZGVzdCA9IG51bGw7Ci0JCQlpbnQgY3VycmVudCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJZm9yIChNYXAuRW50cnk8SVJlc291cmNlLCBMUlVTZXQ+IG1lIDogX21hcC5lbnRyeVNldCgpKXsKLQkJCQlpZiAobWUuZ2V0VmFsdWUoKS5jb3VudGVyIDwgY3VycmVudCl7Ci0JCQkJCW9sZGVzdCA9IG1lLmdldEtleSgpOwotCQkJCQljdXJyZW50ID0gbWUuZ2V0VmFsdWUoKS5jb3VudGVyOwotCQkJCX0KLQkJCX0KLQkJCV9tYXAucmVtb3ZlKG9sZGVzdCk7Ci0JCX0KLQkJTFJVU2V0IHNldCA9IG5ldyBMUlVTZXQoKTsKLQkJc2V0LmNvdW50ZXIgPSBfY291bnRlci5nZXRBbmRJbmNyZW1lbnQoKTsKLQkJc2V0LnZhbGlkYXRvcnMgPSB2c2V0OwotCQlfbWFwLnB1dChyZXNvdXJjZSwgc2V0KTsJCQotCX0KLQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgTFJVU2V0IHsKLQkJaW50IGNvdW50ZXI7Ci0JCVNldDxWYWxpZGF0b3I+IHZhbGlkYXRvcnM7Ci0JfQotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIERpc2FibGVkVmFsaWRhdGlvbkZpbmRlciBpbXBsZW1lbnRzIElWYWxpZGF0b3JWaXNpdG9yIHsKLQkJCi0JCXByaXZhdGUgTWFwPFN0cmluZywgVmFsaWRhdG9yPiBfdmFsaWRhdG9yczsKLQotCQlwdWJsaWMgdm9pZCB2aXNpdChWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxUeXBlIHZhbFR5cGUsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sCi0JCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkKLQkJCV92YWxpZGF0b3JzLnJlbW92ZSh2YWxpZGF0b3IuZ2V0SWQoKSk7Ci0JCQkKLQkJfQotCQkKLQkJcHVibGljIFNldDxWYWxpZGF0b3I+IGZpbmREaXNhYmxlZFZhbGlkYXRvcnNGb3IoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlWYWxNYW5hZ2VyIHZtID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCk7Ci0JCQlWYWxpZGF0b3JbXSB2YWxzID0gdm0uZ2V0VmFsaWRhdG9yc0NvcHkoKTsKLQkJCV92YWxpZGF0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWxpZGF0b3I+KDEwMCk7Ci0JCQlmb3IgKFZhbGlkYXRvciB2IDogdmFscylfdmFsaWRhdG9ycy5wdXQodi5nZXRJZCgpLCB2KTsKLQkJCQkJCQotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCXZtLmFjY2VwdCh0aGlzLCBwcm9qZWN0LCByZXNvdXJjZSwgVmFsVHlwZS5CdWlsZCwgbmV3IFZhbE9wZXJhdGlvbigpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCVNldDxWYWxpZGF0b3I+IHNldCA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvcj4oX3ZhbGlkYXRvcnMuc2l6ZSgpKTsKLQkJCXNldC5hZGRBbGwoX3ZhbGlkYXRvcnMudmFsdWVzKCkpOwotCQkJcmV0dXJuIHNldDsKLQkJfQotCQkKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdG9yc0ZvclByb2plY3RDaGFuZ2VkKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gY29uZmlnU2V0dGluZ0NoYW5nZWQpIHsKLQkJX21hcC5jbGVhcigpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBTdG9yZSB0aGUgc2luZ2xldG9uIGZvciB0aGUgRGlzYWJsZWRWYWxpZGF0b3JNYW5hZ2VyLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIHRvIHN5bmNocm9uaXplIHRoZQotCSAqIERpc2FibGVkVmFsaWRhdG9yTWFuYWdlci5nZXREZWZhdWx0KCkgbWV0aG9kLgotCSAqIAotCSAqIEBhdXRob3Iga2FyYXNpdWsKLQkgKgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIFNpbmdsZXRvbiB7Ci0JCWZpbmFsIHN0YXRpYyBEaXNhYmxlZFZhbGlkYXRvck1hbmFnZXIgZGlzYWJsZWRWYWxpZGF0b3JNYW5hZ2VyID0gbmV3IERpc2FibGVkVmFsaWRhdG9yTWFuYWdlcigpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9FeHRlbnNpb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V4dGVuc2lvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzAyNDcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V4dGVuc2lvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50cy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uQ29uc3RhbnRzIHsKLQkKLQkvKiogdmFsaWRhdG9yVjIgLSBleHRlbnNpb24gcG9pbnQgZm9yIHJlZ2lzdGVyaW5nIHZhbGlkYXRvcnMgdGhhdCB1c2UgdmVyc2lvbiAyIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gKi8KLQlTdHJpbmcgdmFsaWRhdG9yID0gInZhbGlkYXRvclYyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBleGNsdWRlIC0gZXh0ZW5zaW9uIHBvaW50IGZvciBhZGRpbmcgZXh0cmEgZXhjbHVzaW9uIGZpbHRlcnMgdG8gYSB2YWxpZGF0b3IuICovIAotCVN0cmluZyBleGNsdWRlRXh0ZW5zaW9uID0gImV4Y2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGJ1aWxkIC0gaXMgdGhlIHZhbGlkYXRvciBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIGJ1aWxkIGJhc2VkIHZhbGlkYXRpb25zPyB0cnVlIG9yIGZhbHNlICovCi0JU3RyaW5nIGJ1aWxkID0gImJ1aWxkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBjbGFzcyAtIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGhvbGRzIHRoZSB2YWxpZGF0b3IgY2xhc3MuICovCi0JU3RyaW5nIEF0dHJpYkNsYXNzID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBtYW51YWwgLSBpcyB0aGUgdmFsaWRhdG9yIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgbWFudWFsIGJhc2VkIHZhbGlkYXRpb25zPyB0cnVlIG9yIGZhbHNlICovCi0JU3RyaW5nIG1hbnVhbCA9ICJtYW51YWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIG1hcmtlcklkIC0gdGhlIG1hcmtlciBpZCB0aGF0IHRoZSBmcmFtZXdvcmsgc2hvdWxkIHVzZSB3aGVuIGNyZWF0aW5nIGN1c3RvbWl6ZWQgbWFya2VycyBmb3IgdGhpcyB2YWxpZGF0b3IuCi0JICogVGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUuIElmIGl0IGlzIG5vdCBzdXBwbGllZCB0aGFuIHRoZSBzdGFuZGFyZCB2YWxpZGF0aW9uIG1hcmtlciB0eXBlIHdpbGwgYmUgdXNlZC4KLQkgKi8KLQlTdHJpbmcgbWFya2VySWQgPSAibWFya2VySWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIAotCSAqIHNvdXJjZWlkIC0gSWYgdGhpcyB2YWxpZGF0b3IgYWxzbyBzZXJ2ZXMgYXMgYW4gYXMteW91LXR5cGUgdmFsaWRhdG9yIChhbHNvIGtub3cgYXMgYW4gSVNvdXJjZVZhbGlkYXRvcikgCi0JICogdGhlbiBpdCdzIHNvdXJjZSBpZCBpcyBzcGVjaWZpZWQgaGVyZSwgc28gdGhhdCB0aGUgdHdvIHZhbGlkYXRvcnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmUgCi0JICogYW5vdGhlci4gQnkgc291cmNlIGlkLCB3ZSBtZWFuIHRoZSBpZCB0aGF0IGlzIHVzZWQgaW4gdGhlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNlVmFsaWRhdGlvbiAKLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JU3RyaW5nIHNvdXJjZUlkID0gInNvdXJjZWlkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAKLQkgKiB2ZXJzaW9uIC0gdGhlIHZlcnNpb24gb2YgdGhpcyBkZWZpbml0aW9uLiBUaGUgYXR0cmlidXRlIGlzIGEgc2ltcGxlIGludGVnZXIsIGFuZCBpZiBub3Qgc3BlY2lmaWVkIGl0Ci0JICogaXMgYXNzdW1lZCB0byBiZSAxLiBUaGlzIGFsbG93cyB0aGUgZmlsdGVyIHNldHRpbmdzIHRvIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlTdHJpbmcgdmVyc2lvbiA9ICJ2ZXJzaW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogCi0JICogaW5jbHVkZSAtIGEgZ3JvdXAgb2YgaW5jbHVzaW9uIHJ1bGVzLiBBdCBsZWFzdCBvbmUgcnVsZSBpbiB0aGlzIGdyb3VwIG5lZWRzIHRvIG1hdGNoIGluIG9yZGVyIGZvciB0aGUgcmVzb3VyY2UKLQkgKiB0byB0byBjb25zaWRlcmVkIHRvIGJlIHZhbGlkYXRlZC4KLQkgKi8KLQlTdHJpbmcgaW5jbHVkZSA9ICJpbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBleGNsdWRlIC0gYSBncm91cCBvZiBleGNsdXNpb24gcnVsZXMuIElmIGFueSBvZiB0aGVzZSBydWxlcyBtYXRjaCB0aGUgcmVzb3VyY2UgaXMgbm90IHZhbGlkYXRlZC4gKi8KLQlTdHJpbmcgZXhjbHVkZSA9ICJleGNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBydWxlcyAtIGEgZ3JvdXAgb2YgaW5jbHVzaW9uIG9yIGV4Y2x1c2lvbiBydWxlcy4gKi8KLQlTdHJpbmcgcnVsZXMgPSAicnVsZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHJ1bGVzIC0gZXh0ZW5zaW9uIHBvaW50IHRvIGRlY2xhcmUgYSB2YWxpZGF0b3IgZ3JvdXAgKi8KLQlTdHJpbmcgZ3JvdXAgPSAidmFsaWRhdG9yR3JvdXAiOyAvLyROT04tTkxTLTEkCi0JCi0JaW50ZXJmYWNlIEdyb3VwIHsKLQkJLyoKLQkJICogVGhlIGdyb3VwIHN1Yi1lbGVtZW50IGZvciBlaXRoZXIgdGhlIHZhbGlkYXRvckdyb3VwIG9yIHZhbGlkYXRvcgotCQkgKiBleHRlbnNpb24gcG9pbnRzLgotCQkgKi8KLQkJU3RyaW5nIGVsZW1lbnRHcm91cCA9ICJncm91cCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYSB2YWxpZGF0b3IgZ3JvdXAgaWRlbnRpZmllcgotCQlTdHJpbmcgYXR0SWQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JCS8vIHRoZSBsaXN0ZW5lciBzdWItZWxlbWVudAotCQlTdHJpbmcgZWxlbWVudExpc3RlbmVyID0gImxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyB0aGUgZ3JvdXAgbGlzdGVuZXIgY2xhc3MgbmFtZQotCQlTdHJpbmcgYXR0Q2xhc3MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKiBEaWZmZXJlbnQgdHlwZXMgb2YgcnVsZXMgZm9yIGZpbHRlcmluZyB2YWxpZGF0aW9uLiAqLwotCWludGVyZmFjZSBSdWxlIHsKLQkJCi0JCS8qKiBwcm9qZWN0TmF0dXJlIC0gZmlsdGVyIGJ5IHByb2plY3QgbmF0dXJlLiAqLwotCQlTdHJpbmcgcHJvamVjdE5hdHVyZSA9ICJwcm9qZWN0TmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoqIGZpbGVleHQgLSBmaWx0ZXIgYnkgZmlsZSBleHRlbnNpb24uICovCi0JCVN0cmluZyBmaWxlZXh0ID0gImZpbGVleHQiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogZmlsZSAtIGEgZmlsZSBuYW1lLCBpdCBjYW4gaW5jbHVkZSBwYXRoIGluZm9ybWF0aW9uIGFzIHdlbGwuICovCi0JCVN0cmluZyBmaWxlID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogZmFjZXQgLSBmaWx0ZXIgYnkgZmFjZXQgaWQuICovCi0JCVN0cmluZyBmYWNldCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBjb250ZW50VHlwZSAtIGZpbHRlciBieSBjb250ZW50IHR5cGUuICovCi0JCVN0cmluZyBjb250ZW50VHlwZSA9ICJjb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBwYXR0ZXJuIC0gZmlsdGVyIHBhdGhzIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbi4gKi8KLQkJU3RyaW5nIHBhdHRlcm4gPSAicGF0dGVybiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqIFJ1bGUgYXR0cmlidXRlcyAqLwotCWludGVyZmFjZSBSdWxlQXR0cmliIHsKLQkJCi0JCS8qKiBjYXNlU2Vuc2l0aXZlIC0gdHJ1ZSBvciBmYWxzZS4gKi8KLQkJU3RyaW5nIGNhc2VTZW5zaXRpdmUgPSAiY2FzZVNlbnNpdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiAKLQkJICogZXhhY3RNYXRjaCAtIHRydWUgb3IgZmFsc2UsIGRlZmF1bHQgaXMgdHJ1ZS4gSXQgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciBjb250ZW50IHR5cGVzIG5lZWQgdG8gbWF0Y2gKLQkJICogZXhhY3RseSwgb3Igd2hldGhlciBzdWIgdHlwZXMgc2hvdWxkIGFsc28gYmUgY29uc2lkZXJlZC4KLQkJICovCi0JCVN0cmluZyBleGFjdE1hdGNoID0gImV4YWN0TWF0Y2giOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogZXh0IC0gYSBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgImh0bWwiLiAqLwotCQlTdHJpbmcgZXh0ID0gImV4dCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBpZCAtIGFuIGlkZW50aWZpZXIuICovCi0JCVN0cmluZyBpZCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBuYW1lIC0gYSBmaWxlIG5hbWUuICovCi0JCVN0cmluZyBuYW1lID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogcmVnZXggLSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLiAqLwotCQlTdHJpbmcgcmVnZXggPSAicmVnZXgiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogCi0JCSAqIHR5cGUgLSB0aGUgdHlwZSBvZiBmaWxlIHRvIGJlIG1hdGNoZWQ6Ci0JCSAqIDx1bD4KLQkJICogPGxpPmZvbGRlciAtIHByb2plY3QgcmVsYXRpdmUgZm9sZGVyIG5hbWUKLQkJICogPGxpPmZpbGUgLSBzaW1wbGUgZmlsZSBuYW1lCi0JCSAqIDxsaT5mdWxsIC0gZnVsbHkgcXVhbGlmaWVkLCBwcm9qZWN0IHJlbGF0aXZlIGZpbGUgbmFtZQotCQkgKiA8L3VsPgotCQkgKi8KLQkJU3RyaW5nIGZpbGVUeXBlID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogdmVyc2lvbiAtIGZhY2V0IHZlcnNpb24gZXhwcmVzc2lvbi4gU2VlIHRoZSBmYWNldCBmcmFtZXdvcmsgZm9yIHRoZSBleGFjdCBzeW50YXggb2YgdGhpcyBleHByZXNzaW9uLiAqLwotCQlTdHJpbmcgdmVyc2lvbiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlpbnRlcmZhY2UgRmlsZVR5cGUgewotCQkvKiogZm9sZGVyIC0gcHJvamVjdCByZWxhdGl2ZSBmb2xkZXIgbmFtZSAqLwotCQlTdHJpbmcgZm9sZGVyID0gImZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBmaWxlIC0gc2ltcGxlIGZpbGUgbmFtZSAqLwotCQlTdHJpbmcgZmlsZSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyoqIGZ1bGwgLSBmdWxseSBxdWFsaWZpZWQsIHByb2plY3QgcmVsYXRpdmUgZmlsZSBuYW1lICovCi0JCVN0cmluZyBmdWxsID0gImZ1bGwiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCWludGVyZmFjZSBNZXNzYWdlQ2F0ZWdvcnkgewotCQkvKiogbWVzc2FnZUNhdGVnb3J5IC0gbmFtZSBvZiB0aGUgbWVzc2FnZSBjYXRlZ29yeSBlbGVtZW50LiAqLwotCQlTdHJpbmcgbmFtZSA9ICJtZXNzYWdlQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogaWQgLSBzaW1wbGUgaWQgb2YgdGhlIG1lc3NhZ2UuICovCi0JCVN0cmluZyBpZCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKiBsYWJlbCA9IGh1bWFuIHJlYWRhYmxlIGxhYmVsIG9mIHRoZSBtZXNzYWdlIGNhdGVnb3J5LiAqLwotCQlTdHJpbmcgbGFiZWwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKiogc2V2ZXJpdHkgLSBtZXNzYWdlIHNldmVyaXR5LCBpdCBtdXN0IGJlIG9uZSBvZiBlcnJvciwgd2FybmluZyBvciBpZ25vcmUuICovCi0JCVN0cmluZyBzZXZlcml0eSA9ICJzZXZlcml0eSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBzZXZFcnJvciA9ICJlcnJvciI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNldldhcm5pbmcgPSAid2FybmluZyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNldklnbm9yZSA9ICJpZ25vcmUiOyAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlpbnRlcmZhY2UgRXhjbHVkZSB7Ci0JCS8qKiBpZCAtIGZ1bGx5IHF1YWxpZmllZCBpZCBvZiB0aGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgZXh0ZW5kZWQuICovCi0JCVN0cmluZyBpZCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqIHRydWUgKi8KLQlTdHJpbmcgVHJ1ZSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBmYWxzZSAqLwotCVN0cmluZyBGYWxzZSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V4dGVuc2lvblZhbGlkYXRvcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V4dGVuc2lvblZhbGlkYXRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkwZjRhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9FeHRlbnNpb25WYWxpZGF0b3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIFRoZSB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYnkgdGhlIHZhbGlkYXRvciBleHRlbnNpb24gcG9pbnRzLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvblZhbGlkYXRvcnMgewotCXByaXZhdGUgc3RhdGljIEV4dGVuc2lvblZhbGlkYXRvcnMgX21lOwotCQotCS8qKiBBbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycy4gVGhlIGtleSBpcyB0aGUgdmFsaWRhdG9yIGlkIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHZhbGlkYXRvci4gKi8KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4gX21hcDsKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBFeHRlbnNpb25WYWxpZGF0b3JzIGluc3RhbmNlKCl7Ci0JCWlmIChfbWUgPT0gbnVsbCl7Ci0JCQlfbWUgPSBuZXcgRXh0ZW5zaW9uVmFsaWRhdG9ycygpOwotCQl9Ci0JCXJldHVybiBfbWU7Ci0JfQotCi0JcHJpdmF0ZSBFeHRlbnNpb25WYWxpZGF0b3JzKCl7Ci0JCV9tYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4oMTAwKTsKLQkJZm9yIChWYWxpZGF0b3IgdiA6IFZhbGlkYXRvckV4dGVuc2lvblJlYWRlci5nZXREZWZhdWx0KCkucHJvY2VzcygpKXsKLQkJCV9tYXAucHV0KHYuZ2V0SWQoKSwgdik7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSB2MiB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYnkgdGhlIGV4dGVuc2lvbiBwb2ludC4gVGhpcyBpcyB0aGUgcmVhbAotCSAqIG1hcCAobm90IGEgY29weSkuCi0JICogCi0JICogQHJldHVybiBUaGUga2V5IGlzIHRoZSB2YWxpZGF0b3IgaWQgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBWYWxpZGF0b3I+IGdldE1hcFYyKCkgewotCQlyZXR1cm4gX21hcDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSB2MiB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYnkgdGhlIGV4dGVuc2lvbiBwb2ludC4gVGhpcyBpcyBhIGNvcHkgb2YKLQkgKiB0aGUgbWFwLCBidXQgbm90IGEgY29weSBvZiB0aGUgdmFsaWRhdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBrZXkgaXMgdGhlIHZhbGlkYXRvciBpZCBhbmQgdGhlIHZhbHVlIGlzIHRoZSB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4gZ2V0TWFwVjJDb3B5KCkgewotCQlIYXNoTWFwPFN0cmluZywgVmFsaWRhdG9yPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4oX21hcC5zaXplKCkpOwotCQltYXAucHV0QWxsKF9tYXApOwotCQlyZXR1cm4gbWFwOwotCX0KLQkKLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYnkgZXh0ZW5zaW9uIHBvaW50cy4gVGhpcyBpbmNsdWRlcyBhbGwKLQkgKiB0aGUgdjIgdmFsaWRhdG9ycywgYW5kIGFsbCBvZiB0aGUgdjEgdmFsaWRhdG9ycyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGp1c3Qgb24gdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGtleSBpcyB0aGUgdmFsaWRhdG9yIGlkIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgVmFsaWRhdG9yPiBnZXRNYXAoSVByb2plY3QgcHJvamVjdCkgewotCQkvL1RPRE8gSSBtYXkgd2FudCB0byBjb25zaWRlciBjYWNoaW5nIHRoaXMsIGJ1dCB0aGVuIGFnYWluIGlmIHRoZSB2MSB2YWxpZGF0b3JzIGFyZSBnb2luZyBhd2F5Ci0JCS8vIGl0IG1heSBub3QgYmUgd29ydGggaXQuCi0JCU1hcDxTdHJpbmcsIFZhbGlkYXRvcj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWxpZGF0b3I+KCk7Ci0JCW1hcC5wdXRBbGwoX21hcCk7Ci0JCQotCQlmb3IgKFZhbGlkYXRvciB2IDogZ2V0VjFWYWxpZGF0b3JzKHByb2plY3QpKW1hcC5wdXQodi5nZXRJZCgpLCB2KTsKLQkJCi0JCXJldHVybiBtYXA7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgdjEgdmFsaWRhdG9ycyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGp1c3Qgb24gdGhpcyBwcm9qZWN0LgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCUxpc3Q8VmFsaWRhdG9yPiBnZXRWMVZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCl7Ci0JCUxpc3Q8VmFsaWRhdG9yPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yPigpOwotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcGMgPSBuZXcgUHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlwYy5yZXNldFRvRGVmYXVsdCgpOwotCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBwYy5nZXRWYWxpZGF0b3JzKCkpewotCQkJCVZhbGlkYXRvciB2ID0gVmFsaWRhdG9yLmNyZWF0ZSh2bWQsIHBjLCBwcm9qZWN0KTsKLQkJCQlsaXN0LmFkZCh2KTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9GdWxsQnVpbGRKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0Z1bGxCdWlsZEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzJhMmM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0Z1bGxCdWlsZEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRnVsbEJ1aWxkSm9iIGV4dGVuZHMgV29ya3NwYWNlSm9iIHsKLQkKLQlwdWJsaWMgRnVsbEJ1aWxkSm9iKCl7Ci0JCXN1cGVyKFZhbE1lc3NhZ2VzLkpvYk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbW9uaXRvcik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQsIGUudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JUHJvamVjdENoYW5nZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JUHJvamVjdENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ODg1MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVByb2plY3RDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogQSBjYWxsIGJhY2sgZm9yIGxpc3RlbmVycyB0aGF0IGFyZSBpbnRlcmVzdGVkIHdoZW4gYSBwcm9qZWN0IGNoYW5nZXMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0Q2hhbmdlTGlzdGVuZXIgewotCQotCWludCBQcm9qZWN0T3BlbmVkID0gMTsKLQlpbnQgUHJvamVjdENsb3NlZCA9IDI7Ci0JaW50IFByb2plY3REZWxldGVkID0gNDsKLQkKLQkvKiogOCAtIFNvbWV0aGluZyBpbiB0aGUgcHJvamVjdCBkZXNjcmlwdGlvbiBoYXMgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgTmF0dXJlIHdhcyBhZGRlZC4gKi8KLQlpbnQgUHJvamVjdENoYW5nZWQgPSA4OwotCQotCS8qKiAxNiAtIFRoZSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkLiAqLwotCWludCBQcm9qZWN0QWRkZWQgPSAxNjsKLQkKLQkvKioKLQkgKiBUaGUgcHJvamVjdCBoYXMgY2hhbmdlZCBpbiBzb21lIHdheS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0aGF0IGhhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIGNoYW5nZS4gVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgUHJvamVjdCBjb25zdGFudHM7Ci0JICovCi0Jdm9pZCBwcm9qZWN0Q2hhbmdlZChJUHJvamVjdCBwcm9qZWN0LCBpbnQgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDI2ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbENoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0vKioKLSAqIEEgY2xhc3MgdGhhdCB3YW50cyB0byBiZSBub3RpZmllZCB3aGVuIHRoZSB2YWxpZGF0b3IgcHJlZmVyZW5jZXMgY2hhbmdlLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQkvKioKLQkgKiBUaGUgdmFsaWRhdG9ycyBmb3IgdGhlIHByb2plY3QgaGF2ZSBjaGFuZ2VkLgotCSAqICAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBjYW4gYmUgbnVsbCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgaGF2ZQotCSAqIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ1NldHRpbmdDaGFuZ2VkIElmIHRydWUgYSBzZXR0aW5nIHRoYXQgY291bGQgZWZmZWN0IHdoYXQgZ2V0cyB2YWxpZGF0ZWQgaGFzIGNoYW5nZWQuCi0JICogSWYgZmFsc2UsIHRoZW4gb25seSBvdGhlciB0eXBlcyBvZiBzZXR0aW5ncyAobGlrZSB3aGV0aGVyIHRvIHNob3cgYSByZXN1bHRzIGRpYWxvZyBvciBub3QpIGhhdmUKLQkgKiBjaGFuZ2VkLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0b3JzRm9yUHJvamVjdENoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBjb25maWdTZXR0aW5nQ2hhbmdlZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9NYXJrZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9NYXJrZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzY1MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWFya2VyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogQSBjZW50cmFsIHBsYWNlIHRvIG1hbmFnZSBhbGwgb2YgdGhlIFYyIHZhbGlkYXRpb24gbWFya2Vycy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJNYW5hZ2VyIHsKLQkKLQlwcml2YXRlIFNldDxTdHJpbmc+IF9tYXJrZXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPig1MCk7Ci0JCi0JcHVibGljIHN0YXRpYyBNYXJrZXJNYW5hZ2VyIGdldERlZmF1bHQoKXsKLQkJcmV0dXJuIFNpbmdsZXRvbi5tYXJrZXJNYW5hZ2VyOwotCX0KLQkKLQlwcml2YXRlIE1hcmtlck1hbmFnZXIoKXsKLQkJX21hcmtlcnMuYWRkKFZhbENvbnN0YW50cy5Qcm9ibGVtTWFya2VyKTsKLQkJX21hcmtlcnMuYWRkKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkFMSURBVElPTl9NQVJLRVIpOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhciBhbnkgdmFsaWRhdGlvbiBtYXJrZXJzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgdGhpcyB2YWxpZGF0b3IuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdGhhdCBtYXkgaGF2ZSBpdCdzIG1hcmtlcnMgY2xlYXJlZC4gSXQgY2FuIGJlCi0JICogICAgICAgICAgICBudWxsLCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICBUaGUgdmFsaWRhdG9yIHRoYXQgY3JlYXRlZCB0aGUgbWFya2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyTWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgVmFsaWRhdG9yIHZhbGlkYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbClyZXR1cm47Ci0JCWhvb2socmVzb3VyY2UpOwotCQkKLQkJU3RyaW5nIGlkID0gdmFsaWRhdG9yLmdldE1hcmtlcklkKCk7Ci0JCWlmIChpZCAhPSBudWxsKXsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UuZGVsZXRlTWFya2VycyhpZCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkJLy8gTm90aGluZyB0aGF0IHdlIGNhbiBkby4gVGhpcyBpcyBub3Qgd29ydGggbG9nZ2luZy4KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkJCQotCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKFZhbENvbnN0YW50cy5Qcm9ibGVtTWFya2VyLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCVN0cmluZyB2YWxJZCA9IHZhbGlkYXRvci5nZXRJZCgpOwotCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2Vycyl7Ci0JCQlpZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVmFsaWRhdG9yTWVzc2FnZS5WYWxpZGF0aW9uSWQsIG51bGwpOwotCQkJaWYgKHZhbElkLmVxdWFscyhpZCkpbWFya2VyLmRlbGV0ZSgpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGNyZWF0ZU1hcmtlcihWYWxpZGF0b3JNZXNzYWdlIG0sIFN0cmluZyBpZCl7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBtLmdldFJlc291cmNlKCk7Ci0JCQlob29rKHJlc291cmNlKTsKLQkJCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKG0uZ2V0VHlwZSgpKTsKLQkJCU1hcCBtYXAgPSBtLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChtYXAuZ2V0KFZhbGlkYXRvck1lc3NhZ2UuVmFsaWRhdGlvbklkKSA9PSBudWxsKQotCQkJCW1hcC5wdXQoVmFsaWRhdG9yTWVzc2FnZS5WYWxpZGF0aW9uSWQsIGlkKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKG1hcCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlpZiAoIW0uZ2V0UmVzb3VyY2UoKS5leGlzdHMoKSl0aHJvdyBuZXcgUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yKG0uZ2V0UmVzb3VyY2UoKSk7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIGFsbCB0aGUgbWFya2VycyBvbiB0aGlzIHJlc291cmNlIHRoYXQgd2VyZSBjcmVhdGVkIGJlZm9yZSB0aGUKLQkgKiBvcGVyYXRpb24gc3RhcnQgdGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0aGF0IGlzIGhhdmluZyBpdCdzIG1hcmtlcnMgZGVsZXRlZC4KLQkgKiBAcGFyYW0gb3BlcmF0aW9uU3RhcnRUaW1lCi0JICogICAgICAgICAgICBUaGUgdGltZSBhcyByZXR1cm5lZCBieSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS4KLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiAgICAgICAgICAgIFRoZSBkZXB0aCBvZiB0aGUgbWFya2VycyB0byBjbGVhci4gSXQgaXMgb25lIG9mIHRoZQotCSAqICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX1hYWCBjb25zdGFudHMuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIGxvbmcgb3BlcmF0aW9uU3RhcnRUaW1lLCBpbnQgZGVwdGgpewotCQl0cnkgewotCQkJaG9vayhyZXNvdXJjZSk7IAotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhudWxsLCB0cnVlLCBkZXB0aCk7Ci0JCQlTdHJpbmcgbWFya2VyVHlwZTsKLQkJCWZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKXsKLQkJCQl0cnkgewotCQkJCQltYXJrZXJUeXBlID0gbWFya2VyLmdldFR5cGUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCS8vaWdub3JlIHRoZSBtYXJrZXIKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoX21hcmtlcnMuY29udGFpbnMobWFya2VyVHlwZSkpewotCQkJCQlsb25nIGNyZWF0ZVRpbWUgPSBtYXJrZXIuZ2V0Q3JlYXRpb25UaW1lKCk7Ci0JCQkJCWlmIChjcmVhdGVUaW1lIDwgb3BlcmF0aW9uU3RhcnRUaW1lKXsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkJCQkJLy8gZWF0IGl0IC0gdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhpcy4KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkgfHwgIXByb2plY3QuaXNPcGVuKCkpdGhyb3cgbmV3IFByb2plY3RVbmF2YWlsYWJsZUVycm9yKHByb2plY3QpOwotCQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSl0aHJvdyBuZXcgUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yKHJlc291cmNlKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFrZU1hcmtlcnMoTGlzdDxJTWVzc2FnZT4gbGlzdCl7Ci0JCWZvciAoSU1lc3NhZ2UgbWVzc2FnZSA6IGxpc3QpewotCQkJSVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKTsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpcmVzID0gKElSZXNvdXJjZSl0YXJnZXQ7Ci0JCQlpZiAocmVzID09IG51bGwpewotCQkJCXRhcmdldCA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlKElNZXNzYWdlLlRhcmdldFJlc291cmNlKTsKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKXJlcyA9IChJUmVzb3VyY2UpdGFyZ2V0OwotCQkJfQotCQkJaWYgKHJlcyAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQlob29rKHJlcyk7Ci0JCQkJCVN0cmluZyBpZCA9IG1lc3NhZ2UuZ2V0TWFya2VySWQoKTsKLQkJCQkJaWYgKGlkID09IG51bGwpaWQgPSBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSOwotCQkJCQlJTWFya2VyIG1hcmtlciA9IHJlcy5jcmVhdGVNYXJrZXIoaWQpOwotCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtZXNzYWdlLmdldEF0dHJpYnV0ZXMoKSk7Ci0JCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlLmdldFRleHQoKSk7Ci0JCQkJCWludCBtYXJrZXJTZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfSU5GTzsKLQkJCQkJaW50IHNldiA9IG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLQkJCQkJaWYgKChzZXYgJiBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZKSAhPSAwKW1hcmtlclNldmVyaXR5ID0gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsKLQkJCQkJZWxzZSBpZiAoKHNldiAmIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSkgIT0gMCltYXJrZXJTZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBtYXJrZXJTZXZlcml0eSk7Ci0JCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBIGRlYnVnZ2luZyBtZXRob2QuIEEgcGxhY2UgdG8gcHV0IGJyZWFrIHBvaW50cywgc28gdGhhdCB5b3UgY2FuIGZpZ3VyZSBvdXQgd2hhdCBzb3J0IG9mIG1hcmtlcgotCSAqIGNoYW5nZXMgYXJlIGhhcHBlbmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBob29rKElSZXNvdXJjZSByZXNvdXJjZSl7Ci0vLwkJU3RyaW5nIG5hbWUgPSAiZmlyc3QudGVzdDJ4IjsKLS8vCQlpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSl7Ci0vLwkJCVN0cmluZyBtYXJrZXJzID0gTWlzYy5saXN0TWFya2VycyhyZXNvdXJjZSk7Ci0vLwkJCVRyYWNpbmcubG9nKCJNYXJrZXJNYW5hZ2VyIGhhcyBob29rZWQ6ICIsIG5hbWUpOyAvLyROT04tTkxTLTEkCi0vLwkJCVJ1bnRpbWVFeGNlcHRpb24gcnQgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigiaG9va2luZyAiICsgbmFtZSk7Ci0vLwkJCXJ0LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0TWFya2VycygpIHsKLQkJcmV0dXJuIF9tYXJrZXJzOwotCX0KLQkKLQkvKioKLQkgKiBTdG9yZSB0aGUgc2luZ2xldG9uIGZvciB0aGUgTWFya2VyTWFuYWdlci4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIHRvIGF2b2lkIGhhdmluZyB0byBzeW5jaHJvbml6ZSB0aGUKLQkgKiBNYXJrZXJNYW5hZ2VyLmdldERlZmF1bHQoKSBtZXRob2QuCi0JICogCi0JICogQGF1dGhvciBrYXJhc2l1awotCSAqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2luZ2xldG9uIHsKLQkJc3RhdGljIE1hcmtlck1hbmFnZXIgbWFya2VyTWFuYWdlciA9IG5ldyBNYXJrZXJNYW5hZ2VyKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL01pc2MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL01pc2MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhZmM0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9NaXNjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OwotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50LlRocmVhZE1YQmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFNvbWUgbWlzY2VsbGFuZW91cyBoZWxwZXIgbWV0aG9kcy4gCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWlzYyB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKElucHV0U3RyZWFtIGluKXsKLQkJaWYgKGluID09IG51bGwpcmV0dXJuOwotCQl0cnkgewotCQkJaW4uY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0JCQkvLyBlYXQgaXQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCWlmIChvdXQgPT0gbnVsbClyZXR1cm47Ci0JCXRyeSB7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0JCQkvLyBlYXQgaXQKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWJ1Z09wdGlvbkFzQm9vbGVhbihTdHJpbmcgb3B0aW9uKXsKLQkJU3RyaW5nIG9wdCA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKG9wdGlvbik7Ci0JCWlmIChvcHQgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCW9wdCA9IG9wdC50b0xvd2VyQ2FzZSgpOwotCQlpZiAoInRydWUiLmVxdWFscyhvcHQpKXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCWlmICgieWVzIi5lcXVhbHMob3B0KSlyZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIEFuc3dlciBhIHVuaXRzIGFwcHJvcHJpYXRlIHN0cmluZyBmb3IgdGhlIHRpbWUuCi0JICogQHBhcmFtIHRpbWUgdGltZSBpbiBuYW5vIHNlY29uZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUaW1lTmFubyhsb25nIHRpbWUpewotCQlpZiAodGltZSA8PSAxMDAwKXJldHVybiBOTFMuYmluZChWYWxNZXNzYWdlcy5UaW1lTmFubywgdGltZSk7Ci0JCWlmICh0aW1lIDw9IDEwMDAwMDApcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLlRpbWVNaWNybywgdGltZS8xMDAwKTsKLQkJcmV0dXJuIGdldFRpbWVNUyh0aW1lLzEwMDAwMDApOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIENQVSB0aW1lIGNvbnN1bWVkIGJ5IHRoaXMgdGhyZWFkIGluIG5hbm8gc2Vjb25kcy4KLQkgKiBAcmV0dXJuIC0xIGlmIHRoZSB0aW1lIGNhbiBub3QgYmUgZGV0ZXJtaW5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Q1BVVGltZSgpewotCQlsb25nIGNwdVRpbWUgPSAtMTsKLQkJVGhyZWFkTVhCZWFuIHRiID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0VGhyZWFkTVhCZWFuKCk7Ci0JCWlmICh0Yi5pc0N1cnJlbnRUaHJlYWRDcHVUaW1lU3VwcG9ydGVkKCkpewotCQkJY3B1VGltZSA9IHRiLmdldEN1cnJlbnRUaHJlYWRDcHVUaW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGNwdVRpbWU7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhIHVuaXRzIGFwcHJvcHJpYXRlIHN0cmluZyBmb3IgdGhlIHRpbWUuCi0JICogQHBhcmFtIHRpbWUgdGltZSBpbiBtaWxsaXNlY29uZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUaW1lTVMobG9uZyB0aW1lKSB7Ci0JCWlmICh0aW1lIDw9IDEwMDApcmV0dXJuIFZhbE1lc3NhZ2VzLlRpbWVVbmRlcjsKLQkJaWYgKHRpbWUgPD0gNjAwMDApcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLlRpbWVTZWMsIHRpbWUvMTAwMCk7Ci0JCXJldHVybiBOTFMuYmluZChWYWxNZXNzYWdlcy5UaW1lTWluLCB0aW1lLzYwMDAwKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGluIGRlYnVnZ2luZyBzbyB3ZSBjYW4gc2VlIHdoYXQgdHlwZXMgb2YgbWFya2VycyB0aGVyZSBhcmUuCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlzdE1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlKXsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwMDApOwotCQl0cnkgewotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhudWxsLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQlmb3IgKElNYXJrZXIgbSA6IG1hcmtlcnMpewotCQkJCU9iamVjdCBvID0gbS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJCQlpZiAobyAhPSBudWxsKXsKLQkJCQkJYi5hcHBlbmQobyk7Ci0JCQkJfQotCQkJCW8gPSBtLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsKLQkJCQlpZiAobyAhPSBudWxsKXsKLQkJCQkJYi5hcHBlbmQoIiwgU2V2ZXJpdHk9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYi5hcHBlbmQobyk7Ci0JCQkJfQotCQkJCWIuYXBwZW5kKCI7ICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkKLQkJfQotCQlyZXR1cm4gYi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGV5IGFyZSB0aGUgc2FtZS4gSWYgdGhleSBhcmUgYm90aCBudWxsIHRoZW4gdGhleSBhcmUgdGhlIHNhbWUuIAotCSAqIEBwYXJhbSBzMSB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuIEl0IGNhbiBiZSBudWxsLgotCSAqIEBwYXJhbSBzMiB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuIEl0IGNhbiBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lKFN0cmluZyBzMSwgU3RyaW5nIHMyKXsKLQkJaWYgKHMxID09IG51bGwgJiYgczIgPT0gbnVsbClyZXR1cm4gdHJ1ZTsKLQkJaWYgKHMxID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gczEuZXF1YWxzKHMyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG5peShTdHJpbmcgbXNnKXsKLQkJaWYgKG1zZyA9PSBudWxsKW1zZyA9ICJTb3JyeSwgdGhpcyBmdW5jdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0IjsgLy8kTk9OLU5MUy0xJAotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHR5cGUgYXMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcuIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcuCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VDaGFuZ2VFdmVudFR5cGUoaW50IHR5cGUpewotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjAwKTsKLQkJaWYgKCh0eXBlICYgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCkgIT0gMCliLmFwcGVuZCgicG9zdF9idWlsZCAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoKHR5cGUgJiBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSkgIT0gMCliLmFwcGVuZCgicG9zdF9jaGFuZ2UgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCh0eXBlICYgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEKSAhPSAwKWIuYXBwZW5kKCJwcmVfYnVpbGQgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCh0eXBlICYgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFKSAhPSAwKWIuYXBwZW5kKCJwcmVfY2xvc2UgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCh0eXBlICYgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSkgIT0gMCliLmFwcGVuZCgicHJlX2RlbGV0ZSAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYi50b1N0cmluZygpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL051bGxWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL051bGxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNTdhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9OdWxsVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci0KLS8qKgotICogQSBudWxsIHZhbGlkYXRvciB0aGF0IGlzIHVzZWQgaW4gZXJyb3IgY2FzZXMuIEl0IHNpbXBseSBuby1vcHMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTnVsbFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUGVyZm9ybWFuY2VNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9QZXJmb3JtYW5jZU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwZTkzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9QZXJmb3JtYW5jZU1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uUGVyZm9ybWFuY2VDb3VudGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlTW9uaXRvciBpbXBsZW1lbnRzIElQZXJmb3JtYW5jZU1vbml0b3IgewotCQotCXByaXZhdGUgQ29sbGVjdGlvbkxldmVsIF9sZXZlbCA9IENvbGxlY3Rpb25MZXZlbC5Ob25lOwotCXByaXZhdGUgYm9vbGVhbgkJCV9zdW1tYXJ5T25seTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBwZXJmb3JtYW5jZSBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSB0cmFjZVRpbWVzCi0JICogICAgICAgICAgICBTaG91bGQgdGhlIG1vbml0b3IgYmUgdHVybmVkIG9uPwotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBTaG91bGQgdGhlIGV2ZW50cyBiZSBsb2dnZWQgdG8gYSBmaWxlLiBJZiB0aGlzIGlzIG51bGwgb3IgdGhlCi0JICogICAgICAgICAgICBlbXB0eSBzdHJpbmcgdGhlIGV2ZW50cyB3aWxsIGJlIHdyaXR0ZW4gdG8gc3RkZXJyLiBPdGhlcndpc2UKLQkgKiAgICAgICAgICAgIHRoZSBldmVudHMgYXJlIGFwcGVuZGVkIHRvIGEgZmlsZSB3aXRoIHRoaXMgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nSW5TZWNvbmRzCi0JICogICAgICAgICAgICBTZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IHRoZSB0aW1lcyB0aGF0IGFyZSBsb2dnZWQgaW4gdGhlCi0JICogICAgICAgICAgICB0cmFjZSBmaWxlIG5vcm1hbGl6ZWQgdG8gc2Vjb25kcy4gT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHVuaXRzIGFyZSB1c2VkLAotCSAqICAgICAgICAgICAgbWlsbGlzZWNvbmRzIGZvciBlbGFwc2VkIHRpbWUgYW5kIG5hbm9zZWNvbmRzIGZvciBjcHUgdGltZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcmZvcm1hbmNlTW9uaXRvciBjcmVhdGUoYm9vbGVhbiB0cmFjZVRpbWVzLCBTdHJpbmcgZmlsZSwgYm9vbGVhbiBsb2dJblNlY29uZHMpewotCQlQZXJmb3JtYW5jZU1vbml0b3IgcG0gPSBudWxsOwotCQlpZiAoZmlsZSA9PSBudWxsIHx8IGZpbGUubGVuZ3RoKCkgPT0gMClwbSA9IG5ldyBQZXJmb3JtYW5jZU1vbml0b3IoKTsKLQkJZWxzZSBwbSA9IG5ldyBUb0ZpbGUoZmlsZSwgbG9nSW5TZWNvbmRzKTsKLQkJCi0JCWlmICh0cmFjZVRpbWVzKXBtLnNldENvbGxlY3Rpb25MZXZlbChDb2xsZWN0aW9uTGV2ZWwuRGVmYXVsdCk7Ci0JCQotCQlyZXR1cm4gcG07Ci0JfQotCQotCXByaXZhdGUgUGVyZm9ybWFuY2VNb25pdG9yKCl7fTsKLQkKLQlwdWJsaWMgQ29sbGVjdGlvbkxldmVsIGdldENvbGxlY3Rpb25MZXZlbCgpIHsKLQkJcmV0dXJuIF9sZXZlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uTGV2ZWwoQ29sbGVjdGlvbkxldmVsIGxldmVsKSB7Ci0JCV9sZXZlbCA9IGxldmVsOwotCX0KLQotCXB1YmxpYyBMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+IGdldFBlcmZvcm1hbmNlQ291bnRlcnMoYm9vbGVhbiBhc1N1bW1hcnkpIHsKLQkJcmV0dXJuIG5ldyBMaW5rZWRMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+KCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZXNldFBlcmZvcm1hbmNlQ291bnRlcnMoKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb2xsZWN0aW5nKCkgewotCQlyZXR1cm4gX2xldmVsICE9IENvbGxlY3Rpb25MZXZlbC5Ob25lOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N1bW1hcnlPbmx5KCkgewotCQlyZXR1cm4gX3N1bW1hcnlPbmx5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoUGVyZm9ybWFuY2VDb3VudGVycyBjb3VudGVycyl7Ci0JCVRyYWNpbmcud3JpdGUoY291bnRlcnMudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ291bnRlcnN7Ci0JCVN0cmluZwluYW1lOwotCQlpbnQgCW51bWJlckludm9jYXRpb25zOwotCQkKLQkJLyoqIEVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuICovCi0JCWxvbmcJZWxhcHNlZFRpbWU7Ci0JCQotCQkvKiogQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMsIG9yIC0xIGlmIHVua25vd24uICovCi0JCWxvbmcJY3B1VGltZTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRvRmlsZSBleHRlbmRzIFBlcmZvcm1hbmNlTW9uaXRvciB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyAJCV9maWxlTmFtZTsKLQkJcHJpdmF0ZSBib29sZWFuCQlfbG9nSW5TZWNvbmRzOwotCQkKLQkJcHJpdmF0ZSBQcmludFdyaXRlciBfcHc7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDb21tYT0iLCI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgRGF0ZUZvcm1hdCAJX2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkhIOm1tOnNzLlNTU1MiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcHJpdmF0ZSBUb0ZpbGUoU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGxvZ0luU2Vjb25kcyl7Ci0JCQlfZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJCV9sb2dJblNlY29uZHMgPSBsb2dJblNlY29uZHM7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKFBlcmZvcm1hbmNlQ291bnRlcnMgcGMpIHsKLQkJCXRyeSB7Ci0JCQkJUHJpbnRXcml0ZXIgcHcgPSBnZXRXcml0ZXIoKTsKLQkJCQlwdy5wcmludChfZGYuZm9ybWF0KHBjLmdldFdoZW4oKSkgKyBDb21tYSArIAotCQkJCQlwYy5nZXRWYWxpZGF0b3JJZCgpICsgQ29tbWEgKyBwYy5nZXROdW1iZXJJbnZvY2F0aW9ucygpICsgQ29tbWEpOwotCQkJCWlmIChfbG9nSW5TZWNvbmRzKXsKLQkJCQkJZG91YmxlIHNlYyA9ICgoZG91YmxlKXBjLmdldEVsYXBzZWRUaW1lKCkpIC8gMTAwMC4wOwotCQkJCQlwdy5wcmludChzZWMpOwotCQkJCQlwdy5wcmludChDb21tYSk7Ci0JCQkJCXNlYyA9ICgoZG91YmxlKXBjLmdldENwdVRpbWUoKSkgLyAxMDAwMDAwMDAwLjA7Ci0JCQkJCXB3LnByaW50KHNlYyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwdy5wcmludChwYy5nZXRFbGFwc2VkVGltZSgpK0NvbW1hK3BjLmdldENwdVRpbWUoKSk7Ci0JCQkJfQotCQkJCXB3LnByaW50bG4oQ29tbWEgKyBwYy5nZXRSZXNvdXJjZU5hbWUoKSk7Ci0JCQkJcHcuZmx1c2goKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJaWYgKF9wdyA9PSBudWxsKXsKLQkJCQlfcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oX2ZpbGVOYW1lLCB0cnVlKSk7Ci0JCQkJRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpOwotCQkJCV9wdy5wcmludGxuKCIjICIgKyBOTFMuYmluZChWYWxNZXNzYWdlcy5Mb2dTZXNzaW9uLCAgLy8kTk9OLU5MUy0xJAotCQkJCQlkZi5mb3JtYXQobmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKSkpOwotCQkJCWlmIChfbG9nSW5TZWNvbmRzKQotCQkJCQlfcHcucHJpbnRsbigiIyB3aGVuLCBpZCwgaW52b2NhdGlvbiBjb3VudCwgZWxhcHNlZCB0aW1lIChzZWNvbmRzKSwgY3B1IHRpbWUgKHNlY29uZHMpLCByZXNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZSAKLQkJCQkJX3B3LnByaW50bG4oIiMgd2hlbiwgaWQsIGludm9jYXRpb24gY291bnQsIGVsYXBzZWQgdGltZSAobXMpLCBjcHUgdGltZSAobnMpLCByZXNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gX3B3OwotCQkJCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb2xsZWN0aW5nIGV4dGVuZHMgUGVyZm9ybWFuY2VNb25pdG9yIHsKLQkJcHJpdmF0ZSBMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+CV9jb3VudGVycyA9IG5ldyBMaW5rZWRMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+KCk7Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGQoUGVyZm9ybWFuY2VDb3VudGVycyBjb3VudGVycyl7Ci0JCQlfY291bnRlcnMuYWRkKGNvdW50ZXJzKTsKLQkJfQotCQkKLQkJcHVibGljIExpc3Q8UGVyZm9ybWFuY2VDb3VudGVycz4gZ2V0UGVyZm9ybWFuY2VDb3VudGVycyhib29sZWFuIGFzU3VtbWFyeSkgewotCQkJaWYgKGFzU3VtbWFyeSl7Ci0JCQkJTWFwPFN0cmluZywgQ291bnRlcnM+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ291bnRlcnM+KDQwKTsKLQkJCQlmb3IgKFBlcmZvcm1hbmNlQ291bnRlcnMgcGMgOiBfY291bnRlcnMpewotCQkJCQlDb3VudGVycyBjID0gbWFwLmdldChwYy5nZXRWYWxpZGF0b3JJZCgpKTsKLQkJCQkJaWYgKGMgPT0gbnVsbCl7Ci0JCQkJCQljID0gbmV3IENvdW50ZXJzKCk7Ci0JCQkJCQljLm5hbWUgPSBwYy5nZXRWYWxpZGF0b3JOYW1lKCk7Ci0JCQkJCQltYXAucHV0KHBjLmdldFZhbGlkYXRvcklkKCksIGMpOwotCQkJCQl9Ci0JCQkJCWMubnVtYmVySW52b2NhdGlvbnMgKz0gcGMuZ2V0TnVtYmVySW52b2NhdGlvbnMoKTsKLQkJCQkJYy5lbGFwc2VkVGltZSArPSBwYy5nZXRFbGFwc2VkVGltZSgpOwotCQkJCQlpZiAocGMuZ2V0Q3B1VGltZSgpICE9IC0xKWMuY3B1VGltZSArPSBwYy5nZXRDcHVUaW1lKCk7Ci0JCQkJCWVsc2UgYy5jcHVUaW1lID0gLTE7Ci0JCQkJfQotCQkJCUxpc3Q8UGVyZm9ybWFuY2VDb3VudGVycz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFBlcmZvcm1hbmNlQ291bnRlcnM+KCk7Ci0JCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb3VudGVycz4gbWUgOiBtYXAuZW50cnlTZXQoKSl7Ci0JCQkJCUNvdW50ZXJzIGMgPSBtZS5nZXRWYWx1ZSgpOwotCQkJCQlsaXN0LmFkZChuZXcgUGVyZm9ybWFuY2VDb3VudGVycyhtZS5nZXRLZXkoKSwgYy5uYW1lLCBudWxsLCBjLm51bWJlckludm9jYXRpb25zLCBjLmVsYXBzZWRUaW1lLCBjLmNwdVRpbWUpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGxpc3Q7Ci0JCQl9Ci0JCQlyZXR1cm4gX2NvdW50ZXJzOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZXNldFBlcmZvcm1hbmNlQ291bnRlcnMoKSB7Ci0JCQlfY291bnRlcnMuY2xlYXIoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9QcmVmQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9QcmVmQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYWMwNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJlZkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotLyoqCi0gKiBUaGUgY29uc3RhbnRzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgc28gc2F2ZSB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb25zLiAKLSAqIDxwPgotICogVGhlIGVudHJpZXMgaW4gdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IGFyZSBvcmdhbml6ZWQgc29tZXRoaW5nIGxpa2UgdGhpczoKLSAqIDxwcmU+Ci0gKiAvaW5zdGFuY2UvZnJhbWUtd29yay1pZC9zYXZlQXV0bz10cnVlfGZhbHNlCi0gKiAvaW5zdGFuY2UvZnJhbWUtd29yay1pZC9zdXNwZW5kPXRydWV8ZmFsc2UKLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL3ZmLnZlcnNpb249MgotICogL2luc3RhbmNlL2ZyYW1lLXdvcmstaWQvZmlsdGVycy92YWwtaWQvYnVpbGQ9dHJ1ZXxmYWxzZQotICogL2luc3RhbmNlL2ZyYW1lLXdvcmstaWQvZmlsdGVycy92YWwtaWQvbWFudWFsPXRydWV8ZmFsc2UKLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL3ZlcnNpb249c29tZU51bWJlcgotICogL2luc3RhbmNlL2ZyYW1lLXdvcmstaWQvZmlsdGVycy92YWwtaWQvZ3JvdXBzLzAvdHlwZT1pbmNsdWRlfGV4Y2x1ZGUKLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL2dyb3Vwcy8wL3J1bGVzLzAvdHlwZT1maWxlfGZpbGVleHR8cHJvamVjdE5hdHVyZXwuLi4KLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL2dyb3Vwcy8wL3J1bGVzLzAvcGF0dGVybj0uLi4KLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL2dyb3Vwcy8wL3J1bGVzLzEvdHlwZT1maWxlfGZpbGVleHR8cHJvamVjdE5hdHVyZXwuLi4KLSAqIC9pbnN0YW5jZS9mcmFtZS13b3JrLWlkL2ZpbHRlcnMvdmFsLWlkL2dyb3Vwcy8wL3J1bGVzLzEvcGF0dGVybj0uLi4KLSAqIDwvcHJlPgotICogPHA+Ci0gKiBOZXcgYXBwcm9hY2gKLSAqIDxwcmU+Ci0gKiB2YWxzL3ZhbC1pZC9nbG9iYWw9VEZbdmVyc2lvbl1bbGVuXWRlbGVnYXRlLWlkCi0gKiB2YWxzL3ZhbC1pZC9ncm91cHM9W2dyb3Vwc10KLSAqIDwvcHJlPgotICogCi0gKiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJlZkNvbnN0YW50cyB7Ci0JCi0JLyoqIGZpbHRlcnMgLSBub2RlIHdoZXJlIGFsbCB0aGUgZmlsdGVycyBhcmUgc2F2ZWQuICovCi0JU3RyaW5nIGZpbHRlcnMgPSAiZmlsdGVycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogYnVpbGQgLSBpcyB0aGUgdmFsaWRhdG9yIGVuYWJsZWQgZm9yIGJ1aWxkcz8gKi8KLQlTdHJpbmcgYnVpbGQgPSAiYnVpbGQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGRlbGVnYXRlIC0gdGhlIGRlbGVnYXRpbmcgaW1wbGVtZW50YXRpb24gdG8gdXNlICovCi0JU3RyaW5nIGRlbGVnYXRlID0gImRlbGVnYXRlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBkaXNhYmxlZCAtIHRoZSBsaXN0IG9mIGRpc2FibGVkIHJlc291cmNlcyBpbiB0aGUgcHJvamVjdC4gKi8KLQlTdHJpbmcgZGlzYWJsZWQgPSAiZGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGV4YWN0TWF0Y2ggLSBtdXN0IHRoZSBjb250ZW50IHR5cGUgbWF0Y2ggZXhhY3RseT8gKi8KLQlTdHJpbmcgZXhhY3RNYXRjaCA9ICJleGFjdE1hdGNoIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBtYW51YWwgLSBpcyB0aGUgdmFsaWRhdG9yIGVuYWJsZWQgZm9yIG1hbnVhbCB2YWxpZGF0aW9uPyAqLwotCVN0cmluZyBtYW51YWwgPSAibWFudWFsIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBtc2dzIC0gbm9kZSB3aGVyZSBhbGwgdGhlIG1lc3NhZ2Ugc2V2ZXJpdHkgbWFwcGluZ3MgYXJlIHN0b3JlZC4gKi8KLQlTdHJpbmcgbXNncyA9ICJtc2dzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAKLQkgKiB2ZXJzaW9uIC0gdmVyc2lvbiBvZiB0aGUgZmlsdGVyIGRlZmluaXRpb24uIFRoaXMgaXMgc29tZXRoaW5nIHRoYXQgYSBjbGllbnQgY2FuIHVzZSB0byBrZWVwIHRyYWNrCi0JICogb2YgY2hhbmdlcyB0aGF0IHRoZXkgbWlnaHQgbWFrZSB0byB0aGVpciB2YWxpZGF0aW9uIGV4dGVuc2lvbi4KLQkgKi8KLQlTdHJpbmcgdmVyc2lvbiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiB2Zi52ZXJzaW9uIC0gdmVyc2lvbiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuICovCi0JU3RyaW5nIGZyYW1ld29ya1ZlcnNpb24gPSAidmYudmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogZ3JvdXBzIC0gZmlsdGVyIGdyb3VwLiAqLwotCVN0cmluZyBncm91cHMgPSAiZ3JvdXBzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiB0eXBlIC0gdHlwZSBvZiBncm91cCwgZWl0aGVyIGluY2x1ZGUgb3IgZXhjbHVkZS4gKi8KLQlTdHJpbmcgdHlwZSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiB0eXBlIC0gdGhlIHR5cGUgb2YgcnVsZS4gKi8KLQlTdHJpbmcgcnVsZVR5cGUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogcnVsZXMgLSBhIGZpbHRlciBydWxlLiAqLwotCVN0cmluZyBydWxlcyA9ICJydWxlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogcGF0dGVybiAtIHRoZSBwYXR0ZXJuIHBhcnQgb2YgdGhlIHJ1bGUuICovCi0JU3RyaW5nIHBhdHRlcm4gPSAicGF0dGVybiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogc2F2ZUF1dG8gLSBjYW4gd2Ugc2F2ZSBhbGwgdGhlIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5PyB0cnVlL2ZhbHNlICovCi0JU3RyaW5nIHNhdmVBdXRvID0gInNhdmVBdXRvIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBzdGF0ZVRTIC0gcGx1Zy1pbiBzdGF0ZSB0aW1lIHN0YW1wICovCi0JU3RyaW5nIHN0YXRlVFMgPSAic3RhdGVUUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogc3VzcGVuZCAtIHN1c3BlbmQgYWxsIHZhbGlkYXRpb24/IHRydWUvZmFsc2UgKi8KLQlTdHJpbmcgc3VzcGVuZCA9ICJzdXNwZW5kIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBjYXNlIC0gaXMgdGhpcyBjYXNlIHNlbnNpdGl2ZT8gKi8KLQlTdHJpbmcgY2FzZVNlbnNpdGl2ZSA9ICJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBmaWxlVHlwZSAtIHRoZSB0eXBlIG9mIGZpbGUsIHNlZSBGaWx0ZXJSdWxlLkZpbGUgKi8KLQlTdHJpbmcgZmlsZVR5cGUgPSAiZmlsZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGNvbmZpcm1EaWFsb2cgLSBzaG91bGQgd2Ugc2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2hlbiBkb2luZyBhIG1hbnVhbCB2YWxpZGF0aW9uPyAqLwotCVN0cmluZyBjb25maXJtRGlhbG9nID0gImNvbmZpcm1EaWFsb2ciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIG92ZXJyaWRlIC0gc2hvdWxkIHdlIHNob3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcz8gKi8KLQlTdHJpbmcgb3ZlcnJpZGUgPSAib3ZlcnJpZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHZhbHMgLSB0aGUgdmFsaWRhdG9ycyBhcmUgZ3JvdXBlZCB1bmRlciB0aGlzIG5vZGUuICovCi0JU3RyaW5nIHZhbHMgPSAidmFscyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogZ2xvYmFsIC0gc29tZSBnbG9iYWwgdmFsaWRhdGlvbiBzZXR0aW5ncy4gKi8KLQlTdHJpbmcgZ2xvYmFsID0gImdsb2JhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ByZWZlcmVuY2VzV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJlZmVyZW5jZXNXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmM2E1ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJlZmVyZW5jZXNXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIFRoZSBzdWJzZXQgb2YgdGhlIElFY2xpcHNlUHJlZmVyZW5jZXMgaW50ZXJmYWNlIHRoYXQgdGhlIGZyYW1ld29yayBuZWVkcyB0bwotICogYmUgYWJsZSB0byBwZXJzaXN0IHByZWZlcmVuY2VzLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VzV3JhcHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgV3JhcHBlck1hbmdlciBfbWFuYWdlciA9IG5ldyBXcmFwcGVyTWFuZ2VyKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3QuIElmIHByb2plY3QgaXMgbnVsbCBhbnN3ZXIgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcy4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwZXJzaXN0ZW50IGlmIG51bGwgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZXMgYXJlIHJldHVybmVkLCBpZiBUcnVlIHRoZSBwZXJzaXN0ZWQgCi0JICogcHJlZmVyZW5jZXMgYXJlIHJldHVybiBhbmQgaWYgRmFsc2UgdGhlIHRyYW5zaWVudCBwcmVmZXJlbmNlcyBhcmUgcmV0dXJuZWQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXNXcmFwcGVyIGdldFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QsIEJvb2xlYW4gcGVyc2lzdGVudCl7Ci0JCXJldHVybiBfbWFuYWdlci5nZXQocHJvamVjdCwgcGVyc2lzdGVudCk7Ci0JfQotCQkKLQkvKioKLQkgKiBUaGVzZSBhcmUgdGhlIG5hbWVzIG9mIHRoZSBub2RlIGVudHJpZXMuCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGNoaWxkcmVuTmFtZXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCQotCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiBkZWYpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0KFN0cmluZyBrZXksIFN0cmluZyBkZWYpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KFN0cmluZyBrZXksIGludCBkZWYpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldExvbmcoU3RyaW5nIGtleSwgbG9uZyBkZWYpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGtleXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSk7Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcHV0TG9uZyhTdHJpbmcga2V5LCBsb25nIHZhbHVlKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXRJbnQoU3RyaW5nIGtleSwgaW50IHZhbHVlKTsKLQkKLQkvKioKLQkgKiBVbmxpa2UgdGhlIG1vcmUgc29waGlzdGljYXRlZCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzIHN1cHBvcnQsIAotCSAqIHRoaXMgaXMgY3VycmVudGx5IGxpbWl0ZWQgdG8gc2ltcGxlIG5vZGUgbmFtZXMuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFByZWZlcmVuY2VzV3JhcHBlciBub2RlKFN0cmluZyBub2RlTmFtZSk7Ci0JCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbm9kZUV4aXN0cygpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG5vZGVFeGlzdHMoU3RyaW5nIHBhdGhOYW1lKSAgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVOb2RlKCkgIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLQotcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBQcmVmZXJlbmNlc1dyYXBwZXJQZXJzaXN0ZW50IGV4dGVuZHMgUHJlZmVyZW5jZXNXcmFwcGVyIHsKLQkKLQlwcml2YXRlIGZpbmFsIFByZWZlcmVuY2VzIF9wcmVmZXJlbmNlczsKLQkKLQlwdWJsaWMgUHJlZmVyZW5jZXNXcmFwcGVyUGVyc2lzdGVudChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyl7Ci0JCV9wcmVmZXJlbmNlcyA9IHByZWZlcmVuY2VzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gY2hpbGRyZW5OYW1lcygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gX3ByZWZlcmVuY2VzLmNoaWxkcmVuTmFtZXMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJX3ByZWZlcmVuY2VzLmZsdXNoKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0KFN0cmluZyBrZXksIFN0cmluZyBkZWYpIHsKLQkJcmV0dXJuIF9wcmVmZXJlbmNlcy5nZXQoa2V5LCBkZWYpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmKSB7Ci0JCXJldHVybiBfcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihrZXksIGRlZik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBrZXksIGludCBkZWYpIHsKLQkJcmV0dXJuIF9wcmVmZXJlbmNlcy5nZXRJbnQoa2V5LCBkZWYpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBrZXksIGxvbmcgZGVmKSB7Ci0JCXJldHVybiBfcHJlZmVyZW5jZXMuZ2V0TG9uZyhrZXksIGRlZik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmdbXSBrZXlzKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBfcHJlZmVyZW5jZXMua2V5cygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCV9wcmVmZXJlbmNlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQcmVmZXJlbmNlc1dyYXBwZXIgbm9kZShTdHJpbmcgcGF0aCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IF9wcmVmZXJlbmNlcy5ub2RlKHBhdGgpOwotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VzV3JhcHBlclBlcnNpc3RlbnQocHJlZnMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBub2RlRXhpc3RzKCkgewotCQl0cnkgewotCQkJcmV0dXJuIG5vZGVFeGlzdHMoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKXsKLQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBub2RlRXhpc3RzKFN0cmluZyBwYXRoTmFtZSkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiAgewotCQlyZXR1cm4gX3ByZWZlcmVuY2VzLm5vZGVFeGlzdHMocGF0aE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKLQkJX3ByZWZlcmVuY2VzLnB1dEJvb2xlYW4oa2V5LCB2YWx1ZSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwdXRMb25nKFN0cmluZyBrZXksIGxvbmcgdmFsdWUpewotCQlfcHJlZmVyZW5jZXMucHV0TG9uZyhrZXksIHZhbHVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0SW50KFN0cmluZyBrZXksIGludCB2YWx1ZSkgewotCQlfcHJlZmVyZW5jZXMucHV0SW50KGtleSwgdmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVOb2RlKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCV9wcmVmZXJlbmNlcy5yZW1vdmVOb2RlKCk7Ci0JfQotfQotCi1wdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFByZWZlcmVuY2VzV3JhcHBlclRyYW5zaWVudCBleHRlbmRzIFByZWZlcmVuY2VzV3JhcHBlciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBQcmVmZXJlbmNlc1dyYXBwZXJUcmFuc2llbnQgX3BhcmVudDsKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gX2NoaWxkcmVuID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigxMCkpOwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUHJlZmVyZW5jZXNXcmFwcGVyVHJhbnNpZW50PiBfbm9kZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBQcmVmZXJlbmNlc1dyYXBwZXJUcmFuc2llbnQ+KDEwKSk7Ci0JCi0JcHVibGljIFByZWZlcmVuY2VzV3JhcHBlclRyYW5zaWVudChQcmVmZXJlbmNlc1dyYXBwZXJUcmFuc2llbnQgcGFyZW50KXsKLQkJX3BhcmVudCA9IHBhcmVudDsKLQl9Ci0JCi0JcHVibGljIFByZWZlcmVuY2VzV3JhcHBlclRyYW5zaWVudChQcmVmZXJlbmNlc1dyYXBwZXIgcHcsIFByZWZlcmVuY2VzV3JhcHBlclRyYW5zaWVudCBwYXJlbnQpIHsKLQkJX3BhcmVudCA9IHBhcmVudDsKLQkJdHJ5IHsKLQkJCWZvciAoU3RyaW5nIGtleSA6IHB3LmtleXMoKSl7Ci0JCQkJcHV0KGtleSwgcHcuZ2V0KGtleSwgbnVsbCkpOwotCQkJfQotCQkJCi0JCQkKLQkJCWZvciAoU3RyaW5nIG5vZGVOYW1lIDogcHcuY2hpbGRyZW5OYW1lcygpKXsKLQkJCQlQcmVmZXJlbmNlc1dyYXBwZXIgcCA9IHB3Lm5vZGUobm9kZU5hbWUpOwotCQkJCVByZWZlcmVuY2VzV3JhcHBlclRyYW5zaWVudCBwd3QgPSBuZXcgUHJlZmVyZW5jZXNXcmFwcGVyVHJhbnNpZW50KHAsIHRoaXMpOwotCQkJCV9ub2Rlcy5wdXQobm9kZU5hbWUsIHB3dCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKXsKLQkJCQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGNoaWxkcmVuTmFtZXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJU2V0PFN0cmluZz4ga2V5cyA9IF9ub2Rlcy5rZXlTZXQoKTsKLQkJU3RyaW5nIG5hbWVzW10gPSBuZXcgU3RyaW5nW2tleXMuc2l6ZSgpXTsKLQkJa2V5cy50b0FycmF5KG5hbWVzKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldChTdHJpbmcga2V5LCBTdHJpbmcgZGVmKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IF9jaGlsZHJlbi5nZXQoa2V5KTsKLQkJaWYgKHZhbHVlICE9IG51bGwpcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gZGVmOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IF9jaGlsZHJlbi5nZXQoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpcmV0dXJuIGRlZjsKLQkJdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCQlpZiAoInRydWUiLmVxdWFscyh2YWx1ZSkpcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCJmYWxzZSIuZXF1YWxzKHZhbHVlKSlyZXR1cm4gZmFsc2U7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlZjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBnZXRJbnQoU3RyaW5nIGtleSwgaW50IGRlZikgewotCQlTdHJpbmcgdmFsdWUgPSBfY2hpbGRyZW4uZ2V0KGtleSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKXJldHVybiBkZWY7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXsKLQkJfQotCQlyZXR1cm4gZGVmOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBrZXksIGxvbmcgZGVmKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IF9jaGlsZHJlbi5nZXQoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpcmV0dXJuIGRlZjsKLQkJdHJ5IHsKLQkJCXJldHVybiBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXsKLQkJfQotCQlyZXR1cm4gZGVmOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10ga2V5cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1tfY2hpbGRyZW4uc2l6ZSgpXTsKLQkJX2NoaWxkcmVuLmtleVNldCgpLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIFByZWZlcmVuY2VzV3JhcHBlciBub2RlKFN0cmluZyBuYW1lKSB7Ci0JCVByZWZlcmVuY2VzV3JhcHBlclRyYW5zaWVudCBwdyAgPSBfbm9kZXMuZ2V0KG5hbWUpOwotCQlpZiAocHcgIT0gbnVsbClyZXR1cm4gcHc7Ci0JCXB3ID0gbmV3IFByZWZlcmVuY2VzV3JhcHBlclRyYW5zaWVudCh0aGlzKTsKLQkJX25vZGVzLnB1dChuYW1lLCBwdyk7Ci0JCXJldHVybiBwdzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gbm9kZUV4aXN0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIG5vZGVFeGlzdHMoU3RyaW5nIGtleSkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VzV3JhcHBlclRyYW5zaWVudCBwdyA9IF9ub2Rlcy5nZXQoa2V5KTsKLQkJaWYgKHB3ICE9IG51bGwpcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlfY2hpbGRyZW4ucHV0KGtleSwgdmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gYm9vbCkgewotCQlTdHJpbmcgdmFsdWUgPSBib29sID8gInRydWUiIDogImZhbHNlIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCV9jaGlsZHJlbi5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpIHsKLQkJX2NoaWxkcmVuLnB1dChrZXksIFN0cmluZy52YWx1ZU9mKHZhbHVlKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dExvbmcoU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgewotCQlfY2hpbGRyZW4ucHV0KGtleSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTm9kZSgpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlpZiAoX3BhcmVudCA9PSBudWxsKXJldHVybjsKLQkJX3BhcmVudC5yZW1vdmVOb2RlKHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZU5vZGUoUHJlZmVyZW5jZXNXcmFwcGVyVHJhbnNpZW50IG5vZGUpewotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBQcmVmZXJlbmNlc1dyYXBwZXJUcmFuc2llbnQ+IG1lIDogX25vZGVzLmVudHJ5U2V0KCkpewotCQkJaWYgKG1lLmdldFZhbHVlKCkuZXF1YWxzKG5vZGUpKXsKLQkJCQlrZXkgPSBtZS5nZXRLZXkoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoa2V5ICE9IG51bGwpX25vZGVzLnJlbW92ZShrZXkpOwotCX0KLX0KLQotcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgV3JhcHBlck1hbmdlciBpbXBsZW1lbnRzIElQcm9qZWN0Q2hhbmdlTGlzdGVuZXIgewotCQotCXByaXZhdGUgZmluYWwgTWFwPElQcm9qZWN0LCBQcmVmZXJlbmNlc1dyYXBwZXI+IF9tYXAgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgUHJlZmVyZW5jZXNXcmFwcGVyPigyMCk7IAotCXByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPFByZWZlcmVuY2VzV3JhcHBlcj4gX2dsb2JhbCA9IG5ldyBBdG9taWNSZWZlcmVuY2U8UHJlZmVyZW5jZXNXcmFwcGVyPigpOwotCQotCXByaXZhdGUgV3JhcHBlck1hbmdlcigpewotCQlFdmVudE1hbmFnZXIuZ2V0TWFuYWdlcigpLmFkZFByb2plY3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3VycmVudGx5IHRoaXMgb2JqZWN0IG5ldmVyIGdvZXMgYXdheSwgYnV0IGlmIHRoYXQgd2FzIGV2ZXIgdG8gY2hhbmdlIHRoZW4gd2Ugd291bGQgbmVlZCB0byBkaXNwb3NlIGl0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpewotCQlFdmVudE1hbmFnZXIuZ2V0TWFuYWdlcigpLnJlbW92ZVByb2plY3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXNXcmFwcGVyIGdldChJUHJvamVjdCBwcm9qZWN0LCBCb29sZWFuIHBlcnNpc3RlbnQpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClyZXR1cm4gZ2xvYmFsUHJlZmVyZW5jZXMocGVyc2lzdGVudCk7Ci0JCVByZWZlcmVuY2VzV3JhcHBlciBwdyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZChfbWFwKXsKLQkJCXB3ID0gX21hcC5nZXQocHJvamVjdCk7Ci0JCX0KLQkJCi0JCWlmIChwdyAhPSBudWxsICYmIChwZXJzaXN0ZW50ID09IG51bGwgfHwgcGVyc2lzdGVudCA9PSBwdy5pc1BlcnNpc3RlbnQoKSkpcmV0dXJuIHB3OwotCQkKLQkJaWYgKHB3ID09IG51bGwpcHcgPSBuZXcgUHJlZmVyZW5jZXNXcmFwcGVyUGVyc2lzdGVudChWYWxpZGF0aW9uUGx1Z2luLmdldFByZWZlcmVuY2VzKHByb2plY3QpKTsKLQkJaWYgKHBlcnNpc3RlbnQgIT0gbnVsbCAmJiBwZXJzaXN0ZW50ICYmIHB3LmlzVHJhbnNpZW50KCkpcHcgPSBuZXcgUHJlZmVyZW5jZXNXcmFwcGVyUGVyc2lzdGVudChWYWxpZGF0aW9uUGx1Z2luLmdldFByZWZlcmVuY2VzKHByb2plY3QpKTsKLQkJaWYgKHBlcnNpc3RlbnQgIT0gbnVsbCAmJiAhcGVyc2lzdGVudCAmJiBwdy5pc1BlcnNpc3RlbnQoKSlwdyA9IG5ldyBQcmVmZXJlbmNlc1dyYXBwZXJUcmFuc2llbnQocHcsIG51bGwpOwotCQkKLQkJc3luY2hyb25pemVkKF9tYXApewotCQkJX21hcC5wdXQocHJvamVjdCwgcHcpOwotCQl9Ci0JCQotCQlyZXR1cm4gcHc7Ci0JfQotCi0JLyoqCi0JCSAqIEFuc3dlciB0aGUgYXBwcm9wcmlhdGUgZ2xvYmFsIHByZWZlcmVuY2VzLgotCQkgKiAKLQkJICogQHBhcmFtIHBlcnNpc3RlbnQKLQkJICogICAgICAgICAgICBJZiBudWxsIHRoZW4gYW5zd2VyIHRoZSBjdXJyZW50IHNhdmVkIGdsb2JhbCBwcmVmZXJlbmNlcywKLQkJICogICAgICAgICAgICBjcmVhdGluZyBhIG5ldyBwZXJzaXN0ZW50IG9uZSBpZiB0aGVyZSBpcyBub25lLiBJZiBUcnVlLAotCQkgKiAgICAgICAgICAgIHRoZW4gZW5zdXJlIHRoYXQgdGhlIHByZWZlcmVuY2VzIGFyZSBwZXJzaXN0ZW50LiBJZiBGYWxzZSwKLQkJICogICAgICAgICAgICBlbnN1cmUgdGhhdCB0aGUgcHJlZmVyZW5jZXMgYXJlIHRyYW5zaWVudC4KLQkJICogQHJldHVybgotCQkgKi8KLQlwcml2YXRlIFByZWZlcmVuY2VzV3JhcHBlciBnbG9iYWxQcmVmZXJlbmNlcyhCb29sZWFuIHBlcnNpc3RlbnQpIHsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHB3ID0gX2dsb2JhbC5nZXQoKTsKLQkJCi0JCXdoaWxlKHB3ID09IG51bGwpewotCQkJUHJlZmVyZW5jZXNXcmFwcGVyIG5ld1BXID0gY3JlYXRlR2xvYmFsKHBlcnNpc3RlbnQpOwotCQkJaWYgKF9nbG9iYWwuY29tcGFyZUFuZFNldChudWxsLCBuZXdQVykpcHcgPSBuZXdQVzsKLQkJCWVsc2UgcHcgPSBfZ2xvYmFsLmdldCgpOwotCQl9Ci0JCQotCQl3aGlsZSAocGVyc2lzdGVudCAhPSBudWxsICYmICFwZXJzaXN0ZW50ICYmICFwdy5pc1RyYW5zaWVudCgpKXsKLQkJCVByZWZlcmVuY2VzV3JhcHBlciBuZXdQVyA9IG5ldyBQcmVmZXJlbmNlc1dyYXBwZXJUcmFuc2llbnQocHcsIG51bGwpOwotCQkJaWYgKF9nbG9iYWwuY29tcGFyZUFuZFNldChwdywgbmV3UFcpKXB3ID0gbmV3UFc7Ci0JCQllbHNlIHB3ID0gX2dsb2JhbC5nZXQoKTsKLQkJfQotCQkKLQkJd2hpbGUgKHBlcnNpc3RlbnQgIT0gbnVsbCAmJiBwZXJzaXN0ZW50ICYmICFwdy5pc1BlcnNpc3RlbnQoKSl7Ci0JCQlQcmVmZXJlbmNlc1dyYXBwZXIgbmV3UFcgPSBuZXcgUHJlZmVyZW5jZXNXcmFwcGVyUGVyc2lzdGVudChWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCQlpZiAoX2dsb2JhbC5jb21wYXJlQW5kU2V0KHB3LCBuZXdQVykpcHcgPSBuZXdQVzsKLQkJCWVsc2UgcHcgPSBfZ2xvYmFsLmdldCgpOwkJCQotCQl9Ci0JCXJldHVybiBwdzsKLQl9Ci0JCi0JcHJpdmF0ZSBQcmVmZXJlbmNlc1dyYXBwZXIgY3JlYXRlR2xvYmFsKEJvb2xlYW4gcGVyc2lzdGVudCl7Ci0JCVByZWZlcmVuY2VzV3JhcHBlciBwdyA9IG5ldyBQcmVmZXJlbmNlc1dyYXBwZXJQZXJzaXN0ZW50KFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJaWYgKHBlcnNpc3RlbnQgPT0gbnVsbCB8fCBwZXJzaXN0ZW50KXJldHVybiBwdzsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlc1dyYXBwZXJUcmFuc2llbnQocHcsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKElQcm9qZWN0IHByb2plY3QsIGludCB0eXBlKSB7Ci0JCWludCBpbnRlcmVzdGVkID0gSVByb2plY3RDaGFuZ2VMaXN0ZW5lci5Qcm9qZWN0Q2xvc2VkIHwgSVByb2plY3RDaGFuZ2VMaXN0ZW5lci5Qcm9qZWN0RGVsZXRlZDsKLQkJaWYgKCh0eXBlICYgaW50ZXJlc3RlZCkgIT0gMCl7Ci0JCQlzeW5jaHJvbml6ZWQgKF9tYXApIHsKLQkJCQlfbWFwLnJlbW92ZShwcm9qZWN0KTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvamVjdFVuYXZhaWxhYmxlRXJyb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2plY3RVbmF2YWlsYWJsZUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTJiNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvamVjdFVuYXZhaWxhYmxlRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJuYWwgZXJyb3IgaXMgdXNlZCB0byBzaWduYWwgdGhhdCBhIHByb2plY3QgaXMgbm93IHVuYXZhaWxhYmxlLgotICogPHA+Ci0gKiBXZSBjb3VsZCBiZSBpbiB0aGUgbWlkZGxlIG9mIHZhbGlkYXRpbmcgYSBsYXJnZSBwcm9qZWN0LCBhbmQgdGhlIHByb2plY3QgY291bGQgYmUgY2xvc2VkLiAKLSAqIFRoaXMgZXJyb3IgaXMgdXNlZCB0byAiZXhpdCIgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogPHA+Ci0gKiBUaGlzIGlzIGFuIGVycm9yIHJhdGhlciB0aGFuIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugc29tZSBwYXJ0cyBvZiBFY2xpcHNlIGxpa2UgdG8KLSAqIHRyYXAgUnVudGltZUV4Y2VwdGlvbnMgYW5kIGxvZyB0aGVtLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3IgewotCQotCXByaXZhdGUgSVByb2plY3QgX3Byb2plY3Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMDA4MDEyODExMThMOwotCQotCXB1YmxpYyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvcihJUHJvamVjdCBwcm9qZWN0KXsKLQkJc3VwZXIoKTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Jlc291cmNlVW5hdmFpbGFibGVFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTQzNjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Jlc291cmNlVW5hdmFpbGFibGVFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJuYWwgZXJyb3IgaXMgdXNlZCB0byBzaWduYWwgdGhhdCBhIHJlc291cmNlIGlzIG5vdyB1bmF2YWlsYWJsZS4KLSAqIDxwPgotICogVGhpcyBlcnJvciBpcyB1c2VkIHRvICJleGl0IiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIAotICogPHA+Ci0gKiBUaGlzIGlzIGFuIGVycm9yIHJhdGhlciB0aGFuIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugc29tZSBwYXJ0cyBvZiBFY2xpcHNlIGxpa2UgdG8KLSAqIHRyYXAgUnVudGltZUV4Y2VwdGlvbnMgYW5kIGxvZyB0aGVtLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVW5hdmFpbGFibGVFcnJvciBleHRlbmRzIEVycm9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIwMDgwMTI5MDg1M0w7Ci0JCi0JcHJpdmF0ZSBJUmVzb3VyY2UgX3Jlc291cmNlOwotCQotCXB1YmxpYyBSZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IoSVJlc291cmNlIHJlc291cmNlKXsKLQkJc3VwZXIoKTsKLQkJX3Jlc291cmNlID0gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIF9yZXNvdXJjZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1NlcmlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1NlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkYTc2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9TZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLS8qKgotICogQSBzaW1wbGUgZW5jb2RlciB0aGF0IGtub3dzIGhvdyB0byBjb252ZXJ0IGJvb2xlYW5zLCBpbnRlZ2VycyBhbmQgc3RyaW5ncywgaW50byBhIHNpbmdsZSBzdHJpbmcuCi0gKiAKLSAqIEBzZWUgRGVzZXJpYWxpemVyCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VyaWFsaXplciB7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgX2J1ZmZlcjsKLQkKLQlwdWJsaWMgU2VyaWFsaXplcihpbnQgc2l6ZSl7Ci0JCV9idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNpemUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwdXQoYm9vbGVhbiBib29sKXsKLQkJX2J1ZmZlci5hcHBlbmQoYm9vbCA/ICdUJyA6ICdGJyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHB1dChTdHJpbmcgc3RyaW5nKXsKLQkJcHV0KHN0cmluZy5sZW5ndGgoKSk7Ci0JCV9idWZmZXIuYXBwZW5kKHN0cmluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHB1dChpbnQgYW5JbnQpewotCQlTdHJpbmcgcyA9IFN0cmluZy52YWx1ZU9mKGFuSW50KTsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCV9idWZmZXIuYXBwZW5kKGxlbi0xKTsKLQkJX2J1ZmZlci5hcHBlbmQocyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9TdW1tYXJ5UmVwb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1N1bW1hcnlSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTE5MzMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1N1bW1hcnlSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIHdvcmtiZW5jaCByZXBvcnRlciBieSBjYXB0dXJpbmcgc29tZSBzdW1tYXJ5IGluZm9ybWF0aW9uIGFib3V0IGFueSBhZGRlZAotICogbWVzc2FnZXMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3VtbWFyeVJlcG9ydGVyIGV4dGVuZHMgV29ya2JlbmNoUmVwb3J0ZXIgewotCQotCXByaXZhdGUgaW50IF9zZXZlcml0eUhpZ2g7Ci0JcHJpdmF0ZSBpbnQgX3NldmVyaXR5Tm9ybWFsOwotCXByaXZhdGUgaW50CV9zZXZlcml0eUxvdzsKLQotCXB1YmxpYyBTdW1tYXJ5UmVwb3J0ZXIoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKHByb2plY3QsIG1vbml0b3IpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCXN1cGVyLmFkZE1lc3NhZ2UodmFsaWRhdG9yLCBtZXNzYWdlKTsKLQkJc3dpdGNoIChtZXNzYWdlLmdldFNldmVyaXR5KCkpewotCQljYXNlIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk6IAotCQkJX3NldmVyaXR5SGlnaCsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOiAKLQkJCV9zZXZlcml0eU5vcm1hbCsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOgotCQkJX3NldmVyaXR5TG93Kys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHlIaWdoKCkgewotCQlyZXR1cm4gX3NldmVyaXR5SGlnaDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5Tm9ybWFsKCkgewotCQlyZXR1cm4gX3NldmVyaXR5Tm9ybWFsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHlMb3coKSB7Ci0JCXJldHVybiBfc2V2ZXJpdHlMb3c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9UcmFjaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9UcmFjaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTQ5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVHJhY2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBDb250cm9sIHRoZSB0cmFjaW5nIHRoYXQgdGhpcyBwbHVnLWluIHBlcmZvcm1zLiBUaGlzIGlzIHVzZWQgZm9yIHNlcnZpY2UuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhY2luZyB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRGF0ZUZvcm1hdCBfZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiSEg6bW06c3MuU1NTUyIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbglfaXNMb2dnaW5nID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5pc0RlYnVnZ2luZygpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4JX3RyYWNlTWF0Y2hlcyA9IE1pc2MuZGVidWdPcHRpb25Bc0Jvb2xlYW4oRGVidWdDb25zdGFudHMuVHJhY2VNYXRjaGVzKTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuCV90cmFjZVYxID0gTWlzYy5kZWJ1Z09wdGlvbkFzQm9vbGVhbihEZWJ1Z0NvbnN0YW50cy5UcmFjZVYxKTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcJCV9leHRyYVZhbERldGFpbCA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERlYnVnQ29uc3RhbnRzLkV4dHJhVmFsRGV0YWlsKTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgCQlfdHJhY2luZ0xldmVsOwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZwkJX2ZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERlYnVnQ29uc3RhbnRzLkZpbHRlckFsbEV4Y2VwdCk7Ci0JCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHRyYWNlTGV2ZWwgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihEZWJ1Z0NvbnN0YW50cy5UcmFjZUxldmVsKTsKLQkJaW50IGxldmVsID0gMDsKLQkJaWYgKHRyYWNlTGV2ZWwgIT0gbnVsbCl7Ci0JCQl0cnkgewotCQkJCWxldmVsID0gSW50ZWdlci5wYXJzZUludCh0cmFjZUxldmVsKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQl9Ci0JCX0KLQkJX3RyYWNpbmdMZXZlbCA9IGxldmVsOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgZmlsdGVycyBhbGxvdyB0aGlzIHZhbGlkYXRvciB0byBiZSBlbmFibGVkLiBOb3JtYWxseSB0aGlzIG1ldGhvZCB3aWxsIGFuc3dlciB0cnVlLgotCSAqIEl0IGlzIG9ubHkgd2hlbiBmaWx0ZXJzIGFyZSBhY3RpdmF0ZWQgdmlhIHRoZSBkZWJ1Z2dpbmcgb3B0aW9ucywgdGhhdCB0aGlzIG1ldGhvZCBtaWdodCByZXR1cm4gZmFsc2UuCi0JICogVGhpcyBpcyB1c2VkIHRvIGFpZCBpbiBkZWJ1Z2dpbmcgYnkgbWFraW5nIGl0IGxvb2sgbGlrZSBvbmx5IG9uZSB2YWxpZGF0b3IgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsaWRhdG9ySWQgdGhlIHZhbGlkYXRvciBpZC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgcmVnaXN0ZXJlZCB2aWEgYW4gZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIHZhbGlkYXRvcklkKXsKLQkJaWYgKF9maWx0ZXIgPT0gbnVsbCB8fCBfZmlsdGVyLmxlbmd0aCgpID09IDApcmV0dXJuIHRydWU7Ci0JCXJldHVybiAoX2ZpbHRlci5lcXVhbHModmFsaWRhdG9ySWQpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBBcmUgd2UgaW4gbG9nZ2luZy9kZWJ1Z2dpbmcgbW9kZT8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2dnaW5nKCl7Ci0JCXJldHVybiBfaXNMb2dnaW5nOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB3ZSBhcmUgaW4gbG9nZ2luZyBtb2RlLCBhbmQgaWYgdGhlIGN1cnJlbnQgbG9nZ2luZyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gb3IKLQkgKiBlcXVhbCB0byBsZXZlbC4KLQkgKiBAcGFyYW0gbGV2ZWwgVGhlIGxvZ2dpbmcgbGV2ZWwgdGhhdCB3ZSBhcmUgdGVzdGluZy4gVGhlIGhpZ2hlciB0aGUgbGV2ZWwgdGhlIG1vcmUgdmVyYm9zZQotCSAqIHRoZSB0cmFjaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvZ2dpbmcoaW50IGxldmVsKXsKLQkJaWYgKF9pc0xvZ2dpbmcpewotCQkJcmV0dXJuIF90cmFjaW5nTGV2ZWwgPj0gbGV2ZWw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjZU1hdGNoZXMoKXsKLQkJcmV0dXJuIF90cmFjZU1hdGNoZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNlVjEoKXsKLQkJcmV0dXJuIF90cmFjZVYxOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlc0V4dHJhRGV0YWlsKFN0cmluZyB2YWxpZGF0b3JJZCl7Ci0JCWlmIChfZXh0cmFWYWxEZXRhaWwgPT0gbnVsbClyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBfZXh0cmFWYWxEZXRhaWwuZXF1YWxzKHZhbGlkYXRvcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIGxpbmUgdG8gdGhlIGNvbnNvbGUgZm9yIGRlYnVnZ2luZywgaWYgaW4gZGVidWdnaW5nIG1vZGUuCi0JICogQHBhcmFtIGxpbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBsaW5lKXsKLQkJaWYgKGlzTG9nZ2luZygpKXdyaXRlKGxpbmUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKE9iamVjdC4uLiBwYXJ0cyl7Ci0JCWlmIChpc0xvZ2dpbmcoKSl7Ci0JCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjAwKTsKLQkJCWZvciAoT2JqZWN0IHAgOiBwYXJ0cyliLmFwcGVuZChwKTsKLQkJCXdyaXRlKGIudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIGxpbmUgdG8gdGhlIGxvZy4gSW5jbHVkZSBhIHRpbWUgc3RhbXAgd2l0aCB0aGUgbGluZS4KLQkgKiBAcGFyYW0gbGluZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShTdHJpbmcgbGluZSl7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbih0aW1lc3RhbXBJdChsaW5lKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGltZXN0YW1wSXQoU3RyaW5nIGxpbmUpewotCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotCQlTdHJpbmcgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBfZGYuZm9ybWF0KGRhdGUpICsgIiAiICsgdGhyZWFkICsgIiAiICsgbGluZTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCQkKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBhcmUgaW4gbG9nZ2luZyBtb2RlLCBsb2cgdGhlIGl0ZW0sIGFuZCB0aGVuIHJlc2V0IHRoZSBzdHJpbmcgYnVmZmVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nQnVmZmVyIGIpewotCQlsb2coYi50b1N0cmluZygpKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZG9lc24ndCBkbyBhbnl0aGluZywgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb3JjZUxvZ2dpbmcoYm9vbGVhbiBmb3JjZUxvZ2dpbmcpIHsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHVwIHRvIG1heE51bWJlciBkZWx0YXMgdG8gdGhlIGxvZy4KLQkgKiBAcGFyYW0gZGVsdGEgVGhlIGRlbHRhcyB0byBsb2cuCi0JICogQHBhcmFtIG1heE51bWJlciBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGVsdGFzIHRvIGxvZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nUmVzb3VyY2VEZWx0YXMoSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBtYXhOdW1iZXIpewotCQlpZiAoIWlzTG9nZ2luZygpKXJldHVybjsKLQkJaWYgKGRlbHRhID09IG51bGwpVHJhY2luZy5sb2coIiAgUmVzb3VyY2VEZWx0YTogbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJRGVsdGFMb2dnZXIgbG9nZ2VyID0gbmV3IERlbHRhTG9nZ2VyKG1heE51bWJlcik7Ci0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdChsb2dnZXIpOwotCQkJCWlmIChsb2dnZXIuZ2V0Q291bnQoKSA9PSAwKVRyYWNpbmcubG9nKCIgIFJlc291cmNlRGVsdGE6IG5vIGRlbHRhcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCQkvLyBlYXQgaXQKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBIGRlYnVnZ2luZyBjbGFzcyB0aGF0IHByaW50cyBvdXQgc29tZSByZXNvdXJjZSBkZWx0YSdzLgotCSAqIEBhdXRob3Iga2FyYXNpdWsKLQkgKgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIERlbHRhTG9nZ2VyIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgaW50IAlfbWF4OwotCQlwcml2YXRlIGludCAJCV9jb3VudDsKLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiBfY291bnQ7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZ0J1ZmZlciBfYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjAwKTsKLQkJCi0JCXB1YmxpYyBEZWx0YUxvZ2dlcihpbnQgbWF4KXsKLQkJCV9tYXggPSBtYXg7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKF9jb3VudCsrID4gX21heClyZXR1cm4gZmFsc2U7Ci0JCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCVN0cmluZyB0eXBlID0gInVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCQlzd2l0Y2ggKGtpbmQpewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQl0eXBlID0gIkFkZGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCXR5cGUgPSAiQ2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKLQkJCQl0eXBlID0gIlJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7CQkJCQotCQkJfQotCQkJX2IuYXBwZW5kKCIgIFJlc291cmNlRGVsdGEgIik7IC8vJE5PTi1OTFMtMSQKLQkJCV9iLmFwcGVuZCh0eXBlKTsKLQkJCV9iLmFwcGVuZCgnICcpOwotCQkJX2IuYXBwZW5kKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJVHJhY2luZy5sb2coX2IpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxCdWlsZGVySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxCdWlsZGVySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYWZlZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsQnVpbGRlckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uRGVwZW5kZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uRnJpZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklEZXBlbmRlbmN5SW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5JVmFsaWRhdG9yVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogUnVuIGFsbCB0aGUgdjIgdmFsaWRhdG9ycyB0aHJvdWdoIHRoaXMgam9iLgotICogPHA+Ci0gKiBUaGlzIGlzIHRoZSBtYWluIGNsYXNzIGZvciBzdXBwb3J0aW5nIGJ1aWxkIGJhc2VkIHZhbGlkYXRpb24uIFdoZW4gdHJpZ2dlcmVkIGl0IGxvb2tzIGF0IGFsbCBvZiB0aGUKLSAqIHJlc291cmNlIGNoYW5nZXMgYW5kIGRldGVybWluZXMgd2hhdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQuIAotICogPC9wPgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbEJ1aWxkZXJKb2IgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IgewotCQotCXByaXZhdGUgc3RhdGljIFZhbEJ1aWxkZXJKb2IgX2pvYjsKLQlwcml2YXRlIHN0YXRpYyBRdWV1ZTxWYWxpZGF0aW9uUmVxdWVzdD4gX3dvcmsgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0aW9uUmVxdWVzdD4oKTsKLQkKLQlwcml2YXRlIGZpbmFsIFZhbE9wZXJhdGlvbiBfb3BlcmF0aW9uID0gbmV3IFZhbE9wZXJhdGlvbigpOwotCQkKLQkvKiogVGhlIHR5cGVzIG9mIGNoYW5nZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4uICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50CUludGVyZXN0ZWRGbGFncyA9IElSZXNvdXJjZURlbHRhLkNPTlRFTlQgfCBJUmVzb3VyY2VEZWx0YS5FTkNPRElORyB8Ci0JCUlSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00gfCBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTzsKLQkKLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHZhbGlkYXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IGJ1aWxkS2luZCl7Ci0JCVZhbGlkYXRpb25SZXF1ZXN0IHJlcXVlc3QgPSBuZXcgVmFsaWRhdGlvblJlcXVlc3QocHJvamVjdCwgZGVsdGEsIGJ1aWxkS2luZCk7Ci0JCWlmIChfam9iID09IG51bGwpewotCQkJX2pvYiA9IG5ldyBWYWxCdWlsZGVySm9iKCk7Ci0JCQlfam9iLmFkZChyZXF1ZXN0KTsKLQkJCV9qb2Iuc2NoZWR1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCV9qb2IuYWRkKHJlcXVlc3QpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBWYWxpZGF0aW9uUmVxdWVzdCBnZXRSZXF1ZXN0KCl7Ci0JCVZhbGlkYXRpb25SZXF1ZXN0IHJlcXVlc3QgPSBfd29yay5wb2xsKCk7Ci0JCWlmIChyZXF1ZXN0ID09IG51bGwpewotCQkJX2pvYiA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCQotCS8qKgotCSAqIEVhY2ggdmFsaWRhdGlvbiBydW4gaXMgZG9uZSBpbiBpdCdzIG93biBqb2IuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyB2YWxpZGF0ZWQKLQkgKiBAcGFyYW0gZGVsdGEgdGhlIGRlbHRhIHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLiBUaGlzIG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIHdlIGRvIGEgCi0JICogZnVsbCB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBidWlsZEtpbmQgdGhlIGtpbmQgb2YgYnVpbGQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyI0FVVE9fQlVJTEQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjQ0xFQU5fQlVJTEQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjRlVMTF9CVUlMRAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciNJTkNSRU1FTlRBTF9CVUlMRAotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24gc29tZSBnbG9iYWwgY29udGV4dCBmb3IgdGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBWYWxCdWlsZGVySm9iKCl7Ci0JCXN1cGVyKFZhbE1lc3NhZ2VzLkpvYk5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkKFZhbGlkYXRpb25SZXF1ZXN0IHJlcXVlc3QpewotCQlfd29yay5hZGQocmVxdWVzdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCWlmIChmYW1pbHkgPT0gUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpcmV0dXJuIHRydWU7Ci0JCWlmIChmYW1pbHkgPT0gVmFsaWRhdGlvbkJ1aWxkZXIuRkFNSUxZX1ZBTElEQVRJT05fSk9CKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQkKLQkJcmV0dXJuIHN1cGVyLmJlbG9uZ3NUbyhmYW1pbHkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlUcmFjaW5nLmxvZygiVmFsQnVpbGRlckpvYi0wMTogU3RhcnRpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdHJ5IHsKLQkJCXN0YXJ0aW5nVmFsaWRhdGlvbihtb25pdG9yKTsKLQkJCQotCQkJVmFsaWRhdGlvblJlcXVlc3QgcmVxdWVzdCA9IGdldFJlcXVlc3QoKTsKLQkJCXdoaWxlKHJlcXVlc3QgIT0gbnVsbCl7Ci0JCQkJcnVuKHJlcXVlc3QsIG1vbml0b3IpOwotCQkJCXJlcXVlc3QgPSBnZXRSZXF1ZXN0KCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlmaW5pc2hpbmdWYWxpZGF0aW9uKG1vbml0b3IpOwotCQl9Ci0JCQotCQlUcmFjaW5nLmxvZygiVmFsQnVpbGRlckpvYi0wMjogRmluaXNoZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRpbmdWYWxpZGF0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBJVmFsaWRhdG9yVmlzaXRvciBzdGFydGluZ1Zpc2l0b3IgPSBuZXcgSVZhbGlkYXRvclZpc2l0b3IoKXsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsVHlwZSB2YWxUeXBlLCAKLSAgICAgICAgICAgICAgICBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGlvblN0YXJ0aW5nKHByb2plY3QsIG9wZXJhdGlvbi5nZXRTdGF0ZSgpLCBtb25pdG9yKTsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgIH07Ci0KLSAgICAgICAgVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuYWNjZXB0KHN0YXJ0aW5nVmlzaXRvciwgbnVsbCwgVmFsVHlwZS5CdWlsZCwgZ2V0T3BlcmF0aW9uKCksIG1vbml0b3IpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmluaXNoaW5nVmFsaWRhdGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlWYWxpZGF0b3JWaXNpdG9yIGZpbmlzaGVkVmlzaXRvciA9IG5ldyBJVmFsaWRhdG9yVmlzaXRvcigpewotCi0JCSAgICBwdWJsaWMgdm9pZCB2aXNpdChWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxUeXBlIHZhbFR5cGUsCi0JCSAgICAgIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCSAgICAgIHZhbGlkYXRvci52YWxpZGF0aW9uRmluaXNoaW5nKHByb2plY3QsIG9wZXJhdGlvbi5nZXRTdGF0ZSgpLCBtb25pdG9yKTsgICAgICAgICAgICAgIAotCQkgICAgfSAgICAgICAgICAgCi0JCSAgfTsKLQkJICBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5hY2NlcHQoZmluaXNoZWRWaXNpdG9yLCBudWxsLCBWYWxUeXBlLkJ1aWxkLCBnZXRPcGVyYXRpb24oKSwgbW9uaXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJ1bihWYWxpZGF0aW9uUmVxdWVzdCByZXF1ZXN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlzZXROYW1lKFZhbE1lc3NhZ2VzLkpvYk5hbWUgKyAiICIgKyByZXF1ZXN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7CQkKLQkgICAgICAgIElWYWxpZGF0b3JWaXNpdG9yIHN0YXJ0aW5nVmlzaXRvciA9IG5ldyBJVmFsaWRhdG9yVmlzaXRvcigpewotCi0JICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsVHlwZSB2YWxUeXBlLCAKLQkgICAgICAgICAgICAgICAgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JICAgICAgICAgICAgICAgIAotCSAgICAgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGlvblN0YXJ0aW5nKHByb2plY3QsIG9wZXJhdGlvbi5nZXRTdGF0ZSgpLCBtb25pdG9yKTsgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAotCSAgICAgICAgfTsKLQotCSAgICAgICAgVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuYWNjZXB0KHN0YXJ0aW5nVmlzaXRvciwgcmVxdWVzdC5nZXRQcm9qZWN0KCksIFZhbFR5cGUuQnVpbGQsIGdldE9wZXJhdGlvbigpLCBtb25pdG9yKTsKLQkJICAKLQkJCWlmIChyZXF1ZXN0LmdldERlbHRhKCkgPT0gbnVsbClmdWxsQnVpbGQocmVxdWVzdCwgbW9uaXRvcik7Ci0JCQllbHNlIGRlbHRhQnVpbGQocmVxdWVzdCwgbW9uaXRvcik7Ci0KLQkJCQotCQl9Ci0JCWNhdGNoIChQcm9qZWN0VW5hdmFpbGFibGVFcnJvciBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlUHJvamVjdFVuYXZhaWxhYmxlRXJyb3IoZSk7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlVW5hdmFpbGFibGVFcnJvciBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCSAgSVZhbGlkYXRvclZpc2l0b3IgZmluaXNoZWRWaXNpdG9yID0gbmV3IElWYWxpZGF0b3JWaXNpdG9yKCl7Ci0KLQkJICAgIHB1YmxpYyB2b2lkIHZpc2l0KFZhbGlkYXRvciB2YWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbFR5cGUgdmFsVHlwZSwKLQkJICAgICAgVmFsT3BlcmF0aW9uIG9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJICAgICAgdmFsaWRhdG9yLnZhbGlkYXRpb25GaW5pc2hpbmcocHJvamVjdCwgb3BlcmF0aW9uLmdldFN0YXRlKCksIG1vbml0b3IpOyAgICAgICAgICAgICAgCi0JCSAgICB9ICAgICAgICAgICAKLQkJICB9OwotICAgICAgICAgIFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmFjY2VwdChmaW5pc2hlZFZpc2l0b3IsIHJlcXVlc3QuZ2V0UHJvamVjdCgpLCBWYWxUeXBlLkJ1aWxkLCBnZXRPcGVyYXRpb24oKSwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbHRhQnVpbGQoVmFsaWRhdGlvblJlcXVlc3QgcmVxdWVzdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlQ291bnRlciBjb3VudGVyID0gbmV3IFJlc291cmNlQ291bnRlcigpOwotCQlyZXF1ZXN0LmdldERlbHRhKCkuYWNjZXB0KGNvdW50ZXIpOwotCQlTdWJNb25pdG9yIHN1Yk1vbml0b3IgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgY291bnRlci5nZXRDb3VudCgpKTsKLQkJVmlzaXRvciB2aXN0aXRvciA9IG5ldyBWaXNpdG9yKHJlcXVlc3QsIHN1Yk1vbml0b3IsIG1vbml0b3IsIGdldE9wZXJhdGlvbigpKTsKLQkJcmVxdWVzdC5nZXREZWx0YSgpLmFjY2VwdCh2aXN0aXRvcik7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZnVsbEJ1aWxkKFZhbGlkYXRpb25SZXF1ZXN0IHJlcXVlc3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZUNvdW50ZXIgY291bnRlciA9IG5ldyBSZXNvdXJjZUNvdW50ZXIoKTsKLQkJcmVxdWVzdC5nZXRQcm9qZWN0KCkuYWNjZXB0KGNvdW50ZXIsIDApOwotCQlTdWJNb25pdG9yIHN1Yk1vbml0b3IgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgY291bnRlci5nZXRDb3VudCgpKTsKLQkJVmlzaXRvciB2aXN0aXRvciA9IG5ldyBWaXNpdG9yKHJlcXVlc3QsIHN1Yk1vbml0b3IsIG1vbml0b3IsIGdldE9wZXJhdGlvbigpKTsKLQkJcmVxdWVzdC5nZXRQcm9qZWN0KCkuYWNjZXB0KHZpc3RpdG9yKTsKLQkJCi0JfQotCQotCXByaXZhdGUgVmFsT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpewotCQlyZXR1cm4gX29wZXJhdGlvbjsKLQl9Ci0KLQlzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VDb3VudGVyIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkKLQkJcHJpdmF0ZSBpbnQgX2NvdW50OwotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCQlyZXR1cm4gX2NvdW50OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCV9jb3VudCsrOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJX2NvdW50Kys7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JfQotCQotCXN0YXRpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uUmVxdWVzdCB7Ci0JCS8qKiBUaGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIGJ1aWx0LiAqLwotCQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IAkJCV9wcm9qZWN0OwotCQkKLQkJLyoqIFRoZSByZXNvdXJjZSBkZWx0YSB0aGF0IHRyaWdnZXJlZCB0aGUgYnVpbGQsIGl0IHdpbGwgYmUgbnVsbCBmb3IgYSBmdWxsIGJ1aWxkLiAqLwotCQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZURlbHRhCV9kZWx0YTsKLQkJCi0JCS8qKiAKLQkJICogVGhlIGtpbmQgb2YgYnVpbGQuCi0JCSAqIAotCQkgKiAgQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIGludAkJCQkJX2J1aWxkS2luZDsKLQkJCi0JCXB1YmxpYyBWYWxpZGF0aW9uUmVxdWVzdChJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IGJ1aWxkS2luZCl7Ci0JCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JCQlfZGVsdGEgPSBkZWx0YTsKLQkJCV9idWlsZEtpbmQgPSBidWlsZEtpbmQ7Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCXJldHVybiBfcHJvamVjdDsKLQkJfQotCi0JCXB1YmxpYyBJUmVzb3VyY2VEZWx0YSBnZXREZWx0YSgpIHsKLQkJCXJldHVybiBfZGVsdGE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEJ1aWxkS2luZCgpIHsKLQkJCXJldHVybiBfYnVpbGRLaW5kOwotCQl9Ci0JfQotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIFZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IsIElSZXNvdXJjZVZpc2l0b3J7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFZhbGlkYXRpb25SZXF1ZXN0IAlfcmVxdWVzdDsKLQkJcHJpdmF0ZSBmaW5hbCBTdWJNb25pdG9yIAkJCV9zdWJNb25pdG9yOwotCQlwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgCQlfbW9uaXRvcjsKLQkJcHJpdmF0ZSBmaW5hbCBWYWxPcGVyYXRpb24JCQlfb3BlcmF0aW9uOwotCQkKLQkJcHVibGljIFZpc2l0b3IoVmFsaWRhdGlvblJlcXVlc3QgcmVxdWVzdCwgU3ViTW9uaXRvciBzdWJNb25pdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24pewotCQkJX3JlcXVlc3QgPSByZXF1ZXN0OwotCQkJX3N1Yk1vbml0b3IgPSBzdWJNb25pdG9yOwotCQkJX21vbml0b3IgPSBtb25pdG9yOwotCQkJX29wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCWlmIChEaXNhYmxlZFJlc291cmNlTWFuYWdlci5nZXREZWZhdWx0KCkuaXNEaXNhYmxlZChyZXNvdXJjZSkpewotCQkJCQlNYXJrZXJNYW5hZ2VyLmdldERlZmF1bHQoKS5kZWxldGVNYXJrZXJzKHJlc291cmNlLCBfb3BlcmF0aW9uLmdldFN0YXJ0ZWQoKSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS52YWxpZGF0ZShfcmVxdWVzdC5nZXRQcm9qZWN0KCksIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UsIFZhbFR5cGUuQnVpbGQsIAotCQkJCQlfcmVxdWVzdC5nZXRCdWlsZEtpbmQoKSwgX29wZXJhdGlvbiwgX3N1Yk1vbml0b3IubmV3Q2hpbGQoMSkpOwotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlVW5hdmFpbGFibGVFcnJvciBlKXsKLQkJCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSlUcmFjaW5nLmxvZygiVmFsQnVpbGRlckpvYi0wMjogIiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAoRGlzYWJsZWRSZXNvdXJjZU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmlzRGlzYWJsZWQocmVzb3VyY2UpKXsKLQkJCQlNYXJrZXJNYW5hZ2VyLmdldERlZmF1bHQoKS5kZWxldGVNYXJrZXJzKHJlc291cmNlLCBfb3BlcmF0aW9uLmdldFN0YXJ0ZWQoKSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCWJvb2xlYW4gaXNDaGFuZ2VkID0gKGtpbmQgJiBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSAhPSAwOwotCQkJaWYgKGlzQ2hhbmdlZCAmJiAgKGRlbHRhLmdldEZsYWdzKCkgJiBJbnRlcmVzdGVkRmxhZ3MpID09IDApcmV0dXJuIHRydWU7Ci0JCQkKLQkJCWlmICgoa2luZCAmIChJUmVzb3VyY2VEZWx0YS5BRERFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpKSAhPSAwKXsKLQkJCQlWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS52YWxpZGF0ZShfcmVxdWVzdC5nZXRQcm9qZWN0KCksIHJlc291cmNlLCBkZWx0YS5nZXRLaW5kKCksIFZhbFR5cGUuQnVpbGQsIAotCQkJCQlfcmVxdWVzdC5nZXRCdWlsZEtpbmQoKSwgX29wZXJhdGlvbiwgX3N1Yk1vbml0b3IubmV3Q2hpbGQoMSkpOwotCQkJfQotCQkJCQkKLQkJCUlEZXBlbmRlbmN5SW5kZXggaW5kZXggPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXREZXBlbmRlbmN5SW5kZXgoKTsKLQkJCWlmIChpbmRleC5pc0RlcGVuZGVkT24ocmVzb3VyY2UpKXsKLQkJCQlNYXJrZXJNYW5hZ2VyIG1tID0gTWFya2VyTWFuYWdlci5nZXREZWZhdWx0KCk7Ci0JCQkJZm9yIChEZXBlbmRlbnRSZXNvdXJjZSBkciA6IGluZGV4LmdldChyZXNvdXJjZSkpewotCQkJCQlWYWxpZGF0b3IgdmFsID0gZHIuZ2V0VmFsaWRhdG9yKCk7Ci0JCQkJCWlmIChGcmllbmQuc2hvdWxkVmFsaWRhdGUodmFsLCBkci5nZXRSZXNvdXJjZSgpLCBWYWxUeXBlLkJ1aWxkLCBuZXcgQ29udGVudFR5cGVXcmFwcGVyKCkpKXsKLQkJCQkJCV9vcGVyYXRpb24uZ2V0U3RhdGUoKS5wdXQoVmFsaWRhdGlvblN0YXRlLlRyaWdnZXJSZXNvdXJjZSwgcmVzb3VyY2UpOwotCQkJCQkJVmFsaWRhdGlvbkV2ZW50IGV2ZW50ID0gbmV3IFZhbGlkYXRpb25FdmVudChkci5nZXRSZXNvdXJjZSgpLCBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UsIGRlbHRhKTsKLQkJCQkJCWlmICh2YWwuc2hvdWxkQ2xlYXJNYXJrZXJzKGV2ZW50KSltbS5jbGVhck1hcmtlcihkci5nZXRSZXNvdXJjZSgpLCB2YWwpOyAKLQkJCQkJCVZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLnZhbGlkYXRlKHZhbCwgX29wZXJhdGlvbiwgZHIuZ2V0UmVzb3VyY2UoKSwgCi0JCQkJCQkJSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFLCBfbW9uaXRvciwgZXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCQkKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJhZWJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsQ29uc3RhbnRzIHsKLQkvKiogcHJvYmxlbSBtYXJrZXIgZm9yIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuICovCi0JU3RyaW5nIFByb2JsZW1NYXJrZXIgPSAgVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQgKyIucHJvYmxlbW1hcmtlcjIiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmYzc4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkZyaWVuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklWYWxpZGF0b3JHcm91cExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlBlcmZvcm1hbmNlQ291bnRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLklWYWxpZGF0b3JWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLlByb2plY3RQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLk1hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQSBjZW50cmFsIHBsYWNlIHRvIGtlZXAgdHJhY2sgb2YgYWxsIHRoZSB2YWxpZGF0b3JzLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbE1hbmFnZXIgaW1wbGVtZW50cyBJVmFsQ2hhbmdlZExpc3RlbmVyLCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciwgSVByb2plY3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogUHJvamVjdHMgbWF5IGJlIGFsbG93ZWQgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHNldHRpbmdzLiBJZiB0aGF0IGlzIHRoZSBjYXNlIHRoZW4gdGhvc2UKLQkgKiBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzIGFyZSBzYXZlZCBoZXJlLiBJZiB0aGUga2V5IGV4aXN0cywgYnV0IHRoZSB2YWx1ZSBpcyBudWxsLCB0aGVuIHRoYXQKLQkgKiBtZWFucyB0aGF0IHRoZSBwcm9qZWN0IGhhcyBiZWVuIGNoZWNrZWQgYW5kIGl0IGRvZXMgbm90IGhhdmUgYW55IHNwZWNpZmljIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwPElQcm9qZWN0LCBQcm9qZWN0UHJlZmVyZW5jZXM+IF9wcm9qZWN0UHJlZmVyZW5jZXMgPSAKLQkJQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPElQcm9qZWN0LCBQcm9qZWN0UHJlZmVyZW5jZXM+KDUwKSk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8R2xvYmFsUHJlZmVyZW5jZXM+IF9nbG9iYWxQcmVmZXJlbmNlcyA9IG5ldyBBdG9taWNSZWZlcmVuY2U8R2xvYmFsUHJlZmVyZW5jZXM+KCk7Ci0JCQotCS8qKgotCSAqIFRoaXMgbnVtYmVyIGluY3JlYXNlcyBlYWNoIHRpbWUgYW55IG9mIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25zIGNoYW5nZS4gSXQgaXMgdXNlZCB0byBkZXRlcm1pbmUKLQkgKiBpZiBpbmZvcm1hdGlvbiB0aGF0IHdlIGhhdmUgY2FjaGVkIGluIHRoZSBWYWxQcm9wZXJ0eSBpcyBzdGFsZSBvciBub3QuIFRoaXMgc3RhcnRzIG9mZiBhdCB6ZXJvLCBlYWNoIHRpbWUKLQkgKiB0aGUgd29ya2JlbmNoIGlzIHN0YXJ0ZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIF9jb25maWdOdW1iZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOwotCQotCXByaXZhdGUgZmluYWwgVmFsaWRhdG9ySWRNYW5hZ2VyIF9pZE1hbmFnZXIgPSBuZXcgVmFsaWRhdG9ySWRNYW5hZ2VyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBWYWxpZGF0b3JDYWNoZSAJX2NhY2hlID0gbmV3IFZhbGlkYXRvckNhY2hlKCk7Ci0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgU3RhdHVzQnVpbGQgPSBuZXcgUXVhbGlmaWVkTmFtZShWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCwgInNiIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFN0YXR1c01hbnVhbCA9IG5ldyBRdWFsaWZpZWROYW1lKFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lELCAic20iKTsgLy8kTk9OLU5MUy0xJAotCi0JCi0JcHVibGljIHN0YXRpYyBWYWxNYW5hZ2VyIGdldERlZmF1bHQoKXsKLQkJcmV0dXJuIFNpbmdsZXRvbi52YWxNYW5hZ2VyOwotCX0KLQkKLQlwcml2YXRlIFZhbE1hbmFnZXIoKXsKLQkJVmFsUHJlZk1hbmFnZXJHbG9iYWwuZ2V0RGVmYXVsdCgpLmFkZExpc3RlbmVyKHRoaXMpOwotCQlWYWxQcmVmTWFuYWdlclByb2plY3QuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRCk7Ci0JCUV2ZW50TWFuYWdlci5nZXRNYW5hZ2VyKCkuYWRkUHJvamVjdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBpZiB0aGUgVmFsTWFuYWdlciBpcyBldmVyIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpewotCQkvLyBjdXJyZW50bHkgbm9ib2R5IGNhbGxzIHRoaXMgbWV0aG9kLCBiZWNhdXNlIHRoaXMgaW5zdGFuY2UgaXMgbmV2ZXIgcmVtb3ZlZCwgYnV0IHRoZSBtZXRob2QgaXMKLQkJLy8gaGVyZSBmb3IgY29tcGxldGVuZXNzIG5vbmUgdGhlIGxlc3MuCi0JCVZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQlGYWNldGVkUHJvamVjdEZyYW1ld29yay5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJRXZlbnRNYW5hZ2VyLmdldE1hbmFnZXIoKS5yZW1vdmVQcm9qZWN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7CQotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMuIElmIHlvdSBhcmUgcGxhbm5pbmcgb24gbWFraW5nIGNoYW5nZXMgdG8gdGhlIHZhbGlkYXRvcnMsCi0JICogYW5kIHRoZW4gc2F2aW5nIHRoZW0gaW4gYSBwcmVmZXJlbmNlIHN0b3JlIHRoZW4geW91IHByb2JhYmx5IHdhbnQgdGhlIGdldFZhbGlkYXRvcnNDb3B5IG1ldGhvZC4KLQkgKiBCZWNhdXNlIGlmIHlvdSBtYWtlIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIHZhbGlkYXRvcnMsIGFuZCBzaW5jZSB3ZSBvbmx5IHNhdmUgZGlmZmVyZW5jZXMsCi0JICogdGhlcmUgd29uJ3QgYmUgYW55IGRpZmZlcmVuY2VzLiAKLQkgKiAKLQkgKiBAcmV0dXJuIEFuc3dlciB0aGUgdmFsaWRhdG9ycyBpbiBuYW1lIHNvcnRlZCBvcmRlci4gQW5zd2VyIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0b3JzLgotCSAqIAotCSAqIEBzZWUgI2dldFZhbGlkYXRvcnNDb3B5KCkKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yW10gZ2V0VmFsaWRhdG9ycygpewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9ycyhudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGNvcGllcyBvZiBhbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycy4gSWYgeW91IGFyZSBnb2luZyB0byBiZSBtYWtpbmcgY2hhbmdlcyB0byB0aGUgdmFsaWRhdG9ycwotCSAqIGFuZCB0aGVuIHNhdmluZyB0aGVtIGJhY2tpbmcgaW50byB0aGUgcHJlZmVyZW5jZSBzdG9yZSwgdGhlbiB0aGlzIGlzIHRoZSBtZXRob2QgdG8gdXNlLgotCSAqIAotCSAqIEByZXR1cm4gQW5zd2VyIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzQ29weSgpewotCQlWYWxpZGF0b3JbXSBvcmlnID0gZ2V0VmFsaWRhdG9ycygpOwotCQlWYWxpZGF0b3JbXSBjb3B5ID0gbmV3IFZhbGlkYXRvcltvcmlnLmxlbmd0aF07Ci0JCWZvciAoaW50IGk9MDsgaTxvcmlnLmxlbmd0aDsgaSsrKWNvcHlbaV0gPSBvcmlnW2ldLmNvcHkoKTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbGwgdGhlIHZhbGlkYXRvcnMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIDxwPgotCSAqIEluZGl2aWR1YWwgcHJvamVjdHMgbWF5IG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlCi0JICogc2V0dGluZ3MuIElmIHRoZSBwcm9qZWN0IGhhcyBpdCdzIG93biBzZXR0aW5ncywgdGhlbiB0aG9zZSB2YWxpZGF0b3JzIGFyZQotCSAqIHJldHVybmVkIHZpYSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBhcHByb2FjaCBpcyB1c2VkLiBGb3IgdmVyc2lvbiAxIHZhbGlkYXRvcnMsIHRoZSB2YWxpZGF0b3IKLQkgKiBpcyBvbmx5IHJldHVybmVkIGlmIGl0IGlzIGRlZmluZWQgdG8gb3BlcmF0ZSBvbiB0aGlzIHByb2plY3QgdHlwZS4gVGhpcwotCSAqIGlzIHRoZSB3YXkgdGhhdCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrIGRpZCBpdC4gRm9yIHZlcnNpb24KLQkgKiAyIHZhbGlkYXRvcnMsIHRoZXkgYXJlIGFsbCByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoaXMgbWF5IGJlIG51bGwsIGluIHdoaWNoIGNhc2UgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyBhcmUKLQkgKiAgICAgICAgICAgIHJldHVybmVkLgotCSAqIEBwYXJhbSByZXNwZWN0T3ZlcnJpZGVTZXR0aW5ncwotCSAqICAgICAgICAgICAgaWYgdGhpcyBpcyB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvcnMgdGhhdCBnZXQgcmV0dXJuZWQgYXJlCi0JICogICAgICAgICAgICBiYXNlZCBvbiB0aGUgb3ZlcnJpZGUgc2V0dGluZ3MuIFNvIGZvciBleGFtcGxlLCBpZiB0aGUgZ2xvYmFsCi0JICogICAgICAgICAgICBwcmVmZXJlbmNlcyBkbyBub3QgYWxsb3cgcHJvamVjdCBvdmVycmlkZXMgdGhlbiBub25lIG9mIHRoZQotCSAqICAgICAgICAgICAgcHJvamVjdCBzZXR0aW5ncyBhcmUgdXNlZC4gTm9ybWFsIHZhbGlkYXRpb24gd291bGQgc2V0IHRoaXMgdG8gdHJ1ZS4KLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0aWVzIHBhZ2Ugd291bGQgc2V0IHRoaXMgdG8gZmFsc2UuCi0JICogICAgICAgICAgICAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRWYWxpZGF0b3JzTm90Q2FjaGVkKElQcm9qZWN0KX0gaW5zdGVhZCAgICAgICAgICAgIAotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gcmVzcGVjdE92ZXJyaWRlU2V0dGluZ3MpIHRocm93cyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvciB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3JzKHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYSBjYWNoZWQgY29weSBvZiB0aGUgdGhlIHZhbGlkYXRvcnMgZm9yIGEgZ2l2ZW4gcHJvamVjdC4gVGhpcyBpcyBhIGZyb250IGVuZCBtZXRob2QsIAotCSAqIGZvciB0aGUgZ2V0VmFsaWRhdG9yc05vdENhY2hlZCgpIG1ldGhvZC4KLQkgKiA8cD4KLQkgKiBJbmRpdmlkdWFsIHByb2plY3RzIG1heSBvdmVycmlkZSB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZQotCSAqIHNldHRpbmdzLiBJZiB0aGUgcHJvamVjdCBoYXMgaXQncyBvd24gc2V0dGluZ3MsIHRoZW4gdGhvc2UgdmFsaWRhdG9ycyBhcmUKLQkgKiByZXR1cm5lZCB2aWEgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBmb2xsb3dpbmcgYXBwcm9hY2ggaXMgdXNlZC4gRm9yIHZlcnNpb24gMSB2YWxpZGF0b3JzLCB0aGUgdmFsaWRhdG9yCi0JICogaXMgb25seSByZXR1cm5lZCBpZiBpdCBpcyBkZWZpbmVkIHRvIG9wZXJhdGUgb24gdGhpcyBwcm9qZWN0IHR5cGUuIFRoaXMKLQkgKiBpcyB0aGUgd2F5IHRoYXQgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBkaWQgaXQuIEZvciB2ZXJzaW9uCi0JICogMiB2YWxpZGF0b3JzLCB0aGV5IGFyZSBhbGwgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGlzIG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgYXJlCi0JICogICAgICAgICAgICByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB2YWxpZGF0b3JzIGluIG5hbWUgc29ydGVkIG9yZGVyLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvciB7Ci0JCXJldHVybiBfY2FjaGUuZ2V0VmFsaWRhdG9yc0NhY2hlZChwcm9qZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogPHA+Ci0JICogSW5kaXZpZHVhbCBwcm9qZWN0cyBtYXkgb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2UKLQkgKiBzZXR0aW5ncy4gSWYgdGhlIHByb2plY3QgaGFzIGl0J3Mgb3duIHNldHRpbmdzLCB0aGVuIHRob3NlIHZhbGlkYXRvcnMgYXJlCi0JICogcmV0dXJuZWQgdmlhIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgZm9sbG93aW5nIGFwcHJvYWNoIGlzIHVzZWQuIEZvciB2ZXJzaW9uIDEgdmFsaWRhdG9ycywgdGhlIHZhbGlkYXRvcgotCSAqIGlzIG9ubHkgcmV0dXJuZWQgaWYgaXQgaXMgZGVmaW5lZCB0byBvcGVyYXRlIG9uIHRoaXMgcHJvamVjdCB0eXBlLiBUaGlzCi0JICogaXMgdGhlIHdheSB0aGF0IHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBmcmFtZXdvcmsgZGlkIGl0LiBGb3IgdmVyc2lvbgotCSAqIDIgdmFsaWRhdG9ycywgdGhleSBhcmUgYWxsIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhpcyBtYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGFyZQotCSAqICAgICAgICAgICAgcmV0dXJuZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgdmFsaWRhdG9ycyBpbiBuYW1lIHNvcnRlZCBvcmRlci4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnNOb3RDYWNoZWQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIFByb2plY3RVbmF2YWlsYWJsZUVycm9yIHsKLQkJTWFwPFN0cmluZyxWYWxpZGF0b3I+IHYyVmFscyA9IGdldFYyVmFsaWRhdG9ycyhwcm9qZWN0LCBVc2VQcm9qZWN0UHJlZmVyZW5jZXMuTm9ybWFsKTsKLQkJVHJlZVNldDxWYWxpZGF0b3I+IHNvcnRlZCA9IG5ldyBUcmVlU2V0PFZhbGlkYXRvcj4oKTsKLQkJc29ydGVkLmFkZEFsbCh2MlZhbHMudmFsdWVzKCkpOwotCQkKLQkJdHJ5IHsKLQkJCVZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlpZiAocHJvamVjdCA9PSBudWxsKXsKLQkJCQkvLyBJZiB0aGUgcHJvamVjdCBpcyBudWxsIHdlIG5lZWQgdG8gdXNlIHRoaXMgYXBwcm9hY2gsIHNpbmNlIHlvdSBjYW4gbm90IHVzZSBuZXcgTWFudWFsVmFsaWRhdG9yc09wZXJhdGlvbihudWxsKQotCQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHZjLmdldFZhbGlkYXRvcnMoKTsKLQkJCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpewotCQkJCQlWYWxpZGF0b3IgdiA9IFZhbGlkYXRvci5jcmVhdGUodm1kLCB2YywgcHJvamVjdCk7Ci0JCQkJCXNvcnRlZC5hZGQodik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTWFudWFsVmFsaWRhdG9yc09wZXJhdGlvbiBtdm8gPSBuZXcgTWFudWFsVmFsaWRhdG9yc09wZXJhdGlvbihwcm9qZWN0KTsKLQkJCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHZtZHMgPSBtdm8uZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJCQlmb3IgKFZhbGlkYXRvck1ldGFEYXRhIHZtZCA6IHZtZHMpewotCQkJCQlWYWxpZGF0b3IgdiA9IFZhbGlkYXRvci5jcmVhdGUodm1kLCB2YywgcHJvamVjdCk7Ci0JCQkJCXNvcnRlZC5hZGQodik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JCVZhbGlkYXRvcltdIHZhbHMgPSBuZXcgVmFsaWRhdG9yW3NvcnRlZC5zaXplKCldOwotCQlzb3J0ZWQudG9BcnJheSh2YWxzKTsKLQkJcmV0dXJuIHZhbHM7Ci0JfQotCS8qKgotCSAqIFZhbGlkYXRvcnMgY2FuIHVzZSBwcm9qZWN0IGxldmVsIHNldHRpbmdzIChQcm9qZWN0IG5hdHVyZXMgYW5kIGZhY2V0cykgdG8KLQkgKiBkZXRlcm1pbmUgaWYgdGhleSBhcmUgYXBwbGljYWJsZSB0byB0aGUgcHJvamVjdCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0IHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgYmFzZWQgb24uCi0JICogQHBhcmFtIG11c3RVc2VQcm9qZWN0U2V0dGluZ3MKLQkgKiAgICAgICAgICAgIEZvcmNlIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgdG8gYmUgdXNlZC4gVGhlcmUgaXMgYSBjYXNlIHdoZXJlIHRoZSB1c2VyIGhhcyB0b2dnbGVkIHRoZQotCSAqICAgICAgICAgICAgRW5hYmxlIHByb2plY3Qgc3BlY2lmaWMgc2V0dGluZ3MgY2hlY2tib3ggaW4gdGhlIGRpYWxvZywgYnV0IGhhcyBub3QgeWV0IGNvbW1pdHRlZCB0aGUKLQkgKiAgICAgICAgICAgIGNoYW5nZXMuIFRoaXMgYWxsb3dzIHRoYXQgc2V0dGluZyB0byBiZSBwYXNzZWQgdGhyb3VnaC4KLQkgKiBAcmV0dXJuIFRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIHRoaXMgcHJvamVjdCBiYXNlZAotCSAqICAgICAgICAgb24gdGhlIHByb2plY3QgbGV2ZWwgc2V0dGluZ3MuIFRoZXNlIGFyZSB0aGUgImxpdmUiIHZhbGlkYXRvcnMsIHRoZXkgYXJlIG5vdCBjb3BpZXMuCi0JICogQHRocm93cyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvcgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QoSVByb2plY3QgcHJvamVjdCwgVXNlUHJvamVjdFByZWZlcmVuY2VzIHVzZVByb2plY3QpCi0JICovCi0JcHVibGljIFZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIG11c3RVc2VQcm9qZWN0U2V0dGluZ3MpIHRocm93cyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvciB7Ci0JCVVzZVByb2plY3RQcmVmZXJlbmNlcyB1c2VQcm9qZWN0ID0gVXNlUHJvamVjdFByZWZlcmVuY2VzLk5vcm1hbDsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdChwcm9qZWN0LCB1c2VQcm9qZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdG9ycyBjYW4gdXNlIHByb2plY3QgbGV2ZWwgc2V0dGluZ3MgKFByb2plY3QgbmF0dXJlcyBhbmQgZmFjZXRzKSB0bwotCSAqIGRldGVybWluZSBpZiB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBwcm9qZWN0IG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBpcyBiYXNlZCBvbi4KLQkgKiBAcGFyYW0gdXNlUHJvamVjdAotCSAqICAgICAgICAgICAgU3BlY2lmaWVzIGhvdyB0byB1c2UgdGhlIHByb2plY3QgcHJlZmVyZW5jZXMuIFRoaXMgY2FuIGJlIHVzZWQKLQkgKiAgICAgICAgICAgIHRvIGZvcmNlIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgdG8gYmUgdXNlZC4gVGhlcmUgaXMgYSBjYXNlCi0JICogICAgICAgICAgICB3aGVyZSB0aGUgdXNlciBoYXMgdG9nZ2xlZCB0aGUgRW5hYmxlIHByb2plY3Qgc3BlY2lmaWMKLQkgKiAgICAgICAgICAgIHNldHRpbmdzIGNoZWNrYm94IGluIHRoZSBkaWFsb2csIGJ1dCBoYXMgbm90IHlldCBjb21taXR0ZWQgdGhlCi0JICogICAgICAgICAgICBjaGFuZ2VzLiBUaGlzIGFsbG93cyB0aGF0IHNldHRpbmcgdG8gYmUgcGFzc2VkIHRocm91Z2guCi0JICogQHJldHVybiBUaGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGlzIHByb2plY3QgYmFzZWQKLQkgKiAgICAgICAgIG9uIHRoZSBwcm9qZWN0IGxldmVsIHNldHRpbmdzLiBUaGVzZSBhcmUgdGhlICJsaXZlIiB2YWxpZGF0b3JzLAotCSAqICAgICAgICAgdGhleSBhcmUgbm90IGNvcGllcy4KLQkgKiBAdGhyb3dzIFByb2plY3RVbmF2YWlsYWJsZUVycm9yCi0JICovCi0JcHVibGljIFZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBVc2VQcm9qZWN0UHJlZmVyZW5jZXMgdXNlUHJvamVjdCkgdGhyb3dzIFByb2plY3RVbmF2YWlsYWJsZUVycm9yIHsKLQkJTWFwPFN0cmluZyxWYWxpZGF0b3I+IHYyVmFscyA9IGdldFYyVmFsaWRhdG9ycyhwcm9qZWN0LCB1c2VQcm9qZWN0KTsKLQkJVHJlZVNldDxWYWxpZGF0b3I+IHNvcnRlZCA9IG5ldyBUcmVlU2V0PFZhbGlkYXRvcj4oKTsKLQkJc29ydGVkLmFkZEFsbCh2MlZhbHMudmFsdWVzKCkpOwotCQkKLQkJaWYgKHVzZVByb2plY3QgPT0gVXNlUHJvamVjdFByZWZlcmVuY2VzLk11c3ROb3RVc2UpewotCQkJc29ydGVkLmFkZEFsbChFeHRlbnNpb25WYWxpZGF0b3JzLmluc3RhbmNlKCkuZ2V0VjFWYWxpZGF0b3JzKHByb2plY3QpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gdmMuZ2V0VmFsaWRhdG9ycygpOwotCQkJCWZvciAoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogdm1kcykgewotCQkJCQlWYWxpZGF0b3IgdiA9IFZhbGlkYXRvci5jcmVhdGUodm1kLCB2YywgcHJvamVjdCk7Ci0JCQkJCXNvcnRlZC5hZGQodik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSl7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJTGlzdDxWYWxpZGF0b3I+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3I+KCk7Ci0JCWZvciAoVmFsaWRhdG9yIHYgOiBzb3J0ZWQpewotCQkJaWYgKHYuc2hvdWxkVmFsaWRhdGVQcm9qZWN0KHByb2plY3QsIGZhbHNlLCBmYWxzZSkpbGlzdC5hZGQodik7Ci0JCX0KLQkJCi0JCVZhbGlkYXRvcltddmFscyA9IG5ldyBWYWxpZGF0b3JbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkodmFscyk7Ci0JCXJldHVybiB2YWxzOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIFYyIHZhbGlkYXRvcnMgdGhhdCBhcmUgaW4gZWZmZWN0IGZvciB0aGlzIHByb2plY3QuIFRoZQotCSAqIGZvbGxvd2luZyBhcHByb2FjaCBpcyB1c2VkOgotCSAqIDxvbD4KLQkgKiA8bGk+VGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgZXh0ZW5zaW9uIHBvaW50IGFyZSBsb2FkZWQuPC9saT4KLQkgKiA8bGk+VGhleSBhcmUgY3VzdG9taXplZCBieSBhbnkgZ2xvYmFsIHByZWZlcmVuY2VzLjwvbGk+Ci0JICogPGxpPklmIHByb2plY3QgY3VzdG9taXphdGlvbnMgYXJlIGFsbG93ZWQsIHRoZXkgYXJlIGN1c3RvbWl6ZWQgYnkgdGhlCi0JICogcHJvamVjdCBwcmVmZXJlbmNlcy4KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGlzIG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcwotCSAqICAgICAgICAgICAgYXJlIHVzZWQuCi0JICogQHBhcmFtIHVzZVByb2plY3QKLQkgKiAgICAgICAgICAgIFNwZWNpZmllcyBob3cgdG8gdXNlIHRoZSBwcm9qZWN0IHByZWZlcmVuY2VzLiBUaGlzIGNhbiBiZSB1c2VkCi0JICogICAgICAgICAgICB0byBmb3JjZSB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQuIFRoZXJlIGlzIGEgY2FzZQotCSAqICAgICAgICAgICAgd2hlcmUgdGhlIHVzZXIgaGFzIHRvZ2dsZWQgdGhlIEVuYWJsZSBwcm9qZWN0IHNwZWNpZmljCi0JICogICAgICAgICAgICBzZXR0aW5ncyBjaGVja2JveCBpbiB0aGUgZGlhbG9nLCBidXQgaGFzIG5vdCB5ZXQgY29tbWl0dGVkIHRoZQotCSAqICAgICAgICAgICAgY2hhbmdlcy4gVGhpcyBhbGxvd3MgdGhhdCBzZXR0aW5nIHRvIGJlIHBhc3NlZCB0aHJvdWdoLgotCSAqICAgICAgICAgICAgCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZyxWYWxpZGF0b3I+IGdldFYyVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0LCBVc2VQcm9qZWN0UHJlZmVyZW5jZXMgdXNlUHJvamVjdCl7Ci0JCU1hcDxTdHJpbmcsVmFsaWRhdG9yPiBleHRWYWxzID0gRXh0ZW5zaW9uVmFsaWRhdG9ycy5pbnN0YW5jZSgpLmdldE1hcFYyQ29weSgpOwotCQl0cnkgewotCQkJTGlzdDxWYWxpZGF0b3I+IHZhbHMgPSBWYWxQcmVmTWFuYWdlckdsb2JhbC5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9ycygpOwotCQkJZm9yIChWYWxpZGF0b3IgdiA6IHZhbHMpZXh0VmFscy5wdXQodi5nZXRJZCgpLCB2KTsKLQkJCQotCQkJaWYgKHVzZVByb2plY3QgIT0gVXNlUHJvamVjdFByZWZlcmVuY2VzLk11c3ROb3RVc2UpewotCQkJCWlmICh1c2VQcm9qZWN0ID09IFVzZVByb2plY3RQcmVmZXJlbmNlcy5NdXN0VXNlIHx8ICFtdXN0VXNlR2xvYmFsVmFsaWRhdG9ycyhwcm9qZWN0KSl7Ci0JCQkJCS8vVE9ETyBzaG91bGQgcHJvYmFibHkgY2FjaGUgdGhpcyB2cG0KLQkJCQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0IHZwbSA9IG5ldyBWYWxQcmVmTWFuYWdlclByb2plY3QocHJvamVjdCk7Ci0JCQkJCXZhbHMgPSB2cG0uZ2V0VmFsaWRhdG9ycyhleHRWYWxzKTsKLQkJCQkJZm9yIChWYWxpZGF0b3IgdiA6IHZhbHMpZXh0VmFscy5wdXQodi5nZXRJZCgpLCB2KTsKLQkJCQkJCi0JCQkJCWZvciAoVmFsaWRhdG9yIHYgOiBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCkuZ2V0VmFsaWRhdG9ycygpKWV4dFZhbHMucHV0KHYuZ2V0SWQoKSwgdik7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGV4dFZhbHM7Ci0JfQotCQotCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgd2UgbXVzdCB1c2UgdGhlIGdsb2JhbCBzZXR0aW5ncyBmb3IgdGhpcyBwcm9qZWN0LiBJZiB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGRvIG5vdAotCSAqIGFsbG93IG92ZXJyaWRlcywgb3IgaWYgdGhpcyBwcm9qZWN0IGRvZXMgbm90IGFsbG93IG92ZXJyaWRlcyB0aGVuIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgbXVzdCBiZSB1c2VkLgotCSAqICAKLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdGVzdGVkLiBJdCBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIG11c3QgYmUgdXNlZC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyBtdXN0IGJlIHVzZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdFVzZUdsb2JhbFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCl7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpcmV0dXJuIHRydWU7Ci0JCWlmICghZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpKXJldHVybiB0cnVlOwotCQlQcm9qZWN0UHJlZmVyZW5jZXMgcHAgPSBfcHJvamVjdFByZWZlcmVuY2VzLmdldChwcm9qZWN0KTsKLQkJaWYgKHBwICE9IG51bGwpcmV0dXJuICFwcC5nZXRPdmVycmlkZSgpOwotCQkKLQkJVmFsUHJlZk1hbmFnZXJQcm9qZWN0IHZwbSA9IG5ldyBWYWxQcmVmTWFuYWdlclByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiAhdnBtLmdldE92ZXJyaWRlKCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGlkIHRoYXQgaXMgaW4gZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgVGhlIHZhbGlkYXRvciBpZC4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsaWRhdG9yIGlzIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyBpZCwgSVByb2plY3QgcHJvamVjdCl7Ci0JCVZhbGlkYXRvcltdIHZhbHMgPSBnZXRWYWxpZGF0b3JzKHByb2plY3QpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFscyl7Ci0JCQlpZiAodi5nZXRJZCgpLmVxdWFscyhpZCkpcmV0dXJuIHY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgVmFsaWRhdGlvbkZyYW1ld29yayNnZXRWYWxpZGF0b3IoU3RyaW5nLCBJUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcldpdGhJZChTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpewotCQlWYWxpZGF0b3JbXSB2YWxzID0gZ2V0VmFsaWRhdG9ycyhwcm9qZWN0KTsKLQkJZm9yIChWYWxpZGF0b3IgdiA6IHZhbHMpewotCQkJaWYgKHYuZ2V0SWQoKS5lcXVhbHMoaWQpKXJldHVybiB2OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCQkJCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgdGhlIHJlc291cmNlIGhhcyBhbnkgZW5hYmxlZCB2YWxpZGF0b3JzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZSBhIGZpbGUsIGZvbGRlciBvciBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBpc01hbnVhbCBpZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgbWFudWFsIHZhbGlkYXRpb24uIAotCSAqIElmIGZhbHNlIHRoZW4gdGhlIGlzTWFudWFsVmFsaWRhdGlvbiBzZXR0aW5nIGlzbid0IHVzZWQgdG8gZmlsdGVyIG91dCB2YWxpZGF0b3JzLgotCSAqICAgCi0JICogQHBhcmFtIGlzQnVpbGQgaWYgdHJ1ZSB0aGVuIHRoZSB2YWxpZGF0b3IgbXVzdCBiZSB0dXJuZWQgb24gZm9yIGJ1aWxkIGJhc2VkIHZhbGlkYXRpb24uCi0JICogSWYgZmFsc2UgdGhlbiB0aGUgaXNCdWlsZFZhbGlkYXRpb24gc2V0dGluZyBpc24ndCB1c2VkIHRvIGZpbHRlciBvdXQgdmFsaWRhdG9ycy4gIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ZhbGlkYXRvcnMoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGlzTWFudWFsLCBib29sZWFuIGlzQnVpbGQpewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCl7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KXJlc291cmNlOwotCQkJcmV0dXJuIFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnMocHJvamVjdCkubGVuZ3RoID4gMDsKLQkJfQotCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpewotCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcilyZXNvdXJjZTsKLQkJCUhhc1ZhbGlkYXRvclZpc2l0b3IgdiA9IG5ldyBIYXNWYWxpZGF0b3JWaXNpdG9yKGlzTWFudWFsLCBpc0J1aWxkKTsKLQkJCXJldHVybiB2Lmhhc1ZhbGlkYXRvcihmb2xkZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJQ29udGVudFR5cGVXcmFwcGVyIGN0dyA9IG5ldyBDb250ZW50VHlwZVdyYXBwZXIoKTsKLQkJCWZvciAoVmFsaWRhdG9yIHZhbCA6IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnMocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSl7Ci0JCQkJaWYgKEZyaWVuZC5zaG91bGRWYWxpZGF0ZSh2YWwsIHJlc291cmNlLCBpc01hbnVhbCwgaXNCdWlsZCwgY3R3KSlyZXR1cm4gdHJ1ZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBwcm9qZWN0IGhhcyBkaXNhYmxlZCBhbGwgb2YgaXQncyB2YWxpZGF0b3JzLCBvciBpZiBwcm9qZWN0IG92ZXJyaWRlcyBhcmUgbm90Ci0JICogYWxsb3dlZCBpZiBnbG9iYWwgdmFsaWRhdGlvbiBoYXMgYmVlbiBkaXNhYmxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIGNvbnN1bHRlZCwgb3IgbnVsbCBpZiBvbmx5IHRoZSBnbG9iYWwgc2V0dGluZ3MgYXJlIHRvIGJlIAotCSAqIGNoZWNrZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNhYmxlZChJUHJvamVjdCBwcm9qZWN0KXsKLQkJR2xvYmFsUHJlZmVyZW5jZXMgZ3AgPSBnZXRHbG9iYWxQcmVmZXJlbmNlcygpOwotCQlpZiAoIWdwLmdldE92ZXJyaWRlKCkgfHwgcHJvamVjdCA9PSBudWxsKXJldHVybiBncC5nZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpOwotCQkKLQkJUHJvamVjdFByZWZlcmVuY2VzIHBwID0gX3Byb2plY3RQcmVmZXJlbmNlcy5nZXQocHJvamVjdCk7Ci0JCWlmIChwcCA9PSBudWxsKXJldHVybiBncC5nZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpOwotCQlyZXR1cm4gcHAuZ2V0U3VzcGVuZCgpOwkJCi0JfQotCQkJCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzIGFzIHRoZXkgd2VyZSBkZWZpbmVkIGJ5IHRoZSBleHRlbnNpb24gcG9pbnRzLiBUaGF0IGlzCi0JICogYW5zd2VyIHRoZSB2YWxpZGF0b3JzIGFzIGlmIHRoZSB1c2VyIGhhcyBuZXZlciBhcHBsaWVkIGFueSBjdXN0b21pemF0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuc3dlciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdG9ycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvcltdIGdldERlZmF1bHRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlNYXA8U3RyaW5nLFZhbGlkYXRvcj4gZXh0VmFscyA9IEV4dGVuc2lvblZhbGlkYXRvcnMuaW5zdGFuY2UoKS5nZXRNYXBWMigpOwotCQlUcmVlU2V0PFZhbGlkYXRvcj4gc29ydGVkID0gbmV3IFRyZWVTZXQ8VmFsaWRhdG9yPigpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogZXh0VmFscy52YWx1ZXMoKSlzb3J0ZWQuYWRkKHYpOwotCQkKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2MgPSBuZXcgR2xvYmFsQ29uZmlndXJhdGlvbihyb290KTsKLQkJZ2MucmVzZXRUb0RlZmF1bHQoKTsKLQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiBnYy5nZXRWYWxpZGF0b3JzKCkpewotCQkJVmFsaWRhdG9yIHYgPSBWYWxpZGF0b3IuY3JlYXRlKHZtZCwgZ2MsIG51bGwpOwotCQkJdi5zZXRCdWlsZFZhbGlkYXRpb24odm1kLmlzQnVpbGRWYWxpZGF0aW9uKCkpOwotCQkJdi5zZXRNYW51YWxWYWxpZGF0aW9uKHZtZC5pc01hbnVhbFZhbGlkYXRpb24oKSk7Ci0JCQlzb3J0ZWQuYWRkKHYpOwotCQl9Ci0JCQotCQlWYWxpZGF0b3JbXSB2YWwgPSBuZXcgVmFsaWRhdG9yW3NvcnRlZC5zaXplKCldOwotCQlzb3J0ZWQudG9BcnJheSh2YWwpOwotCQlyZXR1cm4gdmFsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvcltdIGdldERlZmF1bHRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZyxWYWxpZGF0b3I+IGV4dFZhbHMgPSBFeHRlbnNpb25WYWxpZGF0b3JzLmluc3RhbmNlKCkuZ2V0TWFwKHByb2plY3QpOwotCQlWYWxpZGF0b3JbXSB2YWwgPSBuZXcgVmFsaWRhdG9yW2V4dFZhbHMuc2l6ZSgpXTsKLQkJZXh0VmFscy52YWx1ZXMoKS50b0FycmF5KHZhbCk7Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHVzZSBmb3IgZ2V0dGluZyB0aGUgdmVyc2lvbiAxIHZhbGlkYXRvciBzZXR0aW5ncy4gVGhpcyBjYW4KLQkgKiBiZSBudWxsIGluIHdoaWNoIGNhc2UgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyBhcmUgdXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuc3dlciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdG9ycy4KLQkgKi8KLS8vCVZhbGlkYXRvcltdIGdldFZhbGlkYXRvcnMyKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvciB7Ci0vLwkJLy8gSWYgSSB1c2UgYSBsb2NhbCB2YXJpYWJsZSBJIGRvbid0IG5lZWQgdG8gc3luY2hyb25pemUgdGhlIG1ldGhvZC4KLS8vCQkKLS8vCQlWYWxpZGF0b3JbXSB2YWxpZGF0b3JzID0gX3ZhbGlkYXRvcnM7Ci0vLwkJaWYgKHByb2plY3QgPT0gbnVsbCAmJiB2YWxpZGF0b3JzICE9IG51bGwpcmV0dXJuIHZhbGlkYXRvcnM7Ci0vLwkJCQkKLS8vCQlWYWxpZGF0b3JbXSB2YWwgPSBsb2FkRXh0ZW5zaW9ucyhmYWxzZSwgcHJvamVjdCk7Ci0vLwkJVmFsUHJlZk1hbmFnZXJHbG9iYWwgdnBtID0gVmFsUHJlZk1hbmFnZXJHbG9iYWwuZ2V0RGVmYXVsdCgpOwotLy8JCWlmICghdnBtLmxvYWRQcmVmZXJlbmNlcyh2YWwpKXsKLS8vCQkJdmFsID0gcmVzdG9yZURlZmF1bHRzMihwcm9qZWN0KTsKLS8vCQkJc2F2ZVN0YXRlVGltZXN0YW1wKCk7CQkJCQotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJaWYgKGdldEdsb2JhbFByZWZlcmVuY2VzKCkuZ2V0U3RhdGVUaW1lU3RhbXAoKSAhPSBQbGF0Zm9ybS5nZXRTdGF0ZVN0YW1wKCkpCi0vLwkJCQl2YWwgPSBtaWdyYXRlU2V0dGluZ3ModmFsLCBwcm9qZWN0KTsKLS8vCQl9Ci0vLwkJCi0vLwkJVHJlZVNldDxWYWxpZGF0b3I+IHNldCA9IG5ldyBUcmVlU2V0PFZhbGlkYXRvcj4oKTsKLS8vCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsKXNldC5hZGQodik7Ci0vLwkJCi0vLwkJTGlzdDxWYWxpZGF0b3I+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3I+KCk7Ci0vLwkJdHJ5IHsKLS8vCQkJVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLS8vCQkJZm9yIChWYWxpZGF0b3JNZXRhRGF0YSB2bWQgOiB2Yy5nZXRWYWxpZGF0b3JzKCkpewotLy8JCQkJbGlzdC5hZGQoVmFsaWRhdG9yLmNyZWF0ZSh2bWQsIHZjLCBwcm9qZWN0KSk7Ci0vLwkJCX0JCQkJCQkJCi0vLwkJCQotLy8JCX0KLS8vCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKLS8vCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAoIXByb2plY3QuZXhpc3RzKCkgfHwgIXByb2plY3QuaXNPcGVuKCkpKQotLy8JCQkJdGhyb3cgbmV3IFByb2plY3RVbmF2YWlsYWJsZUVycm9yKHByb2plY3QpOwotLy8JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLS8vCQl9Ci0vLwkJCi0vLwkJc2V0LmFkZEFsbChsaXN0KTsKLS8vCQl2YWwgPSBuZXcgVmFsaWRhdG9yW3NldC5zaXplKCldOwotLy8JCXNldC50b0FycmF5KHZhbCk7Ci0vLwkJaWYgKHByb2plY3QgPT0gbnVsbClfdmFsaWRhdG9ycyA9IHZhbDsKLS8vCQlyZXR1cm4gdmFsOwotLy8JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWdIYXNDaGFuZ2VkKCl7Ci0JCV9jb25maWdOdW1iZXIuaW5jcmVtZW50QW5kR2V0KCk7Ci0JCVZhbGlkYXRvclByb2plY3RNYW5hZ2VyLnJlc2V0KCk7Ci0JCV9jYWNoZS5yZXNldCgpOwotCX0KLQkJCi0JLyoqCi0JICogQW5zd2VyIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgR2xvYmFsUHJlZmVyZW5jZXMgZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKXsKLQkJR2xvYmFsUHJlZmVyZW5jZXMgZ3AgPSBfZ2xvYmFsUHJlZmVyZW5jZXMuZ2V0KCk7Ci0JCWlmIChncCA9PSBudWxsKXsKLQkJCVZhbFByZWZNYW5hZ2VyR2xvYmFsIHZwbSA9IFZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKTsKLQkJCWdwID0gdnBtLmxvYWRHbG9iYWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKCFfZ2xvYmFsUHJlZmVyZW5jZXMuY29tcGFyZUFuZFNldChudWxsLCBncCkpZ3AgPSBfZ2xvYmFsUHJlZmVyZW5jZXMuZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGdwOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcywgYnV0IG9ubHkgaWYgc29tZXRoaW5nIGhhcyBhY3R1YWxseSBjaGFuZ2VkLgotCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIGdsb2JhbCBzZXR0aW5ncy4KLQkgKiBAcmV0dXJuIGEgYml0IG1hc2sgb2YgdGhlIGNoYW5nZXMgYmV0d2VlbiB0aGUgb2xkIHZhbHVlcyBhbmQgdGhlIG5ldyB2YWx1ZXMuIFNlZSB0aGUgR2xvYmFsUHJlZmVyZW5jZXMKLQkgKiBjb25zdGFudHMgZm9yIHRoZSBiaXQgbWFzayB2YWx1ZXMuIElmIGEgemVybyBpcyByZXR1cm4gdGhlcmUgd2VyZSBubyBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBpbnQgcmVwbGFjZShHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcyB2YWx1ZXMpewotCQlHbG9iYWxQcmVmZXJlbmNlcyBncCA9IG5ldyBHbG9iYWxQcmVmZXJlbmNlcyh2YWx1ZXMpOwotCQlHbG9iYWxQcmVmZXJlbmNlcyBvbGQgPSBnZXRHbG9iYWxQcmVmZXJlbmNlcygpOwotCQlpbnQgY2hhbmdlcyA9IG9sZC5jb21wYXJlKGdwKTsKLQkJaWYgKGNoYW5nZXMgIT0gMCl7Ci0JCQlfZ2xvYmFsUHJlZmVyZW5jZXMuc2V0KGdwKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlczsKLQl9Ci0JCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcHJvamVjdCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0LCB0aGlzIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBQcm9qZWN0UHJlZmVyZW5jZXMgZ2V0UHJvamVjdFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvamVjdFByZWZlcmVuY2VzIHBwID0gX3Byb2plY3RQcmVmZXJlbmNlcy5nZXQocHJvamVjdCk7Ci0JCWlmIChwcCAhPSBudWxsKXJldHVybiBwcDsKLQkJCi0JCS8qIGhvcGVmdWxseSB3ZSByYXJlbHkgZ2V0IHRoaXMgZmFyICovCi0JCQotCQlNYXA8U3RyaW5nLFZhbGlkYXRvcj4gZXh0VmFscyA9IEV4dGVuc2lvblZhbGlkYXRvcnMuaW5zdGFuY2UoKS5nZXRNYXBWMkNvcHkoKTsKLQkJdHJ5IHsKLQkJCUxpc3Q8VmFsaWRhdG9yPiB2YWxzID0gVmFsUHJlZk1hbmFnZXJHbG9iYWwuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcnMoKTsKLQkJCWZvciAoVmFsaWRhdG9yIHYgOiB2YWxzKWV4dFZhbHMucHV0KHYuZ2V0SWQoKSwgdik7Ci0JCQkKLQkJCXBwID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QsIGV4dFZhbHMpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQkKLQkJcmV0dXJuIHBwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0LCB0aGlzIG1heSBiZSBudWxsLgotCSAqIEBwYXJhbSBiYXNlVmFsaWRhdG9ycwotCSAqLwotCXByaXZhdGUgUHJvamVjdFByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0LCBNYXA8U3RyaW5nLCBWYWxpZGF0b3I+IGJhc2VWYWxpZGF0b3JzKSAKLQkJdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCVByb2plY3RQcmVmZXJlbmNlcyBwcCA9IF9wcm9qZWN0UHJlZmVyZW5jZXMuZ2V0KHByb2plY3QpOwotCQlpZiAocHAgIT0gbnVsbClyZXR1cm4gcHA7Ci0JCQotCQlWYWxQcmVmTWFuYWdlclByb2plY3QgdnBtID0gbmV3IFZhbFByZWZNYW5hZ2VyUHJvamVjdChwcm9qZWN0KTsKLQkJcHAgPSB2cG0ubG9hZFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0LCBiYXNlVmFsaWRhdG9ycyk7Ci0JCV9wcm9qZWN0UHJlZmVyZW5jZXMucHV0KHByb2plY3QsIHBwKTsKLQkJcmV0dXJuIHBwOwkJCi0JfQotCQkKLQkvKioKLQkgKiBSZXN0b3JlIGFsbCB0aGUgdmFsaWRhdGlvbiBkZWZhdWx0cywgYXMgZGVmaW5lZCBieSB0aGUgaW5kaXZpZHVhbCB2YWxpZGF0b3JzIHZpYSB0aGUKLQkgKiB2YWxpZGF0aW9uIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLS8vCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXN0b3JlRGVmYXVsdHMoKSB7Ci0vLwkJZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5yZXNldFRvRGVmYXVsdCgpOwotLy8JCV92YWxpZGF0b3JzID0gbnVsbDsKLS8vCQlnZXRWYWxpZGF0b3JzKHRydWUpOwotLy8JfQotCQotCi0JLyoqCi0JICogUnVuIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgcmVzb3VyY2UuCi0JICogPHA+Ci0JICogSWYgdGhpcyBpcyBhIG1hbnVhbCB2YWxpZGF0aW9uIGJvdGggdGhlIHZlcnNpb24gMSBhbmQgdmVyc2lvbiAyIHZhbGlkYXRvcnMgYXJlIHJ1bi4gSWYgaXQKLQkgKiBpcyBhIGJ1aWxkIHZhbGlkYXRpb24sIHRoZW4gb25seSB0aGUgdmVyc2lvbiAyIHZhbGlkYXRvcnMgYXJlIHJ1biwgYmVjYXVzZSB0aGUgb2xkIGZyYW1ld29yayBoYW5kbGVzCi0JICogdGhlIHJ1bm5pbmcgb2YgdGhlIG9sZCB2YWxpZGF0b3JzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZAotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHJlc291cmNlIGRlbHRhLiBJdCB3aWxsIGJlIG9uZSBvZiB0aGUgSVJlc291cmNlRGVsdGEgY29uc3RhbnRzLCBsaWtlCi0JICogSVJlc291cmNlRGVsdGEuQ0hBTkdFRCBmb3IgZXhhbXBsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsVHlwZSBUaGUgdHlwZSBvZiB2YWxpZGF0aW9uIHJlcXVlc3QuCi0JICogQHBhcmFtIGJ1aWxkS2luZCB0aGUga2luZCBvZiBidWlsZCB0aGF0IHRyaWdnZXJlZCB0aGlzIHZhbGlkYXRpb24uIFNlZSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyIGZvciB2YWx1ZXMuCi0JICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgb3BlcmF0aW9uIHRoYXQgdGhpcyB2YWxpZGF0aW9uIGlzIHJ1bm5pbmcgdW5kZXIKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0byB1c2UgdG8gcmVwb3J0IHByb2dyZXNzIAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgaW50IGtpbmQsIFZhbFR5cGUgdmFsVHlwZSwgCi0JCWludCBidWlsZEtpbmQsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJTWFya2VyTWFuYWdlci5nZXREZWZhdWx0KCkuZGVsZXRlTWFya2VycyhyZXNvdXJjZSwgb3BlcmF0aW9uLmdldFN0YXJ0ZWQoKSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkKLQkJSVZhbGlkYXRvclZpc2l0b3IgdmlzaXRvciA9IG5ldyBJVmFsaWRhdG9yVmlzaXRvcigpewotCi0JCQlwdWJsaWMgdm9pZCB2aXNpdChWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxUeXBlIHZ0LAotCQkJCVZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCQkKLQkJCQlWYWxpZGF0b3IuVjEgdjEgPSB2YWxpZGF0b3IuYXNWMVZhbGlkYXRvcigpOwotCQkJCWlmICh2dCA9PSBWYWxUeXBlLkJ1aWxkICYmIHYxICE9IG51bGwpcmV0dXJuOwotCQkJCQotCQkJCVN1Yk1vbml0b3Igc3ViTW9uaXRvciA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yKTsKLQkJCQlTdHJpbmcgdGFzayA9IE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkxvZ1ZhbFN0YXJ0LCB2YWxpZGF0b3IuZ2V0TmFtZSgpLCByZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCXN1Yk1vbml0b3IuYmVnaW5UYXNrKHRhc2ssIDEpOwotCQkJCXZhbGlkYXRlKHZhbGlkYXRvciwgb3BlcmF0aW9uLCByZXNvdXJjZSwga2luZCwgc3ViTW9uaXRvci5uZXdDaGlsZCgxKSwgbnVsbCk7Ci0JCQl9CQkJCi0JCX07Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgZ2V0VmFsaWRhdG9ycyhwcm9qZWN0KS5sZW5ndGgpOwotCQlhY2NlcHQodmlzaXRvciwgcHJvamVjdCwgcmVzb3VyY2UsIHZhbFR5cGUsIG9wZXJhdGlvbiwgc20pOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgYSBzaW5nbGUgcmVzb3VyY2Ugd2l0aCBhIHNpbmdsZSB2YWxpZGF0b3IuIFRoaXMgd2lsbCBjYWxsIHRoZSB2YWxpZGF0b3Igd2hldGhlciB0aGUgdmFsaWRhdG9yCi0JICogaXMgZW5hYmxlZCBvciBub3QuCi0JICogPHA+Ci0JICogQ2FsbGVycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIHNob3VsZFZhbGlkYXRlIHdhcyB0ZXN0ZWQgYmVmb3JlIG1ha2luZyB0aGlzIGNhbGwuCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvciB0aGUgdmFsaWRhdG9yCi0JICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgb3BlcmF0aW9uIHRoYXQgdGhlIHZhbGlkYXRpb24gaXMgcnVubmluZyBpbi4KLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIHZhbGlkYXRlCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcmVzb3VyY2UgY2hhbmdlLiBTZWUgSVJlc291cmNlRGVsdGEuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShWYWxpZGF0b3IgdmFsaWRhdG9yLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCAKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdGlvbkV2ZW50IGV2ZW50KXsKLQkJaWYgKG9wZXJhdGlvbi5pc1ZhbGlkYXRlZCh2YWxpZGF0b3IuZ2V0SWQoKSwgcmVzb3VyY2UpKXJldHVybjsKLQkJbG9uZyB0aW1lID0gMDsKLQkJbG9uZyBjcHVUaW1lID0gLTE7Ci0JCVN0cmluZyBtc2cxID0gTkxTLmJpbmQoVmFsTWVzc2FnZXMuTG9nVmFsU3RhcnQsIHZhbGlkYXRvci5nZXROYW1lKCksIHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCW1vbml0b3Iuc3ViVGFzayhtc2cxKTsKLQkJSVBlcmZvcm1hbmNlTW9uaXRvciBwbSA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldFBlcmZvcm1hbmNlTW9uaXRvcigpOwotCQlpZiAocG0uaXNDb2xsZWN0aW5nKCkpewotCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJY3B1VGltZSA9IE1pc2MuZ2V0Q1BVVGltZSgpOwotCQl9Ci0JCQotCQlpZiAoVHJhY2luZy5tYXRjaGVzRXh0cmFEZXRhaWwodmFsaWRhdG9yLmdldElkKCkpKXsKLQkJCVRyYWNpbmcubG9nKCJWYWxNYW5hZ2VyLTAzOiB2YWxpZGF0aW5nICIsIHJlc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVZhbGlkYXRpb25SZXN1bHQgdnIgPSB2YWxpZGF0b3IudmFsaWRhdGUocmVzb3VyY2UsIGtpbmQsIG9wZXJhdGlvbiwgbW9uaXRvciwgZXZlbnQpOwotCQlpZiAocG0uaXNDb2xsZWN0aW5nKCkpewotCQkJaWYgKGNwdVRpbWUgIT0gLTEpewotCQkJCWNwdVRpbWUgPSBNaXNjLmdldENQVVRpbWUoKSAtIGNwdVRpbWU7Ci0JCQl9Ci0JCQlpbnQgbnVtID0gMDsKLQkJCWlmICh2ciAhPSBudWxsKW51bSA9IHZyLmdldE51bWJlck9mVmFsaWRhdGVkUmVzb3VyY2VzKCk7Ci0JCQlQZXJmb3JtYW5jZUNvdW50ZXJzIHBjID0gbmV3IFBlcmZvcm1hbmNlQ291bnRlcnModmFsaWRhdG9yLmdldElkKCksIAotCQkJCXZhbGlkYXRvci5nZXROYW1lKCksIHJlc291cmNlLmdldE5hbWUoKSwKLQkJCQludW0sIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXRpbWUsIGNwdVRpbWUpOwotCQkJcG0uYWRkKHBjKTsKLQkJfQotCQlpZiAoVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5pc0RlYnVnZ2luZygpICYmICFwbS5pc0NvbGxlY3RpbmcoKSl7Ci0JCQlTdHJpbmcgbXNnID0gdGltZSAhPSAwID8gCi0JCQkJTkxTLmJpbmQoVmFsTWVzc2FnZXMuTG9nVmFsRW5kVGltZSwJbmV3IE9iamVjdFtde3ZhbGlkYXRvci5nZXROYW1lKCksIAotCQkJCQl2YWxpZGF0b3IuZ2V0SWQoKSwgcmVzb3VyY2UsIE1pc2MuZ2V0VGltZU1TKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXRpbWUpfSkgOgotCQkJCU5MUy5iaW5kKFZhbE1lc3NhZ2VzLkxvZ1ZhbEVuZCwgdmFsaWRhdG9yLmdldE5hbWUoKSwgcmVzb3VyY2UpOwotCQkJVHJhY2luZy5sb2coIlZhbE1hbmFnZXItMDE6ICIgKyBtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHZyICE9IG51bGwpewotCQkJb3BlcmF0aW9uLm1lcmdlUmVzdWx0cyh2cik7Ci0JCQlpZiAodnIuZ2V0U3VzcGVuZFZhbGlkYXRpb24oKSAhPSBudWxsKW9wZXJhdGlvbi5zdXNwZW5kVmFsaWRhdGlvbih2ci5nZXRTdXNwZW5kVmFsaWRhdGlvbigpLCB2YWxpZGF0b3IpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFjY2VwdCBhIHZpc2l0b3IgZm9yIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlzaXRvcgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHZhbFR5cGUgdGhlIHR5cGUgb2YgdmFsaWRhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdChJVmFsaWRhdG9yVmlzaXRvciB2aXNpdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxUeXBlIHZhbFR5cGUsIAotCQlWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQkKLQkJaWYgKGlzRGlzYWJsZWQocHJvamVjdCkpcmV0dXJuOwotCQkKLQkJZm9yIChWYWxpZGF0b3IgdmFsIDogZ2V0VmFsaWRhdG9ycyhwcm9qZWN0KSl7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpcmV0dXJuOwotCQkJaWYgKCFWYWxpZGF0b3JQcm9qZWN0TWFuYWdlci5nZXQoKS5zaG91bGRWYWxpZGF0ZSh2YWwsIHByb2plY3QsIHZhbFR5cGUpKWNvbnRpbnVlOwotCQkJaWYgKG9wZXJhdGlvbi5pc1N1c3BlbmRlZCh2YWwsIHByb2plY3QpKWNvbnRpbnVlOwotCQkJdHJ5IHsKLQkJCQl2aXNpdG9yLnZpc2l0KHZhbCwgcHJvamVjdCwgdmFsVHlwZSwgb3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBBY2NlcHQgYSB2aXNpdG9yIGZvciBhbGwgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIHByb2plY3QsIHJlc291cmNlLCAKLQkgKiBhbmQgdmFsaWRhdGlvbiBtb2RlLgotCSAqIAotCSAqIEBwYXJhbSB2YWxUeXBlIHRoZSB0eXBlIG9mIHZhbGlkYXRpb24gcmVxdWVzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdChJVmFsaWRhdG9yVmlzaXRvciB2aXNpdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2UgcmVzb3VyY2UsIAotCQkJVmFsVHlwZSB2YWxUeXBlLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQkKLQkJaWYgKGlzRGlzYWJsZWQocHJvamVjdCkpcmV0dXJuOwotCQkKLQkJTWFwPFN0cmluZyxJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcltdPiBncm91cExpc3RlbmVycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcltdPigpOwotCQkKLQkJVmFsUHJvcGVydHkgdnAgPSBnZXRWYWxQcm9wZXJ0eShyZXNvdXJjZSwgdmFsVHlwZSwgX2NvbmZpZ051bWJlci5nZXQoKSk7Ci0JCWlmICh2cCAhPSBudWxsKXsKLQkJCUJpdFNldCBicyA9IHZwLmdldENvbmZpZ1NldCgpOwotCQkJZm9yIChWYWxpZGF0b3IgdmFsIDogZ2V0VmFsaWRhdG9ycyhwcm9qZWN0KSl7Ci0JCQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlpZiAoIWJzLmdldChfaWRNYW5hZ2VyLmdldEluZGV4KHZhbC5nZXRJZCgpKSkpY29udGludWU7Ci0JCQkJCWlmIChvcGVyYXRpb24uaXNTdXNwZW5kZWQodmFsLCBwcm9qZWN0KSljb250aW51ZTsKLQkJCQkJVmFsaWRhdG9yLlYyIHYyID0gdmFsLmFzVjJWYWxpZGF0b3IoKTsKLQkJCQkJaWYgKHYyICE9IG51bGwpIHsKLQkJCQkJCW5vdGlmeUdyb3VwTGlzdGVuZXJzU3RhcnRpbmcocmVzb3VyY2UsIG9wZXJhdGlvbi5nZXRTdGF0ZSgpLCBtb25pdG9yLCBncm91cExpc3RlbmVycywgdjIpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQl2aXNpdG9yLnZpc2l0KHZhbCwgcHJvamVjdCwgdmFsVHlwZSwgb3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlub3RpZnlHcm91cEZpbmlzaGluZyhyZXNvdXJjZSwgb3BlcmF0aW9uLmdldFN0YXRlKCksIG1vbml0b3IsIGdyb3VwTGlzdGVuZXJzKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdnAgPSBuZXcgVmFsUHJvcGVydHkoKTsKLQkJdnAuc2V0Q29uZmlnTnVtYmVyKF9jb25maWdOdW1iZXIuZ2V0KCkpOwotCQlDb250ZW50VHlwZVdyYXBwZXIgY3R3ID0gbmV3IENvbnRlbnRUeXBlV3JhcHBlcigpOwotCQlmb3IgKFZhbGlkYXRvciB2YWwgOiBnZXRWYWxpZGF0b3JzKHByb2plY3QpKXsKLQkJCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlpZiAoIVZhbGlkYXRvclByb2plY3RNYW5hZ2VyLmdldCgpLnNob3VsZFZhbGlkYXRlKHZhbCwgcHJvamVjdCwgdmFsVHlwZSkpY29udGludWU7Ci0JCQkJaWYgKEZyaWVuZC5zaG91bGRWYWxpZGF0ZSh2YWwsIHJlc291cmNlLCB2YWxUeXBlLCBjdHcpKXsKLQkJCQkJdnAuZ2V0Q29uZmlnU2V0KCkuc2V0KF9pZE1hbmFnZXIuZ2V0SW5kZXgodmFsLmdldElkKCkpKTsKLQkJCQkJLy8gd2UgZG8gdGhlIHN1c3BlbmQgY2hlY2sgYWZ0ZXIgZmlndXJpbmcgb3V0IGlmIGl0IG5lZWRzIHRvIGJlIHZhbGlkYXRlZCwgYmVjYXVzZSB3ZSBzYXZlCi0JCQkJCS8vIHRoaXMgaW5mb3JtYXRpb24gZm9yIHRoZSBzZXNzaW9uLgotCQkJCQlpZiAob3BlcmF0aW9uLmlzU3VzcGVuZGVkKHZhbCwgcHJvamVjdCkpY29udGludWU7Ci0JCQkJCVZhbGlkYXRvci5WMiB2MiA9IHZhbC5hc1YyVmFsaWRhdG9yKCk7Ci0JCQkJCWlmICh2MiAhPSBudWxsKSB7Ci0JCQkJCQlub3RpZnlHcm91cExpc3RlbmVyc1N0YXJ0aW5nKHJlc291cmNlLCBvcGVyYXRpb24uZ2V0U3RhdGUoKSwgbW9uaXRvciwgZ3JvdXBMaXN0ZW5lcnMsIHYyKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJdmlzaXRvci52aXNpdCh2YWwsIHByb2plY3QsIHZhbFR5cGUsIG9wZXJhdGlvbiwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW5vdGlmeUdyb3VwRmluaXNoaW5nKHJlc291cmNlLCBvcGVyYXRpb24uZ2V0U3RhdGUoKSwgbW9uaXRvciwgZ3JvdXBMaXN0ZW5lcnMpOwotCQlwdXRWYWxQcm9wZXJ0eSh2cCwgcmVzb3VyY2UsIHZhbFR5cGUpOwotCX0KLQotCS8qKgotCSAqIExldCB0aGUgZ3JvdXAgbGlzdGVuZXJzIGtub3cgdGhhdCB2YWxpZGF0aW9uIG1pZ2h0IGJlIHN0YXJ0aW5nIGZvciB0aGUgZ3JvdXAgb2YgdmFsaWRhdG9ycy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUdyb3VwTGlzdGVuZXJzU3RhcnRpbmcoZmluYWwgSVJlc291cmNlIHJlc291cmNlLAkgCi0JCQlmaW5hbCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgCi0JCQlNYXA8U3RyaW5nLCBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcltdPiBncm91cExpc3RlbmVycywgVmFsaWRhdG9yLlYyIHYyKSB7Ci0JCQotCQlTdHJpbmdbXSBncm91cHMgPSB2Mi5nZXRWYWxpZGF0b3JHcm91cHMoKTsKLQkJZm9yIChTdHJpbmcgZ3JvdXAgOiBncm91cHMpIHsKLQkJCWlmICghZ3JvdXBMaXN0ZW5lcnMuY29udGFpbnNLZXkoZ3JvdXApKSB7Ci0JCQkJSVZhbGlkYXRvckdyb3VwTGlzdGVuZXJbXSBjcmVhdGVkTGlzdGVuZXJzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljcmVhdGVkTGlzdGVuZXJzID0gVmFsaWRhdG9yR3JvdXBFeHRlbnNpb25SZWFkZXIuZ2V0RGVmYXVsdCgpLmNyZWF0ZUxpc3RlbmVycyhncm91cCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoVmFsTWVzc2FnZXMuRXJyQ29uZmlnLCB2Mi5nZXRJZCgpKTsKLQkJCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQsIG1zZyk7Ci0JCQkJCUNvcmVFeGNlcHRpb24gY29yZSA9IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGNvcmUpOwotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCQkJCi0JCQkJCS8vIHdlIGNyZWF0ZSB0aGlzIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IHNpZ25hbCB0aGUgc2FtZSBleGNlcHRpb24gb3ZlciBhbmQgb3Zlci4gCi0JCQkJCWNyZWF0ZWRMaXN0ZW5lcnMgPSBuZXcgSVZhbGlkYXRvckdyb3VwTGlzdGVuZXJbMF07Ci0JCQkJfQotCQkJCQotCQkJCS8vIGNyZWF0ZSBhbmQgbm90aWZ5IGp1c3QgdGhpcyBvbmNlCi0JCQkJZmluYWwgSVZhbGlkYXRvckdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBjcmVhdGVkTGlzdGVuZXJzOwotCQkJCQkKLQkJCQlncm91cExpc3RlbmVycy5wdXQoZ3JvdXAsIGxpc3RlbmVycyk7Ci0JCQkJZm9yIChmaW5hbCBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCWxpc3RlbmVyLnZhbGlkYXRpb25TdGFydGluZyhyZXNvdXJjZSwgbW9uaXRvciwgc3RhdGUpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExldCB0aGUgZ3JvdXAgbGlzdGVuZXJzIGtub3cgdGhhdCB2YWxpZGF0aW9uIGlzIGZpbmlzaGVkIGZvciB0aGUgZ3JvdXAgb2YgdmFsaWRhdG9ycy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUdyb3VwRmluaXNoaW5nKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgCi0JCQlmaW5hbCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCU1hcDxTdHJpbmcsIElWYWxpZGF0b3JHcm91cExpc3RlbmVyW10+IGdyb3VwTGlzdGVuZXJzKSB7Ci0JCWZvciAoZmluYWwgSVZhbGlkYXRvckdyb3VwTGlzdGVuZXJbXSBsaXN0ZW5lcnMgOiBncm91cExpc3RlbmVycy52YWx1ZXMoKSkgewotCQkJZm9yIChmaW5hbCBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCWxpc3RlbmVyLnZhbGlkYXRpb25GaW5pc2hpbmcocmVzb3VyY2UsIG1vbml0b3IsIHN0YXRlKTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFZhbFByb3BlcnR5IGdldFZhbFByb3BlcnR5KElSZXNvdXJjZSByZXNvdXJjZSwgVmFsVHlwZSB2YWxUeXBlLCBpbnQgY29uZmlnTnVtYmVyKSB7Ci0JCVZhbFByb3BlcnR5IHZwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh2YWxUeXBlID09IFZhbFR5cGUuQnVpbGQpdnAgPSAoVmFsUHJvcGVydHkpcmVzb3VyY2UuZ2V0U2Vzc2lvblByb3BlcnR5KFN0YXR1c0J1aWxkKTsKLQkJCWVsc2UgaWYgKHZhbFR5cGUgPT0gVmFsVHlwZS5NYW51YWwpdnAgPSAoVmFsUHJvcGVydHkpcmVzb3VyY2UuZ2V0U2Vzc2lvblByb3BlcnR5KFN0YXR1c01hbnVhbCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkvLyBkb24ndCBjYXJlIGFib3V0IHRoaXMgb25lCi0JCX0KLQkJaWYgKHZwID09IG51bGwpcmV0dXJuIG51bGw7Ci0JCWlmICh2cC5nZXRDb25maWdOdW1iZXIoKSAhPSBfY29uZmlnTnVtYmVyLmdldCgpKXJldHVybiBudWxsOwotCQlyZXR1cm4gdnA7Ci0JfQotCQotCS8qKgotCSAqIExldCB0aGUgdmFsaWRhdGlvbiBtYW5hZ2VyIGtub3cgdGhhdCBhIHByb2plY3QgaGFzIGJlZW4gY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0aGF0IGhhcyBiZWVuIG9wZW5lZCwgY3JlYXRlZCwgb3IgaGFkIGl0J3MgZGVzY3JpcHRpb24gY2hhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKElQcm9qZWN0IHByb2plY3QpewotCQlWYWxpZGF0b3JQcm9qZWN0TWFuYWdlci5yZXNldCgpOwotCQlfcHJvamVjdFByZWZlcmVuY2VzLnJlbW92ZShwcm9qZWN0KTsKLQkJX2NhY2hlLnJlc2V0KHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBMZXQgdGhlIHZhbGlkYXRpb24gbWFuYWdlciBrbm93IHRoYXQgYSBwcm9qZWN0IGhhcyBiZWVuIHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdGhhdCBoYXMgYmVlbiBjbG9zZWQgb3IgZGVsZXRlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9qZWN0UmVtb3ZlZChJUHJvamVjdCBwcm9qZWN0KXsKLQkJVmFsaWRhdG9yUHJvamVjdE1hbmFnZXIucmVzZXQoKTsKLQkJX3Byb2plY3RQcmVmZXJlbmNlcy5yZW1vdmUocHJvamVjdCk7Ci0JCV9jYWNoZS5yZXNldChwcm9qZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHB1dFZhbFByb3BlcnR5KFZhbFByb3BlcnR5IHZwLCBJUmVzb3VyY2UgcmVzb3VyY2UsIFZhbFR5cGUgdmFsVHlwZSkgewotCQl0cnkgewotCQkJaWYgKHZhbFR5cGUgPT0gVmFsVHlwZS5CdWlsZClyZXNvdXJjZS5zZXRTZXNzaW9uUHJvcGVydHkoU3RhdHVzQnVpbGQsIHZwKTsKLQkJCWVsc2UgaWYgKHZhbFR5cGUgPT0gVmFsVHlwZS5NYW51YWwpcmVzb3VyY2Uuc2V0U2Vzc2lvblByb3BlcnR5KFN0YXR1c01hbnVhbCwgdnApOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaXMgbm90IGZvdW5kLCBpdCBpcyBsaWtlbHkganVzdCBiZWVuIGRlbGV0ZWQgCi0JICAgICAgICAvLyBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBhbnl0aGluZy4gCi0JICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTAyMgotCSAgICAgICAgaWYgKCFlLmdldFN0YXR1cygpLmVxdWFscyhJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EKSkgewotCSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLCBJU3RhdHVzLldBUk5JTkcpOwotCSAgICAgICAgfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTGV0IGVhY2ggb2YgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBrbm93IHRoYXQgYSBjbGVhbiBoYXMgYmVlbiByZXF1ZXN0ZWQuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyBjbGVhbmVkLCBvciBudWxsIGlmIHRoZSBlbnRpcmUgd29ya3NwYWNlIGlzIGJlaW5nIGNsZWFuZWQuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQl2b2lkIGNsZWFuKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJVmFsaWRhdG9yVmlzaXRvciB2aXNpdG9yID0gbmV3IElWYWxpZGF0b3JWaXNpdG9yKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHZpc2l0KFZhbGlkYXRvciB2YWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbFR5cGUgdmFsVHlwZSwKLQkJCQlWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQl2YWxpZGF0b3IuY2xlYW4ocHJvamVjdCwgb3BlcmF0aW9uLCBtb25pdG9yKTsJCQkJCQotCQkJfQotCQkJCi0JCX07Ci0JCWFjY2VwdCh2aXNpdG9yLCBwcm9qZWN0LCBWYWxUeXBlLkJ1aWxkLCBvcGVyYXRpb24sIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBMZXQgZWFjaCBvZiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGtub3cgdGhhdCBhIGNsZWFuIGhhcyBiZWVuIHJlcXVlc3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIGNsZWFuZWQsIG9yIG51bGwgaWYgdGhlIGVudGlyZSB3b3Jrc3BhY2UgaXMgYmVpbmcgY2xlYW5lZC4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCUlWYWxpZGF0b3JWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVZhbGlkYXRvclZpc2l0b3IoKXsKLQotCQkJcHVibGljIHZvaWQgdmlzaXQoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsVHlwZSB2YWxUeXBlLAotCQkJCVZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXZhbGlkYXRvci5jbGVhbihwcm9qZWN0LCBvcGVyYXRpb24sIG1vbml0b3IpOwkJCQkJCi0JCQl9Ci0JCQkKLQkJfTsKLQkJVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0RGVwZW5kZW5jeUluZGV4KCkuY2xlYXIocHJvamVjdCk7Ci0JCVZhbE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgVmFsT3BlcmF0aW9uKCk7Ci0JCWFjY2VwdCh2aXNpdG9yLCBwcm9qZWN0LCBWYWxUeXBlLkJ1aWxkLCBvcGVyYXRpb24sIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRvcnNGb3JQcm9qZWN0Q2hhbmdlZChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIHZhbGlkYXRpb25TZXR0aW5nQ2hhbmdlZCkgewotCQlpZiAodmFsaWRhdGlvblNldHRpbmdDaGFuZ2VkKXsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpX3Byb2plY3RQcmVmZXJlbmNlcy5yZW1vdmUocHJvamVjdCk7Ci0JCQljb25maWdIYXNDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBIYXNWYWxpZGF0b3JWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlVmlzaXRvciB7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gCQkJX2hhc1ZhbGlkYXRvcjsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuCQlfaXNNYW51YWw7Ci0JCXByaXZhdGUgZmluYWwgYm9vbGVhbgkJX2lzQnVpbGQ7Ci0JCQotCQlwdWJsaWMgSGFzVmFsaWRhdG9yVmlzaXRvcihib29sZWFuIGlzTWFudWFsLCBib29sZWFuIGlzQnVpbGQpewotCQkJX2lzTWFudWFsID0gaXNNYW51YWw7Ci0JCQlfaXNCdWlsZCA9IGlzQnVpbGQ7CQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1ZhbGlkYXRvcihJRm9sZGVyIGZvbGRlcil7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5hY2NlcHQodGhpcyk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCXJldHVybiBfaGFzVmFsaWRhdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKXJldHVybiB0cnVlOwotCQkJaWYgKGhhc1ZhbGlkYXRvcnMocmVzb3VyY2UsIF9pc01hbnVhbCwgX2lzQnVpbGQpKXsKLQkJCQlfaGFzVmFsaWRhdG9yID0gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNYXAgdmFsaWRhdG9yIGlkJ3MgdG8gYW4gaW5kZXggbnVtYmVyIG9uIGEgYml0IHNldCwgc28gdGhhdCB3ZSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgaWYgYQotCSAqIHBhcnRpY3VsYXIgdmFsaWRhdG9yIG5lZWRzIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciByZXNvdXJjZS4KLQkgKiBAYXV0aG9yIGthcmFzaXVrCi0JICoKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBWYWxpZGF0b3JJZE1hbmFnZXIgewotCQkKLQkJLyoqCi0JCSAqIE1hcCB2YWxpZGF0b3IgaWQncyB0byBJbnRlZ2Vycy4gVGhlIGludGVnZXJzIGNvcnJlc3BvbmQgdG8gYml0cyBpbiB0aGUgVmFsUHJvcGVydHkgaW5zdGFuY2VzLgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBfbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigxMDApOwotCQlwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IF9yZXZlcnNlTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigxMDApOwotCQkKLQkJLyoqIE5leHQgYXZhaWxhYmxlIGJpdC4gKi8KLQkJcHJpdmF0ZSBpbnQgX25leHQ7Ci0JCQotCQkvKioKLQkJICogQW5zd2VyIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoaXMgdmFsaWRhdG9yLiBJZiB3ZSBoYXZlbid0IHNlZW4gaXQgeWV0IGFsbG9jYXRlIGEgbmV3IGluZGV4IG51bWJlci4KLQkJICogQHBhcmFtIGlkIHZhbGlkYXRvciBpZC4KLQkJICogQHJldHVybiBpbmRleCBpbnRvIHRoZSB2YWxpZGF0b3IgYml0IG1hc2suCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbmRleChTdHJpbmcgaWQpewotCQkJSW50ZWdlciBpID0gX21hcC5nZXQoaWQpOwotCQkJaWYgKGkgIT0gbnVsbClyZXR1cm4gaTsKLQkJCQotCQkJaSA9IF9uZXh0Kys7Ci0JCQlfbWFwLnB1dChpZCwgaSk7Ci0JCQlfcmV2ZXJzZU1hcC5wdXQoaSwgaWQpOwotCQkJCi0JCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFuc3dlciB0aGUgdmFsaWRhdG9yIGlkIGZvciB0aGUgaW5kZXguCi0JCSAqIEBwYXJhbSBpbmRleAotCQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGluZGV4IG51bWJlciBoYXMgbm90IGJlZW4gc2V0LgotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0SWQoSW50ZWdlciBpbmRleCl7Ci0JCQlyZXR1cm4gX3JldmVyc2VNYXAuZ2V0KGluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCl7Ci0JCQlfbWFwLmNsZWFyKCk7Ci0JCQlfcmV2ZXJzZU1hcC5jbGVhcigpOwotCQkJX25leHQgPSAwOwotCQl9Ci0JCQotCQkvKioKLQkJICogQW5zd2VyIHRoZSBpZHMgZm9yIHRoZSBiaXQgaW4gdGhlIGJpdHNldC4gVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcuIAotCQkgKiBAcGFyYW0gYnMKLQkJICovCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0SWRzKEJpdFNldCBicyl7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkJCWZvcihpbnQgaT1icy5uZXh0U2V0Qml0KDApOyBpPj0wOyBpPWJzLm5leHRTZXRCaXQoaSsxKSkgewotCQkJCVN0cmluZyBpZCA9IGdldElkKGkpOwotCQkJCWlmIChpZCAhPSBudWxsKWxpc3QuYWRkKGlkKTsKLQkJCX0KLQkJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkocyk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCB2YWxpZGF0b3JzIGFyZSBlbmFibGVkIHdpdGggd2hpY2ggcHJvamVjdHMuIFdlIHdhbnQgdG8gZW5zdXJlCi0JICogdGhhdCB3ZSBkb24ndCBhY3RpdmF0ZSBhIHZhbGlkYXRvciAoYW5kIGl0J3MgcGx1Zy1pbikgaWYgaXQgaGFzIG5vdGhpbmcgdG8gdmFsaWRhdGUgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiBUaGlzIGlzIGFuIGltbXV0YWJsZSBvYmplY3QuCi0JICogQGF1dGhvciBrYXJhc2l1awotCSAqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgVmFsaWRhdG9yUHJvamVjdE1hbmFnZXIgewotCQkKLQkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQXRvbWljUmVmZXJlbmNlPFZhbGlkYXRvclByb2plY3RNYW5hZ2VyPiBfbWUgPSBuZXcgQXRvbWljUmVmZXJlbmNlPFZhbGlkYXRvclByb2plY3RNYW5hZ2VyPigpOwotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBdG9taWNJbnRlZ2VyIF9jb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQkJCi0JCXByaXZhdGUgZmluYWwgVmFsUHJvamVjdE1hcCBfbWFudWFsID0gbmV3IFZhbFByb2plY3RNYXAoVmFsVHlwZS5NYW51YWwpOwotCQlwcml2YXRlIGZpbmFsIFZhbFByb2plY3RNYXAgX2J1aWxkID0gbmV3IFZhbFByb2plY3RNYXAoVmFsVHlwZS5CdWlsZCk7Ci0JCXByaXZhdGUgZmluYWwgaW50IF9zZXF1ZW5jZTsKLQkJCi0JCS8qKgotCQkgKiBBbnN3ZXIgdGhlIG1vc3QgY3VycmVudCBWYWxpZGF0b3JQcm9qZWN0TWFuYWdlciBjcmVhdGluZyBhIG5ldyBvbmUgaWYgeW91IGhhdmUgdG8uCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yUHJvamVjdE1hbmFnZXIgZ2V0KCl7Ci0JCQlWYWxpZGF0b3JQcm9qZWN0TWFuYWdlciB2cG0gPSBfbWUuZ2V0KCk7Ci0JCQlpZiAodnBtICE9IG51bGwpcmV0dXJuIHZwbTsKLQkJCQotCQkJaW50IG5leHQgPSBfY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLQkJCVZhbGlkYXRvclByb2plY3RNYW5hZ2VyIG5ld1ZwbSA9IG51bGw7Ci0JCQlib29sZWFuIGxvb2tpbmcgPSB0cnVlOwotCQkJd2hpbGUobG9va2luZyl7Ci0JCQkJdnBtID0gX21lLmdldCgpOwotCQkJCWlmICh2cG0gPT0gbnVsbCB8fCBuZXh0ID4gdnBtLmdldFNlcXVlbmNlKCkpewotCQkJCQlpZiAobmV3VnBtID09IG51bGwpbmV3VnBtID0gbmV3IFZhbGlkYXRvclByb2plY3RNYW5hZ2VyKG5leHQpOwotCQkJCQlpZiAoX21lLmNvbXBhcmVBbmRTZXQodnBtLCBuZXdWcG0pKXJldHVybiBuZXdWcG07Ci0JCQkJfQotCQkJCWVsc2UgbG9va2luZyA9IGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHZwbTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJlc2V0IHRoZSBWYWxpZGF0b3JQcm9qZWN0TWFuYWdlciB0byBudWxsLCB3aGljaCB3aWxsIGZvcmNlIGEgbmV3ZXIgb25lIHRvIGJlIGNyZWF0ZWQgdGhlIG5leHQgdGltZQotCQkgKiB0aGF0IGl0IGlzIHJlcXVlc3RlZC4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpewotCQkJaW50IG5leHQgPSBfY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLQkJCVZhbGlkYXRvclByb2plY3RNYW5hZ2VyIHZwbSA9IF9tZS5nZXQoKTsKLQkJCWlmICggdnBtID09IG51bGwpcmV0dXJuOwotCQkJaWYgKG5leHQgPiB2cG0uZ2V0U2VxdWVuY2UoKSlfbWUuY29tcGFyZUFuZFNldCh2cG0sIG51bGwpOwotCQl9Ci0JCQotCQlwcml2YXRlIFZhbGlkYXRvclByb2plY3RNYW5hZ2VyKGludCBzZXF1ZW5jZSl7Ci0JCQlfc2VxdWVuY2UgPSBzZXF1ZW5jZTsKLQkJfQotCQkKLQkJaW50IGdldFNlcXVlbmNlKCl7Ci0JCQlyZXR1cm4gX3NlcXVlbmNlOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2hvdWxkIHRoaXMgdmFsaWRhdG9yIGF0dGVtcHQgdG8gdmFsaWRhdGUgYW55IHJlc291cmNlcyBpbiB0aGlzIHByb2plY3Q/Ci0JCSAqIAotCQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHRlc3RlZC4KLQkJICogQHBhcmFtIHByb2plY3QKLQkJICogICAgICAgICAgICBUaGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIHRlc3RlZC4gVGhpcyBjYW4gYmUgbnVsbCwgd2hpY2gKLQkJICogICAgICAgICAgICBtZWFucyB0aGF0IGFsbCBwcm9qZWN0cyB3aWxsIGJlIHRlc3RlZC4KLQkJICogQHBhcmFtIHR5cGUKLQkJICogICAgICAgICAgICBUaGUgdHlwZSBvZiB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkJICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0b3Igc2hvdWxkIGF0dGVtcHQgdG8gdmFsaWRhdGUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxUeXBlIHR5cGUpewotCQkJaWYgKHR5cGUgPT0gVmFsVHlwZS5CdWlsZClyZXR1cm4gX2J1aWxkLnNob3VsZFZhbGlkYXRlKHZhbGlkYXRvciwgcHJvamVjdCk7Ci0JCQlpZiAodHlwZSA9PSBWYWxUeXBlLk1hbnVhbClyZXR1cm4gX21hbnVhbC5zaG91bGRWYWxpZGF0ZSh2YWxpZGF0b3IsIHByb2plY3QpOwotCQkJCQotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQkKLQkJCQkKLQkJLyoqCi0JCSAqIFRoaXMgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHZhbGlkYXRvcnMgYXJlIGVuYWJsZWQgZm9yIHdoaWNoIHByb2plY3RzLiBXZSB3YW50IHRvIGVuc3VyZQotCQkgKiB0aGF0IHdlIGRvbid0IGFjdGl2YXRlIGEgdmFsaWRhdG9yIChhbmQgaXQncyBwbHVnLWluKSBpZiBpdCBoYXMgbm90aGluZyB0byB2YWxpZGF0ZSBpbiB0aGUgd29ya3NwYWNlLgotCQkgKiA8cD4KLQkJICogVGhlcmUgYXJlIHR3byByZWFzb25zIHdoeSBhIHZhbGlkYXRvciBtYXkgbm90IGJlIGVuYWJsZWQuIEl0J3MgY3VycmVudCBwcm9qZWN0IGxldmVsIGZpbHRlcnMgbWF5IG5vdCBtYXRjaAotCQkgKiB0aGUgcHJvamVjdC4gT3IgdGhlIGVudGlyZSB2YWxpZGF0b3IgbWF5IGhhdmUgYmVlbiB0dXJuZWQgb2ZmIGZvciB0aGUgcHJvamVjdC4gCi0JCSAqIDwvcD4KLQkJICogQGF1dGhvciBrYXJhc2l1awotCQkgKgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgVmFsUHJvamVjdE1hcCB7Ci0JCQkvKioKLQkJCSAqIE1hcCBhIHZhbGlkYXRvciB0byB0aGUgcHJvamVjdHMgdGhhdCBpdCB2YWxpZGF0ZXMuIFRoaXMgaXMgYW4gaW1tdXRhYmxlIG9iamVjdC4KLQkJCSAqIDxwPgotCQkJICogSSd2ZSBnb25lIGJhY2sgYW5kIGZvcnRoIG9uIHdoZXRoZXIgdGhlIGtleSBzaG91bGQKLQkJCSAqIGJlIGEgVmFsaWRhdG9yIG9yIHRoZSB2YWxpZGF0b3IgaWQuIEknbSBiYWNrIHRvIGl0IGJlaW5nIHRoZSBpZCBiZWNhdXNlIEkgd2FzCi0JCQkgKiBydW5uaW5nIGludG8gY2FzZXMgd2hlcmUgYmVjYXVzZSBvZiBjb3B5aW5nIEkgd2Fzbid0IGdldHRpbmcgdGhlIG1hdGNoZXMgdGhhdCBJIGV4cGVjdGVkIGFuZCBJCi0JCQkgKiB3YW50IHRvIGVuc3VyZSB0aGF0IEkgZG9uJ3QgbGVhayB2YWxpZGF0b3JzLiBJZiBJIHJ1biBpbnRvCi0JCQkgKiBmYWxzZSBtYXRjaGVzLCBpdCBpcyBwcm9iYWJseSBiZWNhdXNlIHJlc2V0IGlzbid0IGJlaW5nIGNhbGxlZCB3aGVuIGl0IHNob3VsZCBiZS4KLQkJCSAqIDwvcD4KLQkJCSAqLwotCQkJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8SVByb2plY3Q+PiBfbWFwOwotCQkJCi0JCQlwcml2YXRlIGZpbmFsIFZhbFR5cGUgX3R5cGU7Ci0JCQkJCQkKLQkJCXB1YmxpYyBWYWxQcm9qZWN0TWFwKFZhbFR5cGUgdHlwZSl7Ci0JCQkJX3R5cGUgPSB0eXBlOwotCQkJCV9tYXAgPSBsb2FkKCk7Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogU2hvdWxkIHRoaXMgdmFsaWRhdG9yIGF0dGVtcHQgdG8gdmFsaWRhdGUgYW55IHJlc291cmNlcyBpbiB0aGlzIHByb2plY3Q/Ci0JCQkgKiAKLQkJCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkJCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHRlc3RlZC4KLQkJCSAqIEBwYXJhbSBwcm9qZWN0Ci0JCQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdGVzdGVkLiBUaGlzIGNhbiBiZSBudWxsLCB3aGljaAotCQkJICogICAgICAgICAgICBtZWFucyB0aGF0IGFsbCBwcm9qZWN0cyB3aWxsIGJlIHRlc3RlZCwgYW5kIGlmIGFueSBvZiB0aGVtIHJldHVybiB0cnVlLCAKLQkJCSAqICAgICAgICAgICAgdGhlbiB0cnVlIGlzIGFuc3dlcmVkIGZvciB0aGlzIG1ldGhvZC4KLQkJCSAqICAgICAgICAgICAgCi0JCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbGlkYXRvciBzaG91bGQgYXR0ZW1wdCB0byB2YWxpZGF0ZS4KLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCl7Ci0JCQkJU3RyaW5nIHZpZCA9IHZhbGlkYXRvci5nZXRJZCgpOwotCQkJCVNldDxJUHJvamVjdD4gcHJvamVjdHMgPSBfbWFwLmdldCh2aWQpOwotCQkJCWlmIChwcm9qZWN0cyA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJCQlpZiAocHJvamVjdCA9PSBudWxsKXJldHVybiBwcm9qZWN0cy5zaXplKCkgPiAwOwotCQkJCXJldHVybiBwcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KTsKLQkJCX0KLQkJCQotCQkJLyoqCi0JCQkgKiBGb3IgZWFjaCBvZiB0aGUgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSwgbG9hZCB3aGljaCB2YWxpZGF0b3JzIGFyZSBjdXJyZW50bHkgcHJlcGFyZWQgdG8gdmFsaWRhdGUgdGhpbmdzLgotCQkJICovCi0JCQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJUHJvamVjdD4+IGxvYWQoKSB7Ci0JCQkJTWFwPFN0cmluZywgU2V0PElQcm9qZWN0Pj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8SVByb2plY3Q+Pig1MCk7Ci0JCQkJVmFsTWFuYWdlciB2bSA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJVHJhY2luZy5sb2coIlZhbE1hbmFnZXItMDI6IGxvYWRpbmcgIiArIHByb2plY3RzLmxlbmd0aCArICIgcHJvamVjdHMiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMpewotCQkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpY29udGludWU7Ci0JCQkJCVZhbGlkYXRvcltdIHZhbHMgPSB2bS5nZXRWYWxpZGF0b3JzKHByb2plY3QpOwotCQkJCQlmb3IgKFZhbGlkYXRvciB2IDogdmFscyl7Ci0JCQkJCQlTdHJpbmcgdmlkID0gdi5nZXRJZCgpOwotCQkJCQkJU2V0PElQcm9qZWN0PiBzZXQgPSBtYXAuZ2V0KHZpZCk7Ci0JCQkJCQlpZiAoc2V0ID09IG51bGwpewotCQkJCQkJCXNldCA9IG5ldyBIYXNoU2V0PElQcm9qZWN0Pig1MCk7Ci0JCQkJCQkJbWFwLnB1dCh2aWQsIHNldCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICh2LnNob3VsZFZhbGlkYXRlUHJvamVjdChwcm9qZWN0LCBfdHlwZSkpc2V0LmFkZChwcm9qZWN0KTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJCXJldHVybiBtYXA7Ci0JCQl9Ci0JCQkKLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCkgewotCQlfY29uZmlnTnVtYmVyLmluY3JlbWVudEFuZEdldCgpOwotCQlwcm9qZWN0Q2hhbmdlZChldmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0Q2hhbmdlZChJUHJvamVjdCBwcm9qZWN0LCBpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpewotCQljYXNlIElQcm9qZWN0Q2hhbmdlTGlzdGVuZXIuUHJvamVjdENsb3NlZDoKLQkJY2FzZSBJUHJvamVjdENoYW5nZUxpc3RlbmVyLlByb2plY3REZWxldGVkOgotCQkJcHJvamVjdFJlbW92ZWQocHJvamVjdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJUHJvamVjdENoYW5nZUxpc3RlbmVyLlByb2plY3RPcGVuZWQ6Ci0JCWNhc2UgSVByb2plY3RDaGFuZ2VMaXN0ZW5lci5Qcm9qZWN0Q2hhbmdlZDoKLQkJY2FzZSBJUHJvamVjdENoYW5nZUxpc3RlbmVyLlByb2plY3RBZGRlZDoKLQkJCXByb2plY3RDaGFuZ2VkKHByb2plY3QpOwotCQkJYnJlYWs7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBTdG9yZSB0aGUgc2luZ2xldG9uIGZvciB0aGUgVmFsTWFuYWdlci4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIHRvIGF2b2lkIGhhdmluZyB0byBzeW5jaHJvbml6ZSB0aGUKLQkgKiBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKSBtZXRob2QuCi0JICogCi0JICogQGF1dGhvciBrYXJhc2l1awotCSAqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2luZ2xldG9uIHsKLQkJc3RhdGljIFZhbE1hbmFnZXIgdmFsTWFuYWdlciA9IG5ldyBWYWxNYW5hZ2VyKCk7Ci0JfQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgVmFsaWRhdG9yQ2FjaGUgewotCQlwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8SVByb2plY3QsIFZhbGlkYXRvcltdPiBfY2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SVByb2plY3QsIFZhbGlkYXRvcltdPig1MCk7Ci0JCXByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPFZhbGlkYXRvcltdPiBfZ2xvYmFsID0gbmV3IEF0b21pY1JlZmVyZW5jZTxWYWxpZGF0b3JbXT4oKTsKLQkJCi0JCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzQ2FjaGVkKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBQcm9qZWN0VW5hdmFpbGFibGVFcnJvciB7Ci0JCQlWYWxpZGF0b3JbXSB2YWxzID0gbnVsbDsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwpewotCQkJCXZhbHMgPSBfZ2xvYmFsLmdldCgpOwotCQkJCWlmICh2YWxzID09IG51bGwpewkJCQkKLQkJCQkJdmFscyA9IGdldFZhbGlkYXRvcnNOb3RDYWNoZWQocHJvamVjdCk7Ci0JCQkJCV9nbG9iYWwuc2V0KHZhbHMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXZhbHMgPSBfY2FjaGUuZ2V0KHByb2plY3QpOwotCQkJCWlmICh2YWxzID09IG51bGwpewotCQkJCQl2YWxzID0gZ2V0VmFsaWRhdG9yc05vdENhY2hlZChwcm9qZWN0KTsKLQkJCQkJX2NhY2hlLnB1dChwcm9qZWN0LCB2YWxzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsczsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVzZXQoKXsKLQkJCV9jYWNoZS5jbGVhcigpOwotCQkJX2dsb2JhbC5zZXQobnVsbCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlc2V0KElQcm9qZWN0IHByb2plY3QpewotCQkJaWYgKHByb2plY3QgIT0gbnVsbClfY2FjaGUucmVtb3ZlKHByb2plY3QpOwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIGVudW0gVXNlUHJvamVjdFByZWZlcmVuY2VzIHtOb3JtYWwsIE11c3RVc2UsIE11c3ROb3RVc2V9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGFjNjJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgVmFsTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQkgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdFcnJvcjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWNvZGVFcnJvcjE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3IyMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcjIxOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyckNvbmZpZzsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyRmlsdGVyUnVsZTsJICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJHcm91cE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyRGVwZW5kZW5jeVZlcnNpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyR3JvdXBOb1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyR3JvdXBJbnZhbGlkVHlwZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJQYXR0ZXJuQXR0cmliOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyclR5cGVSZXE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyVHlwZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYmZFeGNTeW50YXhOb1ZhbENsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZiZkV4Y1N5bnRheE5vVmFsUnVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZiZkV4Y1N5bnRheE5vVmFsTnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHcm91cEluY2x1ZGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR3JvdXBFeGNsdWRlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9iTmFtZU1vbml0b3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9iSW5kZXhTYXZlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ1ZhbFN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ1ZhbEVuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dWYWxFbmRUaW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ1ZhbFN1bW1hcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nVmFsU3VtbWFyeTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nU2Vzc2lvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaWdyYXRpb25Kb2JOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvZ3VlVmFsaWRhdG9yOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1bGVQcm9qZWN0TmF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1bGVGaWxlRXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1bGVGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1bGVGb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUnVsZUZ1bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUnVsZUNvbnRlbnRUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1bGVGYWNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdWxlUGF0dGVybjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUV4YWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlTm90RXhhY3Q7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZUV4dFdpdGhDYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVFeHRXaXRob3V0Q2FzZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNldkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNldldhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2V2SWdub3JlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGltZVVuZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpbWVOYW5vOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpbWVNaWNybzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lU2VjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpbWVNaW47Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZUluY2x1ZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZUV4Y2x1ZGU7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVmFsTWVzc2FnZXMuY2xhc3MpOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM3OGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyByZXByZXNlbnRzIGEgdmFsaWRhdGlvbiBvcGVyYXRpb24sIGkuZS4gdGhlIHJ1bm5pbmcgb2YgYSBzZXQgb2YgdmFsaWRhdG9ycyBpbiByZXNwb25zZSB0byBzb21lIGNoYW5nZS4gCi0gKiBJdCBtYXkgYmUgYSBsYXJnZSBvcGVyYXRpb24sIGFzIHdvdWxkIGhhcHBlbiBvbiBhIGNsZWFuIGJ1aWxkLCBvciBpdCBtYXkgYmUgdGhlIHZhbGlkYXRpb24gb2YganVzdCBhIHNpbmdsZQotICogcmVzb3VyY2UuCi0gKiA8cD4KLSAqIFRoZSBvcGVyYXRpb24gY2FuLCBidXQgZG9lc24ndCBuZWVkIHRvLCBzcGFuIG11bHRpcGxlIHByb2plY3RzLgotICogPC9wPgotICogPHA+Ci0gKiBPbmNlIHRoZSBvcGVyYXRpb24gaGFzIGZpbmlzaGVkLCB0aGlzIG9iamVjdCBnb2VzIGF3YXkuCi0gKiA8L3A+ICAgICAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxPcGVyYXRpb24gewotCQotCXByaXZhdGUgZmluYWwgVmFsaWRhdGlvblN0YXRlIAlfc3RhdGUgPSBuZXcgVmFsaWRhdGlvblN0YXRlKCk7Ci0JcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uUmVzdWx0CV9yZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQotCS8qKgotCSAqIEVhY2ggcHJvamVjdCBjYW4gaGF2ZSBhIHNldCBvZiB2YWxpZGF0b3JzIHRoYXQgYXJlIHN1c3BlbmRlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLQkgKiBUaGUgc2V0IGNvbnRhaW5zIHRoZSB2YWxpZGF0b3IncyBpZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcDxJUHJvamVjdCwgU2V0PFN0cmluZz4+IF9zdXNwZW5kZWQgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgU2V0PFN0cmluZz4+KDQwKTsKLQkKLQkvKiogVGhlIHRpbWUgdGhhdCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBsb25nCV9zdGFydGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCi0JLyoqIAotCSAqIEFyZSB3ZSBpbiBhIG11bHRpIHByb2plY3QgdmFsaWRhdGlvbj8gVGhhdCBpcywgY291bGQgd2UgYmUgdmFsaWRhdGluZyBzZXZlcmFsCi0JICogcHJvamVjdHMgYXQgdGhlIHNhbWUgdGltZT8gVGhpcyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGVpdGhlciBjbGVhbiBhbGwgb3IgCi0JICogaWYgYXV0byBidWlsZCBpcyB0dXJuZWQgb2ZmLCBhIGJ1aWxkIGFsbC4gCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuCV9tdWx0aVByb2plY3Q7Ci0JCi0JLyoqIAotCSAqIEhvbGRzIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkYXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHJ1bm5pbmcgb3RoZXIgdmFsaWRhdGlvbnMuCi0JICogVGhlIGtleSBpcyB0aGUgdmFsaWRhdG9yIGlkIGFuZCB0aGUgdmFsdWUgaXMgYSBTZXQgb2YgSVJlc291cmNlcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxJUmVzb3VyY2U+PiAJX3ZhbGlkYXRlZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0PElSZXNvdXJjZT4+KDIwKTsKLQkKLQlwdWJsaWMgVmFsT3BlcmF0aW9uKCl7Ci0JCV9tdWx0aVByb2plY3QgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG11bHRpUHJvamVjdCBTZXQgdG8gdHJ1ZSBpZiB3ZSBjb3VsZCBiZSB2YWxpZGF0aW5nIHNldmVyYWwgcHJvamVjdHMgYXQgdGhlIHNhbWUgdGltZS4KLQkgKi8KLQlwdWJsaWMgVmFsT3BlcmF0aW9uKGJvb2xlYW4gbXVsdGlQcm9qZWN0KXsKLQkJX211bHRpUHJvamVjdCA9IG11bHRpUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRpb25TdGF0ZSBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIF9zdGF0ZTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgc3VtbWFyeSBvZiB0aGUgdmFsaWRhdGlvbiByZXN1bHRzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdFN1bW1hcnkgZ2V0UmVzdWx0KCkgewotCQlzeW5jaHJvbml6ZWQoX3Jlc3VsdCl7Ci0JCQlWYWxpZGF0aW9uUmVzdWx0U3VtbWFyeSB2cnMgPSBuZXcgVmFsaWRhdGlvblJlc3VsdFN1bW1hcnkoX3Jlc3VsdC5nZXRTZXZlcml0eUVycm9yKCksIAotCQkJCV9yZXN1bHQuZ2V0U2V2ZXJpdHlXYXJuaW5nKCksIF9yZXN1bHQuZ2V0U2V2ZXJpdHlJbmZvKCkpOwotCQkJcmV0dXJuIHZyczsKLQkJfQotCX0KLQkJCi0JLyoqCi0JICogQW5zd2VyIGEgY29weSBvZiB0aGUgVmFsaWRhdGlvblJlc3VsdC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHRzIGdldFJlc3VsdHMoKXsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0cyhfcmVzdWx0KTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtZW1iZXIgdGhhdCB0aGlzIHJlc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFzIGEgc2lkZS1lZmZlY3QuCi0JICogIAotCSAqIEBwYXJhbSBpZCBpZCBvZiB0aGUgdmFsaWRhdG9yCi0JICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIHRoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhbGlkYXRlZChTdHJpbmcgaWQsIElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCXN5bmNocm9uaXplZChfdmFsaWRhdGVkKXsKLQkJCVNldDxJUmVzb3VyY2U+IHNldCA9IF92YWxpZGF0ZWQuZ2V0KGlkKTsKLQkJCWlmIChzZXQgPT0gbnVsbCl7Ci0JCQkJc2V0ID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigyMCk7Ci0JCQkJX3ZhbGlkYXRlZC5wdXQoaWQsIHNldCk7Ci0JCQl9Ci0JCQlzZXQuYWRkKHJlc291cmNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgaWYgdGhpcyByZXNvdXJjZSBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHNvbWUgb3RoZXIgdmFsaWRhdGlvbiBieSB0aGUKLQkgKiBnaXZlbiB2YWxpZGF0b3IuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZWQoU3RyaW5nIGlkLCBJUmVzb3VyY2UgcmVzb3VyY2UpewotCQlzeW5jaHJvbml6ZWQoX3ZhbGlkYXRlZCl7Ci0JCQlTZXQ8SVJlc291cmNlPiBzZXQgPSBfdmFsaWRhdGVkLmdldChpZCk7Ci0JCQlpZiAoc2V0ID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlyZXR1cm4gc2V0LmNvbnRhaW5zKHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhcyB0aGlzIHZhbGlkYXRvciBiZWVuIHN1c3BlbmRlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgb3BlcmF0aW9uIG9uIHRoaXMgcHJvamVjdD8KLQkgKiAKLQkgKiBAcGFyYW0gdmFsCi0JICogICAgICAgICAgICBUaGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgY2hlY2tlZC4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgQ2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2Ugd2UgcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciBzaG91bGQgbm90IHJ1biBvbiB0aGlzIHByb2plY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoVmFsaWRhdG9yIHZhbCwgSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJc3luY2hyb25pemVkKF9zdXNwZW5kZWQpewotCQkJU2V0PFN0cmluZz4gc2V0ID0gZ2V0U3VzcGVuZGVkKHByb2plY3QpOwkJCi0JCQlyZXR1cm4gc2V0LmNvbnRhaW5zKHZhbC5nZXRJZCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFNldDxTdHJpbmc+IGdldFN1c3BlbmRlZChJUHJvamVjdCBwcm9qZWN0KXsKLQkJU2V0PFN0cmluZz4gc2V0ID0gX3N1c3BlbmRlZC5nZXQocHJvamVjdCk7Ci0JCWlmIChzZXQgPT0gbnVsbCl7Ci0JCQlzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDUpOwotCQkJX3N1c3BlbmRlZC5wdXQocHJvamVjdCwgc2V0KTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCXZvaWQgc3VzcGVuZFZhbGlkYXRpb24oSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAocHJvamVjdCA9PSBudWxsKXJldHVybjsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKXJldHVybjsKLQkJZ2V0U3VzcGVuZGVkKHByb2plY3QpLmFkZCh2YWxpZGF0b3IuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0U3RhcnRlZCgpIHsKLQkJcmV0dXJuIF9zdGFydGVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlQcm9qZWN0KCkgewotCQlyZXR1cm4gX211bHRpUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY2FuY2VsZWQKLQkgKiAJCVNldCB0byB0cnVlIGlmIGl0IHdhcyBjYW5jZWxlZCBhbmQgZmFsc2UgaWYgaXQgd2FzIG5vdCBjYW5jZWxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGNhbmNlbGVkKSB7Ci0JCXN5bmNocm9uaXplZCAoX3Jlc3VsdCkgewotCQkJX3Jlc3VsdC5zZXRDYW5jZWxlZChjYW5jZWxlZCk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogV2FzIHRoZSBvcGVyYXRpb24gY2FuY2VsZWQgYmVmb3JlIGl0IGNvbXBsZXRlZD8gRm9yIGV4YW1wbGUgaWYgdGhlIHZhbGlkYXRpb24gaXMgYmVpbmcgcnVuIHRocm91Z2ggdGhlCi0JICogdXNlciBpbnRlcmZhY2UsIHRoZSBlbmQgdXNlciBjYW4gY2FuY2VsIHRoZSBvcGVyYXRpb24gdGhyb3VnaCB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQlzeW5jaHJvbml6ZWQgKF9yZXN1bHQpIHsKLQkJCXJldHVybiBfcmVzdWx0LmlzQ2FuY2VsZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1lcmdlUmVzdWx0cyhWYWxpZGF0aW9uUmVzdWx0IHZyKSB7Ci0JCXN5bmNocm9uaXplZCAoX3Jlc3VsdCkgewotCQkJX3Jlc3VsdC5tZXJnZVJlc3VsdHModnIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsUHJlZk1hbmFnZXJHbG9iYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbFByZWZNYW5hZ2VyR2xvYmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NGVkMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsUHJlZk1hbmFnZXJHbG9iYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5GcmllbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY2xhc3MgdGhhdCBrbm93cyBob3cgdG8gbWFuYWdlIHRoZSBnbG9iYWwgcGVyc2lzdGVkIHZhbGlkYXRpb24gc2V0dGluZ3MuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxQcmVmTWFuYWdlckdsb2JhbCB7Ci0JCi0JLyoqIAotCSAqIFZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBwcm9wZXJ0aWVzLgotCSAqIDx1bD4KLQkgKiA8bGk+VmVyc2lvbiAyIC0gdXNlZCB0aGUgZmlsdGVyIGFwcHJvYWNoCi0JICogPGxpPlZlcnNpb24gMyAtIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW5jZSBiYXNlZCBhcHByb2FjaC4gKFNlZSBCdWd6aWxsYSAyMjQxNzkpCi0JICogPC91bD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBmcmFtZXdvcmtWZXJzaW9uID0gMzsKLQkKLQlwcml2YXRlIGZpbmFsIFNldDxJVmFsQ2hhbmdlZExpc3RlbmVyPiBfbGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8SVZhbENoYW5nZWRMaXN0ZW5lcj4oKTsKLQkKLQlwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxMaXN0PFZhbGlkYXRvcj4+IF92YWxpZGF0b3JzID0gbmV3IEF0b21pY1JlZmVyZW5jZTxMaXN0PFZhbGlkYXRvcj4+KCk7Ci0JCi0JcHJpdmF0ZSBWYWxQcmVmTWFuYWdlckdsb2JhbCgpe30KLQkKLQlwdWJsaWMgc3RhdGljIFZhbFByZWZNYW5hZ2VyR2xvYmFsIGdldERlZmF1bHQoKXsKLQkJcmV0dXJuIFNpbmdsZXRvbi52YWxQcmVmTWFuYWdlckdsb2JhbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVZhbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcil7Ci0JCV9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVZhbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcil7Ci0JCV9saXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpc3RlbmVycyhib29sZWFuIHZhbGlkYXRpb25TZXR0aW5nQ2hhbmdlZCl7Ci0JCWZvciAoSVZhbENoYW5nZWRMaXN0ZW5lciBjbCA6IF9saXN0ZW5lcnMpY2wudmFsaWRhdG9yc0ZvclByb2plY3RDaGFuZ2VkKG51bGwsIHZhbGlkYXRpb25TZXR0aW5nQ2hhbmdlZCk7IAotCX0KLQkJCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgdmFsaWRhdG9yIGZpbHRlcnMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiAgCi0JICogQHBhcmFtIHZhbAotCSAqIAotCSAqIEByZXR1cm4gZmFsc2UgaWYgdGhlcmUgYXJlIG5vIHByZWZlcmVuY2VzLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHVzZXIgaGFzIG5ldmVyIGNoYW5nZWQgYW55Ci0JICogb2YgdGhlIGRlZmF1bHQgc2V0dGluZ3MuIEFsc28gYW5zd2VyIGZhbHNlIGlmIHRoZXJlIHdhcyBzb21lIHNvcnQgb2YgZXJyb3IsIHdoaWNoIGVzc2VudGlhbGx5Ci0JICogbWVhbnMgdGhhdCB0aGUgcHJlZmVyZW5jZXMgYXJlbid0IHZhbGlkIGZvciB3aGF0ZXZlciByZWFzb24uICAgCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLS8vCXB1YmxpYyBib29sZWFuIGxvYWRQcmVmZXJlbmNlcyhWYWxpZGF0b3JbXSB2YWwpIHsKLS8vCQotLy8JCXRyeSB7Ci0vLwkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotLy8JCQlpZiAoIXByZWYubm9kZUV4aXN0cyhQcmVmQ29uc3RhbnRzLmZpbHRlcnMpKXJldHVybiBmYWxzZTsKLS8vCQkKLS8vCQkJUHJlZmVyZW5jZXMgZmlsdGVycyA9IHByZWYubm9kZShQcmVmQ29uc3RhbnRzLmZpbHRlcnMpOwotLy8JCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsKXsKLS8vCQkJCVN0cmluZyBpZCA9IHYuZ2V0SWQoKTsKLS8vCQkJCWlmIChmaWx0ZXJzLm5vZGVFeGlzdHMoaWQpKXsKLS8vCQkJCQlQcmVmZXJlbmNlcyB2cCA9IGZpbHRlcnMubm9kZShpZCk7Ci0vLwkJCQkJbG9hZFByZWZlcmVuY2VzKHYsIHZwKTsKLS8vCQkJCX0KLS8vCQkJfQkJCQotLy8JCX0KLS8vCQljYXRjaCAoRXhjZXB0aW9uIGUpewotLy8JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gdHJ1ZTsKLS8vCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHYyIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiBieSB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBMaXN0PFZhbGlkYXRvcj4gZ2V0VmFsaWRhdG9ycygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlMaXN0PFZhbGlkYXRvcj4gdmFscyA9IF92YWxpZGF0b3JzLmdldCgpOwotCQl3aGlsZSAodmFscyA9PSBudWxsKXsKLQkJCXZhbHMgPSBsb2FkVmFsaWRhdG9ycygpOwotCQkJaWYgKCFfdmFsaWRhdG9ycy5jb21wYXJlQW5kU2V0KG51bGwsIHZhbHMpKXZhbHMgPSBfdmFsaWRhdG9ycy5nZXQoKTsKLQkJfQotCQlyZXR1cm4gdmFsczsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgdmFsaWRhdG9ycyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiBieSB0aGUgZ2xvYmFsIHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0PFZhbGlkYXRvcj4gbG9hZFZhbGlkYXRvcnMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJTGlua2VkTGlzdDxWYWxpZGF0b3I+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3I+KCk7Ci0JCVByZWZlcmVuY2VzV3JhcHBlciBwcmVmID0gUHJlZmVyZW5jZXNXcmFwcGVyLmdldFByZWZlcmVuY2VzKG51bGwsIG51bGwpOwotCQlpZiAocHJlZi5ub2RlRXhpc3RzKFByZWZDb25zdGFudHMudmFscykpewotCQkJUHJlZmVyZW5jZXNXcmFwcGVyIHZhbHMgPSBwcmVmLm5vZGUoUHJlZkNvbnN0YW50cy52YWxzKTsKLQkJCWZvciAoU3RyaW5nIGlkIDogdmFscy5jaGlsZHJlbk5hbWVzKCkpewotCQkJCVZhbGlkYXRvciBiYXNlID0gRXh0ZW5zaW9uVmFsaWRhdG9ycy5pbnN0YW5jZSgpLmdldE1hcFYyKCkuZ2V0KGlkKTsKLQkJCQlWYWxpZGF0b3IgdiA9IGxvYWRWYWxpZGF0b3IoaWQsIHZhbHMsIGJhc2UpOwotCQkJCWlmICh2ICE9IG51bGwpewotCQkJCQlWMiB2MiA9IHYuYXNWMlZhbGlkYXRvcigpOwotCQkJCQlpZiAodjIgIT0gbnVsbCl2Mi5zZXRMZXZlbChWYWxpZGF0b3IuTGV2ZWwuR2xvYmFsKTsJCQkJCQotCQkJCQlsaXN0LmFkZCh2KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgY29weSBvZiB0aGUgdmFsaWRhdG9yIHRoYXQgaGFzIGJlZW4gdXBkYXRlZCB3aXRoIHRoZSBnaXZlbiBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFZhbGlkYXRvciBpZC4KLQkgKiBAcGFyYW0gdmFsc05vZGUKLQkgKiAgICAgICAgICAgIFRoZSAvdmFscyBub2RlIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICBUaGUgYmFzZSB2YWxpZGF0b3IgdGhhdCBpcyBiZWluZyBjdXN0b21pemVkLiBUaGlzIGNhbiBiZSBudWxsLAotCSAqICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogCi0JICogQHJldHVybiBBIG5ldyB2YWxpZGF0b3IgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCB2YWxpZGF0b3IKLQkgKiAgICAgICAgIHdpdGggdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlzdGF0aWMgVmFsaWRhdG9yIGxvYWRWYWxpZGF0b3IoU3RyaW5nIGlkLCBQcmVmZXJlbmNlc1dyYXBwZXIgdmFsc05vZGUsIFZhbGlkYXRvciBiYXNlKSB7Ci0JCWlmIChiYXNlID09IG51bGwpcmV0dXJuIG51bGw7Ci0JCQotCQlQcmVmZXJlbmNlc1dyYXBwZXIgdnAgPSB2YWxzTm9kZS5ub2RlKGlkKTsKLQkJYmFzZSA9IGJhc2UuY29weSgpOwotCQlWMiB2MiA9IGJhc2UuYXNWMlZhbGlkYXRvcigpOwotCi0JCVN0cmluZyBnbG9iYWwgPSB2cC5nZXQoUHJlZkNvbnN0YW50cy5nbG9iYWwsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2xvYmFsLmxlbmd0aCgpID4gMCl7Ci0JCUdsb2JhbCBnID0gbmV3IEdsb2JhbChnbG9iYWwpOwotCQkJYmFzZS5zZXRCdWlsZFZhbGlkYXRpb24oZy5pc0J1aWxkKCkpOwotCQkJYmFzZS5zZXRNYW51YWxWYWxpZGF0aW9uKGcuaXNNYW51YWwoKSk7Ci0JCQliYXNlLnNldERlbGVnYXRpbmdJZChnLmdldERlbGVnYXRpbmcoKSk7Ci0JCX0KLQkJCi0JCWlmICh2MiAhPSBudWxsKXsKLQkJCVN0cmluZyBncm91cHMgPSB2cC5nZXQoUHJlZkNvbnN0YW50cy5ncm91cHMsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGdyb3Vwcy5sZW5ndGgoKSA+IDApewotCQkJCUxpc3Q8RmlsdGVyR3JvdXA+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxGaWx0ZXJHcm91cD4oKTsKLQkJCQlEZXNlcmlhbGl6ZXIgZGVzID0gbmV3IERlc2VyaWFsaXplcihncm91cHMpOwotCQkJCXdoaWxlKGRlcy5oYXNOZXh0KCkpbGlzdC5hZGQoRmlsdGVyR3JvdXAuY3JlYXRlKGRlcykpOwotCQkJCXYyLnNldEdyb3VwcyhsaXN0KTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHNldHRpbmdzID0gdnAuZ2V0KFByZWZDb25zdGFudHMubXNncywgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2V0dGluZ3MubGVuZ3RoKCkgPjApCi0JCQl7Ci0JCQkJTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eT4gbWFwID0gTXNncy5kZXNlcmlhbGl6ZShzZXR0aW5ncyk7Ci0JCQkJTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4gbXNnID0gYmFzZS5nZXRNZXNzYWdlU2V0dGluZ3MoKTsKLQkJCQotCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eT4gbWUgOiBtYXAuZW50cnlTZXQoKSl7Ci0JCQkJCU1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbXMgPSBtc2cuZ2V0KG1lLmdldEtleSgpKTsKLQkJCQkJaWYgKG1zICE9IG51bGwpbXMuc2V0Q3VycmVudChtZS5nZXRWYWx1ZSgpKTsKLQkJCQl9CQotCQkJfQotCQl9CQkJCQkKLQkJcmV0dXJuIGJhc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIG9ubHkgdmFsaWQgd2F5IHRvIGdldCB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGlzIHRocm91Z2ggdGhlIFZhbE1hbmFnZXIuCi0JICogCi0JICogQHNlZSBWYWxNYW5hZ2VyI2dldEdsb2JhbFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgR2xvYmFsUHJlZmVyZW5jZXMgbG9hZEdsb2JhbFByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlc1dyYXBwZXIgcHJlZiA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhudWxsLCBudWxsKTsKLQkJR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMgZ3AgPSBuZXcgR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMoKTsKLQkJZ3Auc2F2ZUF1dG9tYXRpY2FsbHkgPSBwcmVmLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5zYXZlQXV0bywgR2xvYmFsUHJlZmVyZW5jZXMuRGVmYXVsdEF1dG9TYXZlKTsKLQkJZ3AuZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBwcmVmLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5zdXNwZW5kLCBHbG9iYWxQcmVmZXJlbmNlcy5EZWZhdWx0U3VzcGVuZCk7Ci0JCWdwLmNvbmZpcm1EaWFsb2cgPSBwcmVmLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5jb25maXJtRGlhbG9nLCBHbG9iYWxQcmVmZXJlbmNlcy5EZWZhdWx0Q29uZmlybSk7Ci0JCWdwLm92ZXJyaWRlID0gcHJlZi5nZXRCb29sZWFuKFByZWZDb25zdGFudHMub3ZlcnJpZGUsIEdsb2JhbFByZWZlcmVuY2VzLkRlZmF1bHRPdmVycmlkZSk7Ci0JCWdwLnZlcnNpb24gPSBwcmVmLmdldEludChQcmVmQ29uc3RhbnRzLmZyYW1ld29ya1ZlcnNpb24sIEdsb2JhbFByZWZlcmVuY2VzLkRlZmF1bHRGcmFtZXdvcmtWZXJzaW9uKTsKLQkJZ3Auc3RhdGVUaW1lU3RhbXAgPSBwcmVmLmdldExvbmcoUHJlZkNvbnN0YW50cy5zdGF0ZVRTLCAwKTsKLQkJCi0JCWlmIChncC52ZXJzaW9uICE9IGZyYW1ld29ya1ZlcnNpb24pbWlncmF0ZShncC52ZXJzaW9uLCBwcmVmKTsKLQkJcmV0dXJuIG5ldyBHbG9iYWxQcmVmZXJlbmNlcyhncCk7Ci0JfQotCQotCS8qKgotCSAqIElmIG5lY2Vzc2FyeSBtaWdyYXRlIHRoZSBwcmVmZXJlbmNlcy4KLQkgKiBAcGFyYW0gdmVyc2lvbiBUaGUgaW5jb21pbmcgdmVyc2lvbiBvZiB0aGUgcHJlZmVyZW5jZXMuCi0JICogQHBhcmFtIHByZWYgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlzdGF0aWMgdm9pZCBtaWdyYXRlKGludCB2ZXJzaW9uLCBQcmVmZXJlbmNlc1dyYXBwZXIgcHJlZikgewotCQl0cnkgewotCQkJYm9vbGVhbiB1cGRhdGUgPSBmYWxzZTsKLQkJCWlmICh2ZXJzaW9uID09IDIpewotCQkJCWlmIChwcmVmLm5vZGVFeGlzdHMoUHJlZkNvbnN0YW50cy5maWx0ZXJzKSl7Ci0JCQkJCXByZWYubm9kZShQcmVmQ29uc3RhbnRzLmZpbHRlcnMpLnJlbW92ZU5vZGUoKTsKLQkJCQkJdXBkYXRlID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHByZWYubm9kZUV4aXN0cyhQcmVmQ29uc3RhbnRzLm1zZ3MpKXsKLQkJCQkJcHJlZi5ub2RlKFByZWZDb25zdGFudHMubXNncykucmVtb3ZlTm9kZSgpOwotCQkJCQl1cGRhdGUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1cGRhdGUpewotCQkJCXByZWYucHV0SW50KFByZWZDb25zdGFudHMuZnJhbWV3b3JrVmVyc2lvbiwgZnJhbWV3b3JrVmVyc2lvbik7Ci0JCQkJcHJlZi5mbHVzaCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcHJlZmVyZW5jZXMgZm9yIGEgdmFsaWRhdG9yLgotCSAqIAotCSAqIEBwYXJhbSB2IHRoZSB2YWxpZGF0b3IgdGhhdCBpcyBiZWluZyBidWlsdCB1cAotCSAqIEBwYXJhbSBwIHRoZSBub2RlIGluIHRoZSBwcmVmZXJlbmNlIHRyZWUgZm9yIHRoZSB2YWxpZGF0b3IsIAotCSAqIAllLmcuIC9pbnN0YW5jZS92YWxpZGF0b3ItZnJhbWV3b3JrLWlkL2ZpbHRlcnMvdmFsaWRhdG9yLWlkCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLS8vCXN0YXRpYyB2b2lkIGxvYWRQcmVmZXJlbmNlcyhWYWxpZGF0b3IgdiwgUHJlZmVyZW5jZXMgcCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0vLwkJdi5zZXRCdWlsZFZhbGlkYXRpb24ocC5nZXRCb29sZWFuKFByZWZDb25zdGFudHMuYnVpbGQsIHRydWUpKTsKLS8vCQl2LnNldE1hbnVhbFZhbGlkYXRpb24ocC5nZXRCb29sZWFuKFByZWZDb25zdGFudHMubWFudWFsLCB0cnVlKSk7Ci0vLwkJdi5zZXRWZXJzaW9uKHAuZ2V0SW50KFByZWZDb25zdGFudHMudmVyc2lvbiwgMSkpOwotLy8JCXYuc2V0RGVsZWdhdGluZ0lkKHAuZ2V0KFByZWZDb25zdGFudHMuZGVsZWdhdGUsIG51bGwpKTsKLS8vCQkKLS8vCQlWYWxpZGF0b3IuVjIgdjIgPSB2LmFzVjJWYWxpZGF0b3IoKTsKLS8vCQlpZiAodjIgPT0gbnVsbClyZXR1cm47Ci0vLwkJaWYgKCFwLm5vZGVFeGlzdHMoUHJlZkNvbnN0YW50cy5ncm91cHMpKXJldHVybjsKLS8vCQkKLS8vCQlQcmVmZXJlbmNlcyBncm91cE5vZGUgPSBwLm5vZGUoUHJlZkNvbnN0YW50cy5ncm91cHMpOwotLy8JCWZvciAoU3RyaW5nIGdyb3VwTmFtZSA6IGdyb3VwTm9kZS5jaGlsZHJlbk5hbWVzKCkpewotLy8JCQlQcmVmZXJlbmNlcyBncm91cCA9IGdyb3VwTm9kZS5ub2RlKGdyb3VwTmFtZSk7Ci0vLwkJCVN0cmluZyB0eXBlID0gZ3JvdXAuZ2V0KFByZWZDb25zdGFudHMudHlwZSwgbnVsbCk7Ci0vLwkJCWlmICh0eXBlID09IG51bGwpdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihWYWxNZXNzYWdlcy5FcnJHcm91cE5vVHlwZSk7Ci0vLwkJCUZpbHRlckdyb3VwIGZnID0gRmlsdGVyR3JvdXAuY3JlYXRlKHR5cGUpOwotLy8JCQlpZiAoZmcgPT0gbnVsbCl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkVyckdyb3VwSW52YWxpZFR5cGUsIHR5cGUpKTsKLS8vCQkJdjIuYWRkKGZnKTsKLS8vCQkJCi0vLwkJCWlmIChncm91cC5ub2RlRXhpc3RzKFByZWZDb25zdGFudHMucnVsZXMpKXsKLS8vCQkJCVByZWZlcmVuY2VzIHJ1bGVOb2RlID0gZ3JvdXAubm9kZShQcmVmQ29uc3RhbnRzLnJ1bGVzKTsKLS8vCQkJCWZvciAoU3RyaW5nIHJ1bGVOYW1lIDogcnVsZU5vZGUuY2hpbGRyZW5OYW1lcygpKXsKLS8vCQkJCQlQcmVmZXJlbmNlcyBydWxlID0gcnVsZU5vZGUubm9kZShydWxlTmFtZSk7Ci0vLwkJCQkJRmlsdGVyUnVsZSBmciA9IEZpbHRlclJ1bGUuY3JlYXRlKHJ1bGUuZ2V0KFByZWZDb25zdGFudHMucnVsZVR5cGUsIG51bGwpKTsKLS8vCQkJCQlpZiAoZnIgIT0gbnVsbCl7Ci0vLwkJCQkJCWZyLmxvYWQocnVsZSk7Ci0vLwkJCQkJCWZnLmFkZChmcik7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQkJCi0vLwl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGUgdmFsaWRhdG9yIGludG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRvciBiZWluZyBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgVGhlIHRvcCBvZiB0aGUgcHJlZmVyZW5jZSB0cmVlIGZvciB2YWxpZGF0b3JzLCBpLmUuCi0JICogICAgICAgICAgICAvaW5zdGFuY2UvdmFsaWRhdG9yLWZyYW1ld29yay1pZC92YWxzIGZvciB3b3Jrc3BhY2UgdmFsaWRhdG9ycwotCSAqICAgICAgICAgICAgYW5kIC92YWxzIGZvciBwcm9qZWN0IHZhbGlkYXRvcnMuCi0JICogICAgICAgICAgICAKLQkgKiBAcGFyYW0gYmFzZVZhbGlkYXRvcnMKLQkgKiAgICAgICAgICAgIEEgbWFwIG9mIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIG9uZSBsZXZlbCBoaWdoZXIgaW4gdGhlCi0JICogICAgICAgICAgICBzdG9yYWdlIGhpZXJhcmNoeS4gU28gaWYgd2UgYXJlIHVwZGF0aW5nIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvcnMsIHRoZW4gdGhpcyBtYXAgd291bGQgYmUgdGhlIGV4dGVuc2lvbiBwb2ludAotCSAqICAgICAgICAgICAgdmFsaWRhdG9ycy4gSWYgd2UgYXJlIHVwZGF0aW5nIGEgcHJvamVjdCdzIHZhbGlkYXRvcnMsIHRoZW4KLQkgKiAgICAgICAgICAgIHRoaXMgbWFwIHdvdWxkIGJlIHRoZSBwcmVmZXJlbmNlIHBhZ2UgdmFsaWRhdG9ycy4KLQkgKi8KLQlzdGF0aWMgdm9pZCBzYXZlKFZhbGlkYXRvciB2YWxpZGF0b3IsIFByZWZlcmVuY2VzV3JhcHBlciByb290LCBNYXA8U3RyaW5nLCBWYWxpZGF0b3I+IGJhc2VWYWxpZGF0b3JzKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yLlYyIHYyID0gdmFsaWRhdG9yLmFzVjJWYWxpZGF0b3IoKTsKLQkJaWYgKHYyID09IG51bGwpcmV0dXJuOwotCQkKLQkJZmluYWwgU3RyaW5nIGlkID0gdmFsaWRhdG9yLmdldElkKCk7Ci0JCWJvb2xlYW4gaGFzTm9kZSA9IHJvb3Qubm9kZUV4aXN0cyhpZCk7Ci0JCQotCQlpZiAodmFsaWRhdG9yLnNhbWVDb25maWcoYmFzZVZhbGlkYXRvcnMuZ2V0KGlkKSkpewotCQkJaWYgKGhhc05vZGUpewotCQkJCVByZWZlcmVuY2VzV3JhcHBlciB2cCA9IHJvb3Qubm9kZShpZCk7Ci0JCQkJdnAucmVtb3ZlTm9kZSgpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghdmFsaWRhdG9yLmlzQ2hhbmdlZCgpKXJldHVybjsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHZwID0gcm9vdC5ub2RlKGlkKTsKLQkJaWYgKHZhbGlkYXRvci5oYXNHbG9iYWxDaGFuZ2VzKCkpewotCQkJR2xvYmFsIGcgPSBuZXcgR2xvYmFsKHZhbGlkYXRvci5pc01hbnVhbFZhbGlkYXRpb24oKSwgdmFsaWRhdG9yLmlzQnVpbGRWYWxpZGF0aW9uKCksIHZhbGlkYXRvci5nZXRWZXJzaW9uKCksCi0JCQkJdmFsaWRhdG9yLmdldERlbGVnYXRpbmdJZCgpKTsKLQkJCXZwLnB1dChQcmVmQ29uc3RhbnRzLmdsb2JhbCwgZy5zZXJpYWxpemUoKSk7Ci0JCQlGcmllbmQuc2V0TWlncmF0ZWQodmFsaWRhdG9yLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCWlmICh2YWxpZGF0b3IuZ2V0Q2hhbmdlQ291bnRNZXNzYWdlcygpID4gMCl7Ci0JCQlDb2xsZWN0aW9uPE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IG1zZ3MgPSB2YWxpZGF0b3IuZ2V0TWVzc2FnZVNldHRpbmdzKCkudmFsdWVzKCk7Ci0JCQlpZiAobXNncy5zaXplKCkgPiAwKXsKLQkJCQl2cC5wdXQoUHJlZkNvbnN0YW50cy5tc2dzLCBNc2dzLnNlcmlhbGl6ZShtc2dzKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICh2Mi5nZXRDaGFuZ2VDb3VudEdyb3VwcygpID4gMCl7Ci0JCQlGaWx0ZXJHcm91cFtdIGdyb3VwcyA9IHYyLmdldEdyb3VwcygpOwotCQkJaWYgKGdyb3Vwcy5sZW5ndGggPiAwKXsKLQkJCQlTZXJpYWxpemVyIHNlciA9IG5ldyBTZXJpYWxpemVyKDUwMCk7Ci0JCQkJZm9yIChGaWx0ZXJHcm91cCBncm91cCA6IGdyb3Vwcylncm91cC5zYXZlKHNlcik7Ci0JCQkJdnAucHV0KFByZWZDb25zdGFudHMuZ3JvdXBzLCBzZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2F2ZSB0aGUgdmFsaWRhdG9yIGludG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRvciBiZWluZyBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgVGhlIHRvcCBvZiB0aGUgcHJlZmVyZW5jZSB0cmVlIGZvciB2YWxpZGF0b3JzLCBpLmUuCi0JICogICAgICAgICAgICAvaW5zdGFuY2UvdmFsaWRhdG9yLWZyYW1ld29yay1pZC92YWxzIGZvciB3b3Jrc3BhY2UgdmFsaWRhdG9ycwotCSAqICAgICAgICAgICAgYW5kIC92YWxzIGZvciBwcm9qZWN0IHZhbGlkYXRvcnMuCi0JICogICAgICAgICAgICAKLQkgKiBAcGFyYW0gYmFzZVZhbGlkYXRvcnMKLQkgKiAgICAgICAgICAgIEEgbWFwIG9mIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIG9uZSBsZXZlbCBoaWdoZXIgaW4gdGhlCi0JICogICAgICAgICAgICBzdG9yYWdlIGhpZXJhcmNoeS4gU28gaWYgd2UgYXJlIHVwZGF0aW5nIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvcnMsIHRoZW4gdGhpcyBtYXAgd291bGQgYmUgdGhlIGV4dGVuc2lvbiBwb2ludAotCSAqICAgICAgICAgICAgdmFsaWRhdG9ycy4gSWYgd2UgYXJlIHVwZGF0aW5nIGEgcHJvamVjdCdzIHZhbGlkYXRvcnMsIHRoZW4KLQkgKiAgICAgICAgICAgIHRoaXMgbWFwIHdvdWxkIGJlIHRoZSBwcmVmZXJlbmNlIHBhZ2UgdmFsaWRhdG9ycy4KLQkgKi8KLQlzdGF0aWMgdm9pZCBzYXZlKFZhbGlkYXRvck11dGFibGUgdmFsaWRhdG9yLCBQcmVmZXJlbmNlc1dyYXBwZXIgcm9vdCwgTWFwPFN0cmluZywgVmFsaWRhdG9yPiBiYXNlVmFsaWRhdG9ycykgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7Ci0JCWlmICghdmFsaWRhdG9yLmlzVjJWYWxpZGF0b3IoKSlyZXR1cm47Ci0JCQotCQlQcmVmZXJlbmNlc1dyYXBwZXIgdnAgPSByb290Lm5vZGUodmFsaWRhdG9yLmdldElkKCkpOwotCQlpZiAodmFsaWRhdG9yLnNhbWVDb25maWcoYmFzZVZhbGlkYXRvcnMuZ2V0KHZhbGlkYXRvci5nZXRJZCgpKSkpewotCQkJdnAucmVtb3ZlTm9kZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghdmFsaWRhdG9yLmlzQ2hhbmdlZCgpKXJldHVybjsKLQkJaWYgKHZhbGlkYXRvci5oYXNHbG9iYWxDaGFuZ2VzKCkpewotCQkJR2xvYmFsIGcgPSBuZXcgR2xvYmFsKHZhbGlkYXRvci5pc01hbnVhbFZhbGlkYXRpb24oKSwgdmFsaWRhdG9yLmlzQnVpbGRWYWxpZGF0aW9uKCksIHZhbGlkYXRvci5nZXRWZXJzaW9uKCksCi0JCQkJdmFsaWRhdG9yLmdldERlbGVnYXRpbmdJZCgpKTsKLQkJCXZwLnB1dChQcmVmQ29uc3RhbnRzLmdsb2JhbCwgZy5zZXJpYWxpemUoKSk7Ci0vLwkJCUZyaWVuZC5zZXRNaWdyYXRlZCh2YWxpZGF0b3IsIGZhbHNlKTsKLQkJfQotCQkJCQotCQlpZiAodmFsaWRhdG9yLmdldENoYW5nZUNvdW50R3JvdXBzKCkgPiAwKXsKLQkJCUZpbHRlckdyb3VwW10gZ3JvdXBzID0gdmFsaWRhdG9yLmdldEdyb3VwcygpOwotCQkJaWYgKGdyb3Vwcy5sZW5ndGggPiAwKXsKLQkJCQlTZXJpYWxpemVyIHNlciA9IG5ldyBTZXJpYWxpemVyKDUwMCk7Ci0JCQkJZm9yIChGaWx0ZXJHcm91cCBncm91cCA6IGdyb3Vwcylncm91cC5zYXZlKHNlcik7Ci0JCQkJdnAucHV0KFByZWZDb25zdGFudHMuZ3JvdXBzLCBzZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhbGlkYXRvci5nZXRDaGFuZ2VDb3VudE1lc3NhZ2VzKCkgPiAwKXsKLQkJCUNvbGxlY3Rpb248TWVzc2FnZVNldmVyaXR5U2V0dGluZz4gbXNncyA9IHZhbGlkYXRvci5nZXRNZXNzYWdlU2V0dGluZ3MoKS52YWx1ZXMoKTsKLQkJCWlmIChtc2dzLnNpemUoKSA+IDApewotCQkJCXZwLnB1dChQcmVmQ29uc3RhbnRzLm1zZ3MsIE1zZ3Muc2VyaWFsaXplKG1zZ3MpKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZUFzUHJlZnMoVmFsaWRhdG9yW10gdmFsKSB7Ci0JCXRyeSB7Ci0JCQlQcmVmZXJlbmNlc1dyYXBwZXIgcHJlZiA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhudWxsLCBudWxsKTsKLQkJCVByZWZlcmVuY2VzV3JhcHBlciB2YWxzID0gcHJlZi5ub2RlKFByZWZDb25zdGFudHMudmFscyk7Ci0JCQlNYXA8U3RyaW5nLCBWYWxpZGF0b3I+IGJhc2UgPSBFeHRlbnNpb25WYWxpZGF0b3JzLmluc3RhbmNlKCkuZ2V0TWFwVjIoKTsKLQkJCWZvciAoVmFsaWRhdG9yIHYgOiB2YWwpc2F2ZSh2LCB2YWxzLCBiYXNlKTsKLQkJCXByZWYuZmx1c2goKTsKLQkJCV92YWxpZGF0b3JzLnNldChudWxsKTsKLQkJCXVwZGF0ZUxpc3RlbmVycyh0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTYXZlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgYW5kIHRoZSB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlUHJlZmVyZW5jZXMoR2xvYmFsUHJlZmVyZW5jZXMgZ3AsIFZhbGlkYXRvcltdIHZhbGlkYXRvcnMpewotCQl0cnkgewotCQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWZzID0gUHJlZmVyZW5jZXNXcmFwcGVyLmdldFByZWZlcmVuY2VzKG51bGwsIG51bGwpOwotCQkJc2F2ZVByZWZlcmVuY2VzKHByZWZzLCBncCk7Ci0JCQlQcmVmZXJlbmNlc1dyYXBwZXIgdmFscyA9IHByZWZzLm5vZGUoUHJlZkNvbnN0YW50cy52YWxzKTsKLQotCQkJTWFwPFN0cmluZywgVmFsaWRhdG9yPiBiYXNlID0gRXh0ZW5zaW9uVmFsaWRhdG9ycy5pbnN0YW5jZSgpLmdldE1hcFYyKCk7Ci0JCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsaWRhdG9ycylzYXZlKHYsIHZhbHMsIGJhc2UpOwotCQkJcHJlZnMuZmx1c2goKTsKLQkJCV92YWxpZGF0b3JzLnNldChudWxsKTsKLQkJCXVwZGF0ZUxpc3RlbmVycyh0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGFuZCB0aGUgdmFsaWRhdG9ycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKEdsb2JhbFByZWZlcmVuY2VzIGdwLCBWYWxpZGF0b3JNdXRhYmxlW10gdmFsaWRhdG9ycywgQm9vbGVhbiBwZXJzaXN0KXsKLQkJdHJ5IHsKLQkJCVByZWZlcmVuY2VzV3JhcHBlciBwcmVmcyA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhudWxsLCBwZXJzaXN0KTsKLQkJCXNhdmVQcmVmZXJlbmNlcyhwcmVmcywgZ3ApOwotCQkJUHJlZmVyZW5jZXNXcmFwcGVyIHZhbHMgPSBwcmVmcy5ub2RlKFByZWZDb25zdGFudHMudmFscyk7Ci0JCQlNYXA8U3RyaW5nLCBWYWxpZGF0b3I+IGJhc2UgPSBFeHRlbnNpb25WYWxpZGF0b3JzLmluc3RhbmNlKCkuZ2V0TWFwVjIoKTsKLQkJCWZvciAoVmFsaWRhdG9yTXV0YWJsZSB2IDogdmFsaWRhdG9ycylzYXZlKHYsIHZhbHMsIGJhc2UpOwotCi0JCQlwcmVmcy5mbHVzaCgpOwotCQkJX3ZhbGlkYXRvcnMuc2V0KG51bGwpOwotCQkJdXBkYXRlTGlzdGVuZXJzKHRydWUpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkJCi0JLyoqCi0JICogU2F2ZSB0aGUgVjEgcHJlZmVyZW5jZXMsIHNvIHRoYXQgdGhlIG9sZCB2YWxpZGF0b3JzIGNvbnRpbnVlIHRvIHdvcmsuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVWMVByZWZlcmVuY2VzKFZhbGlkYXRvck11dGFibGVbXSB2YWxpZGF0b3JzLCBCb29sZWFuIHBlcnNpc3RlbnQpewotCQl0cnkgewotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnYyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlnYy5zZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycyhnZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycyh2YWxpZGF0b3JzKSk7CQkJCQotCQkJZ2Muc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhnZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpKTsKLQotCQkJZ2MucGFzc2l2YXRlKCk7Ci0JCQlnYy5zdG9yZShwZXJzaXN0ZW50KTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgVjEgdmFsaWRhdG9ycyB0aGF0IGFyZSBtYW51YWxseSBlbmFibGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKFZhbGlkYXRvck11dGFibGVbXSB2YWxpZGF0b3JzKSB7Ci0JCUxpc3Q8VmFsaWRhdG9yTWV0YURhdGE+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJZm9yIChWYWxpZGF0b3JNdXRhYmxlIHYgOiB2YWxpZGF0b3JzKXsKLQkJCWlmICh2LmlzTWFudWFsVmFsaWRhdGlvbigpICYmIHYuaXNWMVZhbGlkYXRvcigpKWxpc3QuYWRkKHYuZ2V0Vm1kKCkpOwotCQl9Ci0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgVjEgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciBidWlsZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKFZhbGlkYXRvck11dGFibGVbXSB2YWxpZGF0b3JzKSB7Ci0JCUxpc3Q8VmFsaWRhdG9yTWV0YURhdGE+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKLQkJZm9yIChWYWxpZGF0b3JNdXRhYmxlIHYgOiB2YWxpZGF0b3JzKXsKLQkJCWlmICh2LmlzQnVpbGRWYWxpZGF0aW9uKCkgJiYgdi5pc1YxVmFsaWRhdG9yKCkpbGlzdC5hZGQodi5nZXRWbWQoKSk7Ci0JCX0KLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBTYXZlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgYW5kIHRoZSB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKXsKLQkJdHJ5IHsKLQkJCUdsb2JhbFByZWZlcmVuY2VzIGdwID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKTsKLQkJCVByZWZlcmVuY2VzV3JhcHBlciBwcmVmcyA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhudWxsLCBudWxsKTsKLQkJCXNhdmVQcmVmZXJlbmNlcyhwcmVmcywgZ3ApOwotCQkJcHJlZnMuZmx1c2goKTsKLQkJCXVwZGF0ZUxpc3RlbmVycyh0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGFuZCB0aGUgdmFsaWRhdG9ycy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZVByZWZlcmVuY2VzKFByZWZlcmVuY2VzV3JhcHBlciBwcmVmcywgR2xvYmFsUHJlZmVyZW5jZXMgZ3ApewotCQlwcmVmcy5wdXRCb29sZWFuKFByZWZDb25zdGFudHMuc2F2ZUF1dG8sIGdwLmdldFNhdmVBdXRvbWF0aWNhbGx5KCkpOwotCQlwcmVmcy5wdXRCb29sZWFuKFByZWZDb25zdGFudHMuc3VzcGVuZCwgZ3AuZ2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oKSk7Ci0JCXByZWZzLnB1dExvbmcoUHJlZkNvbnN0YW50cy5zdGF0ZVRTLCBncC5nZXRTdGF0ZVRpbWVTdGFtcCgpKTsKLQkJcHJlZnMucHV0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLmNvbmZpcm1EaWFsb2csIGdwLmdldENvbmZpcm1EaWFsb2coKSk7Ci0JCXByZWZzLnB1dEJvb2xlYW4oUHJlZkNvbnN0YW50cy5vdmVycmlkZSwgZ3AuZ2V0T3ZlcnJpZGUoKSk7Ci0JCXByZWZzLnB1dEludChQcmVmQ29uc3RhbnRzLmZyYW1ld29ya1ZlcnNpb24sIFZhbFByZWZNYW5hZ2VyR2xvYmFsLmZyYW1ld29ya1ZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbnkgbWVzc2FnZSBwcmVmZXJlbmNlcyBpbiB0aGUgbWFwLgotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkTWVzc2FnZXMoVmFsaWRhdG9yIHZhbGlkYXRvciwgTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4gc2V0dGluZ3MpIHsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWYgPSBQcmVmZXJlbmNlc1dyYXBwZXIuZ2V0UHJlZmVyZW5jZXMobnVsbCwgbnVsbCk7Ci0JCXRyeSB7Ci0JCQlsb2FkTWVzc2FnZVNldHRpbmdzKHZhbGlkYXRvciwgc2V0dGluZ3MsIHByZWYpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkJCi0JLyoqCi0JICogTG9hZCB0aGUgbWVzc2FnZSBwcmVmZXJlbmNlcyBmb3IgdGhlIHZhbGlkYXRvciBpbnRvIHRoZSBtYXAuCi0JICogCi0JICogQHBhcmFtIHZhbAotCSAqIEBwYXJhbSBzZXR0aW5ncwotCSAqIEBwYXJhbSByb290IHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICovCi0Jc3RhdGljIHZvaWQgbG9hZE1lc3NhZ2VTZXR0aW5ncyhWYWxpZGF0b3IgdmFsLCBNYXA8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBzZXR0aW5ncywgUHJlZmVyZW5jZXNXcmFwcGVyIHJvb3QpIAotCQl0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFyb290Lm5vZGVFeGlzdHMoUHJlZkNvbnN0YW50cy52YWxzKSlyZXR1cm47Ci0JCQotCQlQcmVmZXJlbmNlc1dyYXBwZXIgdmFscyA9IHJvb3Qubm9kZShQcmVmQ29uc3RhbnRzLnZhbHMpOyAKLQkJaWYgKCF2YWxzLm5vZGVFeGlzdHModmFsLmdldElkKCkpKXJldHVybjsKLQkJCi0JCVByZWZlcmVuY2VzV3JhcHBlciB2YWxQcmVmcyA9IHZhbHMubm9kZSh2YWwuZ2V0SWQoKSk7Ci0JCVN0cmluZyBtc2dzID0gdmFsUHJlZnMuZ2V0KFByZWZDb25zdGFudHMubXNncywgIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtc2dzLmxlbmd0aCgpID09IDApcmV0dXJuOwotCQkKLQkJTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eT4gbWFwID0gTXNncy5kZXNlcmlhbGl6ZShtc2dzKTsKLQkJCi0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eT4gbWUgOiBtYXAuZW50cnlTZXQoKSl7Ci0JCQlNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIG1zID0gc2V0dGluZ3MuZ2V0KG1lLmdldEtleSgpKTsKLQkJCWlmIChtcyAhPSBudWxsKW1zLnNldEN1cnJlbnQobWUuZ2V0VmFsdWUoKSk7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIFNhdmUgd2hldGhlciB0aGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgb3Igbm90LiAKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogQHBhcmFtIHByZWZzIHVwIHRvIHRoZSBmaWx0ZXIgcGFydCBvZiB0aGUgcHJlZmVyZW5jZSB0cmVlCi0JICovCi0vLwlwcml2YXRlIHZvaWQgc2F2ZVNoYWxsb3dQcmVmZXJlbmNlKFZhbGlkYXRvciB2YWxpZGF0b3IsIFByZWZlcmVuY2VzIHByZWZzKSB7Ci0vLwkJaWYgKHZhbGlkYXRvci5hc1YyVmFsaWRhdG9yKCkgPT0gbnVsbClyZXR1cm47Ci0vLwkJUHJlZmVyZW5jZXMgdmFsID0gcHJlZnMubm9kZSh2YWxpZGF0b3IuZ2V0SWQoKSk7Ci0vLwkJdmFsLnB1dEJvb2xlYW4oUHJlZkNvbnN0YW50cy5idWlsZCwgdmFsaWRhdG9yLmlzQnVpbGRWYWxpZGF0aW9uKCkpOwotLy8JCXZhbC5wdXRCb29sZWFuKFByZWZDb25zdGFudHMubWFudWFsLCB2YWxpZGF0b3IuaXNNYW51YWxWYWxpZGF0aW9uKCkpOwotLy8JCXZhbC5wdXRJbnQoUHJlZkNvbnN0YW50cy52ZXJzaW9uLCB2YWxpZGF0b3IuZ2V0VmVyc2lvbigpKTsKLS8vCX0KLQkKLS8vCS8qKgotLy8JICogTG9hZCB0aGUgY3VzdG9taXplZCBtZXNzYWdlIHNldHRpbmdzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0vLwkgKiBAcGFyYW0gbWVzc2FnZVNldHRpbmdzCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIGxvYWRNZXNzYWdlU2V0dGluZ3MoVmFsaWRhdG9yIHZhbCwgTWVzc2FnZUNhdGVnb3J5W10gbWVzc2FnZVNldHRpbmdzKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJbG9hZE1lc3NhZ2VTZXR0aW5ncyh2YWwsIG1lc3NhZ2VTZXR0aW5ncywgVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotLy8JCX0KLS8vCQljYXRjaCAoRXhjZXB0aW9uIGUpewotLy8JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgR2xvYmFsIHsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIAlfbWFudWFsOwotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gCV9idWlsZDsKLQkJcHJpdmF0ZSBmaW5hbCBpbnQJCV92ZXJzaW9uOwotCQlwcml2YXRlIGZpbmFsIFN0cmluZwlfZGVsZWdhdGluZzsKLQkJCi0JCXB1YmxpYyBHbG9iYWwoU3RyaW5nIHZhbHVlKXsKLQkJCURlc2VyaWFsaXplciBkID0gbmV3IERlc2VyaWFsaXplcih2YWx1ZSk7Ci0JCQlfbWFudWFsID0gZC5nZXRCb29sZWFuKCk7Ci0JCQlfYnVpbGQgPSBkLmdldEJvb2xlYW4oKTsKLQkJCV92ZXJzaW9uID0gZC5nZXRJbnQoKTsKLQkJCV9kZWxlZ2F0aW5nID0gZC5oYXNOZXh0KCkgPyBkLmdldFN0cmluZygpIDogbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIEdsb2JhbChib29sZWFuIG1hbnVhbCwgYm9vbGVhbiBidWlsZCwgaW50IHZlcnNpb24sIFN0cmluZyBkZWxlZ2F0aW5nKXsKLQkJCV9tYW51YWwgPSBtYW51YWw7Ci0JCQlfYnVpbGQgPSBidWlsZDsKLQkJCV92ZXJzaW9uID0gdmVyc2lvbjsKLQkJCV9kZWxlZ2F0aW5nID0gZGVsZWdhdGluZzsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBzZXJpYWxpemUoKXsKLQkJCVNlcmlhbGl6ZXIgcyA9IG5ldyBTZXJpYWxpemVyKDUwKTsKLQkJCXMucHV0KF9tYW51YWwpOwotCQkJcy5wdXQoX2J1aWxkKTsKLQkJCXMucHV0KF92ZXJzaW9uKTsKLQkJCWlmIChfZGVsZWdhdGluZyAhPSBudWxsKXMucHV0KF9kZWxlZ2F0aW5nKTsKLQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc01hbnVhbCgpIHsKLQkJCXJldHVybiBfbWFudWFsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNCdWlsZCgpIHsKLQkJCXJldHVybiBfYnVpbGQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0JCQlyZXR1cm4gX3ZlcnNpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlbGVnYXRpbmcoKSB7Ci0JCQlyZXR1cm4gX2RlbGVnYXRpbmc7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgTXNncyB7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZShDb2xsZWN0aW9uPE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IG1lc3NhZ2VzKXsKLQkJCVNlcmlhbGl6ZXIgcyA9IG5ldyBTZXJpYWxpemVyKDEwMCk7Ci0JCQlmb3IgKE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbXMgOiBtZXNzYWdlcyl7Ci0JCQkJcy5wdXQobXMuZ2V0SWQoKSk7Ci0JCQkJcy5wdXQobXMuZ2V0Q3VycmVudCgpLm9yZGluYWwoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcy50b1N0cmluZygpOwkKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFuc3dlciBhIG1hcCBmb3IgYWxsIHRoZSBtZXNzYWdlcy4KLQkJICogVGhlIGtleSBpcyB0aGUgbWVzc2FnZSBpZCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIHRoYXQgbWVzc2FnZQotCQkgKiBAcGFyYW0gdgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk+IGRlc2VyaWFsaXplKFN0cmluZyB2KXsKLQkJCU1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eT4oMTApOwotCQkJRGVzZXJpYWxpemVyIGQgPSBuZXcgRGVzZXJpYWxpemVyKHYpOwotCQkJd2hpbGUoZC5oYXNOZXh0KCkpewotCQkJCVN0cmluZyBpZCA9IGQuZ2V0U3RyaW5nKCk7Ci0JCQkJaW50IHNldiA9IGQuZ2V0SW50KCk7Ci0JCQkJbWFwLnB1dChpZCwgTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS52YWx1ZXMoKVtzZXZdKTsKLQkJCX0KLQkJCXJldHVybiBtYXA7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU3RvcmUgdGhlIHNpbmdsZXRvbiBmb3IgdGhlIFZhbFByZWZNYW5hZ2VyR2xvYmFsLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIHRvIHN5bmNocm9uaXplIHRoZQotCSAqIFZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKSBtZXRob2QuCi0JICogCi0JICogQGF1dGhvciBrYXJhc2l1awotCSAqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgU2luZ2xldG9uIHsKLQkJZmluYWwgc3RhdGljIFZhbFByZWZNYW5hZ2VyR2xvYmFsIHZhbFByZWZNYW5hZ2VyR2xvYmFsID0gbmV3IFZhbFByZWZNYW5hZ2VyR2xvYmFsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxQcmVmTWFuYWdlclByb2plY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbFByZWZNYW5hZ2VyUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjhiMDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbFByZWZNYW5hZ2VyUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uRnJpZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVByb2plY3RTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLlByb2plY3RQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGNsYXNzIHRoYXQga25vd3MgaG93IHRvIG1hbmFnZSB0aGUgcHJvamVjdCBsZXZlbCBwZXJzaXN0ZWQgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxQcmVmTWFuYWdlclByb2plY3QgewotCQotCXByaXZhdGUgZmluYWwgSVByb2plY3QJX3Byb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTGlzdDxJVmFsQ2hhbmdlZExpc3RlbmVyPiBfbGlzdGVuZXJzID0gbmV3IExpbmtlZExpc3Q8SVZhbENoYW5nZWRMaXN0ZW5lcj4oKTsKLQkKLQkvKioKLQkgKiBUaGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCBwcmVmZXJlbmNlIGZpbGUsIGJ1dCBoYXZlCi0JICogb25seSBiZWVuIGNvbmZpZ3VyZWQgdG8gdGhlIGdsb2JhbCBwcmVmZXJlbmNlIGxldmVsLiBUaGF0IGlzIHRoZXkgaGF2ZSBub3QgaGFkCi0JICogYW55IHByb2plY3QgbGV2ZWwgY3VzdG9taXphdGlvbnMgYXBwbGllZCB5ZXQuCi0JICovCi0JcHJpdmF0ZSBMaXN0PFZhbGlkYXRvcj4gX3ZhbGlkYXRvcnM7Ci0JCi0JcHVibGljIFZhbFByZWZNYW5hZ2VyUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KXsKLQkJYXNzZXJ0IHByb2plY3QgIT0gbnVsbDsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTGlzdGVuZXIoSVZhbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcil7Ci0JCWlmIChfbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSlyZXR1cm47Ci0JCV9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElWYWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpewotCQlfbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlTGlzdGVuZXJzKElQcm9qZWN0IHByb2plY3QpewotCQlmb3IgKElWYWxDaGFuZ2VkTGlzdGVuZXIgY2wgOiBfbGlzdGVuZXJzKWNsLnZhbGlkYXRvcnNGb3JQcm9qZWN0Q2hhbmdlZChwcm9qZWN0LCB0cnVlKTsgCi0JfQotCi0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgb3Igbm90IHRoaXMgcHJvamVjdCBoYXMgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLQkgKiAgIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBoYXMgc2V0dGluZ3MuIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBzZXR0aW5ncyBhcmUgZW5hYmxlZCwgb25seSB0aGF0IGl0Ci0JICogaGFzIHNldHRpbmdzLgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvamVjdFNwZWNpZmljU2V0dGluZ3MoKXsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWYgPSBnZXRQcmVmZXJlbmNlcyhudWxsKTsKLQkJCi0JCWlmIChwcmVmID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSB2MiB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIG92ZXJyaWRkZW4gYnkgdGhlIHByb2plY3QKLQkgKiBwcmVmZXJlbmNlcy4gVGhlIHZhbGlkYXRvcnMgd2lsbCBub3QgaGF2ZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSdzCi0JICogY3VzdG9taXphdGlvbnMgYXBwbGllZCB5ZXQuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kLCBpcyB0byBpZGVudGlmeSB0aGUgc3Vic2V0IG9mIHZhbGlkYXRvcnMgCi0JICogdGhhdCBtYXkgbGF0ZXIgYmUgY29uZmlndXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVZhbGlkYXRvcnMKLQkgKiAgICAgICAgICAgIFYyIHZhbGlkYXRvcnMgZnJvbSB0aGUgZXh0ZW5zaW9uIHBvaW50cywgYW5kIGN1c3RvbWl6ZWQgYnkgYW55Ci0JICogICAgICAgICAgICBnbG9iYWwgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIExpc3Q8VmFsaWRhdG9yPiBnZXRWYWxpZGF0b3JzKE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4gYmFzZVZhbGlkYXRvcnMpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlMaXN0PFZhbGlkYXRvcj4gdmFscyA9IF92YWxpZGF0b3JzOwotCQlpZiAodmFscyA9PSBudWxsKXsKLQkJCXZhbHMgPSBsb2FkVmFsaWRhdG9ycyhiYXNlVmFsaWRhdG9ycyk7Ci0JCQlfdmFsaWRhdG9ycyA9IHZhbHM7Ci0JCX0KLQkJcmV0dXJuIHZhbHM7Ci0JfQotCQotCS8qKgotCSAqIExvYWQgdGhlIHZhbGlkYXRvcnMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4gVGhlIHZhbGlkYXRvcnMgd2lsbCBub3QgaGF2ZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSdzCi0JICogY3VzdG9taXphdGlvbnMgYXBwbGllZCB5ZXQuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kLCBpcyB0byBpZGVudGlmeSB0aGUgc3Vic2V0IG9mIHZhbGlkYXRvcnMgCi0JICogdGhhdCBtYXkgbGF0ZXIgYmUgY29uZmlndXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVZhbGlkYXRvcnMKLQkgKiAgICAgICAgICAgIFYyIHZhbGlkYXRvcnMgZnJvbSB0aGUgZXh0ZW5zaW9uIHBvaW50cywgYW5kIGN1c3RvbWl6ZWQgYnkgYW55Ci0JICogICAgICAgICAgICBnbG9iYWwgcHJlZmVyZW5jZXMuCi0JICogQHJldHVybiB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCBwcmVmZXJlbmNlIGZpbGUsIGJ1dCBoYXZlCi0JICogICAgICAgICBvbmx5IGJlZW4gY29uZmlndXJlZCB0byB0aGUgZ2xvYmFsIHByZWZlcmVuY2UgbGV2ZWwuIFRoYXQgaXMgdGhleSBoYXZlIG5vdCBoYWQKLQkgKiAgICAgICAgIGFueSBwcm9qZWN0IGxldmVsIGN1c3RvbWl6YXRpb25zIGFwcGxpZWQgeWV0LgotCSAqLwotCXByaXZhdGUgTGlzdDxWYWxpZGF0b3I+IGxvYWRWYWxpZGF0b3JzKE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4gYmFzZVZhbGlkYXRvcnMpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQlMaXN0PFZhbGlkYXRvcj4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFZhbGlkYXRvcj4oKTsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWYgPSBnZXRQcmVmZXJlbmNlcyhudWxsKTsKLQkJaWYgKHByZWYubm9kZUV4aXN0cyhQcmVmQ29uc3RhbnRzLnZhbHMpKXsKLQkJCVByZWZlcmVuY2VzV3JhcHBlciB2YWxzID0gcHJlZi5ub2RlKFByZWZDb25zdGFudHMudmFscyk7Ci0JCQlmb3IgKFN0cmluZyBpZCA6IHZhbHMuY2hpbGRyZW5OYW1lcygpKXsKLQkJCQlWYWxpZGF0b3IgYmFzZSA9IGJhc2VWYWxpZGF0b3JzLmdldChpZCk7Ci0JCQkJVmFsaWRhdG9yIHYgPSBWYWxQcmVmTWFuYWdlckdsb2JhbC5sb2FkVmFsaWRhdG9yKGlkLCB2YWxzLCBiYXNlKTsKLQkJCQlpZiAodiAhPSBudWxsKXsKLQkJCQkJVjIgdjIgPSB2LmFzVjJWYWxpZGF0b3IoKTsKLQkJCQkJaWYgKHYyICE9IG51bGwpdjIuc2V0TGV2ZWwoVmFsaWRhdG9yLkxldmVsLlByb2plY3QpOwkJCQkJCi0JCQkJCWxpc3QuYWRkKHYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCQotCS8qKgotCSAqIEFuc3dlciB0aGUgc2V0dGluZyBvZiB0aGUgZ2V0T3ZlcnJpZGUgZmllbGQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0T3ZlcnJpZGUoKXsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWYgPSBnZXRQcmVmZXJlbmNlcyhudWxsKTsKLQkJCi0JCWlmICghcHJlZi5ub2RlRXhpc3RzKCkpcmV0dXJuIFByb2plY3RQcmVmZXJlbmNlcy5EZWZhdWx0T3ZlcnJpZGU7Ci0JCQotCQlpbnQgdmVyc2lvbiA9IHByZWYuZ2V0SW50KFByZWZDb25zdGFudHMuZnJhbWV3b3JrVmVyc2lvbiwgMCk7Ci0JCWlmICh2ZXJzaW9uID09IDApewotCQkJdHJ5IHsKLQkJCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwYyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihfcHJvamVjdCk7Ci0JCQkJcmV0dXJuIHBjLmdldERvZXNQcm9qZWN0T3ZlcnJpZGUoKTsKLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpewotCQkJCS8vIGVhdCBpdCwgaWYgaXQgZmFpbHMgd2UganVzdCBnbyB3aXRoIHRoZSBkZWZhdWx0cwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVmLmdldEJvb2xlYW4oUHJlZkNvbnN0YW50cy5vdmVycmlkZSwgUHJvamVjdFByZWZlcmVuY2VzLkRlZmF1bHRPdmVycmlkZSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9qZWN0UHJlZmVyZW5jZXMgbWlncmF0ZUZyb21CZWZvcmVXVFAzMChJUHJvamVjdCBwcm9qZWN0LCBNYXA8U3RyaW5nLCBWYWxpZGF0b3I+IGJhc2VWYWxpZGF0b3JzKSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwYyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCQotCQkJTGlzdDxWYWxpZGF0b3I+IGxpc3QgPSBtaWdyYXRlRnJvbUJlZm9yZVdUUDMwKGJhc2VWYWxpZGF0b3JzLCBwYyk7Ci0JCQlWYWxpZGF0b3JbXSB2YWxzID0gbmV3IFZhbGlkYXRvcltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkodmFscyk7Ci0JCQlyZXR1cm4gbmV3IFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0LCBwYy5nZXREb2VzUHJvamVjdE92ZXJyaWRlKCksIHBjLmlzRGlzYWJsZUFsbFZhbGlkYXRpb24oKSwgdmFscyk7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSl7Ci0JCQkvLyBlYXQgaXQsIGlmIGl0IGZhaWxzIHdlIGp1c3QgZ28gd2l0aCB0aGUgZGVmYXVsdHMKLQkJfQotCQlyZXR1cm4gbmV3IFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8VmFsaWRhdG9yPiBtaWdyYXRlRnJvbUJlZm9yZVdUUDMwKE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4gYmFzZVZhbGlkYXRvcnMsIFByb2plY3RDb25maWd1cmF0aW9uIHBjKQotCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCQotCQlTZXQ8U3RyaW5nPiBidWlsZCA9IHBjLmdldEVuYWJsZWRCdWlsZGxWYWxpZGF0b3JzKCk7Ci0JCVNldDxTdHJpbmc+IG1hbnVhbCA9IHBjLmdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKCk7Ci0JCQotCQlMaXN0PFZhbGlkYXRvcj4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFZhbGlkYXRvcj4oKTsKLQkJZm9yIChWYWxpZGF0b3IgdiA6IGJhc2VWYWxpZGF0b3JzLnZhbHVlcygpKXsKLQkJCVYyIHYyID0gdi5hc1YyVmFsaWRhdG9yKCk7Ci0JCQlpZiAodjIgIT0gbnVsbCl7Ci0JCQkJYm9vbGVhbiBpc0J1aWxkID0gYnVpbGQgPT0gbnVsbCB8fCBidWlsZC5jb250YWlucyh2Mi5nZXRWYWxpZGF0b3JDbGFzc25hbWUoKSk7Ci0JCQkJYm9vbGVhbiBpc01hbnVhbCA9IG1hbnVhbCA9PSBudWxsIHx8IG1hbnVhbC5jb250YWlucyh2Mi5nZXRWYWxpZGF0b3JDbGFzc25hbWUoKSk7Ci0JCQkJaWYgKCh2LmlzQnVpbGRWYWxpZGF0aW9uKCkgIT0gaXNCdWlsZCkgfHwgKHYuaXNNYW51YWxWYWxpZGF0aW9uKCkgIT0gaXNNYW51YWwpKXsKLQkJCQkJVjIgY29weSA9IHYyLmNvcHkoKS5hc1YyVmFsaWRhdG9yKCk7Ci0JCQkJCWNvcHkuc2V0QnVpbGRWYWxpZGF0aW9uKGlzQnVpbGQpOwotCQkJCQljb3B5LnNldE1hbnVhbFZhbGlkYXRpb24oaXNNYW51YWwpOwotCQkJCQljb3B5LnNldExldmVsKFZhbGlkYXRvci5MZXZlbC5Qcm9qZWN0KTsKLQkJCQkJRnJpZW5kLnNldE1pZ3JhdGVkKGNvcHksIHRydWUpOwotCQkJCQlsaXN0LmFkZChjb3B5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcHJvamVjdCBwcmVmZXJlbmNlcyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGFueSBzcGVjaWZpYyBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgUHJvamVjdFByZWZlcmVuY2VzIGxvYWRQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgTWFwPFN0cmluZywgVmFsaWRhdG9yPiBiYXNlVmFsaWRhdG9ycykgCi0JCXRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gewotCQkKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWYgPSBnZXRQcmVmZXJlbmNlcyhudWxsKTsKLQotCQlpZiAocHJlZiA9PSBudWxsKXJldHVybiBudWxsOwotCQlpbnQgdmVyc2lvbiA9IHByZWYuZ2V0SW50KFByZWZDb25zdGFudHMuZnJhbWV3b3JrVmVyc2lvbiwgMCk7Ci0JCWlmICh2ZXJzaW9uID09IDApewotCQkJLy8gVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgYSBwcm9qZWN0IHRoYXQgaXMgYmVmb3JlIFdUUCAzLjAKLQkJCXJldHVybiBtaWdyYXRlRnJvbUJlZm9yZVdUUDMwKHByb2plY3QsIGJhc2VWYWxpZGF0b3JzKTsKLQkJfQotCQkKLQkJaWYgKHZlcnNpb24gIT0gVmFsUHJlZk1hbmFnZXJHbG9iYWwuZnJhbWV3b3JrVmVyc2lvbilWYWxQcmVmTWFuYWdlckdsb2JhbC5taWdyYXRlKHZlcnNpb24sIHByZWYpOwotCi0JCWlmICghcHJlZi5ub2RlRXhpc3RzKFByZWZDb25zdGFudHMudmFscykpewotCQkJcmV0dXJuIG5ldyBQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCwgcHJlZi5nZXRCb29sZWFuKFByZWZDb25zdGFudHMub3ZlcnJpZGUsIFByb2plY3RQcmVmZXJlbmNlcy5EZWZhdWx0T3ZlcnJpZGUpLAotCQkJCXByZWYuZ2V0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLnN1c3BlbmQsIFByb2plY3RQcmVmZXJlbmNlcy5EZWZhdWx0U3VzcGVuZCksIG5ldyBWYWxpZGF0b3JbMF0pOwotCQl9Ci0JCQotCQlQcmVmZXJlbmNlc1dyYXBwZXIgdnAgPSBwcmVmLm5vZGUoUHJlZkNvbnN0YW50cy52YWxzKTsKLQkJTGlzdDxWYWxpZGF0b3I+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3I+KCk7Ci0JCWZvciAoU3RyaW5nIGlkIDogdnAuY2hpbGRyZW5OYW1lcygpKXsKLQkJCVZhbGlkYXRvciBiYXNlID0gYmFzZVZhbGlkYXRvcnMuZ2V0KGlkKTsKLQkJCVZhbGlkYXRvciB2ID0gVmFsUHJlZk1hbmFnZXJHbG9iYWwubG9hZFZhbGlkYXRvcihpZCwgdnAsIGJhc2UpOwotCQkJaWYgKHYgIT0gbnVsbCl7Ci0JCQkJVjIgdjIgPSB2LmFzVjJWYWxpZGF0b3IoKTsKLQkJCQlpZiAodjIgIT0gbnVsbCl2Mi5zZXRMZXZlbChWYWxpZGF0b3IuTGV2ZWwuUHJvamVjdCk7Ci0JCQkJbGlzdC5hZGQodik7Ci0JCQl9Ci0JCX0KLQkJVmFsaWRhdG9yW10gdmFscyA9IG5ldyBWYWxpZGF0b3JbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkodmFscyk7Ci0JCXJldHVybiBuZXcgUHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QsIHByZWYuZ2V0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLm92ZXJyaWRlLCBQcm9qZWN0UHJlZmVyZW5jZXMuRGVmYXVsdE92ZXJyaWRlKSwKLQkJCXByZWYuZ2V0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLnN1c3BlbmQsIFByb2plY3RQcmVmZXJlbmNlcy5EZWZhdWx0U3VzcGVuZCksIHZhbHMpOwotCX0KLQotCXByaXZhdGUgUHJlZmVyZW5jZXNXcmFwcGVyIGdldFByZWZlcmVuY2VzKEJvb2xlYW4gcGVyc2lzdCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZXNXcmFwcGVyLmdldFByZWZlcmVuY2VzKF9wcm9qZWN0LCBwZXJzaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoUHJvamVjdFByZWZlcmVuY2VzIHByb2plY3RQcmVmZXJlbmNlcykgewotCQlWYWxpZGF0b3JbXSB2YWxpZGF0b3JzID0gcHJvamVjdFByZWZlcmVuY2VzLmdldFZhbGlkYXRvcnMoKTsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWYgPSBnZXRQcmVmZXJlbmNlcyhudWxsKTsKLQkJcHJlZi5wdXRCb29sZWFuKFByZWZDb25zdGFudHMuc3VzcGVuZCwgcHJvamVjdFByZWZlcmVuY2VzLmdldFN1c3BlbmQoKSk7Ci0JCXByZWYucHV0Qm9vbGVhbihQcmVmQ29uc3RhbnRzLm92ZXJyaWRlLCBwcm9qZWN0UHJlZmVyZW5jZXMuZ2V0T3ZlcnJpZGUoKSk7Ci0JCXByZWYucHV0SW50KFByZWZDb25zdGFudHMuZnJhbWV3b3JrVmVyc2lvbiwgVmFsUHJlZk1hbmFnZXJHbG9iYWwuZnJhbWV3b3JrVmVyc2lvbik7Ci0JCVByZWZlcmVuY2VzV3JhcHBlciB2YWxzID0gcHJlZi5ub2RlKFByZWZDb25zdGFudHMudmFscyk7Ci0JCXRyeSB7Ci0JCQlWYWxpZGF0b3JbXSB3b3Jrc3BhY2VWYWxzID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9ycygpOwotCQkJTWFwPFN0cmluZywgVmFsaWRhdG9yPiBiYXNlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWxpZGF0b3I+KHdvcmtzcGFjZVZhbHMubGVuZ3RoKTsKLQkJCWZvciAoVmFsaWRhdG9yIHYgOiB3b3Jrc3BhY2VWYWxzKWJhc2UucHV0KHYuZ2V0SWQoKSwgdik7Ci0JCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsaWRhdG9ycylWYWxQcmVmTWFuYWdlckdsb2JhbC5zYXZlKHYsIHZhbHMsIGJhc2UpOwotCQkJcHJlZi5mbHVzaCgpOwotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcGMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkKLQkJCQkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdFByZWZlcmVuY2VzLmdldFByb2plY3QoKSk7Ci0JCQlwYy5zZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGdldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnModmFsaWRhdG9ycykpOwotCQkJcGMuc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnModmFsaWRhdG9ycykpOwotCQkJcGMucGFzc2l2YXRlKCk7Ci0JCQlwYy5zdG9yZSgpOwotCQkJdXBkYXRlTGlzdGVuZXJzKF9wcm9qZWN0KTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcyhQcm9qZWN0UHJlZmVyZW5jZXMgcHJvamVjdFByZWZlcmVuY2VzLCBWYWxpZGF0b3JNdXRhYmxlW10gdmFsaWRhdG9ycykgewotCQlQcmVmZXJlbmNlc1dyYXBwZXIgcHJlZiA9IGdldFByZWZlcmVuY2VzKG51bGwpOwotCQlwcmVmLnB1dEJvb2xlYW4oUHJlZkNvbnN0YW50cy5zdXNwZW5kLCBwcm9qZWN0UHJlZmVyZW5jZXMuZ2V0U3VzcGVuZCgpKTsKLQkJcHJlZi5wdXRCb29sZWFuKFByZWZDb25zdGFudHMub3ZlcnJpZGUsIHByb2plY3RQcmVmZXJlbmNlcy5nZXRPdmVycmlkZSgpKTsKLQkJcHJlZi5wdXRJbnQoUHJlZkNvbnN0YW50cy5mcmFtZXdvcmtWZXJzaW9uLCBWYWxQcmVmTWFuYWdlckdsb2JhbC5mcmFtZXdvcmtWZXJzaW9uKTsKLQkJdHJ5IHsKLQkJCXNhdmVQcmVmZXJlbmNlcyh2YWxpZGF0b3JzLCBmYWxzZSwgbnVsbCk7Ci0JCQlwcmVmLmZsdXNoKCk7Ci0JCQl1cGRhdGVMaXN0ZW5lcnMoX3Byb2plY3QpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcyhNdXRhYmxlUHJvamVjdFNldHRpbmdzIHNldHRpbmdzLCBCb29sZWFuIHBlcnNpc3QpewotCQlJUHJvamVjdCBwcm9qZWN0ID0gc2V0dGluZ3MuZ2V0UHJvamVjdCgpOwotCQlQcmVmZXJlbmNlc1dyYXBwZXIgcHJlZiA9IFByZWZlcmVuY2VzV3JhcHBlci5nZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBwZXJzaXN0KTsKLQkJcHJlZi5wdXRCb29sZWFuKFByZWZDb25zdGFudHMuc3VzcGVuZCwgc2V0dGluZ3MuZ2V0U3VzcGVuZCgpKTsKLQkJcHJlZi5wdXRCb29sZWFuKFByZWZDb25zdGFudHMub3ZlcnJpZGUsIHNldHRpbmdzLmdldE92ZXJyaWRlKCkpOwotCQlwcmVmLnB1dEludChQcmVmQ29uc3RhbnRzLmZyYW1ld29ya1ZlcnNpb24sIFZhbFByZWZNYW5hZ2VyR2xvYmFsLmZyYW1ld29ya1ZlcnNpb24pOwotCQkKLQkJSU11dGFibGVWYWxpZGF0b3JbXSB2bXMgPSBzZXR0aW5ncy5nZXRWYWxpZGF0b3JzKCk7Ci0JCVZhbGlkYXRvck11dGFibGVbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvck11dGFibGVbdm1zLmxlbmd0aF07Ci0JCWZvciAoaW50IGk9MDsgaTx2bXMubGVuZ3RoO2krKyl2YWxpZGF0b3JzW2ldID0gKFZhbGlkYXRvck11dGFibGUpdm1zW2ldOwotCQkKLQkJdHJ5IHsKLQkJCXNhdmVQcmVmZXJlbmNlcyh2YWxpZGF0b3JzLCBmYWxzZSwgcGVyc2lzdCk7Ci0JCQlwcmVmLmZsdXNoKCk7Ci0JCQl1cGRhdGVMaXN0ZW5lcnMocHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcyhWYWxpZGF0b3JNdXRhYmxlW10gdmFsaWRhdG9ycywgYm9vbGVhbiBmbHVzaCwgQm9vbGVhbiBwZXJzaXN0KXsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHByZWYgPSBnZXRQcmVmZXJlbmNlcyhwZXJzaXN0KTsKLQkJcHJlZi5wdXRJbnQoUHJlZkNvbnN0YW50cy5mcmFtZXdvcmtWZXJzaW9uLCBWYWxQcmVmTWFuYWdlckdsb2JhbC5mcmFtZXdvcmtWZXJzaW9uKTsKLQkJUHJlZmVyZW5jZXNXcmFwcGVyIHZhbHMgPSBwcmVmLm5vZGUoUHJlZkNvbnN0YW50cy52YWxzKTsKLQkJdHJ5IHsKLQkJCVZhbGlkYXRvcltdIHdvcmtzcGFjZVZhbHMgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3JzKCk7Ci0JCQlNYXA8U3RyaW5nLCBWYWxpZGF0b3I+IGJhc2UgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4od29ya3NwYWNlVmFscy5sZW5ndGgpOwotCQkJZm9yIChWYWxpZGF0b3IgdiA6IHdvcmtzcGFjZVZhbHMpYmFzZS5wdXQodi5nZXRJZCgpLCB2KTsKLQkJCWZvciAoVmFsaWRhdG9yTXV0YWJsZSB2IDogdmFsaWRhdG9ycylWYWxQcmVmTWFuYWdlckdsb2JhbC5zYXZlKHYsIHZhbHMsIGJhc2UpOwotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcGMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24oX3Byb2plY3QpOwotCQkJcGMuc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhnZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpKTsKLQkJCXBjLnNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKHZhbGlkYXRvcnMpKTsKLQkJCXBjLnBhc3NpdmF0ZSgpOwotCQkJcGMuc3RvcmUoKTsKLQkJCWlmIChmbHVzaCl7Ci0JCQkJcHJlZi5mbHVzaCgpOwotCQkJCXVwZGF0ZUxpc3RlbmVycyhfcHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9CQkKLQkJCi0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbGwgdGhlIFYxIHZhbGlkYXRvcnMgdGhhdCBhcmUgZW5hYmxlZCBmb3IgYnVpbGQuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBnZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKFZhbGlkYXRvcltdIHZhbGlkYXRvcnMpIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBzZXQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oNTApOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsaWRhdG9ycyl7Ci0JCQlpZiAodi5pc0J1aWxkVmFsaWRhdGlvbigpKXsKLQkJCQlWYWxpZGF0b3IuVjEgdjEgPSB2LmFzVjFWYWxpZGF0b3IoKTsKLQkJCQlpZiAodjEgIT0gbnVsbClzZXQuYWRkKHYxLmdldFZtZCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYWxsIHRoZSBWMSB2YWxpZGF0b3JzIHRoYXQgYXJlIGVuYWJsZWQgZm9yIGJ1aWxkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFNldDxWYWxpZGF0b3JNZXRhRGF0YT4gZ2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhWYWxpZGF0b3JNdXRhYmxlW10gdmFsaWRhdG9ycykgewotCQlTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IHNldCA9IG5ldyBIYXNoU2V0PFZhbGlkYXRvck1ldGFEYXRhPig1MCk7Ci0JCWZvciAoVmFsaWRhdG9yTXV0YWJsZSB2IDogdmFsaWRhdG9ycyl7Ci0JCQlpZiAodi5pc0J1aWxkVmFsaWRhdGlvbigpICYmIHYuaXNWMVZhbGlkYXRvcigpKXNldC5hZGQodi5nZXRWbWQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgVjEgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciBtYW51YWwgdmFsaWRhdGlvbi4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKFZhbGlkYXRvcltdIHZhbGlkYXRvcnMpIHsKLQkJU2V0PFZhbGlkYXRvck1ldGFEYXRhPiBzZXQgPSBuZXcgSGFzaFNldDxWYWxpZGF0b3JNZXRhRGF0YT4oNTApOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsaWRhdG9ycyl7Ci0JCQlpZiAodi5pc01hbnVhbFZhbGlkYXRpb24oKSl7Ci0JCQkJVmFsaWRhdG9yLlYxIHYxID0gdi5hc1YxVmFsaWRhdG9yKCk7Ci0JCQkJaWYgKHYxICE9IG51bGwpc2V0LmFkZCh2MS5nZXRWbWQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgVjEgdmFsaWRhdG9ycyB0aGF0IGFyZSBlbmFibGVkIGZvciBtYW51YWwgdmFsaWRhdGlvbi4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTZXQ8VmFsaWRhdG9yTWV0YURhdGE+IGdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKFZhbGlkYXRvck11dGFibGVbXSB2YWxpZGF0b3JzKSB7Ci0JCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gc2V0ID0gbmV3IEhhc2hTZXQ8VmFsaWRhdG9yTWV0YURhdGE+KDUwKTsKLQkJZm9yIChWYWxpZGF0b3JNdXRhYmxlIHYgOiB2YWxpZGF0b3JzKXsKLQkJCWlmICh2LmlzTWFudWFsVmFsaWRhdGlvbigpICYmIHYuaXNWMVZhbGlkYXRvcigpKXNldC5hZGQodi5nZXRWbWQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZE1lc3NhZ2VzKFZhbGlkYXRvciB2YWxpZGF0b3IsIE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IHNldHRpbmdzKSB7Ci0JCXRyeSB7Ci0JCQlWYWxQcmVmTWFuYWdlckdsb2JhbC5sb2FkTWVzc2FnZVNldHRpbmdzKHZhbGlkYXRvciwgc2V0dGluZ3MsIGdldFByZWZlcmVuY2VzKG51bGwpKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCX0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsUHJvcGVydHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDAxZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7Ci0KLS8qKgotICogQSByZXNvdXJjZSBzZXNzaW9uIHByb3BlcnR5LCB0aGF0IGlzIHVzZWQgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBUaGlzIGlzIHBsYWNlZAotICogb24gZWFjaCByZXNvdXJjZSBhbmQgaXQgZW5hYmxlcyB0aGUgZnJhbWV3b3JrIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIHRoZSByZXNvdXJjZSBuZWVkcyB0byBiZSBwcm9jZXNzZWQuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsUHJvcGVydHkgewotLyoKLSAqIEkgZGlkIHNvbWUgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzIG9uIHRoZSBJUmVzb3VyY2Ujc2V0U2Vzc2lvblByb3BlcnR5KCkgYW5kIElSZXNvdXJjZSNnZXRTZXNzaW9uUHJvcGVydHkoKQotICogbWV0aG9kcywgYW5kIHRoZXkgd2VyZSB2ZXJ5IGZhc3QuIEkgdXNlZCBhIHZlcnkgbGFyZ2Ugd29ya3NwYWNlIChvdmVyIDE3LDAwMCkgcmVzb3VyY2VzLCBhbmQgeW91IGNvdWxkIHNldCAob3IgZ2V0KQotICogYSBwcm9wZXJ0eSBvbiBhbGwgdGhlIHJlc291cmNlcyBpbiB1bmRlciAxMDBtcy4gCi0gKi8KLQkKLQlwcml2YXRlIGludCAJX2NvbmZpZ051bWJlcjsKLQlwcml2YXRlIEJpdFNldAlfY29uZmlnU2V0ID0gbmV3IEJpdFNldCgxMDApOwotCQotCXByaXZhdGUgaW50CQlfdmFsaWRhdGlvbk51bWJlcjsKLQlwcml2YXRlIEJpdFNldAlfdmFsaWRhdGlvblNldCA9IG5ldyBCaXRTZXQoMTAwKTsKLQkKLQlwdWJsaWMgaW50IGdldENvbmZpZ051bWJlcigpIHsKLQkJcmV0dXJuIF9jb25maWdOdW1iZXI7Ci0JfQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ051bWJlcihpbnQgY29uZmlnTnVtYmVyKSB7Ci0JCV9jb25maWdOdW1iZXIgPSBjb25maWdOdW1iZXI7Ci0JfQotCXB1YmxpYyBCaXRTZXQgZ2V0Q29uZmlnU2V0KCkgewotCQlyZXR1cm4gX2NvbmZpZ1NldDsKLQl9Ci0JcHVibGljIGludCBnZXRWYWxpZGF0aW9uTnVtYmVyKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRpb25OdW1iZXI7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25OdW1iZXIoaW50IHZhbGlkYXRpb25OdW1iZXIpIHsKLQkJX3ZhbGlkYXRpb25OdW1iZXIgPSB2YWxpZGF0aW9uTnVtYmVyOwotCX0KLQlwdWJsaWMgQml0U2V0IGdldFZhbGlkYXRpb25TZXQoKSB7Ci0JCXJldHVybiBfdmFsaWRhdGlvblNldDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTcxMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0vKioKLSAqIFR5cGUgb2YgdmFsaWRhdGlvbi4gQnVpbGQgb3IgTWFudWFsPwotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGVudW0gVmFsVHlwZSB7Ci0JLyoqIFRoZSB2YWxpZGF0aW9uIGlzIHRyaWdnZXJlZCB2aWEgYSByZXNvdXJjZSBjaGFuZ2UgYW5kIHRoZSBidWlsZCBwcm9jZXNzLiAqLwotCUJ1aWxkLCAKLQkKLQkvKiogVGhlIHVzZXIgbWFudWFsbHkgcmVxdWVzdGVkIHRoZSB2YWxpZGF0aW9uLiAqLwotCU1hbnVhbCwKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SZXN1bHRTdW1tYXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUmVzdWx0U3VtbWFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxMjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SZXN1bHRTdW1tYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLS8qKgotICogQW4gaW1tdXRhYmxlIG9iamVjdCB0aGF0IGhvbGRzIGEgc3VtbWFyeSBvZiB0aGUgdmFsaWRhdGlvbi4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uUmVzdWx0U3VtbWFyeSB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBpbnQgCV9lcnJvcjsKLQlwcml2YXRlIGZpbmFsIGludCAJX3dhcm5pbmc7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQJX2luZm87Ci0JCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHRTdW1tYXJ5KGludCBlcnJvciwgaW50IHdhcm5pbmcsIGludCBpbmZvKXsKLQkJX2Vycm9yID0gZXJyb3I7Ci0JCV93YXJuaW5nID0gd2FybmluZzsKLQkJX2luZm8gPSBpbmZvOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHlFcnJvcigpIHsKLQkJcmV0dXJuIF9lcnJvcjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5V2FybmluZygpIHsKLQkJcmV0dXJuIF93YXJuaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHlJbmZvKCkgewotCQlyZXR1cm4gX2luZm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYmYyOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvblJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuSVZhbGlkYXRvclZpc2l0b3I7Ci0KLS8qKgotICogUnVuIHRoZSB2YWxpZGF0b3JzIG9uIGEgc2VsZWN0ZWQgc2V0IG9mIHJlc291cmNlcy4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VkIHRvIHJ1biBtYW51YWwgdmFsaWRhdGlvbnMgKGkuZS4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgVmFsaWRhdGUgbWVudSBpdGVtKSwgCi0gKiBvciBpdCBpcyBpbnZva2VkIHByb2dyYW1tYXRpY2FsbHkgYnkgYSB0aGlyZCBwYXJ0eSB0aHJvdWdoIHRoZSBWYWxpZGF0aW9uRnJhbWV3b3JrIEFQSS4KLSAqIEl0IGlzIG5vdCB1c2VkIGZvciB0aGUgYnVpbGQgYmFzZWQgaW52b2NhdGlvbi4KLSAqIDwvcD4gCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblJ1bm5lciBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JCi0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PgkJX3Byb2plY3RzOwotCXByaXZhdGUJVmFsVHlwZQkJCV92YWxUeXBlOwotCXByaXZhdGUgVmFsT3BlcmF0aW9uCV92YWxPcGVyYXRpb247Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIHNlbGVjdGVkIHByb2plY3RzIGFuZC9vciByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHByb2plY3RzCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0ZWQgcHJvamVjdHMuIFRoZSBrZXkgaXMgYW4gSVByb2plY3QgYW5kIHRoZSB2YWx1ZSBpcwotCSAqICAgICAgICAgICAgdGhlIFNldCBvZiBJUmVzb3VyY2VzIHRoYXQgd2VyZSBzZWxlY3RlZC4gT2Z0ZW4gdGhpcyB3aWxsIGJlCi0JICogICAgICAgICAgICBldmVyeSByZXNvdXJjZSBpbiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsVHlwZQotCSAqICAgICAgICAgICAgVGhlIHR5cGUgb2YgdmFsaWRhdGlvbiB0aGF0IGhhcyBiZWVuIHJlcXVlc3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgUHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gYXRvbWljCi0JICogICAgICAgICAgICBSdW4gYXMgYW4gYXRvbWljIHdvcmtzcGFjZSBvcGVyYXRpb24/Ci0JICovCi0JcHVibGljIHN0YXRpYyBWYWxPcGVyYXRpb24gdmFsaWRhdGUoTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4gcHJvamVjdHMsIFZhbFR5cGUgdmFsVHlwZSwgCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiBhdG9taWMpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQlWYWxpZGF0aW9uUnVubmVyIG1lID0gbmV3IFZhbGlkYXRpb25SdW5uZXIocHJvamVjdHMsIHZhbFR5cGUpOwotCQlpZiAoYXRvbWljKVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obWUsIG51bGwsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBtb25pdG9yKTsKLQkJZWxzZSBtZS5leGVjdXRlKG1vbml0b3IpOwotCQlyZXR1cm4gbWUuX3ZhbE9wZXJhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIHNlbGVjdGVkIGZpbGUuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGl0IHNpbXBseSBjYWxscyB0aGUgbW9yZSBmbGV4aWJsZSAKLQkgKiB2YWxpZGF0ZSB3aXRoIE1hcCBtZXRob2QuIAotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQuCi0JICogCi0JICogQHBhcmFtIHZhbFR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIHZhbGlkYXRpb24gdGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3IuCi0JICogCi0JICogQHBhcmFtIGF0b21pYwotCSAqICAgICAgICAgICAgUnVuIGFzIGFuIGF0b21pYyB3b3Jrc3BhY2Ugb3BlcmF0aW9uPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsT3BlcmF0aW9uIHZhbGlkYXRlKElGaWxlIGZpbGUsIFZhbFR5cGUgdmFsVHlwZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBib29sZWFuIGF0b21pYykgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JICAgIGZpbmFsIE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IG1hcCA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4oMSk7Ci0JICAgICAgCi0JICAgIFNldDxJUmVzb3VyY2U+IHNldCA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oMSk7Ci0JICAgIHNldC5hZGQoZmlsZSk7Ci0JICAgIG1hcC5wdXQoZmlsZS5nZXRQcm9qZWN0KCksIHNldCk7Ci0JICAgIHJldHVybiB2YWxpZGF0ZShtYXAsIHZhbFR5cGUsIG1vbml0b3IsIGF0b21pYyk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBWYWxpZGF0aW9uUnVubmVyKE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IHByb2plY3RzLCBWYWxUeXBlIHZhbFR5cGUpewotCQlfcHJvamVjdHMgPSBwcm9qZWN0czsKLQkJX3ZhbFR5cGUgPSB2YWxUeXBlOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBWYWxPcGVyYXRpb24gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlfdmFsT3BlcmF0aW9uID0gbmV3IFZhbE9wZXJhdGlvbigpOwotCQlWYWxNYW5hZ2VyIG1hbmFnZXIgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKTsKLQkJCi0JCUlWYWxpZGF0b3JWaXNpdG9yIHN0YXJ0aW5nVmlzaXRvciA9IG5ldyBJVmFsaWRhdG9yVmlzaXRvcigpewotCQkJcHVibGljIHZvaWQgdmlzaXQoVmFsaWRhdG9yIHZhbGlkYXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsVHlwZSB2YWxUeXBlLAotCQkJCVZhbE9wZXJhdGlvbiBvcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXZhbGlkYXRvci52YWxpZGF0aW9uU3RhcnRpbmcocHJvamVjdCwgb3BlcmF0aW9uLmdldFN0YXRlKCksIG1vbml0b3IpOwotCQkJfQkJCQotCQl9OwotCQkKLQkJSVZhbGlkYXRvclZpc2l0b3IgZmluaXNoZWRWaXNpdG9yID0gbmV3IElWYWxpZGF0b3JWaXNpdG9yKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHZpc2l0KFZhbGlkYXRvciB2YWxpZGF0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbFR5cGUgdmFsVHlwZSwKLQkJCQlWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkJCXZhbGlkYXRvci52YWxpZGF0aW9uRmluaXNoaW5nKHByb2plY3QsIG9wZXJhdGlvbi5nZXRTdGF0ZSgpLCBtb25pdG9yKTsJCQkJCi0JCQl9CQkJCi0JCX07Ci0JCQotCQltYW5hZ2VyLmFjY2VwdChzdGFydGluZ1Zpc2l0b3IsIG51bGwsIF92YWxUeXBlLCBfdmFsT3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJCQkKLQkJZm9yIChNYXAuRW50cnk8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBtZSA6IF9wcm9qZWN0cy5lbnRyeVNldCgpKXsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSl7Ci0JCQkJX3ZhbE9wZXJhdGlvbi5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQlyZXR1cm4gX3ZhbE9wZXJhdGlvbjsKLQkJCX0KLQkJCUlQcm9qZWN0IHByb2plY3QgPSBtZS5nZXRLZXkoKTsKLQkJCW1hbmFnZXIuYWNjZXB0KHN0YXJ0aW5nVmlzaXRvciwgcHJvamVjdCwgX3ZhbFR5cGUsIF92YWxPcGVyYXRpb24sIG1vbml0b3IpOwotCQkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBtZS5nZXRWYWx1ZSgpKXsKLQkJCQl0cnkgewotCQkJCQltYW5hZ2VyLnZhbGlkYXRlKHByb2plY3QsIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UsIF92YWxUeXBlLCAKLQkJCQkJCQlJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkFVVE9fQlVJTEQsIF92YWxPcGVyYXRpb24sIG1vbml0b3IpOwotCQkJCX0KLQkJCQljYXRjaCAoUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yIGVycm9yKXsKLQkJCQkJLy8gaWYgdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIHdlIGNhbid0IHZhbGlkYXRlIGl0LCBzbyB3ZSBzaG91bGQganVzdCBtb3ZlIG9uLiAKLQkJCQl9Ci0JCQl9Ci0JCQltYW5hZ2VyLmFjY2VwdChmaW5pc2hlZFZpc2l0b3IsIHByb2plY3QsIF92YWxUeXBlLCBfdmFsT3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJfQotCQltYW5hZ2VyLmFjY2VwdChmaW5pc2hlZFZpc2l0b3IsIG51bGwsIF92YWxUeXBlLCBfdmFsT3BlcmF0aW9uLCBtb25pdG9yKTsKLQkJcmV0dXJuIF92YWxPcGVyYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlleGVjdXRlKG1vbml0b3IpOwkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckV4dGVuc2lvblJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhlMDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckV4dGVuc2lvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlclJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogUHJvY2VzcyB0aGUgdmFsaWRhdG9yICh2ZXJzaW9uIDIpIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckV4dGVuc2lvblJlYWRlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yRXh0ZW5zaW9uUmVhZGVyIF9tZSA9IG5ldyBWYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIoKTsKLQkKLQlwdWJsaWMgIHN0YXRpYyBWYWxpZGF0b3JFeHRlbnNpb25SZWFkZXIgZ2V0RGVmYXVsdCgpewotCQlyZXR1cm4gX21lOwotCX0KLQkKLQlwcml2YXRlIFZhbGlkYXRvckV4dGVuc2lvblJlYWRlcigpe30KLQkKLQkvKioKLQkgKiBQcm9jZXNzIHRoZSB2MiBleHRlbnNpb25zLCByZXR1cm5pbmcgYWxsIHRoZSB2MiB2YWxpZGF0b3JzLgotCSAqLwotCUNvbGxlY3Rpb248VmFsaWRhdG9yPiBwcm9jZXNzKCkgewotCQlNYXA8U3RyaW5nLFZhbGlkYXRvcj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWxpZGF0b3I+KDEwMCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGdldEV4dGVuc2lvblBvaW50KCk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCA9PSBudWxsKXJldHVybiBtYXAudmFsdWVzKCk7Ci0JCQkJCi0JCWZvciAoSUV4dGVuc2lvbiBleHQgOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpewotCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgdmFsaWRhdG9yIDogZXh0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKXsKLQkJCQlTdHJpbmcgaWQgPSBleHQuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCQkJCWlmIChUcmFjaW5nLmlzRW5hYmxlZChpZCkpewotCQkJCQlWYWxpZGF0b3IgdiA9IHByb2Nlc3NWYWxpZGF0b3IodmFsaWRhdG9yLCBpZCwgZXh0LmdldExhYmVsKCksIG51bGwpOwotCQkJCQlpZiAodiAhPSBudWxsKW1hcC5wdXQodi5nZXRJZCgpLHYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZXh0ZW5zaW9uUG9pbnQgPSBnZXRFeHRlbnNpb25Qb2ludEV4Y2x1ZGUoKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpewotCQkJZm9yIChJRXh0ZW5zaW9uIGV4dCA6IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKSl7Ci0JCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgdmFsaWRhdG9yIDogZXh0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKXsKLQkJCQkJU3RyaW5nIGlkID0gdmFsaWRhdG9yLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuRXhjbHVkZS5pZCk7Ci0JCQkJCVZhbGlkYXRvciB2ID0gbWFwLmdldChpZCk7Ci0JCQkJCVYyIHYyID0gbnVsbDsKLQkJCQkJaWYgKHYgIT0gbnVsbCl2MiA9IHYuYXNWMlZhbGlkYXRvcigpOwotCi0JCQkJCWlmICh2MiA9PSBudWxsKXsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgiUGx1Zy1pbiBjb25maWd1cmF0aW9uIGVycm9yLCBleHRlbnNpb24gezB9IHJlZmVyZW5jZXMgdmFsaWRhdG9yIGlkIHsxfSBidXQgdGhpcyBpZCBkb2VzIG5vdCBleGlzdC4iLCAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWV4dGVuc2lvblBvaW50LmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgaWQpOwotCQkJCQkJQ29yZUV4Y2VwdGlvbiBleCA9IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQsIG1zZykpOwotCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZXhjbHVkZSA6IHZhbGlkYXRvci5nZXRDaGlsZHJlbigpKXsKLQkJCQkJCQlGaWx0ZXJHcm91cCBmZyA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJZmcgPSBjcmVhdGVGaWx0ZXJHcm91cChleGNsdWRlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQkJCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCUlDb250cmlidXRvciBjb250cmliID0gdmFsaWRhdG9yLmdldENvbnRyaWJ1dG9yKCk7Ci0JCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoVmFsTWVzc2FnZXMuRXJyQ29uZmlnLCBjb250cmliLmdldE5hbWUoKSk7Ci0JCQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsJCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZmcgIT0gbnVsbCAmJiBmZy5pc0V4Y2x1ZGUoKSl7Ci0JCQkJCQkJCW1lcmdlRXhjbHVkZUdyb3VwKHYyLCBmZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gbWFwLnZhbHVlcygpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogTWVyZ2UgdGhlIHJ1bGVzIGZyb20gdGhlIGZpbHRlciBncm91cCBpbnRvIHRoZSBjdXJyZW50IGV4Y2x1ZGUgZ3JvdXAsIGNyZWF0aW5nIGEgY3VycmVudCBleGNsdWRlCi0JICogZ3JvdXAgaWYgbmVlZCBiZS4KLQkgKiBAcGFyYW0gdjIKLQkgKiBAcGFyYW0gZmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWVyZ2VFeGNsdWRlR3JvdXAoVjIgdjIsIEZpbHRlckdyb3VwIGZnKXsKLQkJRmlsdGVyR3JvdXAgZXhpc3RpbmcgPSBudWxsOwotCQlmb3IgKEZpbHRlckdyb3VwIGdyb3VwIDogdjIuZ2V0R3JvdXBzKCkpewotCQkJaWYgKGdyb3VwLmlzRXhjbHVkZSgpKXsKLQkJCQlleGlzdGluZyA9IGdyb3VwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChleGlzdGluZyA9PSBudWxsKXYyLmFkZChmZyk7Ci0JCWVsc2UgewotCQkJTGlzdDxGaWx0ZXJSdWxlPiBydWxlcyA9IG5ldyBMaW5rZWRMaXN0PEZpbHRlclJ1bGU+KCk7Ci0JCQlmb3IgKEZpbHRlclJ1bGUgcnVsZSA6IGV4aXN0aW5nLmdldFJ1bGVzKCkpcnVsZXMuYWRkKHJ1bGUpOwotCQkJCi0JCQlmb3IgKEZpbHRlclJ1bGUgcnVsZSA6IGZnLmdldFJ1bGVzKCkpcnVsZXMuYWRkKHJ1bGUpOwotCQkJCi0JCQlGaWx0ZXJSdWxlW10gZmlsdGVyUnVsZXMgPSBuZXcgRmlsdGVyUnVsZVtydWxlcy5zaXplKCldOwotCQkJcnVsZXMudG9BcnJheShmaWx0ZXJSdWxlcyk7Ci0JCQlGaWx0ZXJHcm91cCBtZXJnZWQgPSBGaWx0ZXJHcm91cC5jcmVhdGUoZXhpc3RpbmcuaXNFeGNsdWRlKCksIGZpbHRlclJ1bGVzKTsKLQkJCQotCQkJdjIucmVwbGFjZUZpbHRlckdyb3VwKGV4aXN0aW5nLCBtZXJnZWQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIHZhbGlkYXRvciBlbGVtZW50IGluIGEgdmFsaWRhdG9yIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICBUaGUgdmFsaWRhdG9yIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIElmIHRydWUgbG9hZCBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgZm9yIGVhY2gKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvciwgaWYgZmFsc2UgZG8gYSBzaGFsbG93IGxvYWQsIHdoZXJlIG9ubHkgdGhlCi0JICogICAgICAgICAgICB2YWxpZGF0b3IgY2xhc3MsIGlkIGFuZCBuYW1lJ3MgYXJlIGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QgdGhhdCB5b3UgYXJlIGRlZmluZWQgaW4uIFRoaXMgY2FuIGJlIG51bGwgd2hpY2gKLQkgKiAgICAgICAgICAgIG1lYW5zIHRoYXQgeW91IGFyZSBhIGdsb2JhbCB2YWxpZGF0b3IuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgdmFsaWRhdG9yIG9yIG51bGwgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIHByb2Nlc3NWYWxpZGF0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhbGlkYXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmFsaWRhdG9yLlYyIHYgPSBudWxsOwotCQl0cnkgewotCQkJdiA9IFZhbGlkYXRvci5jcmVhdGUodmFsaWRhdG9yLCBwcm9qZWN0KS5hc1YyVmFsaWRhdG9yKCk7Ci0JCQl2LnNldExldmVsKFZhbGlkYXRvci5MZXZlbC5FeHRlbnNpb24pOwotCQkJdi5zZXRJZChpZCk7Ci0JCQl2LnNldE5hbWUobGFiZWwpOwotCQkJdi5zZXRCdWlsZFZhbGlkYXRpb24oZ2V0QXR0cmlidXRlKHZhbGlkYXRvciwgRXh0ZW5zaW9uQ29uc3RhbnRzLmJ1aWxkLCB0cnVlKSk7Ci0JCQl2LnNldE1hbnVhbFZhbGlkYXRpb24oZ2V0QXR0cmlidXRlKHZhbGlkYXRvciwgRXh0ZW5zaW9uQ29uc3RhbnRzLm1hbnVhbCwgdHJ1ZSkpOwotCQkJdi5zZXRNYXJrZXJJZCh2YWxpZGF0b3IuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5tYXJrZXJJZCkpOwotCQkJdi5zZXRWZXJzaW9uKGdldEF0dHJpYnV0ZSh2YWxpZGF0b3IsIEV4dGVuc2lvbkNvbnN0YW50cy52ZXJzaW9uLCAxKSk7Ci0JCQl2LnNldFNvdXJjZUlkKHZhbGlkYXRvci5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLnNvdXJjZUlkKSk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IHZhbGlkYXRvci5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgOiBjaGlsZHJlbilwcm9jZXNzSW5jbHVkZUFuZEV4Y2x1ZGVFbGVtZW50KHYsIGNoaWxkKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlJQ29udHJpYnV0b3IgY29udHJpYiA9IHZhbGlkYXRvci5nZXRDb250cmlidXRvcigpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChWYWxNZXNzYWdlcy5FcnJDb25maWcsIGNvbnRyaWIuZ2V0TmFtZSgpKTsKLQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGFsbCB0aGUgbWVzc2FnZXMgdGhhdCB0aGlzIHZhbGlkYXRvciBoYXMgZGVmaW5lZC4KLQkgKiBAcGFyYW0gdgotCSAqIEByZXR1cm4gYW4gZW1wdHkgbGlzdCBpZiB0aGUgdmFsaWRhdG9yIGRpZCBub3QgZGVmaW5lIGFueSBtZXNzYWdlcy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBhZGRNZXNzYWdlcyhWYWxpZGF0b3Igdil7Ci0JCUxpc3Q8TWVzc2FnZVNldmVyaXR5U2V0dGluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGdldEV4dGVuc2lvblBvaW50KCk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCA9PSBudWxsKXJldHVybiBsaXN0OwotCQlJRXh0ZW5zaW9uIGV4dCA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbih2LmdldElkKCkpOwotCQlpZiAoZXh0ID09IG51bGwpcmV0dXJuIGxpc3Q7Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtIDogZXh0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKXsKLQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlIDogZWxlbS5nZXRDaGlsZHJlbihFeHRlbnNpb25Db25zdGFudHMuTWVzc2FnZUNhdGVnb3J5Lm5hbWUpKXsKLQkJCQlsaXN0LmFkZChwcm9jZXNzTWVzc2FnZShjZSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yIHRoZSB2MiB2YWxpZGF0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBhIHByb2JsZW0gb3Igbm8gZXh0ZW5zaW9ucy4KLQkgKi8KLQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRFeHRlbnNpb25Qb2ludCgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmV0dXJuIHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lELCBFeHRlbnNpb25Db25zdGFudHMudmFsaWRhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGV4dGVuc2lvbiBwb2ludCBmb3IgYWRkaW5nIGV4Y2x1c2lvbiBmaWx0ZXJzLiBUaGlzIGlzIHdoZXJlIGFub3RoZXIgdmFsaWRhdG9yIGNhbgotCSAqIGZ1cnRoZXIgcmVzdHJpY3QgYW4gZXhpc3RpbmcgdmFsaWRhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBhIHByb2JsZW0gb3Igbm8gZXh0ZW5zaW9ucy4KLQkgKi8KLQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRFeHRlbnNpb25Qb2ludEV4Y2x1ZGUoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJldHVybiByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCwgRXh0ZW5zaW9uQ29uc3RhbnRzLmV4Y2x1ZGVFeHRlbnNpb24pOwotCX0KLQkKLQkvKioKLQkgKiBQcm9jZXNzIGEgbWVzc2FnZSBlbGVtZW50IGZvciB0aGUgdmFsaWRhdG9yLCBieSBjcmVhdGluZyBhIE1lc3NhZ2VDYXRlZ29yeSBmb3IgaXQuCi0JICogCi0JICogQHBhcmFtIGNlIGEgTWVzc2FnZUNhdGVnb3J5IGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIHByb2Nlc3NNZXNzYWdlKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQlTdHJpbmcgcyA9IGNlLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuTWVzc2FnZUNhdGVnb3J5LnNldmVyaXR5KTsKLQkJTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSBzZXYgPSBudWxsOwotCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5zZXZFcnJvci5lcXVhbHMocykpc2V2ID0gTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5FcnJvcjsKLQkJZWxzZSBpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5zZXZXYXJuaW5nLmVxdWFscyhzKSlzZXYgPSBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lldhcm5pbmc7Ci0JCWVsc2UgaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkuc2V2SWdub3JlLmVxdWFscyhzKSlzZXYgPSBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lklnbm9yZTsKLQkJCi0JCXJldHVybiBuZXcgTWVzc2FnZVNldmVyaXR5U2V0dGluZyhjZS5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5pZCksIAotCQkJY2UuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5NZXNzYWdlQ2F0ZWdvcnkubGFiZWwpLCBzZXYpOwkJCi0JfQotCi0JLyoqIAotCSAqIFByb2Nlc3MgdGhlIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgZWxlbWVudHMuCi0JICogCi0JICogIEBwYXJhbSB2IFRoZSB2YWxpZGF0b3IgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgdXAuCi0JICogIEBwYXJhbSBncm91cCBUaGUgY2hpbGRyZW4gb2YgdGhlIHZhbGlkYXRvciB0YWcuIFRoaXMgbWF5IGluY2x1ZGVkIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgZWxlbWVudHMuCi0JICogIE90aGVyIGVsZW1lbnRzIGFyZSBpZ25vcmVkLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0luY2x1ZGVBbmRFeGNsdWRlRWxlbWVudChWYWxpZGF0b3IuVjIgdiwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdyb3VwKSB7Ci0JCUZpbHRlckdyb3VwIGZnID0gY3JlYXRlRmlsdGVyR3JvdXAoZ3JvdXApOwotCQlpZiAoZmcgIT0gbnVsbCl2LmFkZChmZyk7Ci0JfQotCQotCS8qKgotCSAqIFByb2Nlc3MgYW4gaW5jbHVkZSBvciBleGNsdWRlIGVsZW1lbnQsIHJldHVybmluZyBhIGZpbHRlciBncm91cCBmb3IgaXQuCi0JICogCi0JICogQHBhcmFtIGdyb3VwCi0JICogICAgICAgICAgICBBbiBpbmNsdWRlLCBleGNsdWRlIG9yIHNvbWUgb3RoZXIgZWxlbWVudC4gT25seSBpbmNsdWRlIGFuZAotCSAqICAgICAgICAgICAgZXhjbHVkZSBlbGVtZW50cyBhcmUgcHJvY2Vzc2VkLCBvdGhlciB0eXBlcyBhcmUgaWdub3JlZC4KLQkgKiAgICAgICAgICAgIAotCSAqIEByZXR1cm4gYSBmaWx0ZXIgZ3JvdXAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgaW5jbHVkZSBvciBleGNsdWRlCi0JICogICAgICAgICBlbGVtZW50LCBvciBudWxsIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgYW4gaW5jbHVkZSBvciBleGNsdWRlCi0JICogICAgICAgICBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgRmlsdGVyR3JvdXAgY3JlYXRlRmlsdGVyR3JvdXAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdyb3VwKXsKLQkJU3RyaW5nIG5hbWUgPSBncm91cC5nZXROYW1lKCk7Ci0JCWlmICghRmlsdGVyR3JvdXAuaXNLbm93bk5hbWUobmFtZSkpcmV0dXJuIG51bGw7IAotCQkKLQkJCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bGVzID0gZ3JvdXAuZ2V0Q2hpbGRyZW4oRXh0ZW5zaW9uQ29uc3RhbnRzLnJ1bGVzKTsKLQkJLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lCi0JCUxpc3Q8RmlsdGVyUnVsZT4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PEZpbHRlclJ1bGU+KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxydWxlcy5sZW5ndGg7IGkrKyl7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByID0gcnVsZXNbaV0uZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvcihpbnQgaj0wOyBqPHIubGVuZ3RoOyBqKyspewotCQkJCWxpc3QuYWRkKHByb2Nlc3NSdWxlKHJbal0pKTsKLQkJCX0KLQkJfQotCQlGaWx0ZXJSdWxlW10gZmlsdGVyUnVsZXMgPSBuZXcgRmlsdGVyUnVsZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShmaWx0ZXJSdWxlcyk7Ci0JCXJldHVybiBGaWx0ZXJHcm91cC5jcmVhdGUobmFtZSwgZmlsdGVyUnVsZXMpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgYSBydWxlIGluIG9uZSBvZiB0aGUgcnVsZSBncm91cHMuCi0JICogCi0JICogQHBhcmFtIHJ1bGUgYSBydWxlIGluIHRoZSBncm91cCwgbGlrZSBmaWxlZXh0LgotCSAqLwotCXByaXZhdGUgRmlsdGVyUnVsZSBwcm9jZXNzUnVsZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVsZSkgewotCQlGaWx0ZXJSdWxlIGZyID0gRmlsdGVyUnVsZS5jcmVhdGUocnVsZSk7Ci0JCWlmIChmciA9PSBudWxsKXsKLQkJCVN0cmluZyBjb250cmlidXRvciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCWNvbnRyaWJ1dG9yID0gcnVsZS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJCQluYW1lID0gcnVsZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCS8vIGVhdCBpdAotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihOTFMuYmluZChWYWxNZXNzYWdlcy5FcnJGaWx0ZXJSdWxlLCBjb250cmlidXRvciwgbmFtZSkpOwotCQl9Ci0JCXJldHVybiBmcjsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGFueSBvZiB0aGUgdmFsaWRhdG9ycyBuZWVkIHRvIGJlIG1pZ3JhdGVkLCBhbmQgaWYgc28gYW5zd2VyIGEgbmV3Ci0JICogVmFsaWRhdG9yIGFycmF5LgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0b3JzIHRoZSBleGlzdGluZyB2YWxpZGF0b3JzIChmcm9tIHRoZSBwcmVmZXJlbmNlcykuCi0JICogIAotCSAqIEByZXR1cm4gbnVsbCBpZiBubyB2YWxpZGF0b3JzIG5lZWRlZCB0byBiZSBtaWdyYXRlZC4KLQkgKi8KLQlWYWxpZGF0b3JbXSBtaWdyYXRlKFZhbGlkYXRvcltdIHZhbGlkYXRvcnMsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJTWFwPFN0cmluZywgVmFsaWRhdG9yPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbGlkYXRvcj4odmFsaWRhdG9ycy5sZW5ndGgpOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFsaWRhdG9ycyltYXAucHV0KHYuZ2V0SWQoKSwgdik7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBnZXRFeHRlbnNpb25Qb2ludCgpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbClyZXR1cm4gbnVsbDsKLQkJCQkKLQkJZm9yIChJRXh0ZW5zaW9uIGV4dCA6IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKSl7Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCB2YWxpZGF0b3IgOiBleHQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpewotCQkJCVZhbGlkYXRvciB2ID0gcHJvY2Vzc1ZhbGlkYXRvcih2YWxpZGF0b3IsIGV4dC5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGV4dC5nZXRMYWJlbCgpLCBwcm9qZWN0KTsKLQkJCQlpZiAodiA9PSBudWxsKWNvbnRpbnVlOwotCQkJCVZhbGlkYXRvciBvbGQgPSBtYXAuZ2V0KHYuZ2V0SWQoKSk7Ci0JCQkJaWYgKG9sZCA9PSBudWxsIHx8IG9sZC5nZXRWZXJzaW9uKCkgPCB2LmdldFZlcnNpb24oKSl7Ci0JCQkJCS8vVE9ETyB3ZSBtYXkgYmUgcmVwbGFjaW5nIHVzZXIgcHJlZmVyZW5jZXMsIGF0IHNvbWUgcG9pbnQgd2UgbWF5IHdhbnQgdG8gZG8gYSByZWFsIG1pZ3JhdGlvbi4KLQkJCQkJbWFwLnB1dCh2LmdldElkKCksIHYpOwotCQkJCQljb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGNvdW50ID4gMCl7Ci0JCQlWYWxpZGF0b3JbXSB2YWxzID0gbmV3IFZhbGlkYXRvclttYXAuc2l6ZSgpXTsKLQkJCW1hcC52YWx1ZXMoKS50b0FycmF5KHZhbHMpOwotCQkJcmV0dXJuIHZhbHM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lLCBib29sZWFuIGRmdCl7Ci0JCVN0cmluZyB2ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7Ci0JCWlmICh2ID09IG51bGwpcmV0dXJuIGRmdDsKLQkJaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHYpKXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCWlmICgiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UodikpcmV0dXJuIGZhbHNlOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZnQ7Ci0JfQotCQotCXByaXZhdGUgaW50IGdldEF0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUsIGludCBkZnQpewotCQlTdHJpbmcgdiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOwotCQlpZiAodiA9PSBudWxsKXJldHVybiBkZnQ7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2KTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy8gZWF0IGl0LgotCQl9Ci0JCXJldHVybiBkZnQ7Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZy4KLS8vCSAqIEBwYXJhbSBlbGVtCi0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSl7Ci0vLwkJU3RyaW5nIG5hbWUgPSBlbGVtLmdldE5hbWUoKTsKLS8vCQlTdHJpbmdbXSBhdHRyaWJzID0gZWxlbS5nZXRBdHRyaWJ1dGVOYW1lcygpOwotLy8JCVN0cmluZ1tdIHZhbHMgPSBuZXcgU3RyaW5nW2F0dHJpYnMubGVuZ3RoXTsKLS8vCQlmb3IgKGludCBpPTA7IGk8dmFscy5sZW5ndGg7IGkrKyl2YWxzW2ldID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0cmlic1tpXSk7Ci0vLwkJU3RyaW5nIHYgPSBlbGVtLmdldFZhbHVlKCk7Ci0vLwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtLmdldENoaWxkcmVuKCk7Ci0vLwkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKWR1bXAoY2hpbGRyZW5baV0pOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yR3JvdXBFeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckdyb3VwRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTQzZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yR3JvdXBFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVZhbGlkYXRvckdyb3VwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogUHJvY2VzcyB0aGUgdmFsaWRhdG9yIGdyb3VwIChmb3IgdXNlIHdpdGggdmFsaWRhdG9yIHZlcnNpb24gMiBvbmx5KSBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yR3JvdXBFeHRlbnNpb25SZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvckdyb3VwRXh0ZW5zaW9uUmVhZGVyIF9pbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yR3JvdXBFeHRlbnNpb25SZWFkZXIgZ2V0RGVmYXVsdCgpIHsKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKV9pbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JHcm91cEV4dGVuc2lvblJlYWRlcigpOwotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIE1hcCBvZiBncm91cCBJRHMgdG8gY29uZmlndXJhdGlvbiBlbGVtZW50cwotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PiBfbWFwOwotCQotCS8qKgotCSAqIE1hcCBvZiBncm91cCBJRCdzIHRvIHJlc29sdmVkIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcltdPiBfcmVzb2x2ZWQ7Ci0KLQlwcml2YXRlIFZhbGlkYXRvckdyb3VwRXh0ZW5zaW9uUmVhZGVyKCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBsaXN0ZW5lcnMgd2l0aCB0aGlzIGdyb3VwIGlkLgotCSAqIEBwYXJhbSBncm91cElECi0JICogQHJldHVybiBhbiBlbXB0eSBhcnJheSB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGlzIGdyb3VwIGlkLgotCSAqLwotCUlWYWxpZGF0b3JHcm91cExpc3RlbmVyW10gY3JlYXRlTGlzdGVuZXJzKFN0cmluZyBncm91cElEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlWYWxpZGF0b3JHcm91cExpc3RlbmVyW10gcmVzdWx0ID0gX3Jlc29sdmVkLmdldChncm91cElEKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKXJldHVybiByZXN1bHQ7Ci0JCQkJCi0JCUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBlbGVtZW50cyA9IF9tYXAuZ2V0KGdyb3VwSUQpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCl7Ci0JCQlfcmVzb2x2ZWQucHV0KGdyb3VwSUQsIG5ldyBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lclswXSk7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoIkNvbmZpZ3VyYXRpb24gZXJyb3IsIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gbGlzdGVuZXIgZ3JvdXAgd2l0aCBpZDogezB9IiwgZ3JvdXBJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lELCBtc2cpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQkKLQkJTGlzdDxJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcj4oZWxlbWVudHMuc2l6ZSgpKTsKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0JCQlJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJCXRyeSB7Ci0JCQkJbGlzdGVuZXIgPSAoSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihFeHRlbnNpb25Db25zdGFudHMuR3JvdXAuYXR0Q2xhc3MpOwotCQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcj4oKTsKLQkJCX0KLQkJfQotCi0JCXJlc3VsdCA9IGxpc3RlbmVycy50b0FycmF5KG5ldyBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcltsaXN0ZW5lcnMuc2l6ZSgpXSk7Ci0JCV9yZXNvbHZlZC5wdXQoZ3JvdXBJRCwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGV4dGVuc2lvbiBwb2ludCBmb3IgdGhlIHZhbGlkYXRvckdyb3Vwcy4KLQkgKiAKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIG9yIG5vIGV4dGVuc2lvbnMuCi0JICovCi0JcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJldHVybiByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCwgRXh0ZW5zaW9uQ29uc3RhbnRzLmdyb3VwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJX21hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+Pig0KTsKLQkJX3Jlc29sdmVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcltdPig0KTsKLQotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBnZXRFeHRlbnNpb25Qb2ludCgpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJZm9yIChJRXh0ZW5zaW9uIGV4dCA6IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKSkgewotCQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdyb3VwIDogZXh0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJCXByb2Nlc3NHcm91cEVsZW1lbnQoZ3JvdXApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzR3JvdXBFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghRXh0ZW5zaW9uQ29uc3RhbnRzLkdyb3VwLmVsZW1lbnRHcm91cC5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKXJldHVybjsKLQkJCi0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5Hcm91cC5hdHRJZCk7Ci0JCWlmIChpZCA9PSBudWxsKXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gZXJyb3IsIHRoZSAiICsgIC8vJE5PTi1OTFMtMSQKLQkJCUV4dGVuc2lvbkNvbnN0YW50cy5Hcm91cC5hdHRJZCArICIgaXMgcmVxdWlyZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBmb3JjZSB0aGUgdXNlIG9mIGEgcXVhbGlmaWVkIElECi0JCWlmIChpZC5pbmRleE9mKERPVCkgPCAwKSB7Ci0JCQlpZCA9IGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKyBET1QgKyBpZDsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBuZXdFbGVtZW50cyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRXh0ZW5zaW9uQ29uc3RhbnRzLkdyb3VwLmVsZW1lbnRMaXN0ZW5lcik7Ci0JCWlmIChuZXdFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gZWxlbWVudHMgPSBfbWFwLmdldChpZCk7Ci0JCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0JCQkJX21hcC5wdXQoaWQsIGVsZW1lbnRzKTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KG5ld0VsZW1lbnRzKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JNdXRhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JNdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjI5YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTXV0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXA7Ci0KLS8qKgotICogVGhlIG11dGFibGUgZmllbGRzIHRoYXQgYSB1c2VyIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgcHJlZmVyZW5jZSBvciBwcm9wZXJ0eSBwYWdlLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRvck11dGFibGUgaW1wbGVtZW50cyBJQWRhcHRhYmxlLCBJTXV0YWJsZVZhbGlkYXRvciB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIF9idWlsZDsKLQlwcml2YXRlIGJvb2xlYW4JX21hbnVhbDsKLQlwcml2YXRlIFN0cmluZyBfZGVsZWdhdGluZ0lkOwotCQotCXByaXZhdGUgaW50IF9jaGFuZ2VDb3VudEdyb3VwczsKLQlwcml2YXRlIGludCBfY2hhbmdlQ291bnRNZXNzYWdlczsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZwlfbmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyAJX3NvdXJjZUlkOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBfaXNWMTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2lzVjI7Ci0JcHJpdmF0ZSBmaW5hbCBWYWxpZGF0b3JNZXRhRGF0YSBfdm1kOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIF9pZDsKLQlwcml2YXRlIGZpbmFsIGludAlfdmVyc2lvbjsKLQotCXByaXZhdGUgRmlsdGVyR3JvdXBbXSBfZ3JvdXBzOwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4gX21lc3NhZ2VTZXR0aW5nczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBfdmFsaWRhdG9yQ2xhc3NuYW1lOwotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiAJX29yaWdCdWlsZDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gCV9vcmlnTWFudWFsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nCV9vcmlnRGVsZWdhdGluZzsKLQotCXB1YmxpYyBWYWxpZGF0b3JNdXRhYmxlKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJX25hbWUgPSB2YWxpZGF0b3IuZ2V0TmFtZSgpOwotCQlfc291cmNlSWQgPSB2YWxpZGF0b3IuZ2V0U291cmNlSWQoKTsKLQkJX21hbnVhbCA9IHZhbGlkYXRvci5pc01hbnVhbFZhbGlkYXRpb24oKTsKLQkJX2J1aWxkID0gdmFsaWRhdG9yLmlzQnVpbGRWYWxpZGF0aW9uKCk7Ci0JCVYyIHYyID0gdmFsaWRhdG9yLmFzVjJWYWxpZGF0b3IoKTsKLQkJX2lzVjIgPSB2MiAhPSBudWxsOwotCQlfZGVsZWdhdGluZ0lkID0gdmFsaWRhdG9yLmdldERlbGVnYXRpbmdJZCgpOwotCQkKLQkJVjEgdjEgPSB2YWxpZGF0b3IuYXNWMVZhbGlkYXRvcigpOwotCQlfaXNWMSA9IHYxICE9IG51bGw7Ci0JCV92bWQgPSBfaXNWMSA/IHYxLmdldFZtZCgpIDogbnVsbDsKLQkJX2lkID0gdmFsaWRhdG9yLmdldElkKCk7Ci0JCQotCQlfb3JpZ0J1aWxkID0gX2J1aWxkOwotCQlfb3JpZ0RlbGVnYXRpbmcgPSBfZGVsZWdhdGluZ0lkOwotCQlfb3JpZ01hbnVhbCA9IF9tYW51YWw7Ci0JCV92ZXJzaW9uID0gdmFsaWRhdG9yLmdldFZlcnNpb24oKTsKLQkJX3ZhbGlkYXRvckNsYXNzbmFtZSA9IHZhbGlkYXRvci5nZXRWYWxpZGF0b3JDbGFzc25hbWUoKTsKLQkJX21lc3NhZ2VTZXR0aW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4oMTApOyAKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBtZSA6IHZhbGlkYXRvci5nZXRNZXNzYWdlU2V0dGluZ3MoKS5lbnRyeVNldCgpKXsKLQkJCV9tZXNzYWdlU2V0dGluZ3MucHV0KG1lLmdldEtleSgpLCBtZS5nZXRWYWx1ZSgpLmNvcHkoKSk7Ci0JCX0KLQkJCi0JCWlmICh2MiAhPSBudWxsKXsKLQkJCUZpbHRlckdyb3VwW10gZ3JvdXBzID0gdjIuZ2V0R3JvdXBzKCk7Ci0JCQlfZ3JvdXBzID0gbmV3IEZpbHRlckdyb3VwW2dyb3Vwcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShncm91cHMsIDAsIF9ncm91cHMsIDAsIGdyb3Vwcy5sZW5ndGgpOwotCQl9Ci0JfQotCi0JcHVibGljIFZhbGlkYXRvck11dGFibGUoVmFsaWRhdG9yTXV0YWJsZSB2YWwpIHsKLQkJX2J1aWxkID0gdmFsLl9idWlsZDsKLQkJX2RlbGVnYXRpbmdJZCA9IHZhbC5fZGVsZWdhdGluZ0lkOwotCQlGaWx0ZXJHcm91cFtdIGdyb3VwcyA9IHZhbC5nZXRHcm91cHMoKTsKLQkJX2dyb3VwcyA9IG5ldyBGaWx0ZXJHcm91cFtncm91cHMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShncm91cHMsIDAsIF9ncm91cHMsIDAsIGdyb3Vwcy5sZW5ndGgpOwotCQkKLQkJX2lkID0gdmFsLl9pZDsKLQkJX2lzVjEgPSB2YWwuX2lzVjE7Ci0JCV9pc1YyID0gdmFsLl9pc1YyOwotCQlfbWFudWFsID0gdmFsLl9tYW51YWw7Ci0JCV9tZXNzYWdlU2V0dGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+KDEwKTsgCi0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4gbWUgOiB2YWwuZ2V0TWVzc2FnZVNldHRpbmdzKCkuZW50cnlTZXQoKSl7Ci0JCQlfbWVzc2FnZVNldHRpbmdzLnB1dChtZS5nZXRLZXkoKSwgbWUuZ2V0VmFsdWUoKS5jb3B5KCkpOwotCQl9Ci0KLQkJX25hbWUgPSB2YWwuX25hbWU7Ci0JCV9vcmlnQnVpbGQgPSB2YWwuX29yaWdCdWlsZDsKLQkJX29yaWdEZWxlZ2F0aW5nID0gdmFsLl9vcmlnRGVsZWdhdGluZzsKLQkJX29yaWdNYW51YWwgPSB2YWwuX29yaWdNYW51YWw7Ci0JCV9zb3VyY2VJZCA9IHZhbC5fc291cmNlSWQ7Ci0JCV92YWxpZGF0b3JDbGFzc25hbWUgPSB2YWwuX3ZhbGlkYXRvckNsYXNzbmFtZTsKLQkJX3ZlcnNpb24gPSB2YWwuX3ZlcnNpb247Ci0JCV92bWQgPSB2YWwuX3ZtZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbiBidWlsZCkgewotCQlfYnVpbGQgPSBidWlsZDsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbiBtYW51YWwpIHsKLQkJX21hbnVhbCA9IG1hbnVhbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBfbmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hbnVhbFZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBfbWFudWFsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQnVpbGRWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gX2J1aWxkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVjJWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfaXNWMjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlbGVnYXRpbmdJZCgpIHsKLQkJcmV0dXJuIF9kZWxlZ2F0aW5nSWQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZCBtdXN0IG5vdCBjaGFuZ2UgdGhlIFZhbGlkYXRvck1ldGFEYXRhLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWbWQoKSB7Ci0JCXJldHVybiBfdm1kOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVjFWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfaXNWMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gX2lkOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIGFueSBvZiB5b3VyIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWQoKSB7Ci0JCWlmIChoYXNHbG9iYWxDaGFuZ2VzKCkpcmV0dXJuIHRydWU7Ci0JCWlmIChfY2hhbmdlQ291bnRHcm91cHMgPiAwIHx8IF9jaGFuZ2VDb3VudE1lc3NhZ2VzID4gMClyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0dsb2JhbENoYW5nZXMoKSB7Ci0JCWlmIChfb3JpZ0J1aWxkICE9IF9idWlsZClyZXR1cm4gdHJ1ZTsKLQkJaWYgKF9vcmlnTWFudWFsICE9IF9tYW51YWwpcmV0dXJuIHRydWU7Ci0JCWlmICghTWlzYy5zYW1lKF9vcmlnRGVsZWdhdGluZywgX2RlbGVnYXRpbmdJZCkpcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBfdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlRmlsdGVyR3JvdXAoRmlsdGVyR3JvdXAgZXhpc3RpbmcsIEZpbHRlckdyb3VwIG1lcmdlZCkgewotCQlpbnQgaSA9IGZpbmQoZXhpc3RpbmcpOwotCQlpZiAoaSA9PSAtMSlhZGQobWVyZ2VkKTsgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgotCQllbHNlIHsKLQkJCV9ncm91cHNbaV0gPSBtZXJnZWQ7Ci0JCQlidW1wQ2hhbmdlQ291bnRHcm91cHMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoRmlsdGVyR3JvdXAgZ3JvdXApIHsKLQkJaW50IGkgPSBmaW5kKGdyb3VwKTsKLQkJaWYgKGkgPT0gLTEpcmV0dXJuOwotCQkKLQkJRmlsdGVyR3JvdXBbXSBncm91cHMgPSBuZXcgRmlsdGVyR3JvdXBbX2dyb3Vwcy5sZW5ndGgtMV07Ci0JCWlmIChpID4gMClTeXN0ZW0uYXJyYXljb3B5KF9ncm91cHMsIDAsIGdyb3VwcywgMCwgaSk7Ci0JCWlmIChpIDwgZ3JvdXBzLmxlbmd0aClTeXN0ZW0uYXJyYXljb3B5KF9ncm91cHMsIGkrMSwgZ3JvdXBzLCBpLCBncm91cHMubGVuZ3RoLWkpOwotCQlfZ3JvdXBzID0gZ3JvdXBzOwotCQlidW1wQ2hhbmdlQ291bnRHcm91cHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZmluZChGaWx0ZXJHcm91cCBncm91cCkgewotCQlmb3IgKGludCBpPTA7IGk8X2dyb3Vwcy5sZW5ndGg7IGkrKylpZiAoZ3JvdXAgPT0gX2dyb3Vwc1tpXSlyZXR1cm4gaTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChGaWx0ZXJHcm91cCBmZykgewotCQlhc3NlcnQgZmcgIT0gbnVsbDsKLQkJRmlsdGVyR3JvdXBbXSBncm91cHMgPSBuZXcgRmlsdGVyR3JvdXBbX2dyb3Vwcy5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoX2dyb3VwcywgMCwgZ3JvdXBzLCAwLCBfZ3JvdXBzLmxlbmd0aCk7Ci0JCWdyb3Vwc1tfZ3JvdXBzLmxlbmd0aF0gPSBmZzsKLQkJX2dyb3VwcyA9IGdyb3VwczsKLQkJYnVtcENoYW5nZUNvdW50R3JvdXBzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidW1wQ2hhbmdlQ291bnRHcm91cHMoKXsKLQkJX2NoYW5nZUNvdW50R3JvdXBzKys7Ci0JfQotCi0JcHVibGljIGludCBnZXRDaGFuZ2VDb3VudEdyb3VwcygpIHsKLQkJcmV0dXJuIF9jaGFuZ2VDb3VudEdyb3VwczsKLQl9Ci0JCi0JcHVibGljIEZpbHRlckdyb3VwW10gZ2V0R3JvdXBzKCl7Ci0JCXJldHVybiBfZ3JvdXBzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlbGVnYXRpbmdJZChTdHJpbmcgaWQpIHsKLQkJX2RlbGVnYXRpbmdJZCA9IGlkOwkKLQl9Ci0KLQlwdWJsaWMgTWFwPFN0cmluZywgTWVzc2FnZVNldmVyaXR5U2V0dGluZz4gZ2V0TWVzc2FnZVNldHRpbmdzKCkgewotCQlyZXR1cm4gX21lc3NhZ2VTZXR0aW5nczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENoYW5nZUNvdW50TWVzc2FnZXMoKXsKLQkJcmV0dXJuIF9jaGFuZ2VDb3VudE1lc3NhZ2VzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidW1wQ2hhbmdlQ291bnRNZXNzYWdlcygpewotCQlfY2hhbmdlQ291bnRNZXNzYWdlcysrOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvckNsYXNzbmFtZTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVDb25maWcoVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaGFzaENvZGVGb3JDb25maWcoKSA9PSB2YWxpZGF0b3IuaGFzaENvZGVGb3JDb25maWcoKTsKLQl9Ci0KLQlwcml2YXRlIGludCBoYXNoQ29kZUZvckNvbmZpZygpIHsKLQkJaW50IGggPSAwOwotCQlpZiAoX2J1aWxkKWggKz0gMTAxOwotCQlpZiAoX2RlbGVnYXRpbmdJZCAhPSBudWxsKWggKz0gX2RlbGVnYXRpbmdJZC5oYXNoQ29kZSgpOwotCQlpZiAoX21hbnVhbCloICs9IDIwMTsKLQkJaWYgKF9tZXNzYWdlU2V0dGluZ3MgIT0gbnVsbCl7Ci0JCQlmb3IgKE1lc3NhZ2VTZXZlcml0eVNldHRpbmcgbXMgOiBfbWVzc2FnZVNldHRpbmdzLnZhbHVlcygpKWggKz0gbXMuaGFzaENvZGUoKTsKLQkJfQotCQlpZiAoX3NvdXJjZUlkICE9IG51bGwpaCArPSBfc291cmNlSWQuaGFzaENvZGUoKTsKLQkJaCArPSBfdmVyc2lvbjsKLQkJaWYgKF9pZCAhPSBudWxsKWggKz0gX2lkLmhhc2hDb2RlKCk7Ci0JCWZvciAoRmlsdGVyR3JvdXAgZmcgOiBfZ3JvdXBzKWggKz0gZmcuaGFzaENvZGVGb3JDb25maWcoKTsKLQkJcmV0dXJuIGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIF9uYW1lOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9GaWx0ZXJHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvRmlsdGVyR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyMGRkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9GaWx0ZXJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50VHlwZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRGVzZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkV4dGVuc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1lc3NhZ2VzOwotCi0vKioKLSAqIEFuIGltbXV0YWJsZSBncm91cCBvZiBmaWx0ZXIgcnVsZXMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyR3JvdXAgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkKLQlwcml2YXRlIGZpbmFsIEZpbHRlclJ1bGVbXSBfcnVsZXM7Ci0JCi0JLyoqIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgc2VyaWFsaXphdGlvbiAoaW4gY2FzZSB3ZSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoaXMpICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNlcmlhbGl6YXRpb25WZXJzaW9uID0gMTsKLQotCS8qKgotCSAqIEFuc3dlciBhIGZpbHRlciBncm91cCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIG5hbWUgZWl0aGVyICJpbmNsdWRlIiBvciAiZXhjbHVkZSIKLQkgKiAKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIG5hbWUgcGFyYW1ldGVyIGlzbid0IGNvcnJlY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJHcm91cCBjcmVhdGUoU3RyaW5nIG5hbWUsIEZpbHRlclJ1bGVbXSBydWxlcykgewotCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLmluY2x1ZGUuZXF1YWxzKG5hbWUpKXJldHVybiBuZXcgRmlsdGVySW5jbHVkZUdyb3VwKHJ1bGVzKTsKLQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5leGNsdWRlLmVxdWFscyhuYW1lKSlyZXR1cm4gbmV3IEZpbHRlckV4Y2x1ZGVHcm91cChydWxlcyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYSBmaWx0ZXIgZ3JvdXAgZnJvbSBhIGRlc2VyaWFsaXplci4KLQkgKiBAcGFyYW0gZGVzCi0JICogCi0JICogQHNlZSBGaWx0ZXJHcm91cCNzYXZlKFNlcmlhbGl6ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJHcm91cCBjcmVhdGUoRGVzZXJpYWxpemVyIGRlcyl7Ci0JCWRlcy5nZXRJbnQoKTsgLy8gZ2V0IHRoZSB2ZXJzaW9uCi0JCVN0cmluZyB0eXBlID0gZGVzLmdldFN0cmluZygpOwotCQkKLQkJaW50IG51bWJlclJ1bGVzID0gZGVzLmdldEludCgpOwotCQlMaXN0PEZpbHRlclJ1bGU+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxGaWx0ZXJSdWxlPigpOwotCQlmb3IgKGludCBpPTA7IGk8bnVtYmVyUnVsZXM7IGkrKylsaXN0LmFkZChGaWx0ZXJSdWxlLmNyZWF0ZShkZXMpKTsKLQkJRmlsdGVyUnVsZVtdIHJ1bGVzID0gbmV3IEZpbHRlclJ1bGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocnVsZXMpOwotCi0JCXJldHVybiBjcmVhdGUodHlwZSwgcnVsZXMpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIG5ldyBmaWx0ZXIgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGV4Y2x1ZGUgaWYgdHJ1ZSBhbiBleGNsdXNpb24gZ3JvdXAgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBhbiBpbmNsdXNpb24gZ3JvdXAgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJHcm91cCBjcmVhdGUoYm9vbGVhbiBleGNsdWRlLCBGaWx0ZXJSdWxlW10gcnVsZXMpewotCQlpZiAoZXhjbHVkZSkgcmV0dXJuIG5ldyBGaWx0ZXJFeGNsdWRlR3JvdXAocnVsZXMpOwotCQlyZXR1cm4gbmV3IEZpbHRlckluY2x1ZGVHcm91cChydWxlcyk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyBpcyBhIHN1cHBvcnRlZCB0eXBlIG9mIGdyb3VwLgotCSAqIEBwYXJhbSBuYW1lIFR5cGUgb2YgZ3JvdXAgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tub3duTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLmluY2x1ZGUuZXF1YWxzKG5hbWUpKXJldHVybiB0cnVlOwotCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLmV4Y2x1ZGUuZXF1YWxzKG5hbWUpKXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JcHJpdmF0ZSBGaWx0ZXJHcm91cChGaWx0ZXJSdWxlW10gcnVsZXMpewotCQlfcnVsZXMgPSBydWxlczsKLQl9Ci0JCQotCS8qKgotCSAqIFRoZSBydWxlcyBpbiB0aGUgZ3JvdXAuCi0JICovCi0JcHVibGljIGZpbmFsIEZpbHRlclJ1bGVbXSBnZXRSdWxlcygpewotCQlGaWx0ZXJSdWxlW10gcnVsZXMgPSBuZXcgRmlsdGVyUnVsZVtfcnVsZXMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShfcnVsZXMsIDAsIHJ1bGVzLCAwLCBfcnVsZXMubGVuZ3RoKTsKLQkJcmV0dXJuIHJ1bGVzOwotCX0KLQkJCi0JLyoqCi0JICogQW5zd2VyIHRoZSBpbnRlcm5hbCB0eXBlIG9mIGdyb3VwLCBlLmcuICJpbmNsdWRlIiBvciAiZXhjbHVkZSIuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0JCi0JLyoqIEFuc3dlciB0aGUgdHlwZSBhcyBhIHR5cGUgdGhhdCBjYW4gYmUgZGlzcGxheWVkIHRvIGEgdXNlciwgdGhhdCBpcyBpdCBoYXMgYmVlbiBsb2NhbGl6ZWQuICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbHRlckluY2x1ZGVHcm91cCBleHRlbmRzIEZpbHRlckdyb3VwIHsKLQkJCi0JCXByaXZhdGUgRmlsdGVySW5jbHVkZUdyb3VwKEZpbHRlclJ1bGVbXSBydWxlcyl7Ci0JCQlzdXBlcihydWxlcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gRXh0ZW5zaW9uQ29uc3RhbnRzLmluY2x1ZGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheWFibGVUeXBlKCkgewotCQkJcmV0dXJuIFZhbE1lc3NhZ2VzLkdyb3VwSW5jbHVkZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsdGVyRXhjbHVkZUdyb3VwIGV4dGVuZHMgRmlsdGVyR3JvdXAgewotCQkKLQkJcHJpdmF0ZSBGaWx0ZXJFeGNsdWRlR3JvdXAoRmlsdGVyUnVsZVtdIHJ1bGVzKXsKLQkJCXN1cGVyKHJ1bGVzKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gRXh0ZW5zaW9uQ29uc3RhbnRzLmV4Y2x1ZGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheWFibGVUeXBlKCkgewotCQkJcmV0dXJuIFZhbE1lc3NhZ2VzLkdyb3VwRXhjbHVkZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCX0KLQkJCi0JLyoqCi0JICogU2F2ZSB5b3VyIHNldHRpbmdzIGludG8gdGhlIHNlcmlhbGl6ZXIuCi0JICogQHBhcmFtIHNlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoU2VyaWFsaXplciBzZXIpewotCQlzZXIucHV0KFNlcmlhbGl6YXRpb25WZXJzaW9uKTsKLQkJc2VyLnB1dChnZXRUeXBlKCkpOwotCQlzZXIucHV0KF9ydWxlcy5sZW5ndGgpOwotCQlmb3IgKEZpbHRlclJ1bGUgcnVsZSA6IF9ydWxlcylydWxlLnNhdmUoc2VyKTsJCQotCX0KLQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgdmFsaWRhdGUgdGhlIHJlc291cmNlIGJhc2VkIG9uIHRoZSBmaWx0ZXJzIGluIHRoaXMgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCBpcyBiZWluZyB2YWxpZGF0ZWQuCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4gVGhpcyBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZQotCSAqIG9ubHkgdGhlIHByb2plY3QgbGV2ZWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlIHJlc291cmNlLCBDb250ZW50VHlwZVdyYXBwZXIgY29udGVudFR5cGVXcmFwcGVyKSB7Ci0JCWJvb2xlYW4gZXhjbHVkZSA9IGlzRXhjbHVkZSgpOwotCQlib29sZWFuIGluY2x1ZGUgPSBpc0luY2x1ZGUoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChGaWx0ZXJSdWxlIHJ1bGUgOiBfcnVsZXMpewotCQkJaWYgKHJlc291cmNlICE9IG51bGwpewotCQkJCUJvb2xlYW4gbWF0Y2ggPSBydWxlLm1hdGNoZXNSZXNvdXJjZShyZXNvdXJjZSwgY29udGVudFR5cGVXcmFwcGVyKTsKLQkJCQlpZiAobWF0Y2ggIT0gbnVsbCljb3VudCsrOwotCQkJCWlmIChleGNsdWRlICYmIG1hdGNoICE9IG51bGwgJiYgbWF0Y2gpcmV0dXJuIGZhbHNlOwotCQkJCWlmIChpbmNsdWRlICYmIG1hdGNoICE9IG51bGwgJiYgbWF0Y2gpcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCUJvb2xlYW4gbWF0Y2ggPSBydWxlLm1hdGNoZXNQcm9qZWN0KHByb2plY3QpOwotCQkJaWYgKG1hdGNoICE9IG51bGwpY291bnQrKzsKLQkJCWlmIChleGNsdWRlICYmIG1hdGNoICE9IG51bGwgJiYgbWF0Y2gpcmV0dXJuIGZhbHNlOwotCQkJaWYgKGluY2x1ZGUgJiYgbWF0Y2ggIT0gbnVsbCAmJiBtYXRjaClyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZXhjbHVkZSlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGNvdW50ID09IDApcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiogCi0JICogQW5zd2VyIHRydWUgaWYgdGhpcyBpcyBhbiBpbmNsdXNpb24gZmlsdGVyLCB0aGF0IGlzIGF0IGxlYXN0IG9uZSBvZiB0aGUgcnVsZXMgbXVzdAotCSAqIG1hdGNoIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIGlzIGFuIGV4Y2x1c2lvbiBmaWx0ZXIsIHRoYXQgaXMgaWYgYW55IG9mIHRoZSBydWxlcyBtYXRjaCB0aGUgCi0JICogcmVzb3VyY2UgaXMgbm90IHZhbGlkYXRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1ZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZUZvckNvbmZpZygpIHsKLQkJaW50IGggPSAwOwotCQlpZiAoaXNFeGNsdWRlKCkpaCArPSAxMzsKLQkJZm9yIChGaWx0ZXJSdWxlIGZyIDogX3J1bGVzKWggKz0gZnIuaGFzaENvZGVGb3JDb25maWcoKTsKLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGdyb3VwIGJ5IGFkZGluZyBhIHJ1bGUgdG8gYW4gZXhpc3RpbmcgZ3JvdXAuCi0JICogQHBhcmFtIGJhc2VHcm91cCBUaGUgZ3JvdXAgdGhhdCBob2xkcyB0aGUgZXhpc3RpbmcgcnVsZXMuCi0JICogQHBhcmFtIHJ1bGUgVGhlIG5ldyBydWxlIHRoYXQgaXMgYmVpbmcgYWRkZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJHcm91cCBhZGRSdWxlKEZpbHRlckdyb3VwIGJhc2VHcm91cCwgRmlsdGVyUnVsZSBydWxlKSB7Ci0JCUxpc3Q8RmlsdGVyUnVsZT4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PEZpbHRlclJ1bGU+KCk7Ci0JCWZvciAoRmlsdGVyUnVsZSByIDogYmFzZUdyb3VwLl9ydWxlcylsaXN0LmFkZChyKTsKLQkJbGlzdC5hZGQocnVsZSk7Ci0JCQotCQlGaWx0ZXJSdWxlW10gcnVsZXMgPSBuZXcgRmlsdGVyUnVsZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShydWxlcyk7Ci0JCXJldHVybiBGaWx0ZXJHcm91cC5jcmVhdGUoYmFzZUdyb3VwLmlzRXhjbHVkZSgpLCBydWxlcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGdyb3VwIGJ5IHJlbW92aW5nIGEgcnVsZSBmcm9tIGFuIGV4aXN0aW5nIGdyb3VwLgotCSAqIEBwYXJhbSBiYXNlR3JvdXAgVGhlIGdyb3VwIHRoYXQgaG9sZHMgdGhlIGV4aXN0aW5nIHJ1bGVzLgotCSAqIEBwYXJhbSBydWxlIFRoZSBydWxlIHRoYXQgaXMgYmVpbmcgcmVtb3ZlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbHRlckdyb3VwIHJlbW92ZVJ1bGUoRmlsdGVyR3JvdXAgYmFzZUdyb3VwLAlGaWx0ZXJSdWxlIHJ1bGUpIHsKLQkJTGlzdDxGaWx0ZXJSdWxlPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8RmlsdGVyUnVsZT4oKTsKLQkJZm9yIChGaWx0ZXJSdWxlIHIgOiBiYXNlR3JvdXAuX3J1bGVzKXsKLQkJCWlmICghci5lcXVhbHMocnVsZSkpbGlzdC5hZGQocik7Ci0JCX0KLQkJCi0JCUZpbHRlclJ1bGVbXSBydWxlcyA9IG5ldyBGaWx0ZXJSdWxlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJ1bGVzKTsKLQkJcmV0dXJuIEZpbHRlckdyb3VwLmNyZWF0ZShiYXNlR3JvdXAuaXNFeGNsdWRlKCksIHJ1bGVzKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9GaWx0ZXJSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9GaWx0ZXJSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MGRmNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvRmlsdGVyUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5EZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRXh0ZW5zaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBBIHJ1bGUgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciBvdXQgKG9yIGluKSB2YWxpZGF0aW9uIG9uIGEgcmVzb3VyY2UuCi0gKiBUaGUgY29uY3JldGUgY2xhc3NlcyBhcmUgYWxsIGltbXV0YWJsZS4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWx0ZXJSdWxlIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfcGF0dGVybjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQb3J0YWJsZUZpbGVEZWxpbSA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZSBhIHJ1bGUgYmFzZWQgb24gYSBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIFRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQsIHNlZSB0aGUgZXh0ZW5zaW9uIHBvaW50IGZvciBkZXRhaWxzLgotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJSdWxlIGNyZWF0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVsZSl7Ci0JCVN0cmluZyBuYW1lID0gcnVsZS5nZXROYW1lKCk7Ci0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5maWxlZXh0LmVxdWFscyhuYW1lKSlyZXR1cm4gbmV3IEZpbGVFeHQocnVsZSk7Ci0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5wcm9qZWN0TmF0dXJlLmVxdWFscyhuYW1lKSlyZXR1cm4gbmV3IFByb2plY3ROYXR1cmUocnVsZSk7Ci0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5maWxlLmVxdWFscyhuYW1lKSlyZXR1cm4gRmlsZS5jcmVhdGVGaWxlKHJ1bGUpOwotCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUuY29udGVudFR5cGUuZXF1YWxzKG5hbWUpKXJldHVybiBDb250ZW50VHlwZS5jcmVhdGVDb250ZW50VHlwZShydWxlKTsKLQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlLmZhY2V0LmVxdWFscyhuYW1lKSlyZXR1cm4gbmV3IEZhY2V0KHJ1bGUpOwotCQlpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUucGF0dGVybi5lcXVhbHMobmFtZSkpcmV0dXJuIEZpbGVQYXR0ZXJuLmNyZWF0ZUZpbGVQYXR0ZXJuKHJ1bGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0Jc3RhdGljIEZpbHRlclJ1bGUgY3JlYXRlKERlc2VyaWFsaXplciBkZXMpIHsKLQkJU3RyaW5nIHR5cGUgPSBkZXMuZ2V0U3RyaW5nKCk7Ci0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5maWxlZXh0LmVxdWFscyh0eXBlKSl7Ci0JCQlTdHJpbmcgcGF0dGVybiA9IGRlcy5nZXRTdHJpbmcoKTsKLQkJCWJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IGRlcy5nZXRCb29sZWFuKCk7Ci0JCQlyZXR1cm4gbmV3IEZpbGVFeHQocGF0dGVybiwgY2FzZVNlbnNpdGl2ZSk7Ci0JCX0KLQkJCi0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5wcm9qZWN0TmF0dXJlLmVxdWFscyh0eXBlKSl7Ci0JCQlTdHJpbmcgcGF0dGVybiA9IGRlcy5nZXRTdHJpbmcoKTsKLQkJCXJldHVybiBuZXcgUHJvamVjdE5hdHVyZShwYXR0ZXJuKTsKLQkJfQotCQkKLQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlLmZpbGUuZXF1YWxzKHR5cGUpKXsKLQkJCVN0cmluZyBwYXR0ZXJuID0gZGVzLmdldFN0cmluZygpOwotCQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gZGVzLmdldEJvb2xlYW4oKTsKLQkJCWludCBmaWxlVHlwZSA9IGRlcy5nZXRJbnQoKTsKLQkJCXJldHVybiBuZXcgRmlsZShwYXR0ZXJuLCBjYXNlU2Vuc2l0aXZlLCBmaWxlVHlwZSk7Ci0JCX0KLQkJCi0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5jb250ZW50VHlwZS5lcXVhbHModHlwZSkpewotCQkJU3RyaW5nIHBhdHRlcm4gPSBkZXMuZ2V0U3RyaW5nKCk7Ci0JCQlib29sZWFuIGV4YWN0TWF0Y2ggPSBkZXMuZ2V0Qm9vbGVhbigpOwotCQkJcmV0dXJuIG5ldyBDb250ZW50VHlwZShwYXR0ZXJuLCBleGFjdE1hdGNoKTsKLQkJfQotCQkKLQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlLmZhY2V0LmVxdWFscyh0eXBlKSl7Ci0JCQlTdHJpbmcgcGF0dGVybiA9IGRlcy5nZXRTdHJpbmcoKTsKLQkJCXJldHVybiBuZXcgRmFjZXQocGF0dGVybiwgbnVsbCk7Ci0JCX0KLQkJCi0JCWlmIChFeHRlbnNpb25Db25zdGFudHMuUnVsZS5wYXR0ZXJuLmVxdWFscyh0eXBlKSl7Ci0JCQlTdHJpbmcgcGF0dGVybiA9IGRlcy5nZXRTdHJpbmcoKTsKLQkJCWJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IGRlcy5nZXRCb29sZWFuKCk7Ci0JCQlyZXR1cm4gbmV3IEZpbGVQYXR0ZXJuKHBhdHRlcm4sIGNhc2VTZW5zaXRpdmUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgRmlsdGVyUnVsZSBjcmVhdGVGaWxlKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGludCB0eXBlKXsKLQkJcmV0dXJuIG5ldyBGaWxlKHBhdHRlcm4sIGNhc2VTZW5zaXRpdmUsIHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEZpbHRlclJ1bGUgY3JlYXRlRmlsZUV4dChTdHJpbmcgcGF0dGVybiwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKXsKLQkJRmlsZUV4dCBleHQgPSBuZXcgRmlsZUV4dChwYXR0ZXJuLCBjYXNlU2Vuc2l0aXZlKTsKLQkJcmV0dXJuIGV4dDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJSdWxlIGNyZWF0ZUZhY2V0KFN0cmluZyBmYWNldElkKXsKLQkJcmV0dXJuIG5ldyBGYWNldChmYWNldElkLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJSdWxlIGNyZWF0ZVByb2plY3QoU3RyaW5nIHByb2plY3ROYXR1cmUpewotCQlyZXR1cm4gbmV3IFByb2plY3ROYXR1cmUocHJvamVjdE5hdHVyZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRmlsdGVyUnVsZSBjcmVhdGVDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUsIGJvb2xlYW4gZXhhY3RNYXRjaCl7Ci0JCXJldHVybiBuZXcgQ29udGVudFR5cGUoY29udGVudFR5cGUsIGV4YWN0TWF0Y2gpOwotCX0KLQkJCi0JcHJvdGVjdGVkIEZpbHRlclJ1bGUoU3RyaW5nIHBhdHRlcm4pewotCQlfcGF0dGVybiA9IHBhdHRlcm47Ci0JfQotCi0JLyoqIAotCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBydWxlIG1hdGNoZXMgdGhlIHJlc291cmNlLCBmYWxzZSBpZiBpdCBkb2Vzbid0LCBhbmQKLQkgKiBudWxsIGlmIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5IHRvIHJlc291cmNlcy4KLQkgKiAKLQkgKiAJQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4KLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBtYXRjaGVzUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlLCBDb250ZW50VHlwZVdyYXBwZXIgY29udGVudFR5cGVXcmFwcGVyKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBydWxlIG1hdGNoZXMgdGhlIHByb2plY3QsIGZhbHNlIGlmIGl0IGRvZXNuJ3QsIGFuZCBudWxsIGlmIHRoZQotCSAqIHJ1bGUgZG9lcyBub3QgYXBwbHkuCi0JICogCi0JICogCUBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLgotCSAqLwotCXB1YmxpYyBCb29sZWFuIG1hdGNoZXNQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXREaXNwbGF5YWJsZVR5cGUoKSArICI6ICIgKyBfcGF0dGVybjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiogQW5zd2VyIGEgbmFtZSBvZiB0aGUgcnVsZSwgdGhhdCBjYW4gYmUgZGlzcGxheWVkIHRvIGEgdXNlci4gKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKXsKLQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpewotCQlyZXR1cm4gX3BhdHRlcm47Ci0JfQotCQotCS8qKiBBbnN3ZXIgdGhlIHR5cGUgb2YgcnVsZS4gKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGUoKTsKLQkKLQkvKiogQW5zd2VyIGEgdHlwZSB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgdG8gYW4gZW5kIHVzZXIuICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXNCb29sZWFuKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBhRGVmYXVsdCl7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKXJldHVybiBhRGVmYXVsdDsKLQkJaWYgKHZhbHVlLmVxdWFscyhFeHRlbnNpb25Db25zdGFudHMuVHJ1ZSkpcmV0dXJuIHRydWU7Ci0JCWlmICh2YWx1ZS5lcXVhbHMoRXh0ZW5zaW9uQ29uc3RhbnRzLkZhbHNlKSlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhRGVmYXVsdDsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaWx0ZXJSdWxlQ2FzZVNlbnNpdGl2ZSBleHRlbmRzIEZpbHRlclJ1bGUgewotCQkJCQotCQlwdWJsaWMgRmlsdGVyUnVsZUNhc2VTZW5zaXRpdmUoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQkJc3VwZXIocGF0dGVybik7Ci0JCQlfY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7Ci0JCX0KLQkJCi0JCXByaXZhdGUgZmluYWwgYm9vbGVhbiBfY2FzZVNlbnNpdGl2ZTsKLQkJCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGVGb3JDb25maWcoKSB7Ci0JCQlpbnQgaCA9ICBzdXBlci5oYXNoQ29kZUZvckNvbmZpZygpOwotCQkJaWYgKF9jYXNlU2Vuc2l0aXZlKWggKz0gNDAxOwotCQkJcmV0dXJuIGg7Ci0JCX0KLQkJCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNhdmUoU2VyaWFsaXplciBzZXIpIHsKLQkJCXN1cGVyLnNhdmUoc2VyKTsKLQkJCXNlci5wdXQoX2Nhc2VTZW5zaXRpdmUpOwotCQl9Ci0JCQkJCQkKLQkJcHVibGljIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKCkgewotCQkJcmV0dXJuIF9jYXNlU2Vuc2l0aXZlOwotCQl9Ci0JCQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvamVjdE5hdHVyZSBleHRlbmRzIEZpbHRlclJ1bGUgewotCQkKLQkJcHJpdmF0ZSBQcm9qZWN0TmF0dXJlKElDb25maWd1cmF0aW9uRWxlbWVudCBydWxlKSB7Ci0JCQlzdXBlcihydWxlLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuUnVsZUF0dHJpYi5pZCkpOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBQcm9qZWN0TmF0dXJlKFN0cmluZyBwcm9qZWN0TmF0dXJlKSB7Ci0JCQlzdXBlcihwcm9qZWN0TmF0dXJlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheWFibGVUeXBlKCkgewotCQkJcmV0dXJuIFZhbE1lc3NhZ2VzLlJ1bGVQcm9qZWN0TmF0dXJlOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUucHJvamVjdE5hdHVyZTsKLQkJfQotCQkKLQkJcHVibGljIEJvb2xlYW4gbWF0Y2hlc1Byb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoX3BhdHRlcm4pOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQl9Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWxlRXh0IGV4dGVuZHMgRmlsdGVyUnVsZUNhc2VTZW5zaXRpdmUgewotCQkKLQkJcHJpdmF0ZSBGaWxlRXh0KElDb25maWd1cmF0aW9uRWxlbWVudCBydWxlKXsKLQkJCXN1cGVyKHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLmV4dCksIAotCQkJCWFzQm9vbGVhbihydWxlLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuUnVsZUF0dHJpYi5jYXNlU2Vuc2l0aXZlKSwgZmFsc2UpKTsKLQkJfQotCQkJCQotCQlwcml2YXRlIEZpbGVFeHQoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQkJc3VwZXIocGF0dGVybiwgY2FzZVNlbnNpdGl2ZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUuZmlsZWV4dDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKSB7Ci0JCQlyZXR1cm4gVmFsTWVzc2FnZXMuUnVsZUZpbGVFeHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0b1N0cmluZygpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKGlzQ2FzZVNlbnNpdGl2ZSgpKXJldHVybiBOTFMuYmluZChWYWxNZXNzYWdlcy5GaWxlRXh0V2l0aENhc2UsIGdldERpc3BsYXlhYmxlVHlwZSgpLCBfcGF0dGVybik7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoVmFsTWVzc2FnZXMuRmlsZUV4dFdpdGhvdXRDYXNlLCBnZXREaXNwbGF5YWJsZVR5cGUoKSwgX3BhdHRlcm4pOwotCQl9Ci0KLQkJcHVibGljIEJvb2xlYW4gbWF0Y2hlc1Jlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSwgQ29udGVudFR5cGVXcmFwcGVyIGNvbnRlbnRUeXBlV3JhcHBlcikgewotCQkJU3RyaW5nIGV4dCA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChpc0Nhc2VTZW5zaXRpdmUoKSlyZXR1cm4gX3BhdHRlcm4uZXF1YWxzKGV4dCk7Ci0JCQlyZXR1cm4gX3BhdHRlcm4uZXF1YWxzSWdub3JlQ2FzZShleHQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEEgcnVsZSB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIGJhc2VkIG9uIGZpbGUgb3IgZm9sZGVyIG5hbWVzLgotCSAqIEBhdXRob3Iga2FyYXNpdWsKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZSBleHRlbmRzIEZpbHRlclJ1bGVDYXNlU2Vuc2l0aXZlIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nCV9wYXR0ZXJuQXNMb3dlcmNhc2U7Ci0JCQotCQkvKiogT25lIG9mIHRoZSBGaWxlVHlwZVhYIGNvbnN0YW50cy4gKi8KLQkJcHJpdmF0ZSBmaW5hbCBpbnQJCV90eXBlOwotCQkKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRmlsZVR5cGVGaWxlID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRmlsZVR5cGVGb2xkZXIgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGaWxlVHlwZUZ1bGwgPSAzOwotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgRmlsZSBjcmVhdGVGaWxlKElDb25maWd1cmF0aW9uRWxlbWVudCBydWxlKXsKLQkJCVN0cmluZyBwYXR0ZXJuID0gcnVsZS5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGVBdHRyaWIubmFtZSk7Ci0JCQlpZiAocGF0dGVybiA9PSBudWxsKXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oVmFsTWVzc2FnZXMuRXJyUGF0dGVybkF0dHJpYik7Ci0JCQlTdHJpbmcgdHlwZSA9IHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLmZpbGVUeXBlKTsKLQkJCWlmICh0eXBlID09IG51bGwpdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihWYWxNZXNzYWdlcy5FcnJUeXBlUmVxKTsKLQkJCQotCQkJaW50IG15VHlwZSA9IC0xOwotCQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5GaWxlVHlwZS5maWxlLmVxdWFscyh0eXBlKSlteVR5cGUgPSBGaWxlVHlwZUZpbGU7Ci0JCQllbHNlIGlmIChFeHRlbnNpb25Db25zdGFudHMuRmlsZVR5cGUuZm9sZGVyLmVxdWFscyh0eXBlKSl7Ci0JCQkJbXlUeXBlID0gRmlsZVR5cGVGb2xkZXI7Ci0JCQkJaWYgKCFwYXR0ZXJuLmVuZHNXaXRoKFBvcnRhYmxlRmlsZURlbGltKSlwYXR0ZXJuICs9IFBvcnRhYmxlRmlsZURlbGltOwotCQkJfQotCQkJZWxzZSBpZiAoRXh0ZW5zaW9uQ29uc3RhbnRzLkZpbGVUeXBlLmZ1bGwuZXF1YWxzKHR5cGUpKW15VHlwZSA9IEZpbGVUeXBlRnVsbDsKLQkJCWVsc2UgewotCQkJCU9iamVjdFtdIHBhcm1zID0ge3R5cGUsIEV4dGVuc2lvbkNvbnN0YW50cy5GaWxlVHlwZS5maWxlLCBFeHRlbnNpb25Db25zdGFudHMuRmlsZVR5cGUuZm9sZGVyLCAKLQkJCQkJRXh0ZW5zaW9uQ29uc3RhbnRzLkZpbGVUeXBlLmZ1bGx9OwotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTkxTLmJpbmQoVmFsTWVzc2FnZXMuRXJyVHlwZSwgcGFybXMpKTsKLQkJCX0KLQkJCWJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IGFzQm9vbGVhbihydWxlLmdldEF0dHJpYnV0ZShFeHRlbnNpb25Db25zdGFudHMuUnVsZUF0dHJpYi5jYXNlU2Vuc2l0aXZlKSwgZmFsc2UpOwotCQkJcmV0dXJuIG5ldyBGaWxlKHBhdHRlcm4sIGNhc2VTZW5zaXRpdmUsIG15VHlwZSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgIEZpbGUoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSwgaW50IHR5cGUpewkJCQotCQkJc3VwZXIocGF0dGVybiwgY2FzZVNlbnNpdGl2ZSk7Ci0JCQlfdHlwZSA9IHR5cGU7Ci0JCQlfcGF0dGVybkFzTG93ZXJjYXNlID0gcGF0dGVybiA9PSBudWxsID8gbnVsbCA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTsKLQkJfQotCQkJCQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUuZmlsZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKSB7Ci0JCQlpZiAoX3R5cGUgPT0gRmlsZVR5cGVGb2xkZXIpcmV0dXJuIFZhbE1lc3NhZ2VzLlJ1bGVGb2xkZXI7Ci0JCQlpZiAoX3R5cGUgPT0gRmlsZVR5cGVGdWxsKXJldHVybiBWYWxNZXNzYWdlcy5SdWxlRnVsbDsKLQkJCXJldHVybiBWYWxNZXNzYWdlcy5SdWxlRmlsZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0RGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVsZSkgewotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKGlzQ2FzZVNlbnNpdGl2ZSgpKXJldHVybiBOTFMuYmluZChWYWxNZXNzYWdlcy5GaWxlRXh0V2l0aENhc2UsIGdldERpc3BsYXlhYmxlVHlwZSgpLCBfcGF0dGVybik7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoVmFsTWVzc2FnZXMuRmlsZUV4dFdpdGhvdXRDYXNlLCBnZXREaXNwbGF5YWJsZVR5cGUoKSwgX3BhdHRlcm4pOwotCQl9Ci0JCQotCQlwdWJsaWMgQm9vbGVhbiBtYXRjaGVzUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlLCBDb250ZW50VHlwZVdyYXBwZXIgY29udGVudFR5cGVXcmFwcGVyKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCQlzd2l0Y2ggKF90eXBlKXsKLQkJCWNhc2UgRmlsZVR5cGVGaWxlOgotCQkJCW5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIEZpbGVUeXBlRm9sZGVyOgotCQkJCW5hbWUgPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkgKyBQb3J0YWJsZUZpbGVEZWxpbTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgRmlsZVR5cGVGdWxsOgotCQkJCW5hbWUgPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlpZiAobmFtZSA9PSBudWxsKXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJaWYgKGlzQ2FzZVNlbnNpdGl2ZSgpKXJldHVybiBuYW1lLnN0YXJ0c1dpdGgoX3BhdHRlcm4pOwotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKF9wYXR0ZXJuQXNMb3dlcmNhc2UpOwotCQl9Ci0JCQkJCQkJCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2F2ZShTZXJpYWxpemVyIHNlcikgewotCQkJc3VwZXIuc2F2ZShzZXIpOwotCQkJc2VyLnB1dChfdHlwZSk7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjZXQgZXh0ZW5kcyBGaWx0ZXJSdWxlIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIF92ZXJzaW9uRXhwcmVzc2lvbjsKLQkJCi0JCXByaXZhdGUgRmFjZXQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJ1bGUpewotCQkJc3VwZXIocnVsZS5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGVBdHRyaWIuaWQpKTsKLQkJCV92ZXJzaW9uRXhwcmVzc2lvbiA9IHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLnZlcnNpb24pOwotCQkJCi0JCX0KLQkJCQkKLQkJcHVibGljIEZhY2V0KFN0cmluZyBmYWNldElkLCBTdHJpbmcgdmVyc2lvbkV4cHJlc3Npb24pIHsKLQkJCXN1cGVyKGZhY2V0SWQpOwotCQkJX3ZlcnNpb25FeHByZXNzaW9uID0gdmVyc2lvbkV4cHJlc3Npb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUuZmFjZXQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheWFibGVUeXBlKCkgewotCQkJcmV0dXJuIFZhbE1lc3NhZ2VzLlJ1bGVGYWNldDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBCb29sZWFuIG1hdGNoZXNQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKF92ZXJzaW9uRXhwcmVzc2lvbiA9PSBudWxsKXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgX3BhdHRlcm4pOwotCQkJCXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgX3BhdHRlcm4sIF92ZXJzaW9uRXhwcmVzc2lvbik7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCQlpZiAoVHJhY2luZy5pc0xvZ2dpbmcoKSlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigyMDApOwotCQkJYi5hcHBlbmQoZ2V0RGlzcGxheWFibGVUeXBlKCkpOwotCQkJYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWIuYXBwZW5kKF9wYXR0ZXJuKTsKLQkJCQotCQkJaWYgKF92ZXJzaW9uRXhwcmVzc2lvbiAhPSAgbnVsbCl7Ci0JCQkJYi5hcHBlbmQoIiAoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQliLmFwcGVuZChfdmVyc2lvbkV4cHJlc3Npb24pOwotCQkJCWIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29udGVudFR5cGUgZXh0ZW5kcyBGaWx0ZXJSdWxlIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgSUNvbnRlbnRUeXBlIAlfdHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuCQlfZXhhY3RNYXRjaDsKLQkJCi0JCXByaXZhdGUgQ29udGVudFR5cGUoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gZXhhY3RNYXRjaCl7Ci0JCQlzdXBlcihwYXR0ZXJuKTsKLQkJCV90eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUocGF0dGVybik7Ci0JCQlfZXhhY3RNYXRjaCA9IGV4YWN0TWF0Y2g7Ci0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIENvbnRlbnRUeXBlIGNyZWF0ZUNvbnRlbnRUeXBlKElDb25maWd1cmF0aW9uRWxlbWVudCBydWxlKXsKLQkJCVN0cmluZyBwYXR0ZXJuID0gcnVsZS5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGVBdHRyaWIuaWQpOwotCQkJYm9vbGVhbiBleGFjdE1hdGNoID0gdHJ1ZTsKLQkJCVN0cmluZyBleGFjdCA9IHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLmV4YWN0TWF0Y2gpOwotCQkJaWYgKEV4dGVuc2lvbkNvbnN0YW50cy5GYWxzZS5lcXVhbHMoZXhhY3QpKSBleGFjdE1hdGNoID0gZmFsc2U7Ci0JCQkKLQkJCXJldHVybiBuZXcgQ29udGVudFR5cGUocGF0dGVybiwgZXhhY3RNYXRjaCk7Ci0JCX0KLQkJCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlLmNvbnRlbnRUeXBlOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZUZvckNvbmZpZygpIHsKLQkJCWludCBoID0gIHN1cGVyLmhhc2hDb2RlRm9yQ29uZmlnKCk7Ci0JCQlpZiAoX2V4YWN0TWF0Y2gpaCArPSAzMDE7Ci0JCQlyZXR1cm4gaDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5YWJsZVR5cGUoKSB7Ci0JCQlyZXR1cm4gVmFsTWVzc2FnZXMuUnVsZUNvbnRlbnRUeXBlOwotCQl9Ci0JCQkJCQkJCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2F2ZShTZXJpYWxpemVyIHNlcikgewotCQkJc3VwZXIuc2F2ZShzZXIpOwotCQkJc2VyLnB1dChfZXhhY3RNYXRjaCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBydWxlKSB7Ci0JCX0KLQkJCQkKLQkJcHVibGljIEJvb2xlYW4gbWF0Y2hlc1Jlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSwgQ29udGVudFR5cGVXcmFwcGVyIGNvbnRlbnRUeXBlV3JhcHBlcikgewotCQkJaWYgKF90eXBlID09IG51bGwpcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCQkJCUlDb250ZW50VHlwZSBjdCA9IGNvbnRlbnRUeXBlV3JhcHBlci5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCQlpZiAoY3QgPT0gbnVsbClyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQkJaWYgKF9leGFjdE1hdGNoKW1hdGNoID0gY3QuZ2V0SWQoKS5lcXVhbHMoX3R5cGUuZ2V0SWQoKSk7Ci0JCQkJZWxzZSBtYXRjaCA9IGN0LmlzS2luZE9mKF90eXBlKTsKLQkJCQkKLQkJCQlpZiAobWF0Y2ggJiYgVHJhY2luZy5pc1RyYWNlTWF0Y2hlcygpKQotCQkJCQlUcmFjaW5nLmxvZygiRmlsdGVyUnVsZS0wMTogIiwgdG9TdHJpbmcoKSArICIgaGFzIG1hdGNoZWQgIiArIHJlc291cmNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIG1hdGNoOwotCQkJfQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKF9leGFjdE1hdGNoKXJldHVybiBOTFMuYmluZChWYWxNZXNzYWdlcy5Db250ZW50VHlwZUV4YWN0LCBnZXREaXNwbGF5YWJsZVR5cGUoKSwgX3BhdHRlcm4pOwotCQkJcmV0dXJuIE5MUy5iaW5kKFZhbE1lc3NhZ2VzLkNvbnRlbnRUeXBlTm90RXhhY3QsIGdldERpc3BsYXlhYmxlVHlwZSgpLCBfcGF0dGVybik7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZVBhdHRlcm4gZXh0ZW5kcyBGaWx0ZXJSdWxlQ2FzZVNlbnNpdGl2ZSB7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFBhdHRlcm4gX2NvbXBpbGVkUGF0dGVybjsKLQkJCi0JCXByaXZhdGUgc3RhdGljIEZpbGVQYXR0ZXJuIGNyZWF0ZUZpbGVQYXR0ZXJuKElDb25maWd1cmF0aW9uRWxlbWVudCBydWxlKXsKLQkJCVN0cmluZyBwYXR0ZXJuID0gcnVsZS5nZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGVBdHRyaWIucmVnZXgpOwotCQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gYXNCb29sZWFuKHJ1bGUuZ2V0QXR0cmlidXRlKEV4dGVuc2lvbkNvbnN0YW50cy5SdWxlQXR0cmliLmNhc2VTZW5zaXRpdmUpLCBmYWxzZSk7Ci0JCQlyZXR1cm4gbmV3IEZpbGVQYXR0ZXJuKHBhdHRlcm4sIGNhc2VTZW5zaXRpdmUpOwotCQl9Ci0JCQotCQlwcml2YXRlIEZpbGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpewotCQkJc3VwZXIocGF0dGVybiwgY2FzZVNlbnNpdGl2ZSk7Ci0JCQlpbnQgZmxhZ3MgPSAwOwotCQkJaWYgKGNhc2VTZW5zaXRpdmUpZmxhZ3MgPSBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkU7Ci0JCQlQYXR0ZXJuIGNvbXBpbGVkUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuLCBmbGFncyk7CQkJCQotCQkJX2NvbXBpbGVkUGF0dGVybiA9IGNvbXBpbGVkUGF0dGVybjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlhYmxlVHlwZSgpIHsKLQkJCXJldHVybiBWYWxNZXNzYWdlcy5SdWxlUGF0dGVybjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gRXh0ZW5zaW9uQ29uc3RhbnRzLlJ1bGUucGF0dGVybjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBCb29sZWFuIG1hdGNoZXNSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UsIENvbnRlbnRUeXBlV3JhcHBlciB3cmFwcGVyKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IFBvcnRhYmxlRmlsZURlbGltICsgcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCWlmIChuYW1lID09IG51bGwpcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQlyZXR1cm4gX2NvbXBpbGVkUGF0dGVybi5tYXRjaGVyKG5hbWUpLm1hdGNoZXMoKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFNhdmUgeW91ciBzZXR0aW5ncyBpbnRvIHRoZSBzZXJpYWxpemVyLgotCSAqIEBwYXJhbSBzZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFNlcmlhbGl6ZXIgc2VyKSB7Ci0JCXNlci5wdXQoZ2V0VHlwZSgpKTsKLQkJc2VyLnB1dChnZXRQYXR0ZXJuKCkpOwkJCi0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZUZvckNvbmZpZygpIHsKLQkJaW50IGggPSBnZXRUeXBlKCkuaGFzaENvZGUoKTsKLQkJaWYgKF9wYXR0ZXJuICE9IG51bGwpaCArPSBfcGF0dGVybi5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9HbG9iYWxQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvR2xvYmFsUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4OWMyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9HbG9iYWxQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGdsb2JhbCBQcmVmZXJlbmNlcyBhcyBzZXQgb24gdGhlIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMgcGFnZS4gSXQgZG9lc24ndAotICogaG9sZCBhbnkgb2YgdGhlIGluZGl2aWR1YWwgdmFsaWRhdG9yIHNldHRpbmdzLCBqdXN0IHRoZSBnbG9iYWwgY2hlY2sgYm94ZXMuIEl0IGlzIGFuIGltbXV0YWJsZSBvYmplY3QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHbG9iYWxQcmVmZXJlbmNlcyB7Ci0JCi0JLyoqIGZhbHNlIC0gRGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc2hvdWxkIGFsbCB0aGUgdmFsaWRhdGlvbiBiZSBzdXNwZW5kZWQgc2V0dGluZy4gKi8gCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERlZmF1bHRTdXNwZW5kID0gZmFsc2U7Ci0JCi0JLyoqIGZhbHNlIC0gRGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgYXV0byBzYXZlIHNldHRpbmcuICovIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBEZWZhdWx0QXV0b1NhdmUgPSBmYWxzZTsKLQkKLQkvKiogZmFsc2UgLSBEZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBjb25maXJtIGRpYWxvZyBzZXR0aW5nLiAqLyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRGVmYXVsdENvbmZpcm0gPSB0cnVlOwotCQotCS8qKiBmYWxzZSAtIERlZmF1bHQgc2V0dGluZyBmb3IgbGV0dGluZyBwcm9qZWN0cyBvdmVycmlkZSB0aGUgZ2xvYmFsIHNldHRpbmdzLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBEZWZhdWx0T3ZlcnJpZGUgPSB0cnVlOwotCQotCS8qKiAyIC0gVGhlIHZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBtZXRhIGRhdGEsIGlmIGFuIGV4cGxpY2l0IHZlcnNpb24gaXNuJ3QgZm91bmQuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdEZyYW1ld29ya1ZlcnNpb24gPSAyOwotCQotCS8qKiBCaXQgbWFza3MgZm9yIHdoYXQgaGFzIGNoYW5nZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ29uZmlybURpYWxvZ01hc2sgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERpc2FibGVBbGxWYWxpZGF0aW9uTWFzayA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgT3ZlcnJpZGVNYXNrID0gNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTYXZlQXV0b21hdGljYWxseU1hc2sgPSA4OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFN0YXRlVGltZVN0YW1wTWFzayA9IDE2OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZlcnNpb25NYXNrID0gMzI7Ci0JCi0JLyoqCi0JICogVGhlIGNoYW5nZXMgdGhhdCBjb3VsZCBhZmZlY3Qgd2hhdCBnZXRzIHZhbGlkYXRlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCdWlsZENoYW5nZU1hc2sgPSBEaXNhYmxlQWxsVmFsaWRhdGlvbk1hc2sgfCBPdmVycmlkZU1hc2s7Ci0JCi0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2NvbmZpcm1EaWFsb2c7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9kaXNhYmxlQWxsVmFsaWRhdGlvbjsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gX292ZXJyaWRlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBfc2F2ZUF1dG9tYXRpY2FsbHk7Ci0JCi0JLyoqIFRoZSBwbHVnLWluIHN0YXRlIHRpbWUgc3RhbXAuICovCi0JcHJpdmF0ZSBmaW5hbCBsb25nCV9zdGF0ZVRpbWVTdGFtcDsKLQkKLQkvKiogVGhlIGluY29taW5nIHZlcnNpb24gb2YgdGhlIGZyYW1ld29yay4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIG1pZ3JhdGlvbiBpcyBuZWVkZWQuKi8KLQlwcml2YXRlIGZpbmFsIGludAkJX3ZlcnNpb247Ci0JCQkKLQkvKioKLQkgKiBUaGUgb25seSB2YWxpZCB3YXkgdG8gZ2V0IHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgaXMgdGhyb3VnaCB0aGUgVmFsTWFuYWdlci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXIjZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBHbG9iYWxQcmVmZXJlbmNlcyhHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcyBncCkgewotCQlfY29uZmlybURpYWxvZyA9IGdwLmNvbmZpcm1EaWFsb2c7Ci0JCV9kaXNhYmxlQWxsVmFsaWRhdGlvbiA9IGdwLmRpc2FibGVBbGxWYWxpZGF0aW9uOwotCQlfb3ZlcnJpZGUgPSBncC5vdmVycmlkZTsKLQkJX3NhdmVBdXRvbWF0aWNhbGx5ID0gZ3Auc2F2ZUF1dG9tYXRpY2FsbHk7Ci0JCV9zdGF0ZVRpbWVTdGFtcCA9IGdwLnN0YXRlVGltZVN0YW1wOwotCQlfdmVyc2lvbiA9IGdwLnZlcnNpb247Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhIGNvcHkgb2YgdGhlIHZhbHVlcy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzIGFzVmFsdWVzKCl7Ci0JCUdsb2JhbFByZWZlcmVuY2VzVmFsdWVzIGdwID0gbmV3IEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzKCk7Ci0JCWdwLmNvbmZpcm1EaWFsb2cgPSBfY29uZmlybURpYWxvZzsKLQkJZ3AuZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBfZGlzYWJsZUFsbFZhbGlkYXRpb247Ci0JCWdwLm92ZXJyaWRlID0gX292ZXJyaWRlOwotCQlncC5zYXZlQXV0b21hdGljYWxseSA9IF9zYXZlQXV0b21hdGljYWxseTsKLQkJZ3Auc3RhdGVUaW1lU3RhbXAgPSBfc3RhdGVUaW1lU3RhbXA7Ci0JCWdwLnZlcnNpb24gPSBfdmVyc2lvbjsKLQkJcmV0dXJuIGdwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFNhdmVBdXRvbWF0aWNhbGx5KCkgewotCQlyZXR1cm4gX3NhdmVBdXRvbWF0aWNhbGx5OwotCX0KLQotCi0JLyoqCi0JICogQW5zd2VyIGlmIGFsbCB2YWxpZGF0aW9uIGhhcyBiZWVuIGRpc2FibGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVBbGxWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gX2Rpc2FibGVBbGxWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbmZpcm1EaWFsb2coKSB7Ci0JCXJldHVybiBfY29uZmlybURpYWxvZzsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRTdGF0ZVRpbWVTdGFtcCgpIHsKLQkJcmV0dXJuIF9zdGF0ZVRpbWVTdGFtcDsKLQl9Ci0KLQkvKiogQW5zd2VyIHdoZXRoZXIgb3Igbm90IHByb2plY3RzIGFyZSBhbGxvd2VkIHRvIG92ZXJyaWRlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMuICovCi0JcHVibGljIGJvb2xlYW4gZ2V0T3ZlcnJpZGUoKSB7Ci0JCXJldHVybiBfb3ZlcnJpZGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gX3ZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZSB5b3Vyc2VsZiB0byB0aGUgb3RoZXIgZ2xvYmFsIHByZWZlcmVuY2VzIGFuZCBhbnN3ZXIgYSBiaXRtYXNrIHdpdGggdGhlIGRpZmZlcmVuY2VzLgotCSAqIEBwYXJhbSBncAotCSAqIEByZXR1cm4gYml0IG1hc2sgb2YgdGhlIGNoYW5nZXMuIFNlZSB0aGUgeHh4TWFzayBjb25zdGFudHMgZm9yIHRoZSB2YWx1ZXMgb2YgdGhlIGJpdHMuIEEgemVybyBtZWFucyB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lLgotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShHbG9iYWxQcmVmZXJlbmNlcyBncCkgewotCQlpbnQgY2hhbmdlcyA9IDA7Ci0JCWlmIChfY29uZmlybURpYWxvZyAhPSBncC5nZXRDb25maXJtRGlhbG9nKCkpY2hhbmdlcyB8PSBDb25maXJtRGlhbG9nTWFzazsKLQkJaWYgKF9kaXNhYmxlQWxsVmFsaWRhdGlvbiAhPSBncC5nZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpKWNoYW5nZXMgfD0gRGlzYWJsZUFsbFZhbGlkYXRpb25NYXNrOwotCQlpZiAoX292ZXJyaWRlICE9IGdwLmdldE92ZXJyaWRlKCkpY2hhbmdlcyB8PSBPdmVycmlkZU1hc2s7Ci0JCWlmIChfc2F2ZUF1dG9tYXRpY2FsbHkgIT0gZ3AuZ2V0U2F2ZUF1dG9tYXRpY2FsbHkoKSljaGFuZ2VzIHw9IFNhdmVBdXRvbWF0aWNhbGx5TWFzazsKLQkJaWYgKF9zdGF0ZVRpbWVTdGFtcCAhPSBncC5nZXRTdGF0ZVRpbWVTdGFtcCgpKWNoYW5nZXMgfD0gU3RhdGVUaW1lU3RhbXBNYXNrOwotCQlpZiAoX3ZlcnNpb24gIT0gZ3AuZ2V0VmVyc2lvbigpKWNoYW5nZXMgfD0gVmVyc2lvbk1hc2s7Ci0JCXJldHVybiBjaGFuZ2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL0dsb2JhbFByZWZlcmVuY2VzVmFsdWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjgzNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvbW9kZWwvR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsOwotCi0vKioKLSAqIEEgbXV0YWJsZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGluaXRpYWxpemUgYSBHbG9iYWxQcmVmZXJlbmNlLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzIHsKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlQWxsVmFsaWRhdGlvbiA9IEdsb2JhbFByZWZlcmVuY2VzLkRlZmF1bHRTdXNwZW5kOwotCXB1YmxpYyBib29sZWFuIHNhdmVBdXRvbWF0aWNhbGx5ID0gR2xvYmFsUHJlZmVyZW5jZXMuRGVmYXVsdEF1dG9TYXZlOwotCXB1YmxpYyBib29sZWFuIGNvbmZpcm1EaWFsb2cgPSBHbG9iYWxQcmVmZXJlbmNlcy5EZWZhdWx0Q29uZmlybTsKLQlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZSA9IEdsb2JhbFByZWZlcmVuY2VzLkRlZmF1bHRPdmVycmlkZTsKLQkKLQkvKiogVGhlIHBsdWctaW4gc3RhdGUgdGltZSBzdGFtcC4gKi8KLQlwdWJsaWMgbG9uZwlzdGF0ZVRpbWVTdGFtcDsKLQkKLQkvKiogVGhlIGluY29taW5nIHZlcnNpb24gb2YgdGhlIGZyYW1ld29yay4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIG1pZ3JhdGlvbiBpcyBuZWVkZWQuKi8KLQlwdWJsaWMgaW50CQl2ZXJzaW9uOwotCQotCXB1YmxpYyBHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcygpewotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL0lWYWxpZGF0b3JWaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9JVmFsaWRhdG9yVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc0NzM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL0lWYWxpZGF0b3JWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgb2JqZWN0cyB0aGF0IHZpc2l0IGVuYWJsZWQgdmFsaWRhdG9ycy4KLSAqIDxwPiAKLSAqIFVzYWdlOgotICogPHByZT4KLSAqIGNsYXNzIFZpc2l0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yVmlzaXRvciB7Ci0gKiAgICBwdWJsaWMgdm9pZCB2aXNpdChWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAqICAgICAgIC8vIHlvdXIgY29kZSBoZXJlCi0gKiAgICB9Ci0gKiB9Ci0gKiBWYWxpZGF0b3JNYW5hZ2VyIHZtID0gVmFsaWRhdG9yTWFuYWdlci5nZXREZWZhdWx0KCk7Ci0gKiB2bS5hY2NlcHQobmV3IFZpc2l0b3IoKSwgLi4uKTsKLSAqIDwvcHJlPgotICogPC9wPiAKLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3JWaXNpdG9yIHsKLQkKLQkvKioKLQkgKiBWaXNpdHMgdGhlIGdpdmVuIHZhbGlkYXRvci4KLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICovCi0Jdm9pZCB2aXNpdChWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxUeXBlIHZhbFR5cGUsIAotCQlWYWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9Qcm9qZWN0UHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL1Byb2plY3RQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI2YWRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL1Byb2plY3RQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotCi0vKioKLSAqIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMgZm9yIGEgcGFydGljdWxhciBwcm9qZWN0LgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RQcmVmZXJlbmNlcyB7Ci0JLyoKLQkgKiBCZWZvcmUgdGhpcyBvYmplY3QgY2FuIGJlIGNvbnNpZGVyZWQgaW1tdXRhYmxlLCB0aGUgbXV0YWJsZSB2YWxpZGF0b3JzIG5lZWQgdG8gYmUgYWRkcmVzc2VkLgotCSAqLwotCS8qKiBmYWxzZSAtIERlZmF1bHQgc2V0dGluZyBmb3IgdGhlICJzaG91bGQgYWxsIHRoZSB2YWxpZGF0aW9uIGJlIHN1c3BlbmRlZCIgc2V0dGluZy4gKi8gCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERlZmF1bHRTdXNwZW5kID0gZmFsc2U7Ci0JCi0JLyoqIGZhbHNlIC0gRGVmYXVsdCBzZXR0aW5nIGZvciBsZXR0aW5nIHByb2plY3RzIG92ZXJyaWRlIHRoZSBnbG9iYWwgc2V0dGluZ3MuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERlZmF1bHRPdmVycmlkZSA9IGZhbHNlOwotCQotCXByaXZhdGUgZmluYWwgSVByb2plY3QJX3Byb2plY3Q7Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gCV9vdmVycmlkZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4JX3N1c3BlbmQ7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBWYWxpZGF0b3JbXQlfdmFsaWRhdG9yczsKLQkKLQlwdWJsaWMgUHJvamVjdFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpewotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JCV9vdmVycmlkZSA9IERlZmF1bHRPdmVycmlkZTsKLQkJX3N1c3BlbmQgID0gRGVmYXVsdFN1c3BlbmQ7Ci0JCV92YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvclswXTsKLQl9Ci0JCi0JcHVibGljIFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIG92ZXJyaWRlLCBib29sZWFuIHN1c3BlbmQsIFZhbGlkYXRvcltdIHZhbGlkYXRvcnMpewotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JCV9vdmVycmlkZSA9IG92ZXJyaWRlOwotCQlfc3VzcGVuZCA9IHN1c3BlbmQ7Ci0JCV92YWxpZGF0b3JzID0gdmFsaWRhdG9yczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0T3ZlcnJpZGUoKSB7Ci0JCXJldHVybiBfb3ZlcnJpZGU7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFN1c3BlbmQoKSB7Ci0JCXJldHVybiBfc3VzcGVuZDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoaXMgcHJvamVjdC4KLQkgKiBAcmV0dXJuIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0b3JzLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JbXSBnZXRWYWxpZGF0b3JzKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcnM7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9tb2RlbC9WYWxpZGF0b3JIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL1ZhbGlkYXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhmMjI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL21vZGVsL1ZhbGlkYXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTXV0YWJsZTsKLQotLyoqCi0gKiBJbXBsZW1lbnQgc29tZSBjb21tb24gdmFsaWRhdG9yIG1ldGhvZHMsIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBwYXJ0IG9mIHRoZSBBUEkuCi0gKiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0b3JIZWxwZXIgewotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHRoaXMgdmFsaWRhdG9yIGFscmVhZHkgaGFzIGFuIGV4Y2x1ZGUgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNFeGNsdWRlR3JvdXAoVmFsaWRhdG9yTXV0YWJsZSB2KXsKLQkJZm9yIChGaWx0ZXJHcm91cCBncm91cCA6IHYuZ2V0R3JvdXBzKCkpaWYgKGdyb3VwLmlzRXhjbHVkZSgpKXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiODhmNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLTxoMT5WYWxpZGF0aW9uIEZyYW1ld29yazwvaDE+Ci08aDM+QnVpbGQgQmFzZWQgVmFsaWRhdGlvbjwvaDM+Ci1UaGUgbWFpbiBjbGFzcyBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbiBpcyB0aGUgCi08YSBocmVmPSJWYWxCdWlsZGVySm9iLmh0bWwiPlZhbEJ1aWxkZXJKb2I8L2E+LiBUaGlzIGdldHMgdHJpZ2dlcmVkIGFzIHBhcnQgb2YgdGhlCi1idWlsZCBtZWNoYW5pc20uIEl0IHJlYWN0cyB0byByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzLCBhbmQgZnJvbSB0aGF0IGRldGVybWluZXMgd2hhdCBuZWVkcyB0byBiZSAKLXZhbGlkYXRlZC4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzYzQyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlZhbGlkYXRpb24gRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC48L3A+Ci08cD5BbHNvIHNlZSA8YSBocmVmPSJkb2MtZmlsZXMvZmFxLmh0bWwiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9hPjwvcD4KLTxwPgotVGhlcmUgYXJlIHR3byBtYWluIHR5cGVzIG9mIHZhbGlkYXRpb24sIDxiPmJ1aWxkIGJhc2VkPC9iPiBhbmQgCi08Yj5hcyB5b3UgdHlwZTwvYj4uIFRoaXMgZnJhbWV3b3JrIHN1cHBvcnRzIGJ1aWxkIGJhc2VkCi12YWxpZGF0aW9uLiBJZiBhdXRvIGJ1aWxkIGlzIHR1cm5lZCBvbiB0aGVuIHRoZSB2YWxpZGF0b3JzIGFyZSBjYWxsZWQKLXdoZW4gdGhlIHVzZXIgc2F2ZXMgdGhlaXIgZmlsZS4gSWYgYXV0byBidWlsZCBpcyBub3QgdHVybmVkIG9uIHRoZW4KLXRoZSB2YWxpZGF0b3JzIGFyZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBzdGFydHMgYSBidWlsZC48L3A+Ci08cD5UaGlzIGZyYW1ld29yayB3YXMgYWRkZWQgdG8gV1RQIGluIHZlcnNpb24gMy4wLjwvcD4KLTxoMz5EZXBlbmRlbmN5IFN1cHBvcnQ8L2gzPgotPHA+U29tZXRpbWVzIHJlc291cmNlcyBkZXBlbmQgb24gb3RoZXIgcmVzb3VyY2VzLCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGV5IGFyZSAKLXZhbGlkIG9yIG5vdC4gQW4gZXhhbXBsZSB3b3VsZCBiZSB0aGF0IGFuIFhNTCByZXNvdXJjZSBjb3VsZCBkZXBlbmQgb24gYSBEVEQuIElmIGF0IHNvbWUgCi1wb2ludCBpbiB0aGUgZnV0dXJlIHRoZSBEVEQgY2hhbmdlcywgdGhlbiB0aGUgZGVwZW5kZW50IFhNTCByZXNvdXJjZSBzaG91bGQgYmUgCi1yZXZhbGlkYXRlZCB0byBlbnN1cmUgdGhhdCBpdCBzdGlsbCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBjaGFuZ2VkIERURCAKLWZpbGUuIEluIG9yZGVyIHRvIGRvIHRoaXMgZWZmaWNpZW50bHksIHRoZXJlIG5lZWRzIHRvIGJlIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gCi10aGUgRFREIGFuZCBhbGwgdGhlIHJlc291cmNlcyB0aGF0IGRlcGVuZCBvbiBpdC48cD5UbyBiZSBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUsIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBhbGxvd3MgCi10aGlzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gYmUgcmV0dXJuZWQgYXMgcGFydCBvZiBhCi08YSBocmVmPSJBYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSwgaW50LCBWYWxpZGF0aW9uU3RhdGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSI+Ci12YWxpZGF0ZSBvcGVyYXRpb248L2E+LiBTaW5jZSB0aGUgdmFsaWRhdG9yIG5lZWRlZCB0byBmaWd1cmUgdGhpcyBvdXQgYW55d2F5cywgCi13aHkgbm90IHBhc3MgdGhpcyBpbmZvcm1hdGlvbiBiYWNrIHRvIHRoZSBmcmFtZXdvcmssIHNvIHRoYXQgaXQgY2FuIGJlIHNhdmVkLiAKLVRoaXMgc2F2ZXMgdGhlIGNvc3Qgb2YgaGF2aW5nIHRvIHBhcnNlIHRoZSBmaWxlIGF0IHNvbWUgbGF0ZXIgcG9pbnQgaW4gdGltZSAKLSh3aGVuIHRoZSBmaWxlIGlzIHByb2JhYmx5IHNpdHRpbmcgY29sZCBvbiBkaXNrKS4gVGhlIGZld2VyIHRpbWVzIHRoYXQgd2UgbmVlZCAKLXRvIG9wZW4sIHJlYWQgYW5kL29yIHBhcnNlIHRoZSBzYW1lIGZpbGUsIHdpbGwgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIAotcHJvZHVjdC4KLTxwPkluIHBhcnRpY3VsYXIgd2hlbiB0aGUgdmFsaWRhdGUgbWV0aG9kIHJldHVybnMsIGEKLTxhIGhyZWY9IlZhbGlkYXRpb25SZXN1bHQuaHRtbCI+VmFsaWRhdGlvblJlc3VsdDwvYT4gbXVzdCBiZSByZXR1cm5lZCwgaW5zaWRlIG9mIAotdGhpcyByZXN1bHQsIGFsbCB5b3VyIGRlcGVuZGVuY2llcyBuZWVkIHRvIGJlIHNwZWNpZmllZCB3aXRoIHRoZQotPGEgaHJlZj0iVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldERlcGVuZHNPbihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VbXSkiPgotc2V0RGVwZW5kc09uPC9hPiBtZXRob2QuPHA+SW4gYWRkaXRpb24gdG8ga2VlcGluZyB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiAKLXVwLXRvLWRhdGUgdGhyb3VnaCB0aGUgbm9ybWFsIGNvdXJzZSBvZiB2YWxpZGF0aW9uLCBkaXJlY3QgYWNjZXNzIGlzIGFsc28gCi1wcm92aWRlZCB0byB0aGUgZGVwZW5kZW5jeSBzdXBwb3J0IHRocm91Z2ggdGhlCi08YSBocmVmPSJWYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0RGVwZW5kZW5jeUluZGV4KCkiPmdldERlcGVuZGVuY3lJbmRleDwvYT4gCi1tZXRob2QuIFRoZSA8YSBocmVmPSJJRGVwZW5kZW5jeUluZGV4Lmh0bWwiPklEZXBlbmRlbmN5SW5kZXg8L2E+IGFsbG93cyB5b3UgdG8gCi1kaXJlY3RseSBtYW5pcHVsYXRlIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvciBhIHZhbGlkYXRvci4KLTxoMz5FbnRyeSBQb2ludHMgaW50byB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcms8L2gzPgotPHA+SGVyZSBhcmUgc29tZSBvZiB0aGUgcG9pbnRzIHdoZXJlIHRoZSBwbGF0Zm9ybSBjYWxscyBpbnRvIHRoZSBmcmFtZXdvcms6PC9wPgotPHVsPgotPGxpPjxiPkJ1aWxkZXI8L2I+IC0gVmFsaWRhdGlvbkJ1aWxkZXI8L2xpPgotPGxpPjxiPklGYWNldGVkUHJvamVjdExpc3RlbmVyPC9iPiAtIFZhbE1hbmFnZXI8L2xpPgotPGxpPjxiPklKb2JDaGFuZ2VMaXN0ZW5lcjwvYj4gLSBWYWxpZGF0aW9uT3BlcmF0aW9uLCBWYWxpZGF0aW9uT3BlcmF0aW9uLlZhbGlkYXRpb25MYXVuY2hlckpvYjwvbGk+Ci08bGk+PGI+SVByb2plY3RDaGFuZ2VMaXN0ZW5lcjwvYj4gLSBWYWxNYW5hZ2VyPC9saT4KLTxsaT48Yj5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvYj4gLSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiwgRGlzYWJsZWRSZXNvdXJjZU1hbmFnZXI8L2xpPgotPGxpPjxiPklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyPC9iPiAtIEV2ZW50TWFuZ2VyPC9saT4KLTxsaT48Yj5JVmFsQ2hhbmdlZExpc3RlbmVyPC9iPiAtIFZhbE1hbmFnZXIsIERpc2FibGVkVmFsaWRhdG9yTWFuYWdlcjwvbGk+Ci08L3VsPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL2V4Y2x1ZGUuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy9leGNsdWRlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDc2NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL2V4Y2x1ZGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgaWQ9ImV4Y2x1ZGUiIG5hbWU9IlZhbGlkYXRvciBFeGNsdXNpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQSB3YXkgdG8gYWRkIGFkZGl0aW9uYWwgZXhjbHVzaW9uIGZpbHRlcnMgdG8gYSBWMiB2YWxpZGF0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZhbGlkYXRvciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzaG9ydCBpZCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHBsdWctaW4sIHNvIHRoYXQgdGhpcyBzZXQgb2YgZXh0cmEgZXhjbHVzaW9uIGZpbHRlcnMgY2FuIGJlIGlkZW50aWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgc2hvcnQgdXNlciBmcmllbmRseSBuYW1lIGZvciB0aGUgZXhjbHVzaW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgSWRlbnRpZmllcyB0aGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgZXh0ZW5kZWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4Y2x1ZGUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZlZCB2YWxpZGF0b3IgaWQgdGhhdCBpcyBiZWluZyBleHRlbmRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXhjbHVkZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBjb250YWlucyBhIHNldCBvZiBleGNsdXNpb24gcnVsZXMsIHVzZWQgaW4gZmlsdGVyaW5nIHdoaWNoIHJlc291cmNlcyBnZXQgdmFsaWRhdGVkLiBJZiBhbnkgb2YgdGhlc2UgcnVsZXMgYXJlIG1hdGNoZWQsIHRoZW4gdGhlIHZhbGlkYXRvciBpcyBub3QgY2FsbGVkIG9uIHRoaXMgcmVzb3VyY2UuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bGVzIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsZWV4dCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgaHRtbC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgaHRtbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXNlU2Vuc2l0aXZlIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZSBleHRlbnNpb24gaXMgY2FzZSBzZW5zaXRpdmUsIHRoZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvamVjdE5hdHVyZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVXNlZCB0byBmaWx0ZXIgb24gcHJvamVjdCBuYXR1cmVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIHByb2plY3QgbmF0dXJlIGlkLCBmb3IgZXhhbXBsZSAmcXVvdDtvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWxlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZmlsZSBvciBmb2xkZXIgbmFtZS4gVGhlIGZpbGUgbmFtZSBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkLCB0aGF0IGlzIGl0IHN0YXJ0cyB3aXRoIGEgbGVhZGluZyBzbGFzaCAoJnF1b3Q7LyZxdW90OyksIG9yIGl0IGNhbiBiZSBhIHJlbGF0aXZlIG5hbWUuIEZvbGRlciBuYW1lcyBhcmUgc2VwYXJhdGVkIHdpdGggdGhlIGZvcndhcmQgc2xhc2ggKCZxdW90Oy8mcXVvdDspIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXNlU2Vuc2l0aXZlIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZSBuYW1lIGlzIG5vdCBjYXNlIHNlbnN0aXRpdmUsIHRoZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gZmFsc2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVHlwZSBvZiBuYW1lLCB0aGVyZSBhcmUgdGhyZWUgY2hvaWNlcy4gJmx0O3VsJmd0OyZsdDtsaSZndDtmb2xkZXIgLSBzcGVjaWZpZXMgYSBwcm9qZWN0IHJlbGF0aXZlIGZvbGRlciBuYW1lLiZsdDsvbGkmZ3Q7Jmx0O2xpJmd0O2ZpbGUgLSBhIHNpbXBsZSBmaWxlIG5hbWUgKGkuZS4gbm8gcGF0aCBpbmZvcm1hdGlvbikuJmx0Oy9saSZndDsmbHQ7bGkmZ3Q7ZnVsbCAtIGEgZnVsbHkgcXVhbGlmaWVkIChwcm9qZWN0IHJlbGF0aXZlKSBmaWxlIG5hbWUuJmx0Oy9saSZndDsmbHQ7L3VsJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm9sZGVyIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZpbGUiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVsZXMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgc2V0IG9mIHJ1bGVzIGZvciBkZXRlcm1pbmluZyBpZiBhIHJlc291cmNlIGlzIHBhc3NlZCB0byB0aGlzIHZhbGlkYXRvciBvciBub3QuIFRoZSBydWxlcyBhcmUgT1ImYXBvcztlZCB0b2dldGhlci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsZWV4dCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3ROYXR1cmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGF0dGVybiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY2V0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZhY2V0IGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVXNlZCB0byBmaWx0ZXIgYmFzZWQgb24gY29udGVudCB0eXBlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNvbnRlbnQgdHlwZSBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGFjdE1hdGNoIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgY29udGVudCB0eXBlIG5lZWRzIHRvIG1hdGNoIGV4YWN0bHkuIFNldCB0byBmYWxzZSBpZiBzdWIgdHlwZXMgYXJlIGNvbnNpZGVyZWQgbWF0Y2hlcyBhcyB3ZWxsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0icGF0dGVybiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgSG9sZHMgYSByZWd1YWxyIGV4cHJlc3Npb24sIHRoYXQgbWF0Y2hlcyB0aGUgcmVzb3VyY2UmYXBvcztzIHByb2plY3QgcmVsYXRpdmUgbmFtZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVnZXgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSG9sZHMgYSBKYXZhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gU2VlIHRoZSBjbGFzcyBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBmb3IgbW9yZSBkZXRhaWxzLiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkIGFnYWluc3QgYSByZXNvdXJjZSZhcG9zO3MgcHJvamVjdCByZWxhdGl2ZSBwYXRoLCBhZnRlciB0aGF0IHBhdGggaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBwb3J0YWJsZSBwYXRoLgotJmx0O3AmZ3Q7VGhlIHBhdGggd2lsbCBhbHdheXMgc3RhcnQgd2l0aCBhIGZvcndhcmQgc2xhc2ggKC8pIHNvIHRoYXQgZm9sZGVyIG5hbWVzIGNhbiBiZSBtb3JlIGVhc2lseSBtYXRjaGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhc2VTZW5zaXRpdmUiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoZSBmaWxlIG5hbWUgaXMgbm90IGNhc2Ugc2Vuc3RpdGl2ZSwgdGhlbiB0aGlzIG5lZWRzIHRvIGJlIHNldCB0byBmYWxzZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgV2ViVG9vbHMgMy4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDshLS0gQSBwbHVnLWluIGlzIHR1cm5pbmcgb2ZmIHRoZSBUMUEgdmFsaWRhdG9yIGZvciBwcm9qZWN0cyB0aGF0IGhhdmUgdGhlIE1vZHVsZUNvcmVOYXR1cmUgLS0mZ3Q7Ci0gJmx0O2V4dGVuc2lvbgotICAgICAgIGlkPSZxdW90O2V4Y2x1ZGUxJnF1b3Q7Ci0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhjbHVkZSZxdW90OyZndDsKLSAgICAmbHQ7dmFsaWRhdG9yCi0gICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLlQxQSZxdW90OyZndDsKLSAgICAgICAmbHQ7ZXhjbHVkZSZndDsKLSAgICAgICAgICAmbHQ7cnVsZXMmZ3Q7Ci0gICAgICAgICAgICAgJmx0O3Byb2plY3ROYXR1cmUKLSAgICAgICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qc3QuajJlZS5Nb2R1bGVDb3JlTmF0dXJlJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICZsdDsvcHJvamVjdE5hdHVyZSZndDsKLSAgICAgICAgICAmbHQ7L3J1bGVzJmd0OwotICAgICAgICZsdDsvZXhjbHVkZSZndDsKLSAgICAmbHQ7L3ZhbGlkYXRvciZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3Zpc2lvbmFsIEFQSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvcmVmZXJlbmNpYWxGaWxlRXh0U2NoZW1hLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvcmVmZXJlbmNpYWxGaWxlRXh0U2NoZW1hLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZmU4NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3JlZmVyZW5jaWFsRmlsZUV4dFNjaGVtYS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgaWQ9InJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIgbmFtZT0iUmVmZXJlbmNpYWwgRmlsZSBWYWxpZGF0b3IiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCBmb3IgcmVmZXJlbnRpYWwgZmlsZSB2YWxpZGF0aW9uLiBUaGlzIGV4dGVuc2lvbiBwb2ludCBzaG91bGQgYmUgZXh0ZW5kZWQgaWYgeW91IGhhdmUgZmlsZXMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZmlsZXMgYW5kIHdvdWxkIGxpa2UgdGhlIHZhbGlkYXRpb24gb24gcmVmZXJlbmNlZCBmaWxlcyB0byBydW4gd2hlbiB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgcmVmZXJlbmNpbmcgZmlsZSBpcyBydW4uIFRoZSBQb3N0IFZhbGlkYXRvciBvcGVyYXRpb24gdGhhdCBpcyB1c2VkIGJ5IHRoaXMgZXh0ZW5zaW9uIHBvaW50IGV4cGVjdHMgYSBmbGF0IGxpc3Qgb2YgZmlsZXMgdG8gcnVuIHZhbGlkYXRpb24gb24gcmVmZXJlbmNlZCBmaWxlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVuIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVuIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci4gCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0aW9uSGVscGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdGlvbkhlbHBlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDg1NGRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0aW9uSGVscGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiBpZD0idmFsaWRhdGlvbkhlbHBlciIgbmFtZT0iVmFsaWRhdGlvbiBIZWxwZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZhbGlkYXRpb25IZWxwZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRpb25IZWxwZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoZWxwZXJDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVByb2plY3RWYWxpZGF0aW9uSGVscGVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2ZmYmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgaWQ9InZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIiBuYW1lPSJWYWxpZGF0aW9uIFNlbGVjdGlvbiBIYW5kbGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFuZGxlckNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIGludGVyZmFjZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZWxlY3Rpb25UeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdG9yLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjNhNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiBpZD0idmFsaWRhdG9yLXYyIiBuYW1lPSJWYWxpZGF0b3IgVjIiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgdmFsaWRhdG9yIHRvIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayAodmVyc2lvbiAyKS4gSW4gYWRkaXRpb24gdG8gc3BlY2lmeWluZyB0aGUgdmFsaWRhdG9yIHRvIGludm9rZSwgaXQgcmVnaXN0ZXJzIGEgc2V0IG9mIGRlZmF1bHQgZmlsdGVyIHJ1bGVzLCB0byBjb250cm9sIHdoaWNoIHJlc291cmNlcyBhcmUgcGFzc3NlZCB0byB0aGUgdmFsaWRhdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmFsaWRhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHNob3J0IGlkIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgcGx1Zy1pbiwgc28gdGhhdCB0aGlzIHZhbGlkYXRvciBjYW4gYmUgaWRlbnRpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzaG9ydCB1c2VyIGZyaWVuZGx5IG5hbWUgb2YgdGhlIHZhbGlkYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgYSB2YWxpZGF0b3IgdG8gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbmNsdWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4Y2x1ZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1lc3NhZ2VDYXRlZ29yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgdmFsaWRhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidWlsZCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSXMgdGhpcyB2YWxpZGF0b3IgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBidWlsZCBiYXNlZCB2YWxpZGF0aW9ucz8gVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW51YWwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElzIHRoaXMgdmFsaWRhdG9yIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgbWFudWFsIGJhc2VkIHZhbGlkYXRpb25zPyBUaGUgZGVmYXVsdCBpcyB0cnVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZlcnNpb24gb2YgdGhlIGRlZmluaXRpb24uIEl0IGlzIGEgc2ltcGxlIGludGVnZXIuIElmIG5vdCBzcGVjaWZpZWQgdGhlIHZlcnNpb24gaXMgYXNzdW1lZCB0byBiZSAxLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNvdXJjZWlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoaXMgdmFsaWRhdG9yIGFsc28gc2VydmVzIGFzIGFuIGFzLXlvdS10eXBlIHZhbGlkYXRvciAoYWxzbyBrbm93IGFzIGFuIElTb3VyY2VWYWxpZGF0b3IpIHRoZW4gaXQmYXBvcztzIHNvdXJjZSBpZCBpcyBzcGVjaWZpZWQgaGVyZSwgc28gdGhhdCB0aGUgdHdvIHZhbGlkYXRvcnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmUgYW5vdGhlci4KLUJ5IHNvdXJjZSBpZCwgd2UgbWVhbiB0aGUgaWQgdGhhdCBpcyB1c2VkIGluIHRoZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZVZhbGlkYXRpb24gZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFya2VySWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWYgeW91ciB2YWxpZGF0b3Igd2lzaGVzIHRvIHVzZSBpdCZhcG9zO3Mgb3duIG1hcmtlciwgaXQgY2FuIGRvIHNvIGJ5IHN1cHBseWluZyB0aGF0IG1hcmtlciBpZCBoZXJlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGNvbnRhaW5zIGEgc2V0IG9mIGluY2x1c2lvbiBydWxlcywgd2hpY2ggYXJlIHVzZWQgaW4gZmlsdGVyaW5nIHdoaWNoIHJlc291cmNlcyBnZXQgdmFsaWRhdGVkLiBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgcnVsZXMgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHRoZSB2YWxpZGF0b3IgdG8gYmUgY2FsbGVkIG9uIHRoZSBwYXJ0aWN1bGFyIHJlc291cmNlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydWxlcyIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4Y2x1ZGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgY29udGFpbnMgYSBzZXQgb2YgZXhjbHVzaW9uIHJ1bGVzLCB1c2VkIGluIGZpbHRlcmluZyB3aGljaCByZXNvdXJjZXMgZ2V0IHZhbGlkYXRlZC4gSWYgYW55IG9mIHRoZXNlIHJ1bGVzIGFyZSBtYXRjaGVkLCB0aGVuIHRoZSB2YWxpZGF0b3IgaXMgbm90IGNhbGxlZCBvbiB0aGlzIHJlc291cmNlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydWxlcyIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZpbGVleHQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlIGh0bWwuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlIGh0bWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FzZVNlbnNpdGl2ZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWYgdGhlIGZpbGUgZXh0ZW5zaW9uIGlzIGNhc2Ugc2Vuc2l0aXZlLCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3ROYXR1cmUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFVzZWQgdG8gZmlsdGVyIG9uIHByb2plY3QgbmF0dXJlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBwcm9qZWN0IG5hdHVyZSBpZCwgZm9yIGV4YW1wbGUgJnF1b3Q7b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZpbGUgb3IgZm9sZGVyIG5hbWUuIFRoZSBmaWxlIG5hbWUgY2FuIGJlIGZ1bGx5IHF1YWxpZmllZCwgdGhhdCBpcyBpdCBzdGFydHMgd2l0aCBhIGxlYWRpbmcgc2xhc2ggKCZxdW90Oy8mcXVvdDspLCBvciBpdCBjYW4gYmUgYSByZWxhdGl2ZSBuYW1lLiBGb2xkZXIgbmFtZXMgYXJlIHNlcGFyYXRlZCB3aXRoIHRoZSBmb3J3YXJkIHNsYXNoICgmcXVvdDsvJnF1b3Q7KSBjaGFyYWN0ZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FzZVNlbnNpdGl2ZSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWYgdGhlIGZpbGUgbmFtZSBpcyBub3QgY2FzZSBzZW5zdGl0aXZlLCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIGZhbHNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFR5cGUgb2YgbmFtZSwgdGhlcmUgYXJlIHRocmVlIGNob2ljZXMuICZsdDt1bCZndDsmbHQ7bGkmZ3Q7Zm9sZGVyIC0gc3BlY2lmaWVzIGEgcHJvamVjdCByZWxhdGl2ZSBmb2xkZXIgbmFtZS4mbHQ7L2xpJmd0OyZsdDtsaSZndDtmaWxlIC0gYSBzaW1wbGUgZmlsZSBuYW1lIChpLmUuIG5vIHBhdGggaW5mb3JtYXRpb24pLiZsdDsvbGkmZ3Q7Jmx0O2xpJmd0O2Z1bGwgLSBhIGZ1bGx5IHF1YWxpZmllZCAocHJvamVjdCByZWxhdGl2ZSkgZmlsZSBuYW1lLiZsdDsvbGkmZ3Q7Jmx0Oy91bCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZvbGRlciI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmaWxlIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bGVzIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHNldCBvZiBydWxlcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYSByZXNvdXJjZSBpcyBwYXNzZWQgdG8gdGhpcyB2YWxpZGF0b3Igb3Igbm90LiBUaGUgcnVsZXMgYXJlIE9SJmFwb3M7ZWQgdG9nZXRoZXIuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbGVleHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9qZWN0TmF0dXJlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhdHRlcm4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWNldCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmYWNldCBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdmVyc2lvbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZnV0aGVyIHF1YWxpZnkgdGhlIG1hdGNoLiBJZiBub3Qgc3BlY2lmZWQsIHRoZW4gdmVyc2lvbnMgYXJlIG5vdCB1c2VkIGFzIGEgY3JpdGVyaWEgZm9yIHNlbGVjdGluZyB0aGUgZmFjZXQuIFRoZSBzeW50YXggb2YgdGhpcyBleHByZXNzaW9uLCBpcyB0aGUgc2FtZSBzeW50YXggdGhhdCBpcyB1c2VkIGJ5IHRoZSBmYWNldCBmcmFtZXdvcmsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imdyb3VwIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyB0aGF0IHRoaXMgdmFsaWRhdG9yIGJlbG9uZ3MgdG8gdGhpcyB2YWxpZGF0aW9uIGdyb3VwLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIElEIG9mIHRoZSB2YWxpZGF0aW9uIGdyb3VwIHRvIHdoaWNoIHRoaXMgdmFsaWRhdG9yIGJlbG9uZ3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJpZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBVc2VkIHRvIGZpbHRlciBiYXNlZCBvbiBjb250ZW50IHR5cGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY29udGVudCB0eXBlIGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4YWN0TWF0Y2giIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBjb250ZW50IHR5cGUgbmVlZHMgdG8gbWF0Y2ggZXhhY3RseS4gU2V0IHRvIGZhbHNlIGlmIHN1YiB0eXBlcyBhcmUgY29uc2lkZXJlZCBtYXRjaGVzIGFzIHdlbGwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1lc3NhZ2VDYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVXNlZCB0byBncm91cCB0b2dldGhlciBhIHNldCBvZiBtZXNzYWdlcywgd2hlcmUgdGhlIHVzZXIgY2FuIGNoYW5nZSB0aGUgbWVzc2FnZSBzZXZlcml0eSBvZiBhbGwgdGhlIG1lc3NhZ2VzIGluIHRoZSBncm91cC4gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBzdXBwb3J0IGluIHRoZSBKRFQsIHdoZXJlIGZvciBleGFtcGxlIGEgdXNlciBjYW4gc3BlY2lmeSB3aGV0aGVyIHVzZWQgbWV0aG9kcyBzaG91bGQgYmUgZXJyb3JzLCB3YXJuaW5ncyBvciBpZ25vcmVkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHNpbXBsZSBpZCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoaXMgdmFsaWRhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc2hvcnQsIG9uZSBsaW5lIGxhYmVsIHRoYXQgaXMgZGlzcGxheWVkIHRvIHRoZSBlbmQgdXNlciwgdGhhdCBkZXNjcmliZXMgdGhlIG1lc3NhZ2UgY2F0ZWdvcnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXZlcml0eSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgc2V2ZXJpdHkgZm9yIHRoaXMgY2F0ZWdvcnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJlcnJvciI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ3YXJuaW5nIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imlnbm9yZSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icGF0dGVybiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgSG9sZHMgYSByZWd1YWxyIGV4cHJlc3Npb24sIHRoYXQgbWF0Y2hlcyB0aGUgcmVzb3VyY2UmYXBvcztzIHByb2plY3QgcmVsYXRpdmUgbmFtZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVnZXgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSG9sZHMgYSBKYXZhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gU2VlIHRoZSBjbGFzcyBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBmb3IgbW9yZSBkZXRhaWxzLiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkIGFnYWluc3QgYSByZXNvdXJjZSZhcG9zO3MgcHJvamVjdCByZWxhdGl2ZSBwYXRoLCBhZnRlciB0aGF0IHBhdGggaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBwb3J0YWJsZSBwYXRoLgotJmx0O3AmZ3Q7VGhlIHBhdGggd2lsbCBhbHdheXMgc3RhcnQgd2l0aCBhIGZvcndhcmQgc2xhc2ggKC8pIHNvIHRoYXQgZm9sZGVyIG5hbWVzIGNhbiBiZSBtb3JlIGVhc2lseSBtYXRjaGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhc2VTZW5zaXRpdmUiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoZSBmaWxlIG5hbWUgaXMgbm90IGNhc2Ugc2Vuc3RpdGl2ZSwgdGhlbiB0aGlzIG5lZWRzIHRvIGJlIHNldCB0byBmYWxzZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgV2ViVG9vbHMgMy4wLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBBbiBleGFtcGxlIG9mIGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gcmVzb3VyY2VzIHRoYXQgaGF2ZSBodG1sIG9yIGh0bSBmaWxlIGV4dGVuc2lvbnMuCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yJnF1b3Q7Ci0gICAgICAgICBpZD0mcXVvdDtUZXN0JnF1b3Q7IG5hbWU9JnF1b3Q7JVZhbGlkYXRvci5OYW1lJnF1b3Q7Jmd0OwotICAgICAgJmx0O3ZhbGlkYXRvciBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0LlRlc3RWYWxpZGF0b3ImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7aW5jbHVkZSZndDsKLSAgICAgICAgICAgICZsdDtydWxlcyZndDsKLSAgICAgICAgICAgICAgICZsdDtmaWxlZXh0IGV4dD0mcXVvdDtodG1sJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICZsdDtmaWxlZXh0IGV4dD0mcXVvdDtodG0mcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0Oy9ydWxlcyZndDsKLSAgICAgICAgICZsdDsvaW5jbHVkZSZndDsKLSAgICAgICZsdDsvdmFsaWRhdG9yJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3Zpc2lvbmFsIEFQSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdG9yRGVsZWdhdGVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdG9yRGVsZWdhdGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNWY4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvckRlbGVnYXRlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgaWQ9InZhbGlkYXRvckRlbGVnYXRlcyIgbmFtZT0iVmFsaWRhdG9yIERlbGVnYXRlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdmFsaWRhdG9yIHByb3ZpZGVycyB0byBjb250cmlidXRlIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMgZm9yIGEgZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlbGVnYXRlIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlbGVnYXRlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIGEgdmFsaWRhdG9yIGRlbGVnYXRlLiBEZWxlZ2F0aW5nIHZhbGlkYXRvcnMgY2FuIGhhdmUgb25lIG9yIG1vcmUgZGVsZWdhdGVzIHJlZ2lzdGVyZWQsIG9ubHkgb25lIG9mIHdoaWNoIGNhbiBiZSBhY3RpdmUgKHNlbGVjdGVkKSBhdCBvbmNlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGRlbGVnYXRlIHZhbGlkYXRvci4gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IElWYWxpZGF0b3JKb2IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yIGV4dGVuc2lvbiBmb3Igd2hpY2ggdGhpcyBkZWxlZ2F0ZSBpcyBiZWluZyByZWdpc3RlcmVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckRlbGVnYXRlcyZxdW90OyZndDsKLSAgICAmbHQ7ZGVsZWdhdGUKLSAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uYWNtZS5mYXN0LlN1cGVyRmFzdFZhbGlkYXRvciZxdW90OwotICAgICAgICAgIG5hbWU9JnF1b3Q7U3VwZXIgZmFzdCB2YWxpZGF0b3ImcXVvdDsKLSAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmFjbWUuY29yZS5BQ01FRGVsZWdhdGluZ1ZhbGlkYXRvciZxdW90Oy8mZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQSBkZWxlZ2F0ZSB2YWxpZGF0b3Igd2lsbCBoYXZlIHRvIGltcGxlbWVudCB0aGUgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UuCi1UaGUgdGFyZ2V0IHZhbGlkYXRvciwgdGhlIG9uZSB3aG8gd2lsbCBkZWxlZ2F0ZSBpdHMgaW1wbGVtZW50YXRpb24gdG8gYSBkZWxlZ2F0ZSB2YWxpZGF0b3Igd2lsbCBoYXZlIHRvIGV4dGVuZCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kZWxlZ2F0ZXMuQmFzZURlbGVnYXRpbmdWYWxpZGF0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdG9yRXh0U2NoZW1hLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdG9yRXh0U2NoZW1hLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDI2MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvckV4dFNjaGVtYS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiBpZD0idmFsaWRhdG9yIiBuYW1lPSJWYWxpZGF0b3IiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZ2l2ZSB0aGUgYWJpbGl0eSB0byBjcmVhdGUgYSBuZXcgdmFsaWRhdG9yIHRoYXQgY2FuIHZhbGlkYXRlIHJlc291cmNlcyBpbiBhIEphdmEgUHJvamVjdC4gVGhlIHZhbGlkYXRvciBuZWVkcyB0byByZWdpc3RlcmVkIGZvciBhIGdpdmVuIG5hdHVyZSBvZiB0aGUgcHJvamVjdCBmb3IgaXQgdG8gcnVuIG9uIHRoYXQgcHJvamVjdC4gVGhlIHVzZXIgY2FuIHNwZWNpZml5IGZpbGUgZmlsdGVycyB0byBmaWx0ZXIgb3V0IGZpbGVzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQuIFRoZSBuZXcgdmFsaWRhdG9yIHJlZ2lzdGVyZWQgYnkgdGhlIHByb2plY3QgbmF0dXJlIG9uIHRoZSBwcm9qZWN0IGNhbiBiZSBydW4gbWFudWFsbHkgb3IgaW5jcmVtZW50YWxseSBpZiAgQXV0byBCdWlsZCBpcyB0dXJuZWQgb24sIGR1cmluZyBpbmNyZW1lbnRhbCBidWlsZHMgdGhlIGNoYW5nZWQgZGVsdGEgb2YgZmlsZXMgYXJlIG9ubHkgdmFsaWRhdGVkIGlmIHRob3NlIGZpbGVzIGFyZSBwYXJ0IG9mIHRoZSB2YWxpZGF0aW9uIGZpbHRlcnMgc3BlY2lmaWVkLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmFsaWRhdG9yIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRvciI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3ROYXR1cmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJoZWxwZXIiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlcGVuZGVudFZhbGlkYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1biIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFya2VySWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWNldCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGVCaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRvIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIG1pZ3JhdGlvbiB0YWcNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZnJvbSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBPcHRpb25hbCBtaWdyYXRpb24gdGFnDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9qZWN0TmF0dXJlIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZSIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0gICANCi0gICANCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZUJpbmRpbmciPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImNvbnRlbnRUeXBlSWQiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgQXNzb2NpYXRlcyBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlIHdpdGggdGhlIGN1cnJlbnQgdmFsaWRhdG9yLCBhbmQgZW5hYmxlcyB0aGUgdmFsaWRhdG9yIHRvIGJlIHJ1biBvbiByZXNvdXJjZXMgb2YgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBjb250ZW50IHR5cGUgaWRlbnRpZmllci4gVGhpcyBpcyBhbiBJRCBkZWZpbmVkIGJ5IHRoZSAmYXBvcztvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzJmFwb3M7IGV4dGVuc2lvbiBwb2ludC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLSAgIA0KLSAgIA0KLSAgIA0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZpbHRlciI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib2JqZWN0Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVGaWx0ZXIiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhc2VTZW5zaXRpdmUiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJoZWxwZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZGVwZW5kZW50VmFsaWRhdG9yIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBWYWxWYWx1ZSIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJydW4iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNyZW1lbnRhbCIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdWxsQnVpbGQiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhc3luYyIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtYXJrZXJJZCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhlIG1hcmtlcklkIGVsZW1lbnQgaXMgaXMgdXNlZCB0byBnZXQgYSBjdXN0b20gcHJvYmxlbSBtYXJrZXIgZm9yIHRoZSBjdXN0b20gdmFsaWRhdG9yIGltcGxlbWVudGVkIHVzaW5nIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotDQotVGhpcyBtYXJrZXJJZCBlbGVtZW50IGFsc28gbmVlZHMgYSBjb3JyZXNwb25kaW5nIHByb2JsZW1NYXJrZXIgZXh0ZW5zaW9uIHRvIGJlIGRlZmluZWQgYnl0aGlzIHZhbGlkYXRvciB3aXRoIHRoZSBzYW1lIElkIGFzIHRoZSBtYWtlcklkVmFsdWUgZm9yIHRoZSB2YWxpZGF0b3IgdG8gaGF2ZSBpdHMgb3duIG1hcmtlciB0eXBlLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGEgcHJvYmxlbU1hcmtlciBleHRlbnNpb24gZGVmaW5lZCBmb3IgYSBtYXJrZXJJZFZhbHVlICZxdW90O0Zvb01hcmtlciZxdW90Ow0KLQ0KLSAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9JnF1b3Q7Rm9vTWFya2VyJnF1b3Q7DQotICAgICAgICAgbmFtZT0mcXVvdDslRUpCX1ZBTElEQVRJT05fUFJPQkxFTU1BUktFUl9OQU1FJnF1b3Q7DQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyZxdW90OyZndDsNCi0gICAgICAmbHQ7c3VwZXINCi0gICAgICAgICAgICB0eXBlPSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXImcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9zdXBlciZndDsNCi0gICAgICAmbHQ7cGVyc2lzdGVudA0KLSAgICAgICAgICAgIHZhbHVlPSZxdW90O3RydWUmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9wZXJzaXN0ZW50Jmd0Ow0KLSAgICAgICZsdDthdHRyaWJ1dGUNCi0gICAgICAgICAgICBuYW1lPSZxdW90O293bmVyJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvYXR0cmlidXRlJmd0Ow0KLSAgICAgICZsdDthdHRyaWJ1dGUNCi0gICAgICAgICAgICBuYW1lPSZxdW90O3ZhbGlkYXRpb25TZXZlcml0eSZxdW90OyZndDsNCi0gICAgICAmbHQ7L2F0dHJpYnV0ZSZndDsNCi0gICAgICAmbHQ7YXR0cmlidXRlDQotICAgICAgICAgICAgbmFtZT0mcXVvdDt0YXJnZXRPYmplY3QmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9hdHRyaWJ1dGUmZ3Q7DQotICAgICAgJmx0O2F0dHJpYnV0ZQ0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7Z3JvdXBOYW1lJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvYXR0cmlidXRlJmd0Ow0KLSAgICAgICZsdDthdHRyaWJ1dGUNCi0gICAgICAgICAgICBuYW1lPSZxdW90O21lc3NhZ2VJZCZxdW90OyZndDsNCi0gICAgICAmbHQ7L2F0dHJpYnV0ZSZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0gICANCi0gICBXaXRob3V0IGEgcHJvYmxlbU1hcmtlciBleHRlbnNpb24gZGVmaW5lZCwgdGhlIGN1c3RvbWVyIHZhbGlkYXRvciB3aWxsIHVzZSB0aGUgYmFzZSBWYWxpZGF0aW9uIE1lc3NhZ2UgcHJvYmxlbU1hcmtlciB0eXBlLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFya2VySWRWYWx1ZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY2V0Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGRlcHJlY2F0ZWQ9InRydWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgYW5kIGVuYWJsZW1lbnQgaXMgdGhlIG5ldyByZWNvbW1lbmRlZCBhcHByb2FjaCB0byBmaWx0ZXIgdmFsaWRhdG9ycyBiYXNlZCBvbiBmYWNldHMuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldElkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdG9yZ3JvdXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0b3Jncm91cC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjA1Y2IxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0b3Jncm91cC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiBpZD0idmFsaWRhdG9yR3JvdXAiIG5hbWU9IlZhbGlkYXRvciBHcm91cCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBEZWZpbmVzIGEgZ3JvdXBpbmcgZm9yIHZhbGlkYXRvcnMgd2l0aCBsaXN0ZW5lcnMgbm90aWZpZWQgb2YgZ3JvdXAgbWVtYmVycyZhcG9zOyBhY3Rpdml0ZXMuICBVc2VmdWwgZm9yIHByZS1jYWNoaW5nIGNvbW1vbiBpbmZvcm1hdGlvbiB1c2VkIGJ5IG11bHRpcGxlIHZhbGlkYXRvcnMgYW5kIGRpc3Bvc2luZyBvZiB0aGF0IGluZm9ybWF0aW9uIHdoZW4gdGhleSZhcG9zO3JlIGFsbCBkb25lLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZ3JvdXAiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJpZGVudGlmaWVyIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBuYW1lIGZvciB0aGlzIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imxpc3RlbmVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIGxpc3RlbmVyIGZvciBhY3Rpdml0aWVzIGluIHRoaXMgZ3JvdXAuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsaXN0ZW5lciZhcG9zO3MgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZ3JvdXAiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgdmFsaWRhdG9yIGdyb3VwLiAgQSBncm91cCBtYXkgaGF2ZSBtdWx0aXBsZSBsaXN0ZW5lcnMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaXN0ZW5lciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iaWRlbnRpZmllciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBXZWJUb29scyAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRGVmaW5lIGEgbGlzdGVuZXIgdGhhdCBzaW1wbHkgcHJpbnRzIHRoYXQgaXQgaGFzIGJlZW4gY2FsbGVkLgotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yR3JvdXAmcXVvdDsmZ3Q7Ci0gICAmbHQ7Z3JvdXAgaWQ9JnF1b3Q7dmFsaWRhdG9yR3JvdXAmcXVvdDsmZ3Q7Ci0gICAgICZsdDtsaXN0ZW5lciBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5leGFtcGxlLlZhbGlkYXRvckdyb3VwTGlzdGVuZXImcXVvdDsvJmd0OwotICAgJmx0Oy9ncm91cCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotCi1wdWJsaWMgY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhhbXBsZS5WYWxpZGF0b3JHcm91cExpc3RlbmVyIGltcGxlbWVudHMgSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIgewotCi0gIHB1YmxpYyBWYWxpZGF0b3JHcm91cExpc3RlbmVyKCkgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmFsaWRhdGlvbkZpbmlzaGluZyhJUmVzb3VyY2UgcmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsVHlwZSB2YWxUeXBlLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICBTeXN0ZW0ub3V0LnByaW50bG4oJnF1b3Q7RmluaXNoaW5nOiZxdW90OyArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmFsaWRhdGlvblN0YXJ0aW5nKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxUeXBlIHZhbFR5cGUsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgIFN5c3RlbS5vdXQucHJpbnRsbigmcXVvdDtTdGFydGluZzomcXVvdDsgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgfQotfQotIAotJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtpZCZxdW90OyBuYW1lPSZxdW90O25hbWUmcXVvdDsgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjImcXVvdDsmZ3Q7Ci0gICZsdDt2YWxpZGF0b3IgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhhbXBsZS5WYWxpZGF0b3ImcXVvdDsmZ3Q7Ci0gICAgJmx0O2dyb3VwIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmV4YW1wbGUudmFsaWRhdG9yR3JvdXAmcXVvdDsvJmd0OwotICAmbHQ7L3ZhbGlkYXRvciZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUHJvdmlzaW9uYWwgQVBJLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4K